Coverage Report

Created: 2025-12-10 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/libfreerdp/codec/include/bitmap.h
Line
Count
Source
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * RLE Compressed Bitmap Stream
4
 *
5
 * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
6
 * Copyright 2016 Armin Novak <armin.novak@thincast.com>
7
 * Copyright 2016 Thincast Technologies GmbH
8
 *
9
 * Licensed under the Apache License, Version 2.0 (the "License");
10
 * you may not use this file except in compliance with the License.
11
 * You may obtain a copy of the License at
12
 *
13
 *     http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 * Unless required by applicable law or agreed to in writing, software
16
 * distributed under the License is distributed on an "AS IS" BASIS,
17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 * See the License for the specific language governing permissions and
19
 * limitations under the License.
20
 */
21
22
#include <winpr/assert.h>
23
#include <winpr/cast.h>
24
#include <winpr/wtypes.h>
25
26
/* do not compile the file directly */
27
28
/**
29
 * Write a foreground/background image to a destination buffer.
30
 */
31
static inline BYTE* WRITEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
32
                                   const BYTE* WINPR_RESTRICT pbDestEnd, UINT32 rowDelta,
33
                                   BYTE bitmask, PIXEL fgPel, UINT32 cBits)
34
72.5k
{
35
72.5k
  PIXEL xorPixel = 0;
36
72.5k
  BYTE mask = 0x01;
37
38
72.5k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
72.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
63
    return NULL;
46
47
72.5k
  UNROLL(cBits, {
48
72.5k
    PIXEL data = 0;
49
72.5k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
72.5k
    if (bitmask & mask)
52
72.5k
      data = xorPixel ^ fgPel;
53
72.5k
    else
54
72.5k
      data = xorPixel;
55
56
72.5k
    DESTWRITEPIXEL(pbDest, data);
57
72.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
72.5k
  });
59
72.5k
  return pbDest;
60
72.5k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
20.7k
{
35
20.7k
  PIXEL xorPixel = 0;
36
20.7k
  BYTE mask = 0x01;
37
38
20.7k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
20.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
19
    return NULL;
46
47
20.7k
  UNROLL(cBits, {
48
20.7k
    PIXEL data = 0;
49
20.7k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
20.7k
    if (bitmask & mask)
52
20.7k
      data = xorPixel ^ fgPel;
53
20.7k
    else
54
20.7k
      data = xorPixel;
55
56
20.7k
    DESTWRITEPIXEL(pbDest, data);
57
20.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
20.7k
  });
59
20.7k
  return pbDest;
60
20.7k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
51.8k
{
35
51.8k
  PIXEL xorPixel = 0;
36
51.8k
  BYTE mask = 0x01;
37
38
51.8k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
51.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
44
    return NULL;
46
47
51.7k
  UNROLL(cBits, {
48
51.7k
    PIXEL data = 0;
49
51.7k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
51.7k
    if (bitmask & mask)
52
51.7k
      data = xorPixel ^ fgPel;
53
51.7k
    else
54
51.7k
      data = xorPixel;
55
56
51.7k
    DESTWRITEPIXEL(pbDest, data);
57
51.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
51.7k
  });
59
51.7k
  return pbDest;
60
51.7k
}
Unexecuted instantiation: interleaved.c:WriteFgBgImage8to8
61
62
/**
63
 * Write a foreground/background image to a destination buffer
64
 * for the first line of compressed data.
65
 */
66
static inline BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
67
                                            const BYTE* WINPR_RESTRICT pbDestEnd, BYTE bitmask,
68
                                            PIXEL fgPel, UINT32 cBits)
69
58.3k
{
70
58.3k
  BYTE mask = 0x01;
71
72
58.3k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
58.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
66
    return NULL;
80
81
58.3k
  UNROLL(cBits, {
82
58.3k
    PIXEL data;
83
84
58.3k
    if (bitmask & mask)
85
58.3k
      data = fgPel;
86
58.3k
    else
87
58.3k
      data = BLACK_PIXEL;
88
89
58.3k
    DESTWRITEPIXEL(pbDest, data);
90
58.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
58.3k
  });
92
58.3k
  return pbDest;
93
58.3k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
21.4k
{
70
21.4k
  BYTE mask = 0x01;
71
72
21.4k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
21.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
24
    return NULL;
80
81
21.3k
  UNROLL(cBits, {
82
21.3k
    PIXEL data;
83
84
21.3k
    if (bitmask & mask)
85
21.3k
      data = fgPel;
86
21.3k
    else
87
21.3k
      data = BLACK_PIXEL;
88
89
21.3k
    DESTWRITEPIXEL(pbDest, data);
90
21.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
21.3k
  });
92
21.3k
  return pbDest;
93
21.3k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
36.9k
{
70
36.9k
  BYTE mask = 0x01;
71
72
36.9k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
36.9k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
42
    return NULL;
80
81
36.9k
  UNROLL(cBits, {
82
36.9k
    PIXEL data;
83
84
36.9k
    if (bitmask & mask)
85
36.9k
      data = fgPel;
86
36.9k
    else
87
36.9k
      data = BLACK_PIXEL;
88
89
36.9k
    DESTWRITEPIXEL(pbDest, data);
90
36.9k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
36.9k
  });
92
36.9k
  return pbDest;
93
36.9k
}
Unexecuted instantiation: interleaved.c:WriteFirstLineFgBgImage8to8
94
95
/**
96
 * Decompress an RLE compressed bitmap.
97
 */
98
static inline BOOL RLEDECOMPRESS(const BYTE* WINPR_RESTRICT pbSrcBuffer, UINT32 cbSrcBuffer,
99
                                 BYTE* WINPR_RESTRICT pbDestBuffer, UINT32 rowDelta, UINT32 width,
100
                                 UINT32 height)
101
13.5k
{
102
13.5k
  const BYTE* pbSrc = pbSrcBuffer;
103
13.5k
  BYTE* pbDest = pbDestBuffer;
104
13.5k
  PIXEL temp = 0;
105
13.5k
  PIXEL fgPel = WHITE_PIXEL;
106
13.5k
  BOOL fInsertFgPel = FALSE;
107
13.5k
  BOOL fFirstLine = TRUE;
108
13.5k
  BYTE bitmask = 0;
109
13.5k
  PIXEL pixelA = 0;
110
13.5k
  PIXEL pixelB = 0;
111
13.5k
  UINT32 runLength = 0;
112
13.5k
  UINT32 code = 0;
113
13.5k
  UINT32 advance = 0;
114
13.5k
  RLEEXTRA
115
116
13.5k
  if ((rowDelta == 0) || (rowDelta < width))
117
0
  {
118
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
119
0
             width);
120
0
    return FALSE;
121
0
  }
122
123
13.5k
  if (!pbSrcBuffer || !pbDestBuffer)
124
0
  {
125
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,
126
0
             pbDestBuffer);
127
0
    return FALSE;
128
0
  }
129
130
13.5k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
13.5k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
414k
  while (pbSrc < pbEnd)
134
411k
  {
135
    /* Watch out for the end of the first scanline. */
136
411k
    if (fFirstLine)
137
68.6k
    {
138
68.6k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
9.98k
      {
140
9.98k
        fFirstLine = FALSE;
141
9.98k
        fInsertFgPel = FALSE;
142
9.98k
      }
143
68.6k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
411k
    code = ExtractCodeId(*pbSrc);
150
151
#if defined(WITH_DEBUG_CODECS)
152
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
153
#endif
154
155
    /* Handle Background Run Orders. */
156
411k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
282k
    {
158
282k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
282k
      if (advance == 0)
160
488
        return FALSE;
161
281k
      pbSrc = pbSrc + advance;
162
163
281k
      if (fFirstLine)
164
29.7k
      {
165
29.7k
        if (fInsertFgPel)
166
20.7k
        {
167
20.7k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
20.7k
          DESTWRITEPIXEL(pbDest, fgPel);
171
20.7k
          runLength = runLength - 1;
172
20.7k
        }
173
174
29.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
65
          return FALSE;
176
177
29.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
29.6k
      }
179
252k
      else
180
252k
      {
181
252k
        if (fInsertFgPel)
182
228k
        {
183
228k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
228k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
41
            return FALSE;
187
188
228k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
228k
          runLength--;
190
228k
        }
191
192
252k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
863
          return FALSE;
194
195
251k
        UNROLL(runLength, {
196
251k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
251k
          DESTWRITEPIXEL(pbDest, temp);
198
251k
        });
199
251k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
280k
      fInsertFgPel = TRUE;
203
280k
      continue;
204
281k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
128k
    fInsertFgPel = FALSE;
209
210
128k
    switch (code)
211
128k
    {
212
      /* Handle Foreground Run Orders. */
213
23.4k
      case REGULAR_FG_RUN:
214
25.5k
      case MEGA_MEGA_FG_RUN:
215
40.9k
      case LITE_SET_FG_FG_RUN:
216
41.7k
      case MEGA_MEGA_SET_FG_RUN:
217
41.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
41.7k
        if (advance == 0)
219
93
          return FALSE;
220
41.6k
        pbSrc = pbSrc + advance;
221
222
41.6k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
16.1k
        {
224
16.1k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
189
            return FALSE;
226
15.9k
          SRCREADPIXEL(fgPel, pbSrc);
227
15.9k
        }
228
229
41.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
260
          return FALSE;
231
232
41.1k
        if (fFirstLine)
233
8.64k
        {
234
8.64k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
8.64k
        }
236
32.5k
        else
237
32.5k
        {
238
32.5k
          UNROLL(runLength, {
239
32.5k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
32.5k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
32.5k
          });
242
32.5k
        }
243
244
41.1k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
8.39k
      case LITE_DITHERED_RUN:
248
9.61k
      case MEGA_MEGA_DITHERED_RUN:
249
9.61k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
9.61k
        if (advance == 0)
251
49
          return FALSE;
252
9.56k
        pbSrc = pbSrc + advance;
253
9.56k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
204
          return FALSE;
255
9.36k
        SRCREADPIXEL(pixelA, pbSrc);
256
9.36k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
367
          return FALSE;
258
8.99k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
8.99k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
120
          return FALSE;
262
263
8.87k
        UNROLL(runLength, {
264
8.87k
          DESTWRITEPIXEL(pbDest, pixelA);
265
8.87k
          DESTWRITEPIXEL(pbDest, pixelB);
266
8.87k
        });
267
8.87k
        break;
268
269
      /* Handle Color Run Orders. */
270
32.4k
      case REGULAR_COLOR_RUN:
271
33.3k
      case MEGA_MEGA_COLOR_RUN:
272
33.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
33.3k
        if (advance == 0)
274
49
          return FALSE;
275
33.3k
        pbSrc = pbSrc + advance;
276
33.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
248
          return FALSE;
278
33.0k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
33.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
169
          return FALSE;
282
283
32.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
32.9k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
10.8k
      case REGULAR_FGBG_IMAGE:
288
12.8k
      case MEGA_MEGA_FGBG_IMAGE:
289
15.3k
      case LITE_SET_FG_FGBG_IMAGE:
290
16.5k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
16.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
16.5k
        if (advance == 0)
293
151
          return FALSE;
294
16.3k
        pbSrc = pbSrc + advance;
295
296
16.3k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.59k
        {
298
3.59k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
150
            return FALSE;
300
3.44k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.44k
        }
302
303
16.2k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
564
          return FALSE;
305
15.6k
        if (fFirstLine)
306
4.58k
        {
307
60.0k
          while (runLength > 8)
308
55.4k
          {
309
55.4k
            bitmask = *pbSrc;
310
55.4k
            pbSrc = pbSrc + 1;
311
55.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
55.4k
            if (!pbDest)
314
63
              return FALSE;
315
316
55.4k
            runLength = runLength - 8;
317
55.4k
          }
318
4.58k
        }
319
11.0k
        else
320
11.0k
        {
321
68.7k
          while (runLength > 8)
322
57.7k
          {
323
57.7k
            bitmask = *pbSrc++;
324
325
57.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
57.7k
            if (!pbDest)
328
49
              return FALSE;
329
330
57.6k
            runLength = runLength - 8;
331
57.6k
          }
332
11.0k
        }
333
334
15.5k
        if (runLength > 0)
335
12.9k
        {
336
12.9k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
93
            return FALSE;
338
12.8k
          bitmask = *pbSrc++;
339
340
12.8k
          if (fFirstLine)
341
2.34k
          {
342
2.34k
            pbDest =
343
2.34k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.34k
          }
345
10.4k
          else
346
10.4k
          {
347
10.4k
            pbDest =
348
10.4k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
10.4k
          }
350
351
12.8k
          if (!pbDest)
352
11
            return FALSE;
353
12.8k
        }
354
355
15.4k
        break;
356
357
      /* Handle Color Image Orders. */
358
15.4k
      case REGULAR_COLOR_IMAGE:
359
11.6k
      case MEGA_MEGA_COLOR_IMAGE:
360
11.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
11.6k
        if (advance == 0)
362
47
          return FALSE;
363
11.5k
        pbSrc = pbSrc + advance;
364
11.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
104
          return FALSE;
366
11.4k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
752
          return FALSE;
368
369
10.7k
        UNROLL(runLength, {
370
3.48k
          SRCREADPIXEL(temp, pbSrc);
371
3.48k
          DESTWRITEPIXEL(pbDest, temp);
372
3.48k
        });
373
7.22k
        break;
374
375
      /* Handle Special Order 1. */
376
7.22k
      case SPECIAL_FGBG_1:
377
2.32k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.32k
        pbSrc = pbSrc + 1;
380
381
2.32k
        if (fFirstLine)
382
317
        {
383
317
          pbDest =
384
317
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
317
        }
386
2.00k
        else
387
2.00k
        {
388
2.00k
          pbDest =
389
2.00k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.00k
        }
391
392
2.32k
        if (!pbDest)
393
3
          return FALSE;
394
395
2.32k
        break;
396
397
      /* Handle Special Order 2. */
398
2.63k
      case SPECIAL_FGBG_2:
399
2.63k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.63k
        pbSrc = pbSrc + 1;
402
403
2.63k
        if (fFirstLine)
404
243
        {
405
243
          pbDest =
406
243
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
243
        }
408
2.39k
        else
409
2.39k
        {
410
2.39k
          pbDest =
411
2.39k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.39k
        }
413
414
2.63k
        if (!pbDest)
415
3
          return FALSE;
416
417
2.63k
        break;
418
419
      /* Handle White Order. */
420
3.64k
      case SPECIAL_WHITE:
421
3.64k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.64k
        pbSrc = pbSrc + 1;
424
425
3.64k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
3.64k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.64k
        break;
430
431
      /* Handle Black Order. */
432
2.67k
      case SPECIAL_BLACK:
433
2.67k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.67k
        pbSrc = pbSrc + 1;
436
437
2.67k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
6
          return FALSE;
439
440
2.66k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.66k
        break;
442
443
4.71k
      default:
444
4.71k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.71k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.71k
        return FALSE;
447
128k
    }
448
128k
  }
449
450
3.62k
  return TRUE;
451
13.5k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
4.51k
{
102
4.51k
  const BYTE* pbSrc = pbSrcBuffer;
103
4.51k
  BYTE* pbDest = pbDestBuffer;
104
4.51k
  PIXEL temp = 0;
105
4.51k
  PIXEL fgPel = WHITE_PIXEL;
106
4.51k
  BOOL fInsertFgPel = FALSE;
107
4.51k
  BOOL fFirstLine = TRUE;
108
4.51k
  BYTE bitmask = 0;
109
4.51k
  PIXEL pixelA = 0;
110
4.51k
  PIXEL pixelB = 0;
111
4.51k
  UINT32 runLength = 0;
112
4.51k
  UINT32 code = 0;
113
4.51k
  UINT32 advance = 0;
114
4.51k
  RLEEXTRA
115
116
4.51k
  if ((rowDelta == 0) || (rowDelta < width))
117
0
  {
118
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
119
0
             width);
120
0
    return FALSE;
121
0
  }
122
123
4.51k
  if (!pbSrcBuffer || !pbDestBuffer)
124
0
  {
125
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,
126
0
             pbDestBuffer);
127
0
    return FALSE;
128
0
  }
129
130
4.51k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
4.51k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
134k
  while (pbSrc < pbEnd)
134
132k
  {
135
    /* Watch out for the end of the first scanline. */
136
132k
    if (fFirstLine)
137
22.9k
    {
138
22.9k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
3.17k
      {
140
3.17k
        fFirstLine = FALSE;
141
3.17k
        fInsertFgPel = FALSE;
142
3.17k
      }
143
22.9k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
132k
    code = ExtractCodeId(*pbSrc);
150
151
#if defined(WITH_DEBUG_CODECS)
152
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
153
#endif
154
155
    /* Handle Background Run Orders. */
156
132k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
91.5k
    {
158
91.5k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
91.5k
      if (advance == 0)
160
128
        return FALSE;
161
91.3k
      pbSrc = pbSrc + advance;
162
163
91.3k
      if (fFirstLine)
164
10.0k
      {
165
10.0k
        if (fInsertFgPel)
166
6.89k
        {
167
6.89k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
6.89k
          DESTWRITEPIXEL(pbDest, fgPel);
171
6.89k
          runLength = runLength - 1;
172
6.89k
        }
173
174
10.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
23
          return FALSE;
176
177
10.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
10.0k
      }
179
81.3k
      else
180
81.3k
      {
181
81.3k
        if (fInsertFgPel)
182
74.0k
        {
183
74.0k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
74.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
11
            return FALSE;
187
188
74.0k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
74.0k
          runLength--;
190
74.0k
        }
191
192
81.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
267
          return FALSE;
194
195
81.0k
        UNROLL(runLength, {
196
81.0k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
81.0k
          DESTWRITEPIXEL(pbDest, temp);
198
81.0k
        });
199
81.0k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
91.0k
      fInsertFgPel = TRUE;
203
91.0k
      continue;
204
91.3k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
41.3k
    fInsertFgPel = FALSE;
209
210
41.3k
    switch (code)
211
41.3k
    {
212
      /* Handle Foreground Run Orders. */
213
7.44k
      case REGULAR_FG_RUN:
214
8.14k
      case MEGA_MEGA_FG_RUN:
215
12.8k
      case LITE_SET_FG_FG_RUN:
216
13.0k
      case MEGA_MEGA_SET_FG_RUN:
217
13.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
13.0k
        if (advance == 0)
219
29
          return FALSE;
220
13.0k
        pbSrc = pbSrc + advance;
221
222
13.0k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
4.93k
        {
224
4.93k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
71
            return FALSE;
226
4.86k
          SRCREADPIXEL(fgPel, pbSrc);
227
4.86k
        }
228
229
12.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
66
          return FALSE;
231
232
12.9k
        if (fFirstLine)
233
2.96k
        {
234
2.96k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
2.96k
        }
236
9.96k
        else
237
9.96k
        {
238
9.96k
          UNROLL(runLength, {
239
9.96k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
9.96k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
9.96k
          });
242
9.96k
        }
243
244
12.9k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
2.74k
      case LITE_DITHERED_RUN:
248
3.19k
      case MEGA_MEGA_DITHERED_RUN:
249
3.19k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
3.19k
        if (advance == 0)
251
13
          return FALSE;
252
3.17k
        pbSrc = pbSrc + advance;
253
3.17k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
78
          return FALSE;
255
3.10k
        SRCREADPIXEL(pixelA, pbSrc);
256
3.10k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
175
          return FALSE;
258
2.92k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
2.92k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
36
          return FALSE;
262
263
2.88k
        UNROLL(runLength, {
264
2.88k
          DESTWRITEPIXEL(pbDest, pixelA);
265
2.88k
          DESTWRITEPIXEL(pbDest, pixelB);
266
2.88k
        });
267
2.88k
        break;
268
269
      /* Handle Color Run Orders. */
270
10.4k
      case REGULAR_COLOR_RUN:
271
10.7k
      case MEGA_MEGA_COLOR_RUN:
272
10.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
10.7k
        if (advance == 0)
274
17
          return FALSE;
275
10.7k
        pbSrc = pbSrc + advance;
276
10.7k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
98
          return FALSE;
278
10.6k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
10.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
63
          return FALSE;
282
283
10.5k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
10.5k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
3.39k
      case REGULAR_FGBG_IMAGE:
288
4.03k
      case MEGA_MEGA_FGBG_IMAGE:
289
4.83k
      case LITE_SET_FG_FGBG_IMAGE:
290
5.15k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
5.15k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
5.15k
        if (advance == 0)
293
47
          return FALSE;
294
5.10k
        pbSrc = pbSrc + advance;
295
296
5.10k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.09k
        {
298
1.09k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
58
            return FALSE;
300
1.03k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.03k
        }
302
303
5.05k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
186
          return FALSE;
305
4.86k
        if (fFirstLine)
306
1.53k
        {
307
21.8k
          while (runLength > 8)
308
20.3k
          {
309
20.3k
            bitmask = *pbSrc;
310
20.3k
            pbSrc = pbSrc + 1;
311
20.3k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
20.3k
            if (!pbDest)
314
23
              return FALSE;
315
316
20.3k
            runLength = runLength - 8;
317
20.3k
          }
318
1.53k
        }
319
3.32k
        else
320
3.32k
        {
321
19.4k
          while (runLength > 8)
322
16.1k
          {
323
16.1k
            bitmask = *pbSrc++;
324
325
16.1k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
16.1k
            if (!pbDest)
328
13
              return FALSE;
329
330
16.1k
            runLength = runLength - 8;
331
16.1k
          }
332
3.32k
        }
333
334
4.82k
        if (runLength > 0)
335
4.03k
        {
336
4.03k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
33
            return FALSE;
338
3.99k
          bitmask = *pbSrc++;
339
340
3.99k
          if (fFirstLine)
341
859
          {
342
859
            pbDest =
343
859
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
859
          }
345
3.13k
          else
346
3.13k
          {
347
3.13k
            pbDest =
348
3.13k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
3.13k
          }
350
351
3.99k
          if (!pbDest)
352
5
            return FALSE;
353
3.99k
        }
354
355
4.79k
        break;
356
357
      /* Handle Color Image Orders. */
358
4.79k
      case REGULAR_COLOR_IMAGE:
359
3.76k
      case MEGA_MEGA_COLOR_IMAGE:
360
3.76k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
3.76k
        if (advance == 0)
362
17
          return FALSE;
363
3.75k
        pbSrc = pbSrc + advance;
364
3.75k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
34
          return FALSE;
366
3.71k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
234
          return FALSE;
368
369
3.48k
        UNROLL(runLength, {
370
3.48k
          SRCREADPIXEL(temp, pbSrc);
371
3.48k
          DESTWRITEPIXEL(pbDest, temp);
372
3.48k
        });
373
3.48k
        break;
374
375
      /* Handle Special Order 1. */
376
791
      case SPECIAL_FGBG_1:
377
791
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
791
        pbSrc = pbSrc + 1;
380
381
791
        if (fFirstLine)
382
99
        {
383
99
          pbDest =
384
99
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
99
        }
386
692
        else
387
692
        {
388
692
          pbDest =
389
692
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
692
        }
391
392
791
        if (!pbDest)
393
1
          return FALSE;
394
395
790
        break;
396
397
      /* Handle Special Order 2. */
398
850
      case SPECIAL_FGBG_2:
399
850
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
850
        pbSrc = pbSrc + 1;
402
403
850
        if (fFirstLine)
404
87
        {
405
87
          pbDest =
406
87
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
87
        }
408
763
        else
409
763
        {
410
763
          pbDest =
411
763
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
763
        }
413
414
850
        if (!pbDest)
415
1
          return FALSE;
416
417
849
        break;
418
419
      /* Handle White Order. */
420
1.18k
      case SPECIAL_WHITE:
421
1.18k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.18k
        pbSrc = pbSrc + 1;
424
425
1.18k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.18k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.18k
        break;
430
431
      /* Handle Black Order. */
432
950
      case SPECIAL_BLACK:
433
950
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
950
        pbSrc = pbSrc + 1;
436
437
950
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
948
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
948
        break;
442
443
1.58k
      default:
444
1.58k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
1.58k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
1.58k
        return FALSE;
447
41.3k
    }
448
41.3k
  }
449
450
1.20k
  return TRUE;
451
4.51k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
9.03k
{
102
9.03k
  const BYTE* pbSrc = pbSrcBuffer;
103
9.03k
  BYTE* pbDest = pbDestBuffer;
104
9.03k
  PIXEL temp = 0;
105
9.03k
  PIXEL fgPel = WHITE_PIXEL;
106
9.03k
  BOOL fInsertFgPel = FALSE;
107
9.03k
  BOOL fFirstLine = TRUE;
108
9.03k
  BYTE bitmask = 0;
109
9.03k
  PIXEL pixelA = 0;
110
9.03k
  PIXEL pixelB = 0;
111
9.03k
  UINT32 runLength = 0;
112
9.03k
  UINT32 code = 0;
113
9.03k
  UINT32 advance = 0;
114
9.03k
  RLEEXTRA
115
116
9.03k
  if ((rowDelta == 0) || (rowDelta < width))
117
0
  {
118
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
119
0
             width);
120
0
    return FALSE;
121
0
  }
122
123
9.03k
  if (!pbSrcBuffer || !pbDestBuffer)
124
0
  {
125
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,
126
0
             pbDestBuffer);
127
0
    return FALSE;
128
0
  }
129
130
9.03k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
9.03k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
280k
  while (pbSrc < pbEnd)
134
278k
  {
135
    /* Watch out for the end of the first scanline. */
136
278k
    if (fFirstLine)
137
45.7k
    {
138
45.7k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
6.81k
      {
140
6.81k
        fFirstLine = FALSE;
141
6.81k
        fInsertFgPel = FALSE;
142
6.81k
      }
143
45.7k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
278k
    code = ExtractCodeId(*pbSrc);
150
151
#if defined(WITH_DEBUG_CODECS)
152
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
153
#endif
154
155
    /* Handle Background Run Orders. */
156
278k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
190k
    {
158
190k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
190k
      if (advance == 0)
160
360
        return FALSE;
161
190k
      pbSrc = pbSrc + advance;
162
163
190k
      if (fFirstLine)
164
19.6k
      {
165
19.6k
        if (fInsertFgPel)
166
13.8k
        {
167
13.8k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
13.8k
          DESTWRITEPIXEL(pbDest, fgPel);
171
13.8k
          runLength = runLength - 1;
172
13.8k
        }
173
174
19.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
42
          return FALSE;
176
177
19.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
19.6k
      }
179
170k
      else
180
170k
      {
181
170k
        if (fInsertFgPel)
182
154k
        {
183
154k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
154k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
30
            return FALSE;
187
188
154k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
154k
          runLength--;
190
154k
        }
191
192
170k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
596
          return FALSE;
194
195
170k
        UNROLL(runLength, {
196
170k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
170k
          DESTWRITEPIXEL(pbDest, temp);
198
170k
        });
199
170k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
189k
      fInsertFgPel = TRUE;
203
189k
      continue;
204
190k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
87.5k
    fInsertFgPel = FALSE;
209
210
87.5k
    switch (code)
211
87.5k
    {
212
      /* Handle Foreground Run Orders. */
213
15.9k
      case REGULAR_FG_RUN:
214
17.4k
      case MEGA_MEGA_FG_RUN:
215
28.1k
      case LITE_SET_FG_FG_RUN:
216
28.6k
      case MEGA_MEGA_SET_FG_RUN:
217
28.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
28.6k
        if (advance == 0)
219
64
          return FALSE;
220
28.5k
        pbSrc = pbSrc + advance;
221
222
28.5k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
11.1k
        {
224
11.1k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
118
            return FALSE;
226
11.0k
          SRCREADPIXEL(fgPel, pbSrc);
227
11.0k
        }
228
229
28.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
194
          return FALSE;
231
232
28.2k
        if (fFirstLine)
233
5.68k
        {
234
5.68k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
5.68k
        }
236
22.5k
        else
237
22.5k
        {
238
22.5k
          UNROLL(runLength, {
239
22.5k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
22.5k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
22.5k
          });
242
22.5k
        }
243
244
28.2k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
5.64k
      case LITE_DITHERED_RUN:
248
6.42k
      case MEGA_MEGA_DITHERED_RUN:
249
6.42k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
6.42k
        if (advance == 0)
251
36
          return FALSE;
252
6.38k
        pbSrc = pbSrc + advance;
253
6.38k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
126
          return FALSE;
255
6.26k
        SRCREADPIXEL(pixelA, pbSrc);
256
6.26k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
192
          return FALSE;
258
6.06k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
6.06k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
84
          return FALSE;
262
263
5.98k
        UNROLL(runLength, {
264
5.98k
          DESTWRITEPIXEL(pbDest, pixelA);
265
5.98k
          DESTWRITEPIXEL(pbDest, pixelB);
266
5.98k
        });
267
5.98k
        break;
268
269
      /* Handle Color Run Orders. */
270
22.0k
      case REGULAR_COLOR_RUN:
271
22.6k
      case MEGA_MEGA_COLOR_RUN:
272
22.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
22.6k
        if (advance == 0)
274
32
          return FALSE;
275
22.6k
        pbSrc = pbSrc + advance;
276
22.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
150
          return FALSE;
278
22.4k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
22.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
106
          return FALSE;
282
283
22.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
22.3k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
7.48k
      case REGULAR_FGBG_IMAGE:
288
8.78k
      case MEGA_MEGA_FGBG_IMAGE:
289
10.5k
      case LITE_SET_FG_FGBG_IMAGE:
290
11.3k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
11.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
11.3k
        if (advance == 0)
293
104
          return FALSE;
294
11.2k
        pbSrc = pbSrc + advance;
295
296
11.2k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
2.50k
        {
298
2.50k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
92
            return FALSE;
300
2.41k
          SRCREADPIXEL(fgPel, pbSrc);
301
2.41k
        }
302
303
11.1k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
378
          return FALSE;
305
10.7k
        if (fFirstLine)
306
3.04k
        {
307
38.1k
          while (runLength > 8)
308
35.1k
          {
309
35.1k
            bitmask = *pbSrc;
310
35.1k
            pbSrc = pbSrc + 1;
311
35.1k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
35.1k
            if (!pbDest)
314
40
              return FALSE;
315
316
35.0k
            runLength = runLength - 8;
317
35.0k
          }
318
3.04k
        }
319
7.73k
        else
320
7.73k
        {
321
49.2k
          while (runLength > 8)
322
41.5k
          {
323
41.5k
            bitmask = *pbSrc++;
324
325
41.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
41.5k
            if (!pbDest)
328
36
              return FALSE;
329
330
41.4k
            runLength = runLength - 8;
331
41.4k
          }
332
7.73k
        }
333
334
10.7k
        if (runLength > 0)
335
8.87k
        {
336
8.87k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
60
            return FALSE;
338
8.81k
          bitmask = *pbSrc++;
339
340
8.81k
          if (fFirstLine)
341
1.48k
          {
342
1.48k
            pbDest =
343
1.48k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.48k
          }
345
7.33k
          else
346
7.33k
          {
347
7.33k
            pbDest =
348
7.33k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
7.33k
          }
350
351
8.81k
          if (!pbDest)
352
6
            return FALSE;
353
8.81k
        }
354
355
10.6k
        break;
356
357
      /* Handle Color Image Orders. */
358
10.6k
      case REGULAR_COLOR_IMAGE:
359
7.84k
      case MEGA_MEGA_COLOR_IMAGE:
360
7.84k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
7.84k
        if (advance == 0)
362
30
          return FALSE;
363
7.81k
        pbSrc = pbSrc + advance;
364
7.81k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
70
          return FALSE;
366
7.74k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
518
          return FALSE;
368
369
7.22k
        UNROLL(runLength, {
370
7.22k
          SRCREADPIXEL(temp, pbSrc);
371
7.22k
          DESTWRITEPIXEL(pbDest, temp);
372
7.22k
        });
373
7.22k
        break;
374
375
      /* Handle Special Order 1. */
376
7.22k
      case SPECIAL_FGBG_1:
377
1.53k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.53k
        pbSrc = pbSrc + 1;
380
381
1.53k
        if (fFirstLine)
382
218
        {
383
218
          pbDest =
384
218
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
218
        }
386
1.31k
        else
387
1.31k
        {
388
1.31k
          pbDest =
389
1.31k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.31k
        }
391
392
1.53k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.53k
        break;
396
397
      /* Handle Special Order 2. */
398
1.78k
      case SPECIAL_FGBG_2:
399
1.78k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.78k
        pbSrc = pbSrc + 1;
402
403
1.78k
        if (fFirstLine)
404
156
        {
405
156
          pbDest =
406
156
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
156
        }
408
1.63k
        else
409
1.63k
        {
410
1.63k
          pbDest =
411
1.63k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.63k
        }
413
414
1.78k
        if (!pbDest)
415
2
          return FALSE;
416
417
1.78k
        break;
418
419
      /* Handle White Order. */
420
2.46k
      case SPECIAL_WHITE:
421
2.46k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.46k
        pbSrc = pbSrc + 1;
424
425
2.46k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
2.46k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.46k
        break;
430
431
      /* Handle Black Order. */
432
1.72k
      case SPECIAL_BLACK:
433
1.72k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.72k
        pbSrc = pbSrc + 1;
436
437
1.72k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
4
          return FALSE;
439
440
1.72k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.72k
        break;
442
443
3.12k
      default:
444
3.12k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
3.12k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
3.12k
        return FALSE;
447
87.5k
    }
448
87.5k
  }
449
450
2.42k
  return TRUE;
451
9.03k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8