Coverage Report

Created: 2025-11-11 07:10

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
91.0k
{
35
91.0k
  PIXEL xorPixel = 0;
36
91.0k
  BYTE mask = 0x01;
37
38
91.0k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
91.0k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
67
    return NULL;
46
47
90.9k
  UNROLL(cBits, {
48
90.9k
    PIXEL data = 0;
49
90.9k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
90.9k
    if (bitmask & mask)
52
90.9k
      data = xorPixel ^ fgPel;
53
90.9k
    else
54
90.9k
      data = xorPixel;
55
56
90.9k
    DESTWRITEPIXEL(pbDest, data);
57
90.9k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
90.9k
  });
59
90.9k
  return pbDest;
60
90.9k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
25.6k
{
35
25.6k
  PIXEL xorPixel = 0;
36
25.6k
  BYTE mask = 0x01;
37
38
25.6k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
25.6k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
21
    return NULL;
46
47
25.6k
  UNROLL(cBits, {
48
25.6k
    PIXEL data = 0;
49
25.6k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
25.6k
    if (bitmask & mask)
52
25.6k
      data = xorPixel ^ fgPel;
53
25.6k
    else
54
25.6k
      data = xorPixel;
55
56
25.6k
    DESTWRITEPIXEL(pbDest, data);
57
25.6k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
25.6k
  });
59
25.6k
  return pbDest;
60
25.6k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
65.3k
{
35
65.3k
  PIXEL xorPixel = 0;
36
65.3k
  BYTE mask = 0x01;
37
38
65.3k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
65.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
46
    return NULL;
46
47
65.3k
  UNROLL(cBits, {
48
65.3k
    PIXEL data = 0;
49
65.3k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
65.3k
    if (bitmask & mask)
52
65.3k
      data = xorPixel ^ fgPel;
53
65.3k
    else
54
65.3k
      data = xorPixel;
55
56
65.3k
    DESTWRITEPIXEL(pbDest, data);
57
65.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
65.3k
  });
59
65.3k
  return pbDest;
60
65.3k
}
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
66.0k
{
70
66.0k
  BYTE mask = 0x01;
71
72
66.0k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
66.0k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
77
    return NULL;
80
81
65.9k
  UNROLL(cBits, {
82
65.9k
    PIXEL data;
83
84
65.9k
    if (bitmask & mask)
85
65.9k
      data = fgPel;
86
65.9k
    else
87
65.9k
      data = BLACK_PIXEL;
88
89
65.9k
    DESTWRITEPIXEL(pbDest, data);
90
65.9k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
65.9k
  });
92
65.9k
  return pbDest;
93
65.9k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
23.6k
{
70
23.6k
  BYTE mask = 0x01;
71
72
23.6k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
23.6k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
27
    return NULL;
80
81
23.6k
  UNROLL(cBits, {
82
23.6k
    PIXEL data;
83
84
23.6k
    if (bitmask & mask)
85
23.6k
      data = fgPel;
86
23.6k
    else
87
23.6k
      data = BLACK_PIXEL;
88
89
23.6k
    DESTWRITEPIXEL(pbDest, data);
90
23.6k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
23.6k
  });
92
23.6k
  return pbDest;
93
23.6k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
42.3k
{
70
42.3k
  BYTE mask = 0x01;
71
72
42.3k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
42.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
50
    return NULL;
80
81
42.2k
  UNROLL(cBits, {
82
42.2k
    PIXEL data;
83
84
42.2k
    if (bitmask & mask)
85
42.2k
      data = fgPel;
86
42.2k
    else
87
42.2k
      data = BLACK_PIXEL;
88
89
42.2k
    DESTWRITEPIXEL(pbDest, data);
90
42.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
42.2k
  });
92
42.2k
  return pbDest;
93
42.2k
}
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
17.8k
{
102
17.8k
  const BYTE* pbSrc = pbSrcBuffer;
103
17.8k
  BYTE* pbDest = pbDestBuffer;
104
17.8k
  PIXEL temp = 0;
105
17.8k
  PIXEL fgPel = WHITE_PIXEL;
106
17.8k
  BOOL fInsertFgPel = FALSE;
107
17.8k
  BOOL fFirstLine = TRUE;
108
17.8k
  BYTE bitmask = 0;
109
17.8k
  PIXEL pixelA = 0;
110
17.8k
  PIXEL pixelB = 0;
111
17.8k
  UINT32 runLength = 0;
112
17.8k
  UINT32 code = 0;
113
17.8k
  UINT32 advance = 0;
114
17.8k
  RLEEXTRA
115
116
17.8k
  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
17.8k
  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
17.8k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
17.8k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
554k
  while (pbSrc < pbEnd)
134
550k
  {
135
    /* Watch out for the end of the first scanline. */
136
550k
    if (fFirstLine)
137
86.7k
    {
138
86.7k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
13.2k
      {
140
13.2k
        fFirstLine = FALSE;
141
13.2k
        fInsertFgPel = FALSE;
142
13.2k
      }
143
86.7k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
550k
    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
550k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
368k
    {
158
368k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
368k
      if (advance == 0)
160
663
        return FALSE;
161
367k
      pbSrc = pbSrc + advance;
162
163
367k
      if (fFirstLine)
164
37.7k
      {
165
37.7k
        if (fInsertFgPel)
166
25.8k
        {
167
25.8k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
25.8k
          DESTWRITEPIXEL(pbDest, fgPel);
171
25.8k
          runLength = runLength - 1;
172
25.8k
        }
173
174
37.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
79
          return FALSE;
176
177
37.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
37.6k
      }
179
329k
      else
180
329k
      {
181
329k
        if (fInsertFgPel)
182
300k
        {
183
300k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
300k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
65
            return FALSE;
187
188
300k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
300k
          runLength--;
190
300k
        }
191
192
329k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.09k
          return FALSE;
194
195
328k
        UNROLL(runLength, {
196
328k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
328k
          DESTWRITEPIXEL(pbDest, temp);
198
328k
        });
199
328k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
366k
      fInsertFgPel = TRUE;
203
366k
      continue;
204
367k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
182k
    fInsertFgPel = FALSE;
209
210
182k
    switch (code)
211
182k
    {
212
      /* Handle Foreground Run Orders. */
213
27.3k
      case REGULAR_FG_RUN:
214
29.7k
      case MEGA_MEGA_FG_RUN:
215
47.0k
      case LITE_SET_FG_FG_RUN:
216
48.0k
      case MEGA_MEGA_SET_FG_RUN:
217
48.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
48.0k
        if (advance == 0)
219
121
          return FALSE;
220
47.9k
        pbSrc = pbSrc + advance;
221
222
47.9k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.2k
        {
224
18.2k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
229
            return FALSE;
226
18.0k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.0k
        }
228
229
47.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
307
          return FALSE;
231
232
47.3k
        if (fFirstLine)
233
10.8k
        {
234
10.8k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.8k
        }
236
36.5k
        else
237
36.5k
        {
238
36.5k
          UNROLL(runLength, {
239
36.5k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
36.5k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
36.5k
          });
242
36.5k
        }
243
244
47.3k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
10.9k
      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
74
          return FALSE;
252
12.4k
        pbSrc = pbSrc + advance;
253
12.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
273
          return FALSE;
255
12.1k
        SRCREADPIXEL(pixelA, pbSrc);
256
12.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
518
          return FALSE;
258
11.6k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
11.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
140
          return FALSE;
262
263
11.4k
        UNROLL(runLength, {
264
11.4k
          DESTWRITEPIXEL(pbDest, pixelA);
265
11.4k
          DESTWRITEPIXEL(pbDest, pixelB);
266
11.4k
        });
267
11.4k
        break;
268
269
      /* Handle Color Run Orders. */
270
64.7k
      case REGULAR_COLOR_RUN:
271
66.2k
      case MEGA_MEGA_COLOR_RUN:
272
66.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
66.2k
        if (advance == 0)
274
72
          return FALSE;
275
66.1k
        pbSrc = pbSrc + advance;
276
66.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
328
          return FALSE;
278
65.8k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
65.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
263
          return FALSE;
282
283
65.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
65.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
13.0k
      case REGULAR_FGBG_IMAGE:
288
15.3k
      case MEGA_MEGA_FGBG_IMAGE:
289
18.8k
      case LITE_SET_FG_FGBG_IMAGE:
290
20.4k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
20.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
20.4k
        if (advance == 0)
293
163
          return FALSE;
294
20.3k
        pbSrc = pbSrc + advance;
295
296
20.3k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
4.99k
        {
298
4.99k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
218
            return FALSE;
300
4.77k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.77k
        }
302
303
20.0k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
805
          return FALSE;
305
19.2k
        if (fFirstLine)
306
5.49k
        {
307
67.8k
          while (runLength > 8)
308
62.4k
          {
309
62.4k
            bitmask = *pbSrc;
310
62.4k
            pbSrc = pbSrc + 1;
311
62.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
62.4k
            if (!pbDest)
314
74
              return FALSE;
315
316
62.3k
            runLength = runLength - 8;
317
62.3k
          }
318
5.49k
        }
319
13.7k
        else
320
13.7k
        {
321
87.1k
          while (runLength > 8)
322
73.3k
          {
323
73.3k
            bitmask = *pbSrc++;
324
325
73.3k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
73.3k
            if (!pbDest)
328
51
              return FALSE;
329
330
73.3k
            runLength = runLength - 8;
331
73.3k
          }
332
13.7k
        }
333
334
19.1k
        if (runLength > 0)
335
15.8k
        {
336
15.8k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
129
            return FALSE;
338
15.7k
          bitmask = *pbSrc++;
339
340
15.7k
          if (fFirstLine)
341
2.91k
          {
342
2.91k
            pbDest =
343
2.91k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.91k
          }
345
12.8k
          else
346
12.8k
          {
347
12.8k
            pbDest =
348
12.8k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
12.8k
          }
350
351
15.7k
          if (!pbDest)
352
6
            return FALSE;
353
15.7k
        }
354
355
19.0k
        break;
356
357
      /* Handle Color Image Orders. */
358
19.0k
      case REGULAR_COLOR_IMAGE:
359
14.9k
      case MEGA_MEGA_COLOR_IMAGE:
360
14.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
14.9k
        if (advance == 0)
362
70
          return FALSE;
363
14.8k
        pbSrc = pbSrc + advance;
364
14.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
161
          return FALSE;
366
14.6k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
1.00k
          return FALSE;
368
369
13.6k
        UNROLL(runLength, {
370
4.34k
          SRCREADPIXEL(temp, pbSrc);
371
4.34k
          DESTWRITEPIXEL(pbDest, temp);
372
4.34k
        });
373
9.32k
        break;
374
375
      /* Handle Special Order 1. */
376
9.32k
      case SPECIAL_FGBG_1:
377
2.36k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.36k
        pbSrc = pbSrc + 1;
380
381
2.36k
        if (fFirstLine)
382
368
        {
383
368
          pbDest =
384
368
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
368
        }
386
1.99k
        else
387
1.99k
        {
388
1.99k
          pbDest =
389
1.99k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.99k
        }
391
392
2.36k
        if (!pbDest)
393
8
          return FALSE;
394
395
2.35k
        break;
396
397
      /* Handle Special Order 2. */
398
3.12k
      case SPECIAL_FGBG_2:
399
3.12k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.12k
        pbSrc = pbSrc + 1;
402
403
3.12k
        if (fFirstLine)
404
315
        {
405
315
          pbDest =
406
315
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
315
        }
408
2.80k
        else
409
2.80k
        {
410
2.80k
          pbDest =
411
2.80k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.80k
        }
413
414
3.12k
        if (!pbDest)
415
5
          return FALSE;
416
417
3.11k
        break;
418
419
      /* Handle White Order. */
420
5.04k
      case SPECIAL_WHITE:
421
5.04k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
5.04k
        pbSrc = pbSrc + 1;
424
425
5.04k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
5.04k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
5.04k
        break;
430
431
      /* Handle Black Order. */
432
3.14k
      case SPECIAL_BLACK:
433
3.14k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
3.14k
        pbSrc = pbSrc + 1;
436
437
3.14k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
3.14k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
3.14k
        break;
442
443
6.32k
      default:
444
6.32k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.32k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.32k
        return FALSE;
447
182k
    }
448
182k
  }
449
450
4.61k
  return TRUE;
451
17.8k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
5.95k
{
102
5.95k
  const BYTE* pbSrc = pbSrcBuffer;
103
5.95k
  BYTE* pbDest = pbDestBuffer;
104
5.95k
  PIXEL temp = 0;
105
5.95k
  PIXEL fgPel = WHITE_PIXEL;
106
5.95k
  BOOL fInsertFgPel = FALSE;
107
5.95k
  BOOL fFirstLine = TRUE;
108
5.95k
  BYTE bitmask = 0;
109
5.95k
  PIXEL pixelA = 0;
110
5.95k
  PIXEL pixelB = 0;
111
5.95k
  UINT32 runLength = 0;
112
5.95k
  UINT32 code = 0;
113
5.95k
  UINT32 advance = 0;
114
5.95k
  RLEEXTRA
115
116
5.95k
  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
5.95k
  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
5.95k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
5.95k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
180k
  while (pbSrc < pbEnd)
134
178k
  {
135
    /* Watch out for the end of the first scanline. */
136
178k
    if (fFirstLine)
137
29.0k
    {
138
29.0k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.18k
      {
140
4.18k
        fFirstLine = FALSE;
141
4.18k
        fInsertFgPel = FALSE;
142
4.18k
      }
143
29.0k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
178k
    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
178k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
119k
    {
158
119k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
119k
      if (advance == 0)
160
185
        return FALSE;
161
119k
      pbSrc = pbSrc + advance;
162
163
119k
      if (fFirstLine)
164
12.7k
      {
165
12.7k
        if (fInsertFgPel)
166
8.55k
        {
167
8.55k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.55k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.55k
          runLength = runLength - 1;
172
8.55k
        }
173
174
12.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
27
          return FALSE;
176
177
12.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.6k
      }
179
107k
      else
180
107k
      {
181
107k
        if (fInsertFgPel)
182
98.0k
        {
183
98.0k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
98.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
17
            return FALSE;
187
188
98.0k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
98.0k
          runLength--;
190
98.0k
        }
191
192
106k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
350
          return FALSE;
194
195
106k
        UNROLL(runLength, {
196
106k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
106k
          DESTWRITEPIXEL(pbDest, temp);
198
106k
        });
199
106k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
119k
      fInsertFgPel = TRUE;
203
119k
      continue;
204
119k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
58.5k
    fInsertFgPel = FALSE;
209
210
58.5k
    switch (code)
211
58.5k
    {
212
      /* Handle Foreground Run Orders. */
213
8.75k
      case REGULAR_FG_RUN:
214
9.54k
      case MEGA_MEGA_FG_RUN:
215
14.8k
      case LITE_SET_FG_FG_RUN:
216
15.2k
      case MEGA_MEGA_SET_FG_RUN:
217
15.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
15.2k
        if (advance == 0)
219
39
          return FALSE;
220
15.1k
        pbSrc = pbSrc + advance;
221
222
15.1k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
5.65k
        {
224
5.65k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
91
            return FALSE;
226
5.56k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.56k
        }
228
229
15.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
87
          return FALSE;
231
232
15.0k
        if (fFirstLine)
233
3.72k
        {
234
3.72k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.72k
        }
236
11.2k
        else
237
11.2k
        {
238
11.2k
          UNROLL(runLength, {
239
11.2k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.2k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.2k
          });
242
11.2k
        }
243
244
15.0k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.53k
      case LITE_DITHERED_RUN:
248
4.12k
      case MEGA_MEGA_DITHERED_RUN:
249
4.12k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.12k
        if (advance == 0)
251
18
          return FALSE;
252
4.10k
        pbSrc = pbSrc + advance;
253
4.10k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
105
          return FALSE;
255
4.00k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.00k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
258
          return FALSE;
258
3.74k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.74k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
48
          return FALSE;
262
263
3.69k
        UNROLL(runLength, {
264
3.69k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.69k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.69k
        });
267
3.69k
        break;
268
269
      /* Handle Color Run Orders. */
270
20.9k
      case REGULAR_COLOR_RUN:
271
21.4k
      case MEGA_MEGA_COLOR_RUN:
272
21.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
21.4k
        if (advance == 0)
274
22
          return FALSE;
275
21.3k
        pbSrc = pbSrc + advance;
276
21.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
130
          return FALSE;
278
21.2k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
21.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
81
          return FALSE;
282
283
21.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
21.1k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.03k
      case REGULAR_FGBG_IMAGE:
288
4.80k
      case MEGA_MEGA_FGBG_IMAGE:
289
5.93k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.38k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.38k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.38k
        if (advance == 0)
293
49
          return FALSE;
294
6.33k
        pbSrc = pbSrc + advance;
295
296
6.33k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.55k
        {
298
1.55k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
82
            return FALSE;
300
1.47k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.47k
        }
302
303
6.24k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
267
          return FALSE;
305
5.98k
        if (fFirstLine)
306
1.92k
        {
307
24.2k
          while (runLength > 8)
308
22.3k
          {
309
22.3k
            bitmask = *pbSrc;
310
22.3k
            pbSrc = pbSrc + 1;
311
22.3k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
22.3k
            if (!pbDest)
314
26
              return FALSE;
315
316
22.3k
            runLength = runLength - 8;
317
22.3k
          }
318
1.92k
        }
319
4.05k
        else
320
4.05k
        {
321
24.3k
          while (runLength > 8)
322
20.3k
          {
323
20.3k
            bitmask = *pbSrc++;
324
325
20.3k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
20.3k
            if (!pbDest)
328
17
              return FALSE;
329
330
20.3k
            runLength = runLength - 8;
331
20.3k
          }
332
4.05k
        }
333
334
5.93k
        if (runLength > 0)
335
4.93k
        {
336
4.93k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
47
            return FALSE;
338
4.88k
          bitmask = *pbSrc++;
339
340
4.88k
          if (fFirstLine)
341
1.09k
          {
342
1.09k
            pbDest =
343
1.09k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.09k
          }
345
3.79k
          else
346
3.79k
          {
347
3.79k
            pbDest =
348
3.79k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
3.79k
          }
350
351
4.88k
          if (!pbDest)
352
2
            return FALSE;
353
4.88k
        }
354
355
5.89k
        break;
356
357
      /* Handle Color Image Orders. */
358
5.89k
      case REGULAR_COLOR_IMAGE:
359
4.74k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.74k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.74k
        if (advance == 0)
362
22
          return FALSE;
363
4.71k
        pbSrc = pbSrc + advance;
364
4.71k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
53
          return FALSE;
366
4.66k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
323
          return FALSE;
368
369
4.34k
        UNROLL(runLength, {
370
4.34k
          SRCREADPIXEL(temp, pbSrc);
371
4.34k
          DESTWRITEPIXEL(pbDest, temp);
372
4.34k
        });
373
4.34k
        break;
374
375
      /* Handle Special Order 1. */
376
778
      case SPECIAL_FGBG_1:
377
778
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
778
        pbSrc = pbSrc + 1;
380
381
778
        if (fFirstLine)
382
110
        {
383
110
          pbDest =
384
110
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
110
        }
386
668
        else
387
668
        {
388
668
          pbDest =
389
668
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
668
        }
391
392
778
        if (!pbDest)
393
2
          return FALSE;
394
395
776
        break;
396
397
      /* Handle Special Order 2. */
398
995
      case SPECIAL_FGBG_2:
399
995
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
995
        pbSrc = pbSrc + 1;
402
403
995
        if (fFirstLine)
404
109
        {
405
109
          pbDest =
406
109
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
109
        }
408
886
        else
409
886
        {
410
886
          pbDest =
411
886
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
886
        }
413
414
995
        if (!pbDest)
415
1
          return FALSE;
416
417
994
        break;
418
419
      /* Handle White Order. */
420
1.70k
      case SPECIAL_WHITE:
421
1.70k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.70k
        pbSrc = pbSrc + 1;
424
425
1.70k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.70k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.70k
        break;
430
431
      /* Handle Black Order. */
432
1.15k
      case SPECIAL_BLACK:
433
1.15k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.15k
        pbSrc = pbSrc + 1;
436
437
1.15k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
1.15k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.15k
        break;
442
443
2.09k
      default:
444
2.09k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.09k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.09k
        return FALSE;
447
58.5k
    }
448
58.5k
  }
449
450
1.51k
  return TRUE;
451
5.95k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
11.9k
{
102
11.9k
  const BYTE* pbSrc = pbSrcBuffer;
103
11.9k
  BYTE* pbDest = pbDestBuffer;
104
11.9k
  PIXEL temp = 0;
105
11.9k
  PIXEL fgPel = WHITE_PIXEL;
106
11.9k
  BOOL fInsertFgPel = FALSE;
107
11.9k
  BOOL fFirstLine = TRUE;
108
11.9k
  BYTE bitmask = 0;
109
11.9k
  PIXEL pixelA = 0;
110
11.9k
  PIXEL pixelB = 0;
111
11.9k
  UINT32 runLength = 0;
112
11.9k
  UINT32 code = 0;
113
11.9k
  UINT32 advance = 0;
114
11.9k
  RLEEXTRA
115
116
11.9k
  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
11.9k
  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
11.9k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
11.9k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
374k
  while (pbSrc < pbEnd)
134
371k
  {
135
    /* Watch out for the end of the first scanline. */
136
371k
    if (fFirstLine)
137
57.7k
    {
138
57.7k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
9.04k
      {
140
9.04k
        fFirstLine = FALSE;
141
9.04k
        fInsertFgPel = FALSE;
142
9.04k
      }
143
57.7k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
371k
    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
371k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
248k
    {
158
248k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
248k
      if (advance == 0)
160
478
        return FALSE;
161
247k
      pbSrc = pbSrc + advance;
162
163
247k
      if (fFirstLine)
164
24.9k
      {
165
24.9k
        if (fInsertFgPel)
166
17.2k
        {
167
17.2k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
17.2k
          DESTWRITEPIXEL(pbDest, fgPel);
171
17.2k
          runLength = runLength - 1;
172
17.2k
        }
173
174
24.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
52
          return FALSE;
176
177
24.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
24.9k
      }
179
222k
      else
180
222k
      {
181
222k
        if (fInsertFgPel)
182
202k
        {
183
202k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
202k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
48
            return FALSE;
187
188
202k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
202k
          runLength--;
190
202k
        }
191
192
222k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
744
          return FALSE;
194
195
221k
        UNROLL(runLength, {
196
221k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
221k
          DESTWRITEPIXEL(pbDest, temp);
198
221k
        });
199
221k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
246k
      fInsertFgPel = TRUE;
203
246k
      continue;
204
247k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
123k
    fInsertFgPel = FALSE;
209
210
123k
    switch (code)
211
123k
    {
212
      /* Handle Foreground Run Orders. */
213
18.6k
      case REGULAR_FG_RUN:
214
20.2k
      case MEGA_MEGA_FG_RUN:
215
32.2k
      case LITE_SET_FG_FG_RUN:
216
32.8k
      case MEGA_MEGA_SET_FG_RUN:
217
32.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
32.8k
        if (advance == 0)
219
82
          return FALSE;
220
32.7k
        pbSrc = pbSrc + advance;
221
222
32.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
12.5k
        {
224
12.5k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
138
            return FALSE;
226
12.4k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.4k
        }
228
229
32.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
220
          return FALSE;
231
232
32.3k
        if (fFirstLine)
233
7.08k
        {
234
7.08k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
7.08k
        }
236
25.3k
        else
237
25.3k
        {
238
25.3k
          UNROLL(runLength, {
239
25.3k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
25.3k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
25.3k
          });
242
25.3k
        }
243
244
32.3k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
7.37k
      case LITE_DITHERED_RUN:
248
8.35k
      case MEGA_MEGA_DITHERED_RUN:
249
8.35k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
8.35k
        if (advance == 0)
251
56
          return FALSE;
252
8.30k
        pbSrc = pbSrc + advance;
253
8.30k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
168
          return FALSE;
255
8.13k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.13k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
260
          return FALSE;
258
7.87k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.87k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
92
          return FALSE;
262
263
7.78k
        UNROLL(runLength, {
264
7.78k
          DESTWRITEPIXEL(pbDest, pixelA);
265
7.78k
          DESTWRITEPIXEL(pbDest, pixelB);
266
7.78k
        });
267
7.78k
        break;
268
269
      /* Handle Color Run Orders. */
270
43.8k
      case REGULAR_COLOR_RUN:
271
44.8k
      case MEGA_MEGA_COLOR_RUN:
272
44.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
44.8k
        if (advance == 0)
274
50
          return FALSE;
275
44.8k
        pbSrc = pbSrc + advance;
276
44.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
198
          return FALSE;
278
44.6k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
44.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
182
          return FALSE;
282
283
44.4k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
44.4k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.04k
      case REGULAR_FGBG_IMAGE:
288
10.5k
      case MEGA_MEGA_FGBG_IMAGE:
289
12.9k
      case LITE_SET_FG_FGBG_IMAGE:
290
14.0k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
14.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
14.0k
        if (advance == 0)
293
114
          return FALSE;
294
13.9k
        pbSrc = pbSrc + advance;
295
296
13.9k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.44k
        {
298
3.44k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
136
            return FALSE;
300
3.30k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.30k
        }
302
303
13.8k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
538
          return FALSE;
305
13.2k
        if (fFirstLine)
306
3.56k
        {
307
43.5k
          while (runLength > 8)
308
40.0k
          {
309
40.0k
            bitmask = *pbSrc;
310
40.0k
            pbSrc = pbSrc + 1;
311
40.0k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
40.0k
            if (!pbDest)
314
48
              return FALSE;
315
316
40.0k
            runLength = runLength - 8;
317
40.0k
          }
318
3.56k
        }
319
9.73k
        else
320
9.73k
        {
321
62.7k
          while (runLength > 8)
322
53.0k
          {
323
53.0k
            bitmask = *pbSrc++;
324
325
53.0k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
53.0k
            if (!pbDest)
328
34
              return FALSE;
329
330
53.0k
            runLength = runLength - 8;
331
53.0k
          }
332
9.73k
        }
333
334
13.2k
        if (runLength > 0)
335
10.9k
        {
336
10.9k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
82
            return FALSE;
338
10.8k
          bitmask = *pbSrc++;
339
340
10.8k
          if (fFirstLine)
341
1.81k
          {
342
1.81k
            pbDest =
343
1.81k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.81k
          }
345
9.04k
          else
346
9.04k
          {
347
9.04k
            pbDest =
348
9.04k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
9.04k
          }
350
351
10.8k
          if (!pbDest)
352
4
            return FALSE;
353
10.8k
        }
354
355
13.1k
        break;
356
357
      /* Handle Color Image Orders. */
358
13.1k
      case REGULAR_COLOR_IMAGE:
359
10.1k
      case MEGA_MEGA_COLOR_IMAGE:
360
10.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
10.1k
        if (advance == 0)
362
48
          return FALSE;
363
10.1k
        pbSrc = pbSrc + advance;
364
10.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
108
          return FALSE;
366
10.0k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
682
          return FALSE;
368
369
9.32k
        UNROLL(runLength, {
370
9.32k
          SRCREADPIXEL(temp, pbSrc);
371
9.32k
          DESTWRITEPIXEL(pbDest, temp);
372
9.32k
        });
373
9.32k
        break;
374
375
      /* Handle Special Order 1. */
376
9.32k
      case SPECIAL_FGBG_1:
377
1.58k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.58k
        pbSrc = pbSrc + 1;
380
381
1.58k
        if (fFirstLine)
382
258
        {
383
258
          pbDest =
384
258
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
258
        }
386
1.32k
        else
387
1.32k
        {
388
1.32k
          pbDest =
389
1.32k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.32k
        }
391
392
1.58k
        if (!pbDest)
393
6
          return FALSE;
394
395
1.58k
        break;
396
397
      /* Handle Special Order 2. */
398
2.12k
      case SPECIAL_FGBG_2:
399
2.12k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.12k
        pbSrc = pbSrc + 1;
402
403
2.12k
        if (fFirstLine)
404
206
        {
405
206
          pbDest =
406
206
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
206
        }
408
1.92k
        else
409
1.92k
        {
410
1.92k
          pbDest =
411
1.92k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.92k
        }
413
414
2.12k
        if (!pbDest)
415
4
          return FALSE;
416
417
2.12k
        break;
418
419
      /* Handle White Order. */
420
3.34k
      case SPECIAL_WHITE:
421
3.34k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.34k
        pbSrc = pbSrc + 1;
424
425
3.34k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
3.34k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.34k
        break;
430
431
      /* Handle Black Order. */
432
1.99k
      case SPECIAL_BLACK:
433
1.99k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.99k
        pbSrc = pbSrc + 1;
436
437
1.99k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.99k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.99k
        break;
442
443
4.23k
      default:
444
4.23k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.23k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.23k
        return FALSE;
447
123k
    }
448
123k
  }
449
450
3.10k
  return TRUE;
451
11.9k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8