Coverage Report

Created: 2026-01-16 07:06

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
89.4k
{
35
89.4k
  PIXEL xorPixel = 0;
36
89.4k
  BYTE mask = 0x01;
37
38
89.4k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
89.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
93
    return NULL;
46
47
89.3k
  UNROLL(cBits, {
48
89.3k
    PIXEL data = 0;
49
89.3k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
89.3k
    if (bitmask & mask)
52
89.3k
      data = xorPixel ^ fgPel;
53
89.3k
    else
54
89.3k
      data = xorPixel;
55
56
89.3k
    DESTWRITEPIXEL(pbDest, data);
57
89.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
89.3k
  });
59
89.3k
  return pbDest;
60
89.3k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
25.8k
{
35
25.8k
  PIXEL xorPixel = 0;
36
25.8k
  BYTE mask = 0x01;
37
38
25.8k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
25.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
29
    return NULL;
46
47
25.8k
  UNROLL(cBits, {
48
25.8k
    PIXEL data = 0;
49
25.8k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
25.8k
    if (bitmask & mask)
52
25.8k
      data = xorPixel ^ fgPel;
53
25.8k
    else
54
25.8k
      data = xorPixel;
55
56
25.8k
    DESTWRITEPIXEL(pbDest, data);
57
25.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
25.8k
  });
59
25.8k
  return pbDest;
60
25.8k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
63.5k
{
35
63.5k
  PIXEL xorPixel = 0;
36
63.5k
  BYTE mask = 0x01;
37
38
63.5k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
63.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
64
    return NULL;
46
47
63.5k
  UNROLL(cBits, {
48
63.5k
    PIXEL data = 0;
49
63.5k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
63.5k
    if (bitmask & mask)
52
63.5k
      data = xorPixel ^ fgPel;
53
63.5k
    else
54
63.5k
      data = xorPixel;
55
56
63.5k
    DESTWRITEPIXEL(pbDest, data);
57
63.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
63.5k
  });
59
63.5k
  return pbDest;
60
63.5k
}
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
53.6k
{
70
53.6k
  BYTE mask = 0x01;
71
72
53.6k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
53.6k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
45
    return NULL;
80
81
53.6k
  UNROLL(cBits, {
82
53.6k
    PIXEL data;
83
84
53.6k
    if (bitmask & mask)
85
53.6k
      data = fgPel;
86
53.6k
    else
87
53.6k
      data = BLACK_PIXEL;
88
89
53.6k
    DESTWRITEPIXEL(pbDest, data);
90
53.6k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
53.6k
  });
92
53.6k
  return pbDest;
93
53.6k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
19.8k
{
70
19.8k
  BYTE mask = 0x01;
71
72
19.8k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
19.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
17
    return NULL;
80
81
19.8k
  UNROLL(cBits, {
82
19.8k
    PIXEL data;
83
84
19.8k
    if (bitmask & mask)
85
19.8k
      data = fgPel;
86
19.8k
    else
87
19.8k
      data = BLACK_PIXEL;
88
89
19.8k
    DESTWRITEPIXEL(pbDest, data);
90
19.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
19.8k
  });
92
19.8k
  return pbDest;
93
19.8k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
33.7k
{
70
33.7k
  BYTE mask = 0x01;
71
72
33.7k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
33.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
28
    return NULL;
80
81
33.7k
  UNROLL(cBits, {
82
33.7k
    PIXEL data;
83
84
33.7k
    if (bitmask & mask)
85
33.7k
      data = fgPel;
86
33.7k
    else
87
33.7k
      data = BLACK_PIXEL;
88
89
33.7k
    DESTWRITEPIXEL(pbDest, data);
90
33.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
33.7k
  });
92
33.7k
  return pbDest;
93
33.7k
}
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.1k
{
102
16.1k
  const BYTE* pbSrc = pbSrcBuffer;
103
16.1k
  BYTE* pbDest = pbDestBuffer;
104
16.1k
  PIXEL temp = 0;
105
16.1k
  PIXEL fgPel = WHITE_PIXEL;
106
16.1k
  BOOL fInsertFgPel = FALSE;
107
16.1k
  BOOL fFirstLine = TRUE;
108
16.1k
  BYTE bitmask = 0;
109
16.1k
  PIXEL pixelA = 0;
110
16.1k
  PIXEL pixelB = 0;
111
16.1k
  UINT32 runLength = 0;
112
16.1k
  UINT32 code = 0;
113
16.1k
  UINT32 advance = 0;
114
16.1k
  RLEEXTRA
115
116
16.1k
  if ((rowDelta == 0) || (rowDelta < width))
117
0
  {
118
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
119
0
             width);
120
0
    return FALSE;
121
0
  }
122
123
16.1k
  if (!pbSrcBuffer || !pbDestBuffer)
124
0
  {
125
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,
126
0
             pbDestBuffer);
127
0
    return FALSE;
128
0
  }
129
130
16.1k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
16.1k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
488k
  while (pbSrc < pbEnd)
134
484k
  {
135
    /* Watch out for the end of the first scanline. */
136
484k
    if (fFirstLine)
137
77.1k
    {
138
77.1k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
11.9k
      {
140
11.9k
        fFirstLine = FALSE;
141
11.9k
        fInsertFgPel = FALSE;
142
11.9k
      }
143
77.1k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
484k
    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
484k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
317k
    {
158
317k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
317k
      if (advance == 0)
160
572
        return FALSE;
161
317k
      pbSrc = pbSrc + advance;
162
163
317k
      if (fFirstLine)
164
32.3k
      {
165
32.3k
        if (fInsertFgPel)
166
21.8k
        {
167
21.8k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
21.8k
          DESTWRITEPIXEL(pbDest, fgPel);
171
21.8k
          runLength = runLength - 1;
172
21.8k
        }
173
174
32.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
62
          return FALSE;
176
177
32.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
32.3k
      }
179
285k
      else
180
285k
      {
181
285k
        if (fInsertFgPel)
182
255k
        {
183
255k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
255k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
49
            return FALSE;
187
188
255k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
255k
          runLength--;
190
255k
        }
191
192
284k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
975
          return FALSE;
194
195
283k
        UNROLL(runLength, {
196
283k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
283k
          DESTWRITEPIXEL(pbDest, temp);
198
283k
        });
199
283k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
316k
      fInsertFgPel = TRUE;
203
316k
      continue;
204
317k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
166k
    fInsertFgPel = FALSE;
209
210
166k
    switch (code)
211
166k
    {
212
      /* Handle Foreground Run Orders. */
213
23.8k
      case REGULAR_FG_RUN:
214
26.5k
      case MEGA_MEGA_FG_RUN:
215
43.4k
      case LITE_SET_FG_FG_RUN:
216
44.5k
      case MEGA_MEGA_SET_FG_RUN:
217
44.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
44.5k
        if (advance == 0)
219
103
          return FALSE;
220
44.4k
        pbSrc = pbSrc + advance;
221
222
44.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
17.9k
        {
224
17.9k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
182
            return FALSE;
226
17.7k
          SRCREADPIXEL(fgPel, pbSrc);
227
17.7k
        }
228
229
44.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
271
          return FALSE;
231
232
43.9k
        if (fFirstLine)
233
9.94k
        {
234
9.94k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
9.94k
        }
236
34.0k
        else
237
34.0k
        {
238
34.0k
          UNROLL(runLength, {
239
34.0k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
34.0k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
34.0k
          });
242
34.0k
        }
243
244
43.9k
        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
60
          return FALSE;
252
12.3k
        pbSrc = pbSrc + advance;
253
12.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
238
          return FALSE;
255
12.1k
        SRCREADPIXEL(pixelA, pbSrc);
256
12.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
493
          return FALSE;
258
11.6k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
11.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
156
          return FALSE;
262
263
11.5k
        UNROLL(runLength, {
264
11.5k
          DESTWRITEPIXEL(pbDest, pixelA);
265
11.5k
          DESTWRITEPIXEL(pbDest, pixelB);
266
11.5k
        });
267
11.5k
        break;
268
269
      /* Handle Color Run Orders. */
270
54.8k
      case REGULAR_COLOR_RUN:
271
56.2k
      case MEGA_MEGA_COLOR_RUN:
272
56.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
56.2k
        if (advance == 0)
274
62
          return FALSE;
275
56.1k
        pbSrc = pbSrc + advance;
276
56.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
290
          return FALSE;
278
55.8k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
55.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
165
          return FALSE;
282
283
55.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
55.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
14.4k
      case REGULAR_FGBG_IMAGE:
288
16.3k
      case MEGA_MEGA_FGBG_IMAGE:
289
20.4k
      case LITE_SET_FG_FGBG_IMAGE:
290
21.5k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
21.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
21.5k
        if (advance == 0)
293
138
          return FALSE;
294
21.4k
        pbSrc = pbSrc + advance;
295
296
21.4k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
5.12k
        {
298
5.12k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
177
            return FALSE;
300
4.94k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.94k
        }
302
303
21.2k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
795
          return FALSE;
305
20.4k
        if (fFirstLine)
306
5.16k
        {
307
55.2k
          while (runLength > 8)
308
50.1k
          {
309
50.1k
            bitmask = *pbSrc;
310
50.1k
            pbSrc = pbSrc + 1;
311
50.1k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
50.1k
            if (!pbDest)
314
42
              return FALSE;
315
316
50.0k
            runLength = runLength - 8;
317
50.0k
          }
318
5.16k
        }
319
15.3k
        else
320
15.3k
        {
321
84.2k
          while (runLength > 8)
322
69.0k
          {
323
69.0k
            bitmask = *pbSrc++;
324
325
69.0k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
69.0k
            if (!pbDest)
328
63
              return FALSE;
329
330
68.9k
            runLength = runLength - 8;
331
68.9k
          }
332
15.3k
        }
333
334
20.3k
        if (runLength > 0)
335
17.8k
        {
336
17.8k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
88
            return FALSE;
338
17.7k
          bitmask = *pbSrc++;
339
340
17.7k
          if (fFirstLine)
341
2.93k
          {
342
2.93k
            pbDest =
343
2.93k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.93k
          }
345
14.7k
          else
346
14.7k
          {
347
14.7k
            pbDest =
348
14.7k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
14.7k
          }
350
351
17.7k
          if (!pbDest)
352
24
            return FALSE;
353
17.7k
        }
354
355
20.2k
        break;
356
357
      /* Handle Color Image Orders. */
358
20.2k
      case REGULAR_COLOR_IMAGE:
359
11.7k
      case MEGA_MEGA_COLOR_IMAGE:
360
11.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
11.7k
        if (advance == 0)
362
68
          return FALSE;
363
11.6k
        pbSrc = pbSrc + advance;
364
11.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
107
          return FALSE;
366
11.5k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
971
          return FALSE;
368
369
10.5k
        UNROLL(runLength, {
370
3.31k
          SRCREADPIXEL(temp, pbSrc);
371
3.31k
          DESTWRITEPIXEL(pbDest, temp);
372
3.31k
        });
373
7.28k
        break;
374
375
      /* Handle Special Order 1. */
376
7.28k
      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
293
        {
383
293
          pbDest =
384
293
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
293
        }
386
2.35k
        else
387
2.35k
        {
388
2.35k
          pbDest =
389
2.35k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.35k
        }
391
392
2.64k
        if (!pbDest)
393
6
          return FALSE;
394
395
2.64k
        break;
396
397
      /* Handle Special Order 2. */
398
3.60k
      case SPECIAL_FGBG_2:
399
3.60k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.60k
        pbSrc = pbSrc + 1;
402
403
3.60k
        if (fFirstLine)
404
319
        {
405
319
          pbDest =
406
319
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
319
        }
408
3.28k
        else
409
3.28k
        {
410
3.28k
          pbDest =
411
3.28k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
3.28k
        }
413
414
3.60k
        if (!pbDest)
415
3
          return FALSE;
416
417
3.60k
        break;
418
419
      /* Handle White Order. */
420
4.50k
      case SPECIAL_WHITE:
421
4.50k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
4.50k
        pbSrc = pbSrc + 1;
424
425
4.50k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
4.50k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
4.50k
        break;
430
431
      /* Handle Black Order. */
432
3.13k
      case SPECIAL_BLACK:
433
3.13k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
3.13k
        pbSrc = pbSrc + 1;
436
437
3.13k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
3.13k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
3.13k
        break;
442
443
5.91k
      default:
444
5.91k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
5.91k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
5.91k
        return FALSE;
447
166k
    }
448
166k
  }
449
450
4.05k
  return TRUE;
451
16.1k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
5.37k
{
102
5.37k
  const BYTE* pbSrc = pbSrcBuffer;
103
5.37k
  BYTE* pbDest = pbDestBuffer;
104
5.37k
  PIXEL temp = 0;
105
5.37k
  PIXEL fgPel = WHITE_PIXEL;
106
5.37k
  BOOL fInsertFgPel = FALSE;
107
5.37k
  BOOL fFirstLine = TRUE;
108
5.37k
  BYTE bitmask = 0;
109
5.37k
  PIXEL pixelA = 0;
110
5.37k
  PIXEL pixelB = 0;
111
5.37k
  UINT32 runLength = 0;
112
5.37k
  UINT32 code = 0;
113
5.37k
  UINT32 advance = 0;
114
5.37k
  RLEEXTRA
115
116
5.37k
  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.37k
  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.37k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
5.37k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
162k
  while (pbSrc < pbEnd)
134
161k
  {
135
    /* Watch out for the end of the first scanline. */
136
161k
    if (fFirstLine)
137
25.9k
    {
138
25.9k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
3.80k
      {
140
3.80k
        fFirstLine = FALSE;
141
3.80k
        fInsertFgPel = FALSE;
142
3.80k
      }
143
25.9k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
161k
    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
161k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
104k
    {
158
104k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
104k
      if (advance == 0)
160
156
        return FALSE;
161
104k
      pbSrc = pbSrc + advance;
162
163
104k
      if (fFirstLine)
164
10.9k
      {
165
10.9k
        if (fInsertFgPel)
166
7.28k
        {
167
7.28k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
7.28k
          DESTWRITEPIXEL(pbDest, fgPel);
171
7.28k
          runLength = runLength - 1;
172
7.28k
        }
173
174
10.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
22
          return FALSE;
176
177
10.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
10.9k
      }
179
93.1k
      else
180
93.1k
      {
181
93.1k
        if (fInsertFgPel)
182
83.9k
        {
183
83.9k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
83.9k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
19
            return FALSE;
187
188
83.9k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
83.9k
          runLength--;
190
83.9k
        }
191
192
93.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
301
          return FALSE;
194
195
92.8k
        UNROLL(runLength, {
196
92.8k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
92.8k
          DESTWRITEPIXEL(pbDest, temp);
198
92.8k
        });
199
92.8k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
103k
      fInsertFgPel = TRUE;
203
103k
      continue;
204
104k
    }
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.8k
    fInsertFgPel = FALSE;
209
210
56.8k
    switch (code)
211
56.8k
    {
212
      /* Handle Foreground Run Orders. */
213
7.64k
      case REGULAR_FG_RUN:
214
8.52k
      case MEGA_MEGA_FG_RUN:
215
14.5k
      case LITE_SET_FG_FG_RUN:
216
14.9k
      case MEGA_MEGA_SET_FG_RUN:
217
14.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
14.9k
        if (advance == 0)
219
35
          return FALSE;
220
14.9k
        pbSrc = pbSrc + advance;
221
222
14.9k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
6.44k
        {
224
6.44k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
66
            return FALSE;
226
6.37k
          SRCREADPIXEL(fgPel, pbSrc);
227
6.37k
        }
228
229
14.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
67
          return FALSE;
231
232
14.8k
        if (fFirstLine)
233
3.47k
        {
234
3.47k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.47k
        }
236
11.3k
        else
237
11.3k
        {
238
11.3k
          UNROLL(runLength, {
239
11.3k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.3k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.3k
          });
242
11.3k
        }
243
244
14.8k
        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
104
          return FALSE;
255
4.14k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.14k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
233
          return FALSE;
258
3.90k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.90k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
50
          return FALSE;
262
263
3.85k
        UNROLL(runLength, {
264
3.85k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.85k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.85k
        });
267
3.85k
        break;
268
269
      /* Handle Color Run Orders. */
270
20.0k
      case REGULAR_COLOR_RUN:
271
20.4k
      case MEGA_MEGA_COLOR_RUN:
272
20.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
20.4k
        if (advance == 0)
274
18
          return FALSE;
275
20.4k
        pbSrc = pbSrc + advance;
276
20.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
130
          return FALSE;
278
20.3k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
20.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
65
          return FALSE;
282
283
20.2k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
20.2k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.53k
      case REGULAR_FGBG_IMAGE:
288
5.18k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.57k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.95k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.95k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.95k
        if (advance == 0)
293
42
          return FALSE;
294
6.91k
        pbSrc = pbSrc + advance;
295
296
6.91k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.75k
        {
298
1.75k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
71
            return FALSE;
300
1.68k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.68k
        }
302
303
6.84k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
241
          return FALSE;
305
6.60k
        if (fFirstLine)
306
1.79k
        {
307
20.3k
          while (runLength > 8)
308
18.5k
          {
309
18.5k
            bitmask = *pbSrc;
310
18.5k
            pbSrc = pbSrc + 1;
311
18.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
18.5k
            if (!pbDest)
314
16
              return FALSE;
315
316
18.5k
            runLength = runLength - 8;
317
18.5k
          }
318
1.79k
        }
319
4.81k
        else
320
4.81k
        {
321
24.2k
          while (runLength > 8)
322
19.4k
          {
323
19.4k
            bitmask = *pbSrc++;
324
325
19.4k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
19.4k
            if (!pbDest)
328
17
              return FALSE;
329
330
19.4k
            runLength = runLength - 8;
331
19.4k
          }
332
4.81k
        }
333
334
6.57k
        if (runLength > 0)
335
5.70k
        {
336
5.70k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
30
            return FALSE;
338
5.67k
          bitmask = *pbSrc++;
339
340
5.67k
          if (fFirstLine)
341
1.11k
          {
342
1.11k
            pbDest =
343
1.11k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.11k
          }
345
4.55k
          else
346
4.55k
          {
347
4.55k
            pbDest =
348
4.55k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
4.55k
          }
350
351
5.67k
          if (!pbDest)
352
10
            return FALSE;
353
5.67k
        }
354
355
6.53k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.53k
      case REGULAR_COLOR_IMAGE:
359
3.68k
      case MEGA_MEGA_COLOR_IMAGE:
360
3.68k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
3.68k
        if (advance == 0)
362
22
          return FALSE;
363
3.66k
        pbSrc = pbSrc + advance;
364
3.66k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
33
          return FALSE;
366
3.63k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
319
          return FALSE;
368
369
3.31k
        UNROLL(runLength, {
370
3.31k
          SRCREADPIXEL(temp, pbSrc);
371
3.31k
          DESTWRITEPIXEL(pbDest, temp);
372
3.31k
        });
373
3.31k
        break;
374
375
      /* Handle Special Order 1. */
376
882
      case SPECIAL_FGBG_1:
377
882
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
882
        pbSrc = pbSrc + 1;
380
381
882
        if (fFirstLine)
382
89
        {
383
89
          pbDest =
384
89
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
89
        }
386
793
        else
387
793
        {
388
793
          pbDest =
389
793
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
793
        }
391
392
882
        if (!pbDest)
393
2
          return FALSE;
394
395
880
        break;
396
397
      /* Handle Special Order 2. */
398
1.20k
      case SPECIAL_FGBG_2:
399
1.20k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.20k
        pbSrc = pbSrc + 1;
402
403
1.20k
        if (fFirstLine)
404
113
        {
405
113
          pbDest =
406
113
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
113
        }
408
1.08k
        else
409
1.08k
        {
410
1.08k
          pbDest =
411
1.08k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.08k
        }
413
414
1.20k
        if (!pbDest)
415
1
          return FALSE;
416
417
1.19k
        break;
418
419
      /* Handle White Order. */
420
1.48k
      case SPECIAL_WHITE:
421
1.48k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.48k
        pbSrc = pbSrc + 1;
424
425
1.48k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.48k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.48k
        break;
430
431
      /* Handle Black Order. */
432
1.03k
      case SPECIAL_BLACK:
433
1.03k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.03k
        pbSrc = pbSrc + 1;
436
437
1.03k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
1.03k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.03k
        break;
442
443
1.93k
      default:
444
1.93k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
1.93k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
1.93k
        return FALSE;
447
56.8k
    }
448
56.8k
  }
449
450
1.35k
  return TRUE;
451
5.37k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
10.7k
{
102
10.7k
  const BYTE* pbSrc = pbSrcBuffer;
103
10.7k
  BYTE* pbDest = pbDestBuffer;
104
10.7k
  PIXEL temp = 0;
105
10.7k
  PIXEL fgPel = WHITE_PIXEL;
106
10.7k
  BOOL fInsertFgPel = FALSE;
107
10.7k
  BOOL fFirstLine = TRUE;
108
10.7k
  BYTE bitmask = 0;
109
10.7k
  PIXEL pixelA = 0;
110
10.7k
  PIXEL pixelB = 0;
111
10.7k
  UINT32 runLength = 0;
112
10.7k
  UINT32 code = 0;
113
10.7k
  UINT32 advance = 0;
114
10.7k
  RLEEXTRA
115
116
10.7k
  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
10.7k
  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
10.7k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
10.7k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
325k
  while (pbSrc < pbEnd)
134
323k
  {
135
    /* Watch out for the end of the first scanline. */
136
323k
    if (fFirstLine)
137
51.1k
    {
138
51.1k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.10k
      {
140
8.10k
        fFirstLine = FALSE;
141
8.10k
        fInsertFgPel = FALSE;
142
8.10k
      }
143
51.1k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
323k
    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
323k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
213k
    {
158
213k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
213k
      if (advance == 0)
160
416
        return FALSE;
161
213k
      pbSrc = pbSrc + advance;
162
163
213k
      if (fFirstLine)
164
21.3k
      {
165
21.3k
        if (fInsertFgPel)
166
14.5k
        {
167
14.5k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
14.5k
          DESTWRITEPIXEL(pbDest, fgPel);
171
14.5k
          runLength = runLength - 1;
172
14.5k
        }
173
174
21.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
40
          return FALSE;
176
177
21.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
21.3k
      }
179
191k
      else
180
191k
      {
181
191k
        if (fInsertFgPel)
182
172k
        {
183
172k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
172k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
30
            return FALSE;
187
188
171k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
171k
          runLength--;
190
171k
        }
191
192
191k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
674
          return FALSE;
194
195
191k
        UNROLL(runLength, {
196
191k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
191k
          DESTWRITEPIXEL(pbDest, temp);
198
191k
        });
199
191k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
212k
      fInsertFgPel = TRUE;
203
212k
      continue;
204
213k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
109k
    fInsertFgPel = FALSE;
209
210
109k
    switch (code)
211
109k
    {
212
      /* Handle Foreground Run Orders. */
213
16.2k
      case REGULAR_FG_RUN:
214
18.0k
      case MEGA_MEGA_FG_RUN:
215
28.9k
      case LITE_SET_FG_FG_RUN:
216
29.5k
      case MEGA_MEGA_SET_FG_RUN:
217
29.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
29.5k
        if (advance == 0)
219
68
          return FALSE;
220
29.4k
        pbSrc = pbSrc + advance;
221
222
29.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
11.5k
        {
224
11.5k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
116
            return FALSE;
226
11.4k
          SRCREADPIXEL(fgPel, pbSrc);
227
11.4k
        }
228
229
29.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
204
          return FALSE;
231
232
29.1k
        if (fFirstLine)
233
6.46k
        {
234
6.46k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
6.46k
        }
236
22.6k
        else
237
22.6k
        {
238
22.6k
          UNROLL(runLength, {
239
22.6k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
22.6k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
22.6k
          });
242
22.6k
        }
243
244
29.1k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
7.37k
      case LITE_DITHERED_RUN:
248
8.19k
      case MEGA_MEGA_DITHERED_RUN:
249
8.19k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
8.19k
        if (advance == 0)
251
44
          return FALSE;
252
8.14k
        pbSrc = pbSrc + advance;
253
8.14k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
134
          return FALSE;
255
8.01k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.01k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
260
          return FALSE;
258
7.75k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.75k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
106
          return FALSE;
262
263
7.64k
        UNROLL(runLength, {
264
7.64k
          DESTWRITEPIXEL(pbDest, pixelA);
265
7.64k
          DESTWRITEPIXEL(pbDest, pixelB);
266
7.64k
        });
267
7.64k
        break;
268
269
      /* Handle Color Run Orders. */
270
34.7k
      case REGULAR_COLOR_RUN:
271
35.7k
      case MEGA_MEGA_COLOR_RUN:
272
35.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
35.7k
        if (advance == 0)
274
44
          return FALSE;
275
35.6k
        pbSrc = pbSrc + advance;
276
35.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
160
          return FALSE;
278
35.5k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
35.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
100
          return FALSE;
282
283
35.4k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
35.4k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.87k
      case REGULAR_FGBG_IMAGE:
288
11.2k
      case MEGA_MEGA_FGBG_IMAGE:
289
13.9k
      case LITE_SET_FG_FGBG_IMAGE:
290
14.6k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
14.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
14.6k
        if (advance == 0)
293
96
          return FALSE;
294
14.5k
        pbSrc = pbSrc + advance;
295
296
14.5k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.37k
        {
298
3.37k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
106
            return FALSE;
300
3.26k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.26k
        }
302
303
14.4k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
554
          return FALSE;
305
13.8k
        if (fFirstLine)
306
3.37k
        {
307
34.8k
          while (runLength > 8)
308
31.5k
          {
309
31.5k
            bitmask = *pbSrc;
310
31.5k
            pbSrc = pbSrc + 1;
311
31.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
31.5k
            if (!pbDest)
314
26
              return FALSE;
315
316
31.5k
            runLength = runLength - 8;
317
31.5k
          }
318
3.37k
        }
319
10.5k
        else
320
10.5k
        {
321
60.0k
          while (runLength > 8)
322
49.5k
          {
323
49.5k
            bitmask = *pbSrc++;
324
325
49.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
49.5k
            if (!pbDest)
328
46
              return FALSE;
329
330
49.5k
            runLength = runLength - 8;
331
49.5k
          }
332
10.5k
        }
333
334
13.8k
        if (runLength > 0)
335
12.1k
        {
336
12.1k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
58
            return FALSE;
338
12.0k
          bitmask = *pbSrc++;
339
340
12.0k
          if (fFirstLine)
341
1.82k
          {
342
1.82k
            pbDest =
343
1.82k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.82k
          }
345
10.2k
          else
346
10.2k
          {
347
10.2k
            pbDest =
348
10.2k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
10.2k
          }
350
351
12.0k
          if (!pbDest)
352
14
            return FALSE;
353
12.0k
        }
354
355
13.7k
        break;
356
357
      /* Handle Color Image Orders. */
358
13.7k
      case REGULAR_COLOR_IMAGE:
359
8.05k
      case MEGA_MEGA_COLOR_IMAGE:
360
8.05k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
8.05k
        if (advance == 0)
362
46
          return FALSE;
363
8.01k
        pbSrc = pbSrc + advance;
364
8.01k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
74
          return FALSE;
366
7.93k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
652
          return FALSE;
368
369
7.28k
        UNROLL(runLength, {
370
7.28k
          SRCREADPIXEL(temp, pbSrc);
371
7.28k
          DESTWRITEPIXEL(pbDest, temp);
372
7.28k
        });
373
7.28k
        break;
374
375
      /* Handle Special Order 1. */
376
7.28k
      case SPECIAL_FGBG_1:
377
1.76k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.76k
        pbSrc = pbSrc + 1;
380
381
1.76k
        if (fFirstLine)
382
204
        {
383
204
          pbDest =
384
204
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
204
        }
386
1.56k
        else
387
1.56k
        {
388
1.56k
          pbDest =
389
1.56k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.56k
        }
391
392
1.76k
        if (!pbDest)
393
4
          return FALSE;
394
395
1.76k
        break;
396
397
      /* Handle Special Order 2. */
398
2.40k
      case SPECIAL_FGBG_2:
399
2.40k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.40k
        pbSrc = pbSrc + 1;
402
403
2.40k
        if (fFirstLine)
404
206
        {
405
206
          pbDest =
406
206
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
206
        }
408
2.19k
        else
409
2.19k
        {
410
2.19k
          pbDest =
411
2.19k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.19k
        }
413
414
2.40k
        if (!pbDest)
415
2
          return FALSE;
416
417
2.40k
        break;
418
419
      /* Handle White Order. */
420
3.01k
      case SPECIAL_WHITE:
421
3.01k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.01k
        pbSrc = pbSrc + 1;
424
425
3.01k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
3.01k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.01k
        break;
430
431
      /* Handle Black Order. */
432
2.10k
      case SPECIAL_BLACK:
433
2.10k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.10k
        pbSrc = pbSrc + 1;
436
437
2.10k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
2.10k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.10k
        break;
442
443
3.97k
      default:
444
3.97k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
3.97k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
3.97k
        return FALSE;
447
109k
    }
448
109k
  }
449
450
2.70k
  return TRUE;
451
10.7k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8