GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: gx_display_driver_1bpp_block_move.c Lines: 116 116 100.0 %
Date: 2026-03-06 19:21:09 Branches: 50 50 100.0 %

Line Branch Exec Source
1
/***************************************************************************
2
 * Copyright (c) 2024 Microsoft Corporation
3
 * Copyright (c) 2026-present Eclipse ThreadX contributors
4
 *
5
 * This program and the accompanying materials are made available under the
6
 * terms of the MIT License which is available at
7
 * https://opensource.org/licenses/MIT.
8
 *
9
 * SPDX-License-Identifier: MIT
10
 **************************************************************************/
11
12
13
/**************************************************************************/
14
/**************************************************************************/
15
/**                                                                       */
16
/** GUIX Component                                                        */
17
/**                                                                       */
18
/**   Display Management (Display)                                        */
19
/**                                                                       */
20
/**************************************************************************/
21
22
#define GX_SOURCE_CODE
23
24
25
/* Include necessary system files.  */
26
27
#include "gx_api.h"
28
#include "gx_display.h"
29
#include "gx_system.h"
30
#include "gx_utility.h"
31
32
/**************************************************************************/
33
/*                                                                        */
34
/*  FUNCTION                                               RELEASE        */
35
/*                                                                        */
36
/*    _gx_display_driver_1bpp_block_move                  PORTABLE C      */
37
/*                                                           6.1          */
38
/*  AUTHOR                                                                */
39
/*                                                                        */
40
/*    Kenneth Maxwell, Microsoft Corporation                              */
41
/*                                                                        */
42
/*  DESCRIPTION                                                           */
43
/*                                                                        */
44
/*    1-bit color palette display driver block moving function.           */
45
/*                                                                        */
46
/*  INPUT                                                                 */
47
/*                                                                        */
48
/*    context                               Draw context                  */
49
/*    block                                 The rectangle to be moved     */
50
/*    xshift                                Amount to move on X-axis      */
51
/*    yshift                                Amount to move on Y-axis      */
52
/*                                                                        */
53
/*  OUTPUT                                                                */
54
/*                                                                        */
55
/*    None                                                                */
56
/*                                                                        */
57
/*  CALLS                                                                 */
58
/*                                                                        */
59
/*    memmove                               Move a block of data          */
60
/*                                                                        */
61
/*  CALLED BY                                                             */
62
/*                                                                        */
63
/*    GUIX Internal Code                                                  */
64
/*                                                                        */
65
/**************************************************************************/
66
8
VOID _gx_display_driver_1bpp_block_move(GX_DRAW_CONTEXT *context,
67
                                        GX_RECTANGLE *block, INT xshift, INT yshift)
