Coverage Report

Created: 2026-01-09 06:45

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
92.1k
{
35
92.1k
  PIXEL xorPixel = 0;
36
92.1k
  BYTE mask = 0x01;
37
38
92.1k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
92.1k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
69
    return NULL;
46
47
92.0k
  UNROLL(cBits, {
48
92.0k
    PIXEL data = 0;
49
92.0k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
92.0k
    if (bitmask & mask)
52
92.0k
      data = xorPixel ^ fgPel;
53
92.0k
    else
54
92.0k
      data = xorPixel;
55
56
92.0k
    DESTWRITEPIXEL(pbDest, data);
57
92.0k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
92.0k
  });
59
92.0k
  return pbDest;
60
92.0k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
25.3k
{
35
25.3k
  PIXEL xorPixel = 0;
36
25.3k
  BYTE mask = 0x01;
37
38
25.3k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
25.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
23
    return NULL;
46
47
25.3k
  UNROLL(cBits, {
48
25.3k
    PIXEL data = 0;
49
25.3k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
25.3k
    if (bitmask & mask)
52
25.3k
      data = xorPixel ^ fgPel;
53
25.3k
    else
54
25.3k
      data = xorPixel;
55
56
25.3k
    DESTWRITEPIXEL(pbDest, data);
57
25.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
25.3k
  });
59
25.3k
  return pbDest;
60
25.3k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
66.7k
{
35
66.7k
  PIXEL xorPixel = 0;
36
66.7k
  BYTE mask = 0x01;
37
38
66.7k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
66.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
46
    return NULL;
46
47
66.7k
  UNROLL(cBits, {
48
66.7k
    PIXEL data = 0;
49
66.7k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
66.7k
    if (bitmask & mask)
52
66.7k
      data = xorPixel ^ fgPel;
53
66.7k
    else
54
66.7k
      data = xorPixel;
55
56
66.7k
    DESTWRITEPIXEL(pbDest, data);
57
66.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
66.7k
  });
59
66.7k
  return pbDest;
60
66.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
69.0k
{
70
69.0k
  BYTE mask = 0x01;
71
72
69.0k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
69.0k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
64
    return NULL;
80
81
68.9k
  UNROLL(cBits, {
82
68.9k
    PIXEL data;
83
84
68.9k
    if (bitmask & mask)
85
68.9k
      data = fgPel;
86
68.9k
    else
87
68.9k
      data = BLACK_PIXEL;
88
89
68.9k
    DESTWRITEPIXEL(pbDest, data);
90
68.9k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
68.9k
  });
92
68.9k
  return pbDest;
93
68.9k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
25.8k
{
70
25.8k
  BYTE mask = 0x01;
71
72
25.8k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
25.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
24
    return NULL;
80
81
25.8k
  UNROLL(cBits, {
82
25.8k
    PIXEL data;
83
84
25.8k
    if (bitmask & mask)
85
25.8k
      data = fgPel;
86
25.8k
    else
87
25.8k
      data = BLACK_PIXEL;
88
89
25.8k
    DESTWRITEPIXEL(pbDest, data);
90
25.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
25.8k
  });
92
25.8k
  return pbDest;
93
25.8k
}
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
40
    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.0k
{
102
18.0k
  const BYTE* pbSrc = pbSrcBuffer;
103
18.0k
  BYTE* pbDest = pbDestBuffer;
104
18.0k
  PIXEL temp = 0;
105
18.0k
  PIXEL fgPel = WHITE_PIXEL;
106
18.0k
  BOOL fInsertFgPel = FALSE;
107
18.0k
  BOOL fFirstLine = TRUE;
108
18.0k
  BYTE bitmask = 0;
109
18.0k
  PIXEL pixelA = 0;
110
18.0k
  PIXEL pixelB = 0;
111
18.0k
  UINT32 runLength = 0;
112
18.0k
  UINT32 code = 0;
113
18.0k
  UINT32 advance = 0;
114
18.0k
  RLEEXTRA
115
116
18.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
18.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
18.0k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
18.0k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
513k
  while (pbSrc < pbEnd)
134
508k
  {
135
    /* Watch out for the end of the first scanline. */
136
508k
    if (fFirstLine)
137
84.5k
    {
138
84.5k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
13.0k
      {
140
13.0k
        fFirstLine = FALSE;
141
13.0k
        fInsertFgPel = FALSE;
142
13.0k
      }
143
84.5k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
508k
    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
508k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
341k
    {
158
341k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
341k
      if (advance == 0)
160
661
        return FALSE;
161
340k
      pbSrc = pbSrc + advance;
162
163
340k
      if (fFirstLine)
164
35.8k
      {
165
35.8k
        if (fInsertFgPel)
166
24.2k
        {
167
24.2k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
24.2k
          DESTWRITEPIXEL(pbDest, fgPel);
171
24.2k
          runLength = runLength - 1;
172
24.2k
        }
173
174
35.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
73
          return FALSE;
176
177
35.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
35.7k
      }
179
304k
      else
180
304k
      {
181
304k
        if (fInsertFgPel)
182
274k
        {
183
274k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
274k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
64
            return FALSE;
187
188
274k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
274k
          runLength--;
190
274k
        }
191
192
304k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
991
          return FALSE;
194
195
303k
        UNROLL(runLength, {
196
303k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
303k
          DESTWRITEPIXEL(pbDest, temp);
198
303k
        });
199
303k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
339k
      fInsertFgPel = TRUE;
203
339k
      continue;
204
340k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
167k
    fInsertFgPel = FALSE;
209
210
167k
    switch (code)
211
167k
    {
212
      /* Handle Foreground Run Orders. */
213
25.7k
      case REGULAR_FG_RUN:
214
28.0k
      case MEGA_MEGA_FG_RUN:
215
45.8k
      case LITE_SET_FG_FG_RUN:
216
46.8k
      case MEGA_MEGA_SET_FG_RUN:
217
46.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
46.8k
        if (advance == 0)
219
101
          return FALSE;
220
46.7k
        pbSrc = pbSrc + advance;
221
222
46.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.7k
        {
224
18.7k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
267
            return FALSE;
226
18.5k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.5k
        }
228
229
46.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
291
          return FALSE;
231
232
46.2k
        if (fFirstLine)
233
10.9k
        {
234
10.9k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.9k
        }
236
35.2k
        else
237
35.2k
        {
238
35.2k
          UNROLL(runLength, {
239
35.2k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
35.2k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
35.2k
          });
242
35.2k
        }
243
244
46.2k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
11.2k
      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
62
          return FALSE;
252
12.4k
        pbSrc = pbSrc + advance;
253
12.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
260
          return FALSE;
255
12.1k
        SRCREADPIXEL(pixelA, pbSrc);
256
12.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
583
          return FALSE;
258
11.5k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
11.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
163
          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
50.9k
      case REGULAR_COLOR_RUN:
271
52.3k
      case MEGA_MEGA_COLOR_RUN:
272
52.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
52.3k
        if (advance == 0)
274
72
          return FALSE;
275
52.2k
        pbSrc = pbSrc + advance;
276
52.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
341
          return FALSE;
278
51.8k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
51.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
227
          return FALSE;
282
283
51.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
51.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
14.3k
      case REGULAR_FGBG_IMAGE:
288
16.9k
      case MEGA_MEGA_FGBG_IMAGE:
289
21.7k
      case LITE_SET_FG_FGBG_IMAGE:
290
22.9k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
22.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
22.9k
        if (advance == 0)
293
167
          return FALSE;
294
22.8k
        pbSrc = pbSrc + advance;
295
296
22.8k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
5.96k
        {
298
5.96k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
219
            return FALSE;
300
5.74k
          SRCREADPIXEL(fgPel, pbSrc);
301
5.74k
        }
302
303
22.5k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
862
          return FALSE;
305
21.7k
        if (fFirstLine)
306
5.94k
        {
307
71.2k
          while (runLength > 8)
308
65.3k
          {
309
65.3k
            bitmask = *pbSrc;
310
65.3k
            pbSrc = pbSrc + 1;
311
65.3k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
65.3k
            if (!pbDest)
314
61
              return FALSE;
315
316
65.2k
            runLength = runLength - 8;
317
65.2k
          }
318
5.94k
        }
319
15.7k
        else
320
15.7k
        {
321
87.6k
          while (runLength > 8)
322
71.8k
          {
323
71.8k
            bitmask = *pbSrc++;
324
325
71.8k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
71.8k
            if (!pbDest)
328
55
              return FALSE;
329
330
71.8k
            runLength = runLength - 8;
331
71.8k
          }
332
15.7k
        }
333
334
21.6k
        if (runLength > 0)
335
18.4k
        {
336
18.4k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
117
            return FALSE;
338
18.3k
          bitmask = *pbSrc++;
339
340
18.3k
          if (fFirstLine)
341
3.05k
          {
342
3.05k
            pbDest =
343
3.05k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
3.05k
          }
345
15.2k
          else
346
15.2k
          {
347
15.2k
            pbDest =
348
15.2k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
15.2k
          }
350
351
18.3k
          if (!pbDest)
352
10
            return FALSE;
353
18.3k
        }
354
355
21.4k
        break;
356
357
      /* Handle Color Image Orders. */
358
21.4k
      case REGULAR_COLOR_IMAGE:
359
13.9k
      case MEGA_MEGA_COLOR_IMAGE:
360
13.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
13.9k
        if (advance == 0)
362
60
          return FALSE;
363
13.8k
        pbSrc = pbSrc + advance;
364
13.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
118
          return FALSE;
366
13.7k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
1.00k
          return FALSE;
368
369
12.7k
        UNROLL(runLength, {
370
3.74k
          SRCREADPIXEL(temp, pbSrc);
371
3.74k
          DESTWRITEPIXEL(pbDest, temp);
372
3.74k
        });
373
8.98k
        break;
374
375
      /* Handle Special Order 1. */
376
8.98k
      case SPECIAL_FGBG_1:
377
2.89k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.89k
        pbSrc = pbSrc + 1;
380
381
2.89k
        if (fFirstLine)
382
349
        {
383
349
          pbDest =
384
349
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
349
        }
386
2.54k
        else
387
2.54k
        {
388
2.54k
          pbDest =
389
2.54k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.54k
        }
391
392
2.89k
        if (!pbDest)
393
4
          return FALSE;
394
395
2.88k
        break;
396
397
      /* Handle Special Order 2. */
398
2.88k
      case SPECIAL_FGBG_2:
399
2.70k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.70k
        pbSrc = pbSrc + 1;
402
403
2.70k
        if (fFirstLine)
404
284
        {
405
284
          pbDest =
406
284
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
284
        }
408
2.42k
        else
409
2.42k
        {
410
2.42k
          pbDest =
411
2.42k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.42k
        }
413
414
2.70k
        if (!pbDest)
415
3
          return FALSE;
416
417
2.70k
        break;
418
419
      /* Handle White Order. */
420
3.95k
      case SPECIAL_WHITE:
421
3.95k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.95k
        pbSrc = pbSrc + 1;
424
425
3.95k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
6
          return FALSE;
427
428
3.94k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.94k
        break;
430
431
      /* Handle Black Order. */
432
2.62k
      case SPECIAL_BLACK:
433
2.62k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.62k
        pbSrc = pbSrc + 1;
436
437
2.62k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
2.62k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.62k
        break;
442
443
6.41k
      default:
444
6.41k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.41k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.41k
        return FALSE;
447
167k
    }
448
167k
  }
449
450
4.76k
  return TRUE;
451
18.0k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
6.00k
{
102
6.00k
  const BYTE* pbSrc = pbSrcBuffer;
103
6.00k
  BYTE* pbDest = pbDestBuffer;
104
6.00k
  PIXEL temp = 0;
105
6.00k
  PIXEL fgPel = WHITE_PIXEL;
106
6.00k
  BOOL fInsertFgPel = FALSE;
107
6.00k
  BOOL fFirstLine = TRUE;
108
6.00k
  BYTE bitmask = 0;
109
6.00k
  PIXEL pixelA = 0;
110
6.00k
  PIXEL pixelB = 0;
111
6.00k
  UINT32 runLength = 0;
112
6.00k
  UINT32 code = 0;
113
6.00k
  UINT32 advance = 0;
114
6.00k
  RLEEXTRA
115
116
6.00k
  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.00k
  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.00k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
6.00k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
169k
  while (pbSrc < pbEnd)
134
168k
  {
135
    /* Watch out for the end of the first scanline. */
136
168k
    if (fFirstLine)
137
28.3k
    {
138
28.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.16k
      {
140
4.16k
        fFirstLine = FALSE;
141
4.16k
        fInsertFgPel = FALSE;
142
4.16k
      }
143
28.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
168k
    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
168k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
111k
    {
158
111k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
111k
      if (advance == 0)
160
171
        return FALSE;
161
111k
      pbSrc = pbSrc + advance;
162
163
111k
      if (fFirstLine)
164
12.0k
      {
165
12.0k
        if (fInsertFgPel)
166
8.04k
        {
167
8.04k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.04k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.04k
          runLength = runLength - 1;
172
8.04k
        }
173
174
12.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
25
          return FALSE;
176
177
12.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.0k
      }
179
99.1k
      else
180
99.1k
      {
181
99.1k
        if (fInsertFgPel)
182
89.9k
        {
183
89.9k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
89.9k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
18
            return FALSE;
187
188
89.8k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
89.8k
          runLength--;
190
89.8k
        }
191
192
99.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
309
          return FALSE;
194
195
98.8k
        UNROLL(runLength, {
196
98.8k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
98.8k
          DESTWRITEPIXEL(pbDest, temp);
198
98.8k
        });
199
98.8k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
110k
      fInsertFgPel = TRUE;
203
110k
      continue;
204
111k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
56.6k
    fInsertFgPel = FALSE;
209
210
56.6k
    switch (code)
211
56.6k
    {
212
      /* Handle Foreground Run Orders. */
213
7.91k
      case REGULAR_FG_RUN:
214
8.67k
      case MEGA_MEGA_FG_RUN:
215
14.3k
      case LITE_SET_FG_FG_RUN:
216
14.7k
      case MEGA_MEGA_SET_FG_RUN:
217
14.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
14.7k
        if (advance == 0)
219
31
          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.05k
        {
224
6.05k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
103
            return FALSE;
226
5.95k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.95k
        }
228
229
14.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
71
          return FALSE;
231
232
14.5k
        if (fFirstLine)
233
3.73k
        {
234
3.73k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.73k
        }
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.5k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.84k
      case LITE_DITHERED_RUN:
248
4.26k
      case MEGA_MEGA_DITHERED_RUN:
249
4.26k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.26k
        if (advance == 0)
251
16
          return FALSE;
252
4.24k
        pbSrc = pbSrc + advance;
253
4.24k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
110
          return FALSE;
255
4.13k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.13k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
285
          return FALSE;
258
3.85k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.85k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
47
          return FALSE;
262
263
3.80k
        UNROLL(runLength, {
264
3.80k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.80k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.80k
        });
267
3.80k
        break;
268
269
      /* Handle Color Run Orders. */
270
19.4k
      case REGULAR_COLOR_RUN:
271
19.9k
      case MEGA_MEGA_COLOR_RUN:
272
19.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
19.9k
        if (advance == 0)
274
20
          return FALSE;
275
19.9k
        pbSrc = pbSrc + advance;
276
19.9k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
147
          return FALSE;
278
19.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
19.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
83
          return FALSE;
282
283
19.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
19.7k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.55k
      case REGULAR_FGBG_IMAGE:
288
5.39k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.90k
      case LITE_SET_FG_FGBG_IMAGE:
290
7.31k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
7.31k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
7.31k
        if (advance == 0)
293
47
          return FALSE;
294
7.26k
        pbSrc = pbSrc + advance;
295
296
7.26k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.89k
        {
298
1.89k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
81
            return FALSE;
300
1.81k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.81k
        }
302
303
7.18k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
274
          return FALSE;
305
6.91k
        if (fFirstLine)
306
2.10k
        {
307
26.5k
          while (runLength > 8)
308
24.4k
          {
309
24.4k
            bitmask = *pbSrc;
310
24.4k
            pbSrc = pbSrc + 1;
311
24.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
24.4k
            if (!pbDest)
314
23
              return FALSE;
315
316
24.4k
            runLength = runLength - 8;
317
24.4k
          }
318
2.10k
        }
319
4.80k
        else
320
4.80k
        {
321
23.7k
          while (runLength > 8)
322
18.9k
          {
323
18.9k
            bitmask = *pbSrc++;
324
325
18.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
18.9k
            if (!pbDest)
328
17
              return FALSE;
329
330
18.9k
            runLength = runLength - 8;
331
18.9k
          }
332
4.80k
        }
333
334
6.87k
        if (runLength > 0)
335
5.82k
        {
336
5.82k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
43
            return FALSE;
338
5.77k
          bitmask = *pbSrc++;
339
340
5.77k
          if (fFirstLine)
341
1.21k
          {
342
1.21k
            pbDest =
343
1.21k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.21k
          }
345
4.56k
          else
346
4.56k
          {
347
4.56k
            pbDest =
348
4.56k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
4.56k
          }
350
351
5.77k
          if (!pbDest)
352
4
            return FALSE;
353
5.77k
        }
354
355
6.82k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.82k
      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
22
          return FALSE;
363
4.10k
        pbSrc = pbSrc + advance;
364
4.10k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
38
          return FALSE;
366
4.06k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
320
          return FALSE;
368
369
3.74k
        UNROLL(runLength, {
370
3.74k
          SRCREADPIXEL(temp, pbSrc);
371
3.74k
          DESTWRITEPIXEL(pbDest, temp);
372
3.74k
        });
373
3.74k
        break;
374
375
      /* Handle Special Order 1. */
376
1.17k
      case SPECIAL_FGBG_1:
377
1.17k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.17k
        pbSrc = pbSrc + 1;
380
381
1.17k
        if (fFirstLine)
382
119
        {
383
119
          pbDest =
384
119
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
119
        }
386
1.05k
        else
387
1.05k
        {
388
1.05k
          pbDest =
389
1.05k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.05k
        }
391
392
1.17k
        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
831
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
831
        pbSrc = pbSrc + 1;
402
403
831
        if (fFirstLine)
404
96
        {
405
96
          pbDest =
406
96
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
96
        }
408
735
        else
409
735
        {
410
735
          pbDest =
411
735
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
735
        }
413
414
831
        if (!pbDest)
415
1
          return FALSE;
416
417
830
        break;
418
419
      /* Handle White Order. */
420
1.27k
      case SPECIAL_WHITE:
421
1.27k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.27k
        pbSrc = pbSrc + 1;
424
425
1.27k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
1.27k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.27k
        break;
430
431
      /* Handle Black Order. */
432
875
      case SPECIAL_BLACK:
433
875
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
875
        pbSrc = pbSrc + 1;
436
437
875
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
874
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
874
        break;
442
443
2.12k
      default:
444
2.12k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.12k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.12k
        return FALSE;
447
56.6k
    }
448
56.6k
  }
449
450
1.57k
  return TRUE;
451
6.00k
}
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
343k
  while (pbSrc < pbEnd)
134
340k
  {
135
    /* Watch out for the end of the first scanline. */
136
340k
    if (fFirstLine)
137
56.1k
    {
138
56.1k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.88k
      {
140
8.88k
        fFirstLine = FALSE;
141
8.88k
        fInsertFgPel = FALSE;
142
8.88k
      }
143
56.1k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
340k
    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
340k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
230k
    {
158
230k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
230k
      if (advance == 0)
160
490
        return FALSE;
161
229k
      pbSrc = pbSrc + advance;
162
163
229k
      if (fFirstLine)
164
23.7k
      {
165
23.7k
        if (fInsertFgPel)
166
16.2k
        {
167
16.2k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
16.2k
          DESTWRITEPIXEL(pbDest, fgPel);
171
16.2k
          runLength = runLength - 1;
172
16.2k
        }
173
174
23.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
48
          return FALSE;
176
177
23.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
23.6k
      }
179
205k
      else
180
205k
      {
181
205k
        if (fInsertFgPel)
182
185k
        {
183
185k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
185k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
46
            return FALSE;
187
188
184k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
184k
          runLength--;
190
184k
        }
191
192
205k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
682
          return FALSE;
194
195
205k
        UNROLL(runLength, {
196
205k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
205k
          DESTWRITEPIXEL(pbDest, temp);
198
205k
        });
199
205k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
228k
      fInsertFgPel = TRUE;
203
228k
      continue;
204
229k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
110k
    fInsertFgPel = FALSE;
209
210
110k
    switch (code)
211
110k
    {
212
      /* Handle Foreground Run Orders. */
213
17.8k
      case REGULAR_FG_RUN:
214
19.3k
      case MEGA_MEGA_FG_RUN:
215
31.5k
      case LITE_SET_FG_FG_RUN:
216
32.1k
      case MEGA_MEGA_SET_FG_RUN:
217
32.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
32.1k
        if (advance == 0)
219
70
          return FALSE;
220
32.0k
        pbSrc = pbSrc + advance;
221
222
32.0k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
12.7k
        {
224
12.7k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
164
            return FALSE;
226
12.5k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.5k
        }
228
229
31.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
220
          return FALSE;
231
232
31.6k
        if (fFirstLine)
233
7.18k
        {
234
7.18k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
7.18k
        }
236
24.4k
        else
237
24.4k
        {
238
24.4k
          UNROLL(runLength, {
239
24.4k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
24.4k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
24.4k
          });
242
24.4k
        }
243
244
31.6k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
7.36k
      case LITE_DITHERED_RUN:
248
8.21k
      case MEGA_MEGA_DITHERED_RUN:
249
8.21k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
8.21k
        if (advance == 0)
251
46
          return FALSE;
252
8.16k
        pbSrc = pbSrc + advance;
253
8.16k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
150
          return FALSE;
255
8.01k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.01k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
298
          return FALSE;
258
7.71k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.71k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
116
          return FALSE;
262
263
7.60k
        UNROLL(runLength, {
264
7.60k
          DESTWRITEPIXEL(pbDest, pixelA);
265
7.60k
          DESTWRITEPIXEL(pbDest, pixelB);
266
7.60k
        });
267
7.60k
        break;
268
269
      /* Handle Color Run Orders. */
270
31.4k
      case REGULAR_COLOR_RUN:
271
32.3k
      case MEGA_MEGA_COLOR_RUN:
272
32.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
32.3k
        if (advance == 0)
274
52
          return FALSE;
275
32.2k
        pbSrc = pbSrc + advance;
276
32.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
194
          return FALSE;
278
32.1k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
32.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
144
          return FALSE;
282
283
31.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
31.9k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.80k
      case REGULAR_FGBG_IMAGE:
288
11.5k
      case MEGA_MEGA_FGBG_IMAGE:
289
14.8k
      case LITE_SET_FG_FGBG_IMAGE:
290
15.6k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
15.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
15.6k
        if (advance == 0)
293
120
          return FALSE;
294
15.5k
        pbSrc = pbSrc + advance;
295
296
15.5k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
4.07k
        {
298
4.07k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
138
            return FALSE;
300
3.93k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.93k
        }
302
303
15.4k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
588
          return FALSE;
305
14.8k
        if (fFirstLine)
306
3.84k
        {
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
38
              return FALSE;
315
316
40.8k
            runLength = runLength - 8;
317
40.8k
          }
318
3.84k
        }
319
10.9k
        else
320
10.9k
        {
321
63.8k
          while (runLength > 8)
322
52.9k
          {
323
52.9k
            bitmask = *pbSrc++;
324
325
52.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
52.9k
            if (!pbDest)
328
38
              return FALSE;
329
330
52.8k
            runLength = runLength - 8;
331
52.8k
          }
332
10.9k
        }
333
334
14.7k
        if (runLength > 0)
335
12.5k
        {
336
12.5k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
74
            return FALSE;
338
12.5k
          bitmask = *pbSrc++;
339
340
12.5k
          if (fFirstLine)
341
1.84k
          {
342
1.84k
            pbDest =
343
1.84k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.84k
          }
345
10.6k
          else
346
10.6k
          {
347
10.6k
            pbDest =
348
10.6k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
10.6k
          }
350
351
12.5k
          if (!pbDest)
352
6
            return FALSE;
353
12.5k
        }
354
355
14.6k
        break;
356
357
      /* Handle Color Image Orders. */
358
14.6k
      case REGULAR_COLOR_IMAGE:
359
9.78k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.78k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.78k
        if (advance == 0)
362
38
          return FALSE;
363
9.74k
        pbSrc = pbSrc + advance;
364
9.74k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
80
          return FALSE;
366
9.66k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
684
          return FALSE;
368
369
8.98k
        UNROLL(runLength, {
370
8.98k
          SRCREADPIXEL(temp, pbSrc);
371
8.98k
          DESTWRITEPIXEL(pbDest, temp);
372
8.98k
        });
373
8.98k
        break;
374
375
      /* Handle Special Order 1. */
376
8.98k
      case SPECIAL_FGBG_1:
377
1.71k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.71k
        pbSrc = pbSrc + 1;
380
381
1.71k
        if (fFirstLine)
382
230
        {
383
230
          pbDest =
384
230
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
230
        }
386
1.48k
        else
387
1.48k
        {
388
1.48k
          pbDest =
389
1.48k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.48k
        }
391
392
1.71k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.71k
        break;
396
397
      /* Handle Special Order 2. */
398
1.87k
      case SPECIAL_FGBG_2:
399
1.87k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.87k
        pbSrc = pbSrc + 1;
402
403
1.87k
        if (fFirstLine)
404
188
        {
405
188
          pbDest =
406
188
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
188
        }
408
1.68k
        else
409
1.68k
        {
410
1.68k
          pbDest =
411
1.68k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.68k
        }
413
414
1.87k
        if (!pbDest)
415
2
          return FALSE;
416
417
1.87k
        break;
418
419
      /* Handle White Order. */
420
2.68k
      case SPECIAL_WHITE:
421
2.68k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.68k
        pbSrc = pbSrc + 1;
424
425
2.68k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
4
          return FALSE;
427
428
2.67k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.67k
        break;
430
431
      /* Handle Black Order. */
432
1.74k
      case SPECIAL_BLACK:
433
1.74k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.74k
        pbSrc = pbSrc + 1;
436
437
1.74k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.74k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.74k
        break;
442
443
4.29k
      default:
444
4.29k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.29k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.29k
        return FALSE;
447
110k
    }
448
110k
  }
449
450
3.19k
  return TRUE;
451
12.0k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8