Coverage Report

Created: 2025-12-14 07:02

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
87.5k
{
35
87.5k
  PIXEL xorPixel = 0;
36
87.5k
  BYTE mask = 0x01;
37
38
87.5k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
87.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
77
    return NULL;
46
47
87.4k
  UNROLL(cBits, {
48
87.4k
    PIXEL data = 0;
49
87.4k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
87.4k
    if (bitmask & mask)
52
87.4k
      data = xorPixel ^ fgPel;
53
87.4k
    else
54
87.4k
      data = xorPixel;
55
56
87.4k
    DESTWRITEPIXEL(pbDest, data);
57
87.4k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
87.4k
  });
59
87.4k
  return pbDest;
60
87.4k
}
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
62.2k
{
35
62.2k
  PIXEL xorPixel = 0;
36
62.2k
  BYTE mask = 0x01;
37
38
62.2k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
62.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
54
    return NULL;
46
47
62.1k
  UNROLL(cBits, {
48
62.1k
    PIXEL data = 0;
49
62.1k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
62.1k
    if (bitmask & mask)
52
62.1k
      data = xorPixel ^ fgPel;
53
62.1k
    else
54
62.1k
      data = xorPixel;
55
56
62.1k
    DESTWRITEPIXEL(pbDest, data);
57
62.1k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
62.1k
  });
59
62.1k
  return pbDest;
60
62.1k
}
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
74.7k
{
70
74.7k
  BYTE mask = 0x01;
71
72
74.7k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
74.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
87
    return NULL;
80
81
74.6k
  UNROLL(cBits, {
82
74.6k
    PIXEL data;
83
84
74.6k
    if (bitmask & mask)
85
74.6k
      data = fgPel;
86
74.6k
    else
87
74.6k
      data = BLACK_PIXEL;
88
89
74.6k
    DESTWRITEPIXEL(pbDest, data);
90
74.6k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
74.6k
  });
92
74.6k
  return pbDest;
93
74.6k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
27.3k
{
70
27.3k
  BYTE mask = 0x01;
71
72
27.3k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
27.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
31
    return NULL;
80
81
27.3k
  UNROLL(cBits, {
82
27.3k
    PIXEL data;
83
84
27.3k
    if (bitmask & mask)
85
27.3k
      data = fgPel;
86
27.3k
    else
87
27.3k
      data = BLACK_PIXEL;
88
89
27.3k
    DESTWRITEPIXEL(pbDest, data);
90
27.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
27.3k
  });
92
27.3k
  return pbDest;
93
27.3k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
47.3k
{
70
47.3k
  BYTE mask = 0x01;
71
72
47.3k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
47.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
56
    return NULL;
80
81
47.3k
  UNROLL(cBits, {
82
47.3k
    PIXEL data;
83
84
47.3k
    if (bitmask & mask)
85
47.3k
      data = fgPel;
86
47.3k
    else
87
47.3k
      data = BLACK_PIXEL;
88
89
47.3k
    DESTWRITEPIXEL(pbDest, data);
90
47.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
47.3k
  });
92
47.3k
  return pbDest;
93
47.3k
}
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
16.8k
{
102
16.8k
  const BYTE* pbSrc = pbSrcBuffer;
103
16.8k
  BYTE* pbDest = pbDestBuffer;
104
16.8k
  PIXEL temp = 0;
105
16.8k
  PIXEL fgPel = WHITE_PIXEL;
106
16.8k
  BOOL fInsertFgPel = FALSE;
107
16.8k
  BOOL fFirstLine = TRUE;
108
16.8k
  BYTE bitmask = 0;
109
16.8k
  PIXEL pixelA = 0;
110
16.8k
  PIXEL pixelB = 0;
111
16.8k
  UINT32 runLength = 0;
112
16.8k
  UINT32 code = 0;
113
16.8k
  UINT32 advance = 0;
114
16.8k
  RLEEXTRA
115
116
16.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
16.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
16.8k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
16.8k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
500k
  while (pbSrc < pbEnd)
134
496k
  {
135
    /* Watch out for the end of the first scanline. */
136
496k
    if (fFirstLine)
137
81.6k
    {
138
81.6k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
12.4k
      {
140
12.4k
        fFirstLine = FALSE;
141
12.4k
        fInsertFgPel = FALSE;
142
12.4k
      }
143
81.6k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
496k
    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
496k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
344k
    {
158
344k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
344k
      if (advance == 0)
160
617
        return FALSE;
161
343k
      pbSrc = pbSrc + advance;
162
163
343k
      if (fFirstLine)
164
35.0k
      {
165
35.0k
        if (fInsertFgPel)
166
24.0k
        {
167
24.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
24.0k
          DESTWRITEPIXEL(pbDest, fgPel);
171
24.0k
          runLength = runLength - 1;
172
24.0k
        }
173
174
35.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
72
          return FALSE;
176
177
35.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
35.0k
      }
179
308k
      else
180
308k
      {
181
308k
        if (fInsertFgPel)
182
279k
        {
183
279k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
279k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
62
            return FALSE;
187
188
279k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
279k
          runLength--;
190
279k
        }
191
192
308k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.06k
          return FALSE;
194
195
307k
        UNROLL(runLength, {
196
307k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
307k
          DESTWRITEPIXEL(pbDest, temp);
198
307k
        });
199
307k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
342k
      fInsertFgPel = TRUE;
203
342k
      continue;
204
343k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
152k
    fInsertFgPel = FALSE;
209
210
152k
    switch (code)
211
152k
    {
212
      /* Handle Foreground Run Orders. */
213
27.8k
      case REGULAR_FG_RUN:
214
30.0k
      case MEGA_MEGA_FG_RUN:
215
47.8k
      case LITE_SET_FG_FG_RUN:
216
48.9k
      case MEGA_MEGA_SET_FG_RUN:
217
48.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
48.9k
        if (advance == 0)
219
104
          return FALSE;
220
48.8k
        pbSrc = pbSrc + advance;
221
222
48.8k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.8k
        {
224
18.8k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
229
            return FALSE;
226
18.6k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.6k
        }
228
229
48.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
312
          return FALSE;
231
232
48.2k
        if (fFirstLine)
233
10.2k
        {
234
10.2k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.2k
        }
236
38.0k
        else
237
38.0k
        {
238
38.0k
          UNROLL(runLength, {
239
38.0k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
38.0k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
38.0k
          });
242
38.0k
        }
243
244
48.2k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
12.0k
      case LITE_DITHERED_RUN:
248
13.3k
      case MEGA_MEGA_DITHERED_RUN:
249
13.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
13.3k
        if (advance == 0)
251
55
          return FALSE;
252
13.2k
        pbSrc = pbSrc + advance;
253
13.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
258
          return FALSE;
255
13.0k
        SRCREADPIXEL(pixelA, pbSrc);
256
13.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
491
          return FALSE;
258
12.5k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
12.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
161
          return FALSE;
262
263
12.3k
        UNROLL(runLength, {
264
12.3k
          DESTWRITEPIXEL(pbDest, pixelA);
265
12.3k
          DESTWRITEPIXEL(pbDest, pixelB);
266
12.3k
        });
267
12.3k
        break;
268
269
      /* Handle Color Run Orders. */
270
35.7k
      case REGULAR_COLOR_RUN:
271
37.2k
      case MEGA_MEGA_COLOR_RUN:
272
37.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
37.2k
        if (advance == 0)
274
57
          return FALSE;
275
37.1k
        pbSrc = pbSrc + advance;
276
37.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
308
          return FALSE;
278
36.8k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
36.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
213
          return FALSE;
282
283
36.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
36.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
12.4k
      case REGULAR_FGBG_IMAGE:
288
14.4k
      case MEGA_MEGA_FGBG_IMAGE:
289
18.0k
      case LITE_SET_FG_FGBG_IMAGE:
290
19.3k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
19.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
19.3k
        if (advance == 0)
293
150
          return FALSE;
294
19.2k
        pbSrc = pbSrc + advance;
295
296
19.2k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
4.87k
        {
298
4.87k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
205
            return FALSE;
300
4.66k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.66k
        }
302
303
19.0k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
845
          return FALSE;
305
18.1k
        if (fFirstLine)
306
5.03k
        {
307
76.3k
          while (runLength > 8)
308
71.4k
          {
309
71.4k
            bitmask = *pbSrc;
310
71.4k
            pbSrc = pbSrc + 1;
311
71.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
71.4k
            if (!pbDest)
314
84
              return FALSE;
315
316
71.3k
            runLength = runLength - 8;
317
71.3k
          }
318
5.03k
        }
319
13.1k
        else
320
13.1k
        {
321
82.8k
          while (runLength > 8)
322
69.7k
          {
323
69.7k
            bitmask = *pbSrc++;
324
325
69.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
69.7k
            if (!pbDest)
328
61
              return FALSE;
329
330
69.7k
            runLength = runLength - 8;
331
69.7k
          }
332
13.1k
        }
333
334
18.0k
        if (runLength > 0)
335
15.2k
        {
336
15.2k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
106
            return FALSE;
338
15.1k
          bitmask = *pbSrc++;
339
340
15.1k
          if (fFirstLine)
341
2.67k
          {
342
2.67k
            pbDest =
343
2.67k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.67k
          }
345
12.4k
          else
346
12.4k
          {
347
12.4k
            pbDest =
348
12.4k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
12.4k
          }
350
351
15.1k
          if (!pbDest)
352
11
            return FALSE;
353
15.1k
        }
354
355
17.9k
        break;
356
357
      /* Handle Color Image Orders. */
358
17.9k
      case REGULAR_COLOR_IMAGE:
359
14.2k
      case MEGA_MEGA_COLOR_IMAGE:
360
14.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
14.2k
        if (advance == 0)
362
55
          return FALSE;
363
14.1k
        pbSrc = pbSrc + advance;
364
14.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
118
          return FALSE;
366
14.0k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
902
          return FALSE;
368
369
13.1k
        UNROLL(runLength, {
370
4.07k
          SRCREADPIXEL(temp, pbSrc);
371
4.07k
          DESTWRITEPIXEL(pbDest, temp);
372
4.07k
        });
373
9.09k
        break;
374
375
      /* Handle Special Order 1. */
376
9.09k
      case SPECIAL_FGBG_1:
377
2.64k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.64k
        pbSrc = pbSrc + 1;
380
381
2.64k
        if (fFirstLine)
382
318
        {
383
318
          pbDest =
384
318
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
318
        }
386
2.32k
        else
387
2.32k
        {
388
2.32k
          pbDest =
389
2.32k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.32k
        }
391
392
2.64k
        if (!pbDest)
393
3
          return FALSE;
394
395
2.63k
        break;
396
397
      /* Handle Special Order 2. */
398
3.28k
      case SPECIAL_FGBG_2:
399
3.28k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.28k
        pbSrc = pbSrc + 1;
402
403
3.28k
        if (fFirstLine)
404
304
        {
405
304
          pbDest =
406
304
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
304
        }
408
2.97k
        else
409
2.97k
        {
410
2.97k
          pbDest =
411
2.97k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.97k
        }
413
414
3.28k
        if (!pbDest)
415
5
          return FALSE;
416
417
3.27k
        break;
418
419
      /* Handle White Order. */
420
4.05k
      case SPECIAL_WHITE:
421
4.05k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
4.05k
        pbSrc = pbSrc + 1;
424
425
4.05k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
4.05k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
4.05k
        break;
430
431
      /* Handle Black Order. */
432
3.24k
      case SPECIAL_BLACK:
433
3.24k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
3.24k
        pbSrc = pbSrc + 1;
436
437
3.24k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
3.24k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
3.24k
        break;
442
443
6.09k
      default:
444
6.09k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.09k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.09k
        return FALSE;
447
152k
    }
448
152k
  }
449
450
4.23k
  return TRUE;
451
16.8k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
5.63k
{
102
5.63k
  const BYTE* pbSrc = pbSrcBuffer;
103
5.63k
  BYTE* pbDest = pbDestBuffer;
104
5.63k
  PIXEL temp = 0;
105
5.63k
  PIXEL fgPel = WHITE_PIXEL;
106
5.63k
  BOOL fInsertFgPel = FALSE;
107
5.63k
  BOOL fFirstLine = TRUE;
108
5.63k
  BYTE bitmask = 0;
109
5.63k
  PIXEL pixelA = 0;
110
5.63k
  PIXEL pixelB = 0;
111
5.63k
  UINT32 runLength = 0;
112
5.63k
  UINT32 code = 0;
113
5.63k
  UINT32 advance = 0;
114
5.63k
  RLEEXTRA
115
116
5.63k
  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.63k
  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.63k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
5.63k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
162k
  while (pbSrc < pbEnd)
134
160k
  {
135
    /* Watch out for the end of the first scanline. */
136
160k
    if (fFirstLine)
137
27.3k
    {
138
27.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
3.95k
      {
140
3.95k
        fFirstLine = FALSE;
141
3.95k
        fInsertFgPel = FALSE;
142
3.95k
      }
143
27.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
160k
    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
160k
    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
161
        return FALSE;
161
111k
      pbSrc = pbSrc + advance;
162
163
111k
      if (fFirstLine)
164
11.8k
      {
165
11.8k
        if (fInsertFgPel)
166
8.01k
        {
167
8.01k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.01k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.01k
          runLength = runLength - 1;
172
8.01k
        }
173
174
11.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
28
          return FALSE;
176
177
11.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
11.8k
      }
179
99.8k
      else
180
99.8k
      {
181
99.8k
        if (fInsertFgPel)
182
91.0k
        {
183
91.0k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
91.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
16
            return FALSE;
187
188
91.0k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
91.0k
          runLength--;
190
91.0k
        }
191
192
99.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
336
          return FALSE;
194
195
99.5k
        UNROLL(runLength, {
196
99.5k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
99.5k
          DESTWRITEPIXEL(pbDest, temp);
198
99.5k
        });
199
99.5k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
111k
      fInsertFgPel = TRUE;
203
111k
      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
48.7k
    fInsertFgPel = FALSE;
209
210
48.7k
    switch (code)
211
48.7k
    {
212
      /* Handle Foreground Run Orders. */
213
8.84k
      case REGULAR_FG_RUN:
214
9.57k
      case MEGA_MEGA_FG_RUN:
215
14.9k
      case LITE_SET_FG_FG_RUN:
216
15.3k
      case MEGA_MEGA_SET_FG_RUN:
217
15.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
15.3k
        if (advance == 0)
219
34
          return FALSE;
220
15.3k
        pbSrc = pbSrc + advance;
221
222
15.3k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
5.77k
        {
224
5.77k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
87
            return FALSE;
226
5.68k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.68k
        }
228
229
15.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
84
          return FALSE;
231
232
15.1k
        if (fFirstLine)
233
3.52k
        {
234
3.52k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.52k
        }
236
11.6k
        else
237
11.6k
        {
238
11.6k
          UNROLL(runLength, {
239
11.6k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.6k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.6k
          });
242
11.6k
        }
243
244
15.1k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.87k
      case LITE_DITHERED_RUN:
248
4.31k
      case MEGA_MEGA_DITHERED_RUN:
249
4.31k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.31k
        if (advance == 0)
251
13
          return FALSE;
252
4.30k
        pbSrc = pbSrc + advance;
253
4.30k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
108
          return FALSE;
255
4.19k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.19k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
227
          return FALSE;
258
3.96k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.96k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
51
          return FALSE;
262
263
3.91k
        UNROLL(runLength, {
264
3.91k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.91k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.91k
        });
267
3.91k
        break;
268
269
      /* Handle Color Run Orders. */
270
11.6k
      case REGULAR_COLOR_RUN:
271
12.1k
      case MEGA_MEGA_COLOR_RUN:
272
12.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
12.1k
        if (advance == 0)
274
17
          return FALSE;
275
12.1k
        pbSrc = pbSrc + advance;
276
12.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
130
          return FALSE;
278
12.0k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
12.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
71
          return FALSE;
282
283
11.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
11.9k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
3.88k
      case REGULAR_FGBG_IMAGE:
288
4.54k
      case MEGA_MEGA_FGBG_IMAGE:
289
5.69k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.14k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.14k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.14k
        if (advance == 0)
293
46
          return FALSE;
294
6.10k
        pbSrc = pbSrc + advance;
295
296
6.10k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.57k
        {
298
1.57k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
79
            return FALSE;
300
1.49k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.49k
        }
302
303
6.02k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
263
          return FALSE;
305
5.76k
        if (fFirstLine)
306
1.72k
        {
307
27.8k
          while (runLength > 8)
308
26.1k
          {
309
26.1k
            bitmask = *pbSrc;
310
26.1k
            pbSrc = pbSrc + 1;
311
26.1k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
26.1k
            if (!pbDest)
314
30
              return FALSE;
315
316
26.1k
            runLength = runLength - 8;
317
26.1k
          }
318
1.72k
        }
319
4.03k
        else
320
4.03k
        {
321
23.9k
          while (runLength > 8)
322
19.9k
          {
323
19.9k
            bitmask = *pbSrc++;
324
325
19.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
19.9k
            if (!pbDest)
328
17
              return FALSE;
329
330
19.9k
            runLength = runLength - 8;
331
19.9k
          }
332
4.03k
        }
333
334
5.71k
        if (runLength > 0)
335
4.79k
        {
336
4.79k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
38
            return FALSE;
338
4.75k
          bitmask = *pbSrc++;
339
340
4.75k
          if (fFirstLine)
341
1.01k
          {
342
1.01k
            pbDest =
343
1.01k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.01k
          }
345
3.74k
          else
346
3.74k
          {
347
3.74k
            pbDest =
348
3.74k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
3.74k
          }
350
351
4.75k
          if (!pbDest)
352
5
            return FALSE;
353
4.75k
        }
354
355
5.67k
        break;
356
357
      /* Handle Color Image Orders. */
358
5.67k
      case REGULAR_COLOR_IMAGE:
359
4.42k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.42k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.42k
        if (advance == 0)
362
19
          return FALSE;
363
4.40k
        pbSrc = pbSrc + advance;
364
4.40k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
40
          return FALSE;
366
4.36k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
296
          return FALSE;
368
369
4.07k
        UNROLL(runLength, {
370
4.07k
          SRCREADPIXEL(temp, pbSrc);
371
4.07k
          DESTWRITEPIXEL(pbDest, temp);
372
4.07k
        });
373
4.07k
        break;
374
375
      /* Handle Special Order 1. */
376
814
      case SPECIAL_FGBG_1:
377
814
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
814
        pbSrc = pbSrc + 1;
380
381
814
        if (fFirstLine)
382
98
        {
383
98
          pbDest =
384
98
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
98
        }
386
716
        else
387
716
        {
388
716
          pbDest =
389
716
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
716
        }
391
392
814
        if (!pbDest)
393
1
          return FALSE;
394
395
813
        break;
396
397
      /* Handle Special Order 2. */
398
1.00k
      case SPECIAL_FGBG_2:
399
1.00k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.00k
        pbSrc = pbSrc + 1;
402
403
1.00k
        if (fFirstLine)
404
110
        {
405
110
          pbDest =
406
110
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
110
        }
408
892
        else
409
892
        {
410
892
          pbDest =
411
892
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
892
        }
413
414
1.00k
        if (!pbDest)
415
1
          return FALSE;
416
417
1.00k
        break;
418
419
      /* Handle White Order. */
420
1.35k
      case SPECIAL_WHITE:
421
1.35k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.35k
        pbSrc = pbSrc + 1;
424
425
1.35k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.35k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.35k
        break;
430
431
      /* Handle Black Order. */
432
1.13k
      case SPECIAL_BLACK:
433
1.13k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.13k
        pbSrc = pbSrc + 1;
436
437
1.13k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
1.13k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.13k
        break;
442
443
2.02k
      default:
444
2.02k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.02k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.02k
        return FALSE;
447
48.7k
    }
448
48.7k
  }
449
450
1.40k
  return TRUE;
451
5.63k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
11.2k
{
102
11.2k
  const BYTE* pbSrc = pbSrcBuffer;
103
11.2k
  BYTE* pbDest = pbDestBuffer;
104
11.2k
  PIXEL temp = 0;
105
11.2k
  PIXEL fgPel = WHITE_PIXEL;
106
11.2k
  BOOL fInsertFgPel = FALSE;
107
11.2k
  BOOL fFirstLine = TRUE;
108
11.2k
  BYTE bitmask = 0;
109
11.2k
  PIXEL pixelA = 0;
110
11.2k
  PIXEL pixelB = 0;
111
11.2k
  UINT32 runLength = 0;
112
11.2k
  UINT32 code = 0;
113
11.2k
  UINT32 advance = 0;
114
11.2k
  RLEEXTRA
115
116
11.2k
  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.2k
  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.2k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
11.2k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
338k
  while (pbSrc < pbEnd)
134
335k
  {
135
    /* Watch out for the end of the first scanline. */
136
335k
    if (fFirstLine)
137
54.3k
    {
138
54.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.51k
      {
140
8.51k
        fFirstLine = FALSE;
141
8.51k
        fInsertFgPel = FALSE;
142
8.51k
      }
143
54.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
335k
    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
335k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
232k
    {
158
232k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
232k
      if (advance == 0)
160
456
        return FALSE;
161
231k
      pbSrc = pbSrc + advance;
162
163
231k
      if (fFirstLine)
164
23.2k
      {
165
23.2k
        if (fInsertFgPel)
166
16.0k
        {
167
16.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
16.0k
          DESTWRITEPIXEL(pbDest, fgPel);
171
16.0k
          runLength = runLength - 1;
172
16.0k
        }
173
174
23.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
44
          return FALSE;
176
177
23.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
23.1k
      }
179
208k
      else
180
208k
      {
181
208k
        if (fInsertFgPel)
182
188k
        {
183
188k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
188k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
46
            return FALSE;
187
188
188k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
188k
          runLength--;
190
188k
        }
191
192
208k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
732
          return FALSE;
194
195
207k
        UNROLL(runLength, {
196
207k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
207k
          DESTWRITEPIXEL(pbDest, temp);
198
207k
        });
199
207k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
231k
      fInsertFgPel = TRUE;
203
231k
      continue;
204
231k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
103k
    fInsertFgPel = FALSE;
209
210
103k
    switch (code)
211
103k
    {
212
      /* Handle Foreground Run Orders. */
213
18.9k
      case REGULAR_FG_RUN:
214
20.4k
      case MEGA_MEGA_FG_RUN:
215
32.8k
      case LITE_SET_FG_FG_RUN:
216
33.5k
      case MEGA_MEGA_SET_FG_RUN:
217
33.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
33.5k
        if (advance == 0)
219
70
          return FALSE;
220
33.4k
        pbSrc = pbSrc + advance;
221
222
33.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
13.0k
        {
224
13.0k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
142
            return FALSE;
226
12.9k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.9k
        }
228
229
33.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
228
          return FALSE;
231
232
33.1k
        if (fFirstLine)
233
6.75k
        {
234
6.75k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
6.75k
        }
236
26.3k
        else
237
26.3k
        {
238
26.3k
          UNROLL(runLength, {
239
26.3k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
26.3k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
26.3k
          });
242
26.3k
        }
243
244
33.1k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
8.17k
      case LITE_DITHERED_RUN:
248
9.03k
      case MEGA_MEGA_DITHERED_RUN:
249
9.03k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
9.03k
        if (advance == 0)
251
42
          return FALSE;
252
8.99k
        pbSrc = pbSrc + advance;
253
8.99k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
150
          return FALSE;
255
8.84k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.84k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
264
          return FALSE;
258
8.58k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
8.58k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
110
          return FALSE;
262
263
8.47k
        UNROLL(runLength, {
264
8.47k
          DESTWRITEPIXEL(pbDest, pixelA);
265
8.47k
          DESTWRITEPIXEL(pbDest, pixelB);
266
8.47k
        });
267
8.47k
        break;
268
269
      /* Handle Color Run Orders. */
270
24.0k
      case REGULAR_COLOR_RUN:
271
25.0k
      case MEGA_MEGA_COLOR_RUN:
272
25.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
25.0k
        if (advance == 0)
274
40
          return FALSE;
275
25.0k
        pbSrc = pbSrc + advance;
276
25.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
178
          return FALSE;
278
24.8k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
24.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
142
          return FALSE;
282
283
24.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
24.7k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
8.51k
      case REGULAR_FGBG_IMAGE:
288
9.86k
      case MEGA_MEGA_FGBG_IMAGE:
289
12.3k
      case LITE_SET_FG_FGBG_IMAGE:
290
13.2k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
13.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
13.2k
        if (advance == 0)
293
104
          return FALSE;
294
13.1k
        pbSrc = pbSrc + advance;
295
296
13.1k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.29k
        {
298
3.29k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
126
            return FALSE;
300
3.16k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.16k
        }
302
303
12.9k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
582
          return FALSE;
305
12.4k
        if (fFirstLine)
306
3.30k
        {
307
48.5k
          while (runLength > 8)
308
45.3k
          {
309
45.3k
            bitmask = *pbSrc;
310
45.3k
            pbSrc = pbSrc + 1;
311
45.3k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
45.3k
            if (!pbDest)
314
54
              return FALSE;
315
316
45.2k
            runLength = runLength - 8;
317
45.2k
          }
318
3.30k
        }
319
9.10k
        else
320
9.10k
        {
321
58.8k
          while (runLength > 8)
322
49.8k
          {
323
49.8k
            bitmask = *pbSrc++;
324
325
49.8k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
49.8k
            if (!pbDest)
328
44
              return FALSE;
329
330
49.7k
            runLength = runLength - 8;
331
49.7k
          }
332
9.10k
        }
333
334
12.3k
        if (runLength > 0)
335
10.4k
        {
336
10.4k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
68
            return FALSE;
338
10.3k
          bitmask = *pbSrc++;
339
340
10.3k
          if (fFirstLine)
341
1.66k
          {
342
1.66k
            pbDest =
343
1.66k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.66k
          }
345
8.71k
          else
346
8.71k
          {
347
8.71k
            pbDest =
348
8.71k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
8.71k
          }
350
351
10.3k
          if (!pbDest)
352
6
            return FALSE;
353
10.3k
        }
354
355
12.2k
        break;
356
357
      /* Handle Color Image Orders. */
358
12.2k
      case REGULAR_COLOR_IMAGE:
359
9.81k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.81k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.81k
        if (advance == 0)
362
36
          return FALSE;
363
9.77k
        pbSrc = pbSrc + advance;
364
9.77k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
78
          return FALSE;
366
9.70k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
606
          return FALSE;
368
369
9.09k
        UNROLL(runLength, {
370
9.09k
          SRCREADPIXEL(temp, pbSrc);
371
9.09k
          DESTWRITEPIXEL(pbDest, temp);
372
9.09k
        });
373
9.09k
        break;
374
375
      /* Handle Special Order 1. */
376
9.09k
      case SPECIAL_FGBG_1:
377
1.82k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.82k
        pbSrc = pbSrc + 1;
380
381
1.82k
        if (fFirstLine)
382
220
        {
383
220
          pbDest =
384
220
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
220
        }
386
1.60k
        else
387
1.60k
        {
388
1.60k
          pbDest =
389
1.60k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.60k
        }
391
392
1.82k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.82k
        break;
396
397
      /* Handle Special Order 2. */
398
2.28k
      case SPECIAL_FGBG_2:
399
2.28k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.28k
        pbSrc = pbSrc + 1;
402
403
2.28k
        if (fFirstLine)
404
194
        {
405
194
          pbDest =
406
194
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
194
        }
408
2.08k
        else
409
2.08k
        {
410
2.08k
          pbDest =
411
2.08k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.08k
        }
413
414
2.28k
        if (!pbDest)
415
4
          return FALSE;
416
417
2.27k
        break;
418
419
      /* Handle White Order. */
420
2.70k
      case SPECIAL_WHITE:
421
2.70k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.70k
        pbSrc = pbSrc + 1;
424
425
2.70k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
2.70k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.70k
        break;
430
431
      /* Handle Black Order. */
432
2.11k
      case SPECIAL_BLACK:
433
2.11k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.11k
        pbSrc = pbSrc + 1;
436
437
2.11k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
2.10k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.10k
        break;
442
443
4.07k
      default:
444
4.07k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.07k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.07k
        return FALSE;
447
103k
    }
448
103k
  }
449
450
2.83k
  return TRUE;
451
11.2k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8