Coverage Report

Created: 2026-01-10 06:35

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
97.6k
{
35
97.6k
  PIXEL xorPixel = 0;
36
97.6k
  BYTE mask = 0x01;
37
38
97.6k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
97.6k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
81
    return NULL;
46
47
97.5k
  UNROLL(cBits, {
48
97.5k
    PIXEL data = 0;
49
97.5k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
97.5k
    if (bitmask & mask)
52
97.5k
      data = xorPixel ^ fgPel;
53
97.5k
    else
54
97.5k
      data = xorPixel;
55
56
97.5k
    DESTWRITEPIXEL(pbDest, data);
57
97.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
97.5k
  });
59
97.5k
  return pbDest;
60
97.5k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
26.1k
{
35
26.1k
  PIXEL xorPixel = 0;
36
26.1k
  BYTE mask = 0x01;
37
38
26.1k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
26.1k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
23
    return NULL;
46
47
26.1k
  UNROLL(cBits, {
48
26.1k
    PIXEL data = 0;
49
26.1k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
26.1k
    if (bitmask & mask)
52
26.1k
      data = xorPixel ^ fgPel;
53
26.1k
    else
54
26.1k
      data = xorPixel;
55
56
26.1k
    DESTWRITEPIXEL(pbDest, data);
57
26.1k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
26.1k
  });
59
26.1k
  return pbDest;
60
26.1k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
71.4k
{
35
71.4k
  PIXEL xorPixel = 0;
36
71.4k
  BYTE mask = 0x01;
37
38
71.4k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
71.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
58
    return NULL;
46
47
71.4k
  UNROLL(cBits, {
48
71.4k
    PIXEL data = 0;
49
71.4k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
71.4k
    if (bitmask & mask)
52
71.4k
      data = xorPixel ^ fgPel;
53
71.4k
    else
54
71.4k
      data = xorPixel;
55
56
71.4k
    DESTWRITEPIXEL(pbDest, data);
57
71.4k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
71.4k
  });
59
71.4k
  return pbDest;
60
71.4k
}
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
69.4k
{
70
69.4k
  BYTE mask = 0x01;
71
72
69.4k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
69.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
62
    return NULL;
80
81
69.3k
  UNROLL(cBits, {
82
69.3k
    PIXEL data;
83
84
69.3k
    if (bitmask & mask)
85
69.3k
      data = fgPel;
86
69.3k
    else
87
69.3k
      data = BLACK_PIXEL;
88
89
69.3k
    DESTWRITEPIXEL(pbDest, data);
90
69.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
69.3k
  });
92
69.3k
  return pbDest;
93
69.3k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
26.2k
{
70
26.2k
  BYTE mask = 0x01;
71
72
26.2k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
26.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
24
    return NULL;
80
81
26.2k
  UNROLL(cBits, {
82
26.2k
    PIXEL data;
83
84
26.2k
    if (bitmask & mask)
85
26.2k
      data = fgPel;
86
26.2k
    else
87
26.2k
      data = BLACK_PIXEL;
88
89
26.2k
    DESTWRITEPIXEL(pbDest, data);
90
26.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
26.2k
  });
92
26.2k
  return pbDest;
93
26.2k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
43.1k
{
70
43.1k
  BYTE mask = 0x01;
71
72
43.1k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
43.1k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
38
    return NULL;
80
81
43.1k
  UNROLL(cBits, {
82
43.1k
    PIXEL data;
83
84
43.1k
    if (bitmask & mask)
85
43.1k
      data = fgPel;
86
43.1k
    else
87
43.1k
      data = BLACK_PIXEL;
88
89
43.1k
    DESTWRITEPIXEL(pbDest, data);
90
43.1k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
43.1k
  });
92
43.1k
  return pbDest;
93
43.1k
}
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
18.1k
{
102
18.1k
  const BYTE* pbSrc = pbSrcBuffer;
103
18.1k
  BYTE* pbDest = pbDestBuffer;
104
18.1k
  PIXEL temp = 0;
105
18.1k
  PIXEL fgPel = WHITE_PIXEL;
106
18.1k
  BOOL fInsertFgPel = FALSE;
107
18.1k
  BOOL fFirstLine = TRUE;
108
18.1k
  BYTE bitmask = 0;
109
18.1k
  PIXEL pixelA = 0;
110
18.1k
  PIXEL pixelB = 0;
111
18.1k
  UINT32 runLength = 0;
112
18.1k
  UINT32 code = 0;
113
18.1k
  UINT32 advance = 0;
114
18.1k
  RLEEXTRA
115
116
18.1k
  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
18.1k
  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
18.1k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
18.1k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
528k
  while (pbSrc < pbEnd)
134
524k
  {
135
    /* Watch out for the end of the first scanline. */
136
524k
    if (fFirstLine)
137
85.3k
    {
138
85.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
13.1k
      {
140
13.1k
        fFirstLine = FALSE;
141
13.1k
        fInsertFgPel = FALSE;
142
13.1k
      }
143
85.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
524k
    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
524k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
339k
    {
158
339k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
339k
      if (advance == 0)
160
671
        return FALSE;
161
338k
      pbSrc = pbSrc + advance;
162
163
338k
      if (fFirstLine)
164
36.3k
      {
165
36.3k
        if (fInsertFgPel)
166
24.7k
        {
167
24.7k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
24.7k
          DESTWRITEPIXEL(pbDest, fgPel);
171
24.7k
          runLength = runLength - 1;
172
24.7k
        }
173
174
36.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
64
          return FALSE;
176
177
36.2k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
36.2k
      }
179
302k
      else
180
302k
      {
181
302k
        if (fInsertFgPel)
182
272k
        {
183
272k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
272k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
63
            return FALSE;
187
188
272k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
272k
          runLength--;
190
272k
        }
191
192
302k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
998
          return FALSE;
194
195
301k
        UNROLL(runLength, {
196
301k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
301k
          DESTWRITEPIXEL(pbDest, temp);
198
301k
        });
199
301k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
337k
      fInsertFgPel = TRUE;
203
337k
      continue;
204
338k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
184k
    fInsertFgPel = FALSE;
209
210
184k
    switch (code)
211
184k
    {
212
      /* Handle Foreground Run Orders. */
213
25.2k
      case REGULAR_FG_RUN:
214
27.6k
      case MEGA_MEGA_FG_RUN:
215
45.5k
      case LITE_SET_FG_FG_RUN:
216
46.6k
      case MEGA_MEGA_SET_FG_RUN:
217
46.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
46.6k
        if (advance == 0)
219
101
          return FALSE;
220
46.4k
        pbSrc = pbSrc + advance;
221
222
46.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.9k
        {
224
18.9k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
258
            return FALSE;
226
18.6k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.6k
        }
228
229
46.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
292
          return FALSE;
231
232
45.9k
        if (fFirstLine)
233
10.9k
        {
234
10.9k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.9k
        }
236
34.9k
        else
237
34.9k
        {
238
34.9k
          UNROLL(runLength, {
239
34.9k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
34.9k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
34.9k
          });
242
34.9k
        }
243
244
45.9k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
11.1k
      case LITE_DITHERED_RUN:
248
12.4k
      case MEGA_MEGA_DITHERED_RUN:
249
12.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
12.4k
        if (advance == 0)
251
67
          return FALSE;
252
12.3k
        pbSrc = pbSrc + advance;
253
12.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
269
          return FALSE;
255
12.0k
        SRCREADPIXEL(pixelA, pbSrc);
256
12.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
589
          return FALSE;
258
11.4k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
11.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
174
          return FALSE;
262
263
11.3k
        UNROLL(runLength, {
264
11.3k
          DESTWRITEPIXEL(pbDest, pixelA);
265
11.3k
          DESTWRITEPIXEL(pbDest, pixelB);
266
11.3k
        });
267
11.3k
        break;
268
269
      /* Handle Color Run Orders. */
270
68.0k
      case REGULAR_COLOR_RUN:
271
69.3k
      case MEGA_MEGA_COLOR_RUN:
272
69.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
69.3k
        if (advance == 0)
274
72
          return FALSE;
275
69.2k
        pbSrc = pbSrc + advance;
276
69.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
359
          return FALSE;
278
68.9k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
68.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
197
          return FALSE;
282
283
68.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
68.7k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
14.8k
      case REGULAR_FGBG_IMAGE:
288
17.4k
      case MEGA_MEGA_FGBG_IMAGE:
289
22.0k
      case LITE_SET_FG_FGBG_IMAGE:
290
23.2k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
23.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
23.2k
        if (advance == 0)
293
169
          return FALSE;
294
23.0k
        pbSrc = pbSrc + advance;
295
296
23.0k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
5.76k
        {
298
5.76k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
214
            return FALSE;
300
5.55k
          SRCREADPIXEL(fgPel, pbSrc);
301
5.55k
        }
302
303
22.8k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
875
          return FALSE;
305
21.9k
        if (fFirstLine)
306
5.95k
        {
307
71.6k
          while (runLength > 8)
308
65.7k
          {
309
65.7k
            bitmask = *pbSrc;
310
65.7k
            pbSrc = pbSrc + 1;
311
65.7k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
65.7k
            if (!pbDest)
314
59
              return FALSE;
315
316
65.7k
            runLength = runLength - 8;
317
65.7k
          }
318
5.95k
        }
319
16.0k
        else
320
16.0k
        {
321
92.4k
          while (runLength > 8)
322
76.4k
          {
323
76.4k
            bitmask = *pbSrc++;
324
325
76.4k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
76.4k
            if (!pbDest)
328
64
              return FALSE;
329
330
76.4k
            runLength = runLength - 8;
331
76.4k
          }
332
16.0k
        }
333
334
21.8k
        if (runLength > 0)
335
18.6k
        {
336
18.6k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
117
            return FALSE;
338
18.5k
          bitmask = *pbSrc++;
339
340
18.5k
          if (fFirstLine)
341
3.06k
          {
342
3.06k
            pbDest =
343
3.06k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
3.06k
          }
345
15.4k
          else
346
15.4k
          {
347
15.4k
            pbDest =
348
15.4k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
15.4k
          }
350
351
18.5k
          if (!pbDest)
352
11
            return FALSE;
353
18.5k
        }
354
355
21.7k
        break;
356
357
      /* Handle Color Image Orders. */
358
21.7k
      case REGULAR_COLOR_IMAGE:
359
13.7k
      case MEGA_MEGA_COLOR_IMAGE:
360
13.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
13.7k
        if (advance == 0)
362
50
          return FALSE;
363
13.7k
        pbSrc = pbSrc + advance;
364
13.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
125
          return FALSE;
366
13.6k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
990
          return FALSE;
368
369
12.6k
        UNROLL(runLength, {
370
3.75k
          SRCREADPIXEL(temp, pbSrc);
371
3.75k
          DESTWRITEPIXEL(pbDest, temp);
372
3.75k
        });
373
8.86k
        break;
374
375
      /* Handle Special Order 1. */
376
8.86k
      case SPECIAL_FGBG_1:
377
3.11k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
3.11k
        pbSrc = pbSrc + 1;
380
381
3.11k
        if (fFirstLine)
382
322
        {
383
322
          pbDest =
384
322
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
322
        }
386
2.79k
        else
387
2.79k
        {
388
2.79k
          pbDest =
389
2.79k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.79k
        }
391
392
3.11k
        if (!pbDest)
393
4
          return FALSE;
394
395
3.11k
        break;
396
397
      /* Handle Special Order 2. */
398
3.17k
      case SPECIAL_FGBG_2:
399
3.17k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.17k
        pbSrc = pbSrc + 1;
402
403
3.17k
        if (fFirstLine)
404
293
        {
405
293
          pbDest =
406
293
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
293
        }
408
2.88k
        else
409
2.88k
        {
410
2.88k
          pbDest =
411
2.88k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.88k
        }
413
414
3.17k
        if (!pbDest)
415
5
          return FALSE;
416
417
3.17k
        break;
418
419
      /* Handle White Order. */
420
3.63k
      case SPECIAL_WHITE:
421
3.63k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.63k
        pbSrc = pbSrc + 1;
424
425
3.63k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
5
          return FALSE;
427
428
3.62k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.62k
        break;
430
431
      /* Handle Black Order. */
432
2.68k
      case SPECIAL_BLACK:
433
2.68k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.68k
        pbSrc = pbSrc + 1;
436
437
2.68k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
2.67k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.67k
        break;
442
443
6.52k
      default:
444
6.52k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.52k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.52k
        return FALSE;
447
184k
    }
448
184k
  }
449
450
4.73k
  return TRUE;
451
18.1k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
6.04k
{
102
6.04k
  const BYTE* pbSrc = pbSrcBuffer;
103
6.04k
  BYTE* pbDest = pbDestBuffer;
104
6.04k
  PIXEL temp = 0;
105
6.04k
  PIXEL fgPel = WHITE_PIXEL;
106
6.04k
  BOOL fInsertFgPel = FALSE;
107
6.04k
  BOOL fFirstLine = TRUE;
108
6.04k
  BYTE bitmask = 0;
109
6.04k
  PIXEL pixelA = 0;
110
6.04k
  PIXEL pixelB = 0;
111
6.04k
  UINT32 runLength = 0;
112
6.04k
  UINT32 code = 0;
113
6.04k
  UINT32 advance = 0;
114
6.04k
  RLEEXTRA
115
116
6.04k
  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
6.04k
  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
6.04k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
6.04k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
175k
  while (pbSrc < pbEnd)
134
174k
  {
135
    /* Watch out for the end of the first scanline. */
136
174k
    if (fFirstLine)
137
28.6k
    {
138
28.6k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.17k
      {
140
4.17k
        fFirstLine = FALSE;
141
4.17k
        fInsertFgPel = FALSE;
142
4.17k
      }
143
28.6k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
174k
    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
174k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
110k
    {
158
110k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
110k
      if (advance == 0)
160
179
        return FALSE;
161
110k
      pbSrc = pbSrc + advance;
162
163
110k
      if (fFirstLine)
164
12.2k
      {
165
12.2k
        if (fInsertFgPel)
166
8.18k
        {
167
8.18k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.18k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.18k
          runLength = runLength - 1;
172
8.18k
        }
173
174
12.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
22
          return FALSE;
176
177
12.2k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.2k
      }
179
98.2k
      else
180
98.2k
      {
181
98.2k
        if (fInsertFgPel)
182
88.9k
        {
183
88.9k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
88.9k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
19
            return FALSE;
187
188
88.9k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
88.9k
          runLength--;
190
88.9k
        }
191
192
98.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
312
          return FALSE;
194
195
97.9k
        UNROLL(runLength, {
196
97.9k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
97.9k
          DESTWRITEPIXEL(pbDest, temp);
198
97.9k
        });
199
97.9k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
110k
      fInsertFgPel = TRUE;
203
110k
      continue;
204
110k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
63.5k
    fInsertFgPel = FALSE;
209
210
63.5k
    switch (code)
211
63.5k
    {
212
      /* Handle Foreground Run Orders. */
213
7.90k
      case REGULAR_FG_RUN:
214
8.65k
      case MEGA_MEGA_FG_RUN:
215
14.4k
      case LITE_SET_FG_FG_RUN:
216
14.8k
      case MEGA_MEGA_SET_FG_RUN:
217
14.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
14.8k
        if (advance == 0)
219
29
          return FALSE;
220
14.7k
        pbSrc = pbSrc + advance;
221
222
14.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
6.13k
        {
224
6.13k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
98
            return FALSE;
226
6.03k
          SRCREADPIXEL(fgPel, pbSrc);
227
6.03k
        }
228
229
14.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
76
          return FALSE;
231
232
14.6k
        if (fFirstLine)
233
3.76k
        {
234
3.76k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.76k
        }
236
10.8k
        else
237
10.8k
        {
238
10.8k
          UNROLL(runLength, {
239
10.8k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
10.8k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
10.8k
          });
242
10.8k
        }
243
244
14.6k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.80k
      case LITE_DITHERED_RUN:
248
4.23k
      case MEGA_MEGA_DITHERED_RUN:
249
4.23k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.23k
        if (advance == 0)
251
17
          return FALSE;
252
4.21k
        pbSrc = pbSrc + advance;
253
4.21k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
113
          return FALSE;
255
4.10k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.10k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
281
          return FALSE;
258
3.81k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.81k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
50
          return FALSE;
262
263
3.76k
        UNROLL(runLength, {
264
3.76k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.76k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.76k
        });
267
3.76k
        break;
268
269
      /* Handle Color Run Orders. */
270
26.1k
      case REGULAR_COLOR_RUN:
271
26.6k
      case MEGA_MEGA_COLOR_RUN:
272
26.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
26.6k
        if (advance == 0)
274
20
          return FALSE;
275
26.6k
        pbSrc = pbSrc + advance;
276
26.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
149
          return FALSE;
278
26.4k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
26.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
71
          return FALSE;
282
283
26.4k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
26.4k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.62k
      case REGULAR_FGBG_IMAGE:
288
5.47k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.94k
      case LITE_SET_FG_FGBG_IMAGE:
290
7.35k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
7.35k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
7.35k
        if (advance == 0)
293
51
          return FALSE;
294
7.30k
        pbSrc = pbSrc + advance;
295
296
7.30k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.85k
        {
298
1.85k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
80
            return FALSE;
300
1.77k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.77k
        }
302
303
7.22k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
273
          return FALSE;
305
6.94k
        if (fFirstLine)
306
2.09k
        {
307
26.9k
          while (runLength > 8)
308
24.8k
          {
309
24.8k
            bitmask = *pbSrc;
310
24.8k
            pbSrc = pbSrc + 1;
311
24.8k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
24.8k
            if (!pbDest)
314
23
              return FALSE;
315
316
24.8k
            runLength = runLength - 8;
317
24.8k
          }
318
2.09k
        }
319
4.85k
        else
320
4.85k
        {
321
24.4k
          while (runLength > 8)
322
19.5k
          {
323
19.5k
            bitmask = *pbSrc++;
324
325
19.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
19.5k
            if (!pbDest)
328
16
              return FALSE;
329
330
19.5k
            runLength = runLength - 8;
331
19.5k
          }
332
4.85k
        }
333
334
6.90k
        if (runLength > 0)
335
5.84k
        {
336
5.84k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
43
            return FALSE;
338
5.80k
          bitmask = *pbSrc++;
339
340
5.80k
          if (fFirstLine)
341
1.20k
          {
342
1.20k
            pbDest =
343
1.20k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.20k
          }
345
4.60k
          else
346
4.60k
          {
347
4.60k
            pbDest =
348
4.60k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
4.60k
          }
350
351
5.80k
          if (!pbDest)
352
5
            return FALSE;
353
5.80k
        }
354
355
6.86k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.86k
      case REGULAR_COLOR_IMAGE:
359
4.12k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.12k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.12k
        if (advance == 0)
362
16
          return FALSE;
363
4.10k
        pbSrc = pbSrc + advance;
364
4.10k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
37
          return FALSE;
366
4.07k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
320
          return FALSE;
368
369
3.75k
        UNROLL(runLength, {
370
3.75k
          SRCREADPIXEL(temp, pbSrc);
371
3.75k
          DESTWRITEPIXEL(pbDest, temp);
372
3.75k
        });
373
3.75k
        break;
374
375
      /* Handle Special Order 1. */
376
1.18k
      case SPECIAL_FGBG_1:
377
1.18k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.18k
        pbSrc = pbSrc + 1;
380
381
1.18k
        if (fFirstLine)
382
110
        {
383
110
          pbDest =
384
110
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
110
        }
386
1.07k
        else
387
1.07k
        {
388
1.07k
          pbDest =
389
1.07k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.07k
        }
391
392
1.18k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.17k
        break;
396
397
      /* Handle Special Order 2. */
398
1.17k
      case SPECIAL_FGBG_2:
399
966
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
966
        pbSrc = pbSrc + 1;
402
403
966
        if (fFirstLine)
404
99
        {
405
99
          pbDest =
406
99
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
99
        }
408
867
        else
409
867
        {
410
867
          pbDest =
411
867
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
867
        }
413
414
966
        if (!pbDest)
415
1
          return FALSE;
416
417
965
        break;
418
419
      /* Handle White Order. */
420
1.20k
      case SPECIAL_WHITE:
421
1.20k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.20k
        pbSrc = pbSrc + 1;
424
425
1.20k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.20k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.20k
        break;
430
431
      /* Handle Black Order. */
432
893
      case SPECIAL_BLACK:
433
893
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
893
        pbSrc = pbSrc + 1;
436
437
893
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
892
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
892
        break;
442
443
2.16k
      default:
444
2.16k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.16k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.16k
        return FALSE;
447
63.5k
    }
448
63.5k
  }
449
450
1.57k
  return TRUE;
451
6.04k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
12.0k
{
102
12.0k
  const BYTE* pbSrc = pbSrcBuffer;
103
12.0k
  BYTE* pbDest = pbDestBuffer;
104
12.0k
  PIXEL temp = 0;
105
12.0k
  PIXEL fgPel = WHITE_PIXEL;
106
12.0k
  BOOL fInsertFgPel = FALSE;
107
12.0k
  BOOL fFirstLine = TRUE;
108
12.0k
  BYTE bitmask = 0;
109
12.0k
  PIXEL pixelA = 0;
110
12.0k
  PIXEL pixelB = 0;
111
12.0k
  UINT32 runLength = 0;
112
12.0k
  UINT32 code = 0;
113
12.0k
  UINT32 advance = 0;
114
12.0k
  RLEEXTRA
115
116
12.0k
  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
12.0k
  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
12.0k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
12.0k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
353k
  while (pbSrc < pbEnd)
134
349k
  {
135
    /* Watch out for the end of the first scanline. */
136
349k
    if (fFirstLine)
137
56.7k
    {
138
56.7k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.95k
      {
140
8.95k
        fFirstLine = FALSE;
141
8.95k
        fInsertFgPel = FALSE;
142
8.95k
      }
143
56.7k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
349k
    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
349k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
228k
    {
158
228k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
228k
      if (advance == 0)
160
492
        return FALSE;
161
228k
      pbSrc = pbSrc + advance;
162
163
228k
      if (fFirstLine)
164
24.0k
      {
165
24.0k
        if (fInsertFgPel)
166
16.5k
        {
167
16.5k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
16.5k
          DESTWRITEPIXEL(pbDest, fgPel);
171
16.5k
          runLength = runLength - 1;
172
16.5k
        }
173
174
24.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
42
          return FALSE;
176
177
24.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
24.0k
      }
179
204k
      else
180
204k
      {
181
204k
        if (fInsertFgPel)
182
183k
        {
183
183k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
183k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
44
            return FALSE;
187
188
183k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
183k
          runLength--;
190
183k
        }
191
192
204k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
686
          return FALSE;
194
195
203k
        UNROLL(runLength, {
196
203k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
203k
          DESTWRITEPIXEL(pbDest, temp);
198
203k
        });
199
203k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
227k
      fInsertFgPel = TRUE;
203
227k
      continue;
204
228k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
120k
    fInsertFgPel = FALSE;
209
210
120k
    switch (code)
211
120k
    {
212
      /* Handle Foreground Run Orders. */
213
17.3k
      case REGULAR_FG_RUN:
214
18.9k
      case MEGA_MEGA_FG_RUN:
215
31.1k
      case LITE_SET_FG_FG_RUN:
216
31.7k
      case MEGA_MEGA_SET_FG_RUN:
217
31.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
31.7k
        if (advance == 0)
219
72
          return FALSE;
220
31.7k
        pbSrc = pbSrc + advance;
221
222
31.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
12.8k
        {
224
12.8k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
160
            return FALSE;
226
12.6k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.6k
        }
228
229
31.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
216
          return FALSE;
231
232
31.3k
        if (fFirstLine)
233
7.23k
        {
234
7.23k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
7.23k
        }
236
24.1k
        else
237
24.1k
        {
238
24.1k
          UNROLL(runLength, {
239
24.1k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
24.1k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
24.1k
          });
242
24.1k
        }
243
244
31.3k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
7.35k
      case LITE_DITHERED_RUN:
248
8.18k
      case MEGA_MEGA_DITHERED_RUN:
249
8.18k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
8.18k
        if (advance == 0)
251
50
          return FALSE;
252
8.13k
        pbSrc = pbSrc + advance;
253
8.13k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
156
          return FALSE;
255
7.97k
        SRCREADPIXEL(pixelA, pbSrc);
256
7.97k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
308
          return FALSE;
258
7.67k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.67k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
124
          return FALSE;
262
263
7.54k
        UNROLL(runLength, {
264
7.54k
          DESTWRITEPIXEL(pbDest, pixelA);
265
7.54k
          DESTWRITEPIXEL(pbDest, pixelB);
266
7.54k
        });
267
7.54k
        break;
268
269
      /* Handle Color Run Orders. */
270
41.8k
      case REGULAR_COLOR_RUN:
271
42.7k
      case MEGA_MEGA_COLOR_RUN:
272
42.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
42.7k
        if (advance == 0)
274
52
          return FALSE;
275
42.6k
        pbSrc = pbSrc + advance;
276
42.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
210
          return FALSE;
278
42.4k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
42.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
126
          return FALSE;
282
283
42.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
42.3k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
10.1k
      case REGULAR_FGBG_IMAGE:
288
11.9k
      case MEGA_MEGA_FGBG_IMAGE:
289
15.0k
      case LITE_SET_FG_FGBG_IMAGE:
290
15.9k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
15.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
15.9k
        if (advance == 0)
293
118
          return FALSE;
294
15.7k
        pbSrc = pbSrc + advance;
295
296
15.7k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.91k
        {
298
3.91k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
134
            return FALSE;
300
3.78k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.78k
        }
302
303
15.6k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
602
          return FALSE;
305
15.0k
        if (fFirstLine)
306
3.85k
        {
307
44.7k
          while (runLength > 8)
308
40.9k
          {
309
40.9k
            bitmask = *pbSrc;
310
40.9k
            pbSrc = pbSrc + 1;
311
40.9k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
40.9k
            if (!pbDest)
314
36
              return FALSE;
315
316
40.8k
            runLength = runLength - 8;
317
40.8k
          }
318
3.85k
        }
319
11.1k
        else
320
11.1k
        {
321
68.0k
          while (runLength > 8)
322
56.8k
          {
323
56.8k
            bitmask = *pbSrc++;
324
325
56.8k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
56.8k
            if (!pbDest)
328
48
              return FALSE;
329
330
56.8k
            runLength = runLength - 8;
331
56.8k
          }
332
11.1k
        }
333
334
14.9k
        if (runLength > 0)
335
12.7k
        {
336
12.7k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
74
            return FALSE;
338
12.7k
          bitmask = *pbSrc++;
339
340
12.7k
          if (fFirstLine)
341
1.86k
          {
342
1.86k
            pbDest =
343
1.86k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.86k
          }
345
10.8k
          else
346
10.8k
          {
347
10.8k
            pbDest =
348
10.8k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
10.8k
          }
350
351
12.7k
          if (!pbDest)
352
6
            return FALSE;
353
12.7k
        }
354
355
14.8k
        break;
356
357
      /* Handle Color Image Orders. */
358
14.8k
      case REGULAR_COLOR_IMAGE:
359
9.66k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.66k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.66k
        if (advance == 0)
362
34
          return FALSE;
363
9.62k
        pbSrc = pbSrc + advance;
364
9.62k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
88
          return FALSE;
366
9.53k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
670
          return FALSE;
368
369
8.86k
        UNROLL(runLength, {
370
8.86k
          SRCREADPIXEL(temp, pbSrc);
371
8.86k
          DESTWRITEPIXEL(pbDest, temp);
372
8.86k
        });
373
8.86k
        break;
374
375
      /* Handle Special Order 1. */
376
8.86k
      case SPECIAL_FGBG_1:
377
1.93k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.93k
        pbSrc = pbSrc + 1;
380
381
1.93k
        if (fFirstLine)
382
212
        {
383
212
          pbDest =
384
212
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
212
        }
386
1.72k
        else
387
1.72k
        {
388
1.72k
          pbDest =
389
1.72k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.72k
        }
391
392
1.93k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.93k
        break;
396
397
      /* Handle Special Order 2. */
398
2.21k
      case SPECIAL_FGBG_2:
399
2.21k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.21k
        pbSrc = pbSrc + 1;
402
403
2.21k
        if (fFirstLine)
404
194
        {
405
194
          pbDest =
406
194
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
194
        }
408
2.01k
        else
409
2.01k
        {
410
2.01k
          pbDest =
411
2.01k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.01k
        }
413
414
2.21k
        if (!pbDest)
415
4
          return FALSE;
416
417
2.20k
        break;
418
419
      /* Handle White Order. */
420
2.42k
      case SPECIAL_WHITE:
421
2.42k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.42k
        pbSrc = pbSrc + 1;
424
425
2.42k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
4
          return FALSE;
427
428
2.42k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.42k
        break;
430
431
      /* Handle Black Order. */
432
1.78k
      case SPECIAL_BLACK:
433
1.78k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.78k
        pbSrc = pbSrc + 1;
436
437
1.78k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.78k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.78k
        break;
442
443
4.36k
      default:
444
4.36k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.36k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.36k
        return FALSE;
447
120k
    }
448
120k
  }
449
450
3.15k
  return TRUE;
451
12.0k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8