68
{
69
GX_UBYTE *putrow;
70
GX_UBYTE *getrow;
71
GX_UBYTE *pGet;
72
GX_UBYTE *pPut;
73
INT       width;
74
INT       column;
75
INT       y;
76
INT       height;
77
INT       stride;
78
GX_UBYTE  putmask;
79
GX_UBYTE  getmask;
80
INT       move_width;
81
82
8
    putrow = (GX_UBYTE *)context -> gx_draw_context_memory;
83
84
8
    stride = (context -> gx_draw_context_pitch + 7) >> 3;
85
86
8
    if (xshift)
87
    {
88
4
        if (xshift > 0)
89
        {
90
            /* Copy from left to right.  */
91
3
            width = block -> gx_rectangle_right - block -> gx_rectangle_left + 1;
92
3
            width -= xshift;
93
94
3
            putrow += block -> gx_rectangle_top * stride;
95
3
            getrow = putrow;
96
97
3
            putrow += block -> gx_rectangle_right >> 3;
98
3
            getrow += (block -> gx_rectangle_left + width - 1) >> 3;
99
100
345
            for (y = block -> gx_rectangle_top; y <= block -> gx_rectangle_bottom; y++)
101
            {
102
342
                pPut = putrow;
103
342
                pGet = getrow;
104
105
342
                putmask = (GX_UBYTE)(0x80 >> (block -> gx_rectangle_right & 0x07));
106
342
                getmask = (GX_UBYTE)(0x80 >> ((block -> gx_rectangle_left + width - 1) & 0x07));
107
108
53010
                for (column = 0; column < width; column++)
109
                {
110
52668
                    if ((*pGet) & getmask)
111
                    {
112
14664
                        *pPut |= putmask;
113
                    }
114
                    else
115
                    {
116
38004
                        *pPut = (GX_UBYTE)((*pPut) & (~putmask));
117
                    }
118
119
52668
                    if (getmask == 0x80)
120
                    {
121
6726
                        getmask = 0x01;
122
6726
                        pGet--;
123
                    }
124
                    else
125
                    {
126
45942
                        getmask = (GX_UBYTE)(getmask << 1);
127
                    }
128
129
52668
                    if (putmask == 0x80)
130
                    {
131
6384
                        putmask = 0x01;
132
6384
                        pPut--;
133
                    }
134
                    else
135
                    {
136
46284
                        putmask = (GX_UBYTE)(putmask << 1);
137
                    }
138
                }
139
140
342
                putrow += stride;
141
342
                getrow += stride;
142
            }
143
        }
144
        else
145
        {
146
            /* Copy from right to left.  */
147
1
            width = block -> gx_rectangle_right - block -> gx_rectangle_left + 1;
148
1
            width += xshift;
149
150
1
            putrow += block -> gx_rectangle_top * stride;
151
1
            getrow = putrow;
152
153
1
            putrow += block -> gx_rectangle_left >> 3;
154
1
            getrow += (block -> gx_rectangle_left - xshift) >> 3;
155
156
115
            for (y = block -> gx_rectangle_top; y <= block -> gx_rectangle_bottom; y++)
157
            {
158
114
                pPut = putrow;
159
114
                pGet = getrow;
160
161
114
                putmask = (GX_UBYTE)(0x80 >> (block -> gx_rectangle_left & 0x07));
162
114
                getmask = (GX_UBYTE)(0x80 >> ((block -> gx_rectangle_left - xshift) & 0x07));
163
164
9690
                for (column = 0; column < width; column++)
165
                {
166
9576
                    if ((*pGet) & getmask)
167
                    {
168
1656
                        *pPut |= putmask;
169
                    }
170
                    else
171
                    {
172
7920
                        *pPut &= (GX_UBYTE)(~putmask);
173
                    }
174
175
9576
                    getmask >>= 1;
176
9576
                    putmask >>= 1;
177
178
9576
                    if (!getmask)
179
                    {
180
1140
                        getmask = 0x80;
181
1140
                        pGet++;
182
                    }
183
9576
                    if (!putmask)
184
                    {
185
1140
                        putmask = 0x80;
186
1140
                        pPut++;
187
                    }
188
                }
189
190
114
                putrow += stride;
191
114
                getrow += stride;
192
            }
193
        }
194
    }
195
    else
196
    {
197
4
        width = block -> gx_rectangle_right - block -> gx_rectangle_left + 1;
198
199
4
        if (yshift > 0)
200
        {
201
            /* Copy from top to bottom.  */
202
3
            putrow += (block -> gx_rectangle_bottom * stride);
203
3
            putrow += (block -> gx_rectangle_left >> 3);
204
205
3
            getrow = putrow;
206
3
            getrow -= yshift * stride;
207
208
3
            height = block -> gx_rectangle_bottom - block -> gx_rectangle_top + 1;
209
3
            height -= yshift;
210
211
297
            for (y = 0; y < height; y++)
212
            {
213
294
                pPut = putrow;
214
294
                pGet = getrow;
215
216
294
                putmask = (GX_UBYTE)(0x80 >> (block -> gx_rectangle_left & 0x07));
217
218
294
                column = 0;
219
2624
                while (column < width)
220
                {
221

2330
                    if ((putmask == 0x80) && (width - column >= 8))
222
                    {
223
294
                        move_width = (width - column) >> 3;
224
294
                        memmove(pPut, pGet, (size_t)move_width);
225
294
                        pPut += move_width;
226
294
                        pGet += move_width;
227
294
                        column += (move_width << 3);
228
                    }
229
                    else
230
                    {
231
2036
                        if ((*pGet) & putmask)
232
                        {
233
1176
                            *pPut |= putmask;
234
                        }
235
                        else
236
                        {
237
860
                            *pPut &= (GX_UBYTE)(~putmask);
238
                        }
239
240
2036
                        putmask >>= 1;
241
242
2036
                        if (!putmask)
243
                        {
244
68
                            putmask = 0x80;
245
68
                            pPut++;
246
68
                            pGet++;
247
                        }
248
249
2036
                        column++;
250
                    }
251
                }
252
253
294
                putrow -= stride;
254
294
                getrow -= stride;
255
            }
256
        }
257
        else
258
        {
259
            /* Copy from bottom to top.  */
260
1
            putrow += (block -> gx_rectangle_top * stride);
261
1
            putrow += (block -> gx_rectangle_left >> 3);
262
263
1
            getrow = putrow;
264
1
            getrow -= yshift * stride;
265
266
1
            height = block -> gx_rectangle_bottom - block -> gx_rectangle_top + 1;
267
1
            height += yshift;
268
269
69
            for (y = 0; y < height; y++)
270
            {
271
68
                pPut = putrow;
272
68
                pGet = getrow;
273
274
68
                putmask = (GX_UBYTE)(0x80 >> (block -> gx_rectangle_left & 0x07));
275
276
68
                column = 0;
277
278
816
                while (column < width)
279
                {
280

748
                    if ((putmask == 0x80) && (width - column >= 8))
281
                    {
282
68
                        move_width = (width - column) >> 3;
283
68
                        memmove(pPut, pGet, (size_t)move_width);
284
68
                        pPut += move_width;
285
68
                        pGet += move_width;
286
68
                        column += (move_width << 3);
287
                    }
288
                    else
289
                    {
290
680
                        if ((*pGet) & putmask)
291
                        {
292
526
                            *pPut |= putmask;
293
                        }
294
                        else
295
                        {
296
154
                            *pPut &= (GX_UBYTE)(~putmask);
297
                        }
298
299
680
                        putmask >>= 1;
300
301
680
                        if (!putmask)
302
                        {
303
68
                            putmask = 0x80;
304
68
                            pPut++;
305
68
                            pGet++;
306
                        }
307
308
680
                        column++;
309
                    }
310
                }
311
312
68
                putrow += stride;
313
68
                getrow += stride;
314
            }
315
        }
316
    }
317
8
}
318