Coverage Report

Created: 2025-12-02 06:05

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
94.4k
{
35
94.4k
  PIXEL xorPixel = 0;
36
94.4k
  BYTE mask = 0x01;
37
38
94.4k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
94.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
75
    return NULL;
46
47
94.3k
  UNROLL(cBits, {
48
94.3k
    PIXEL data = 0;
49
94.3k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
94.3k
    if (bitmask & mask)
52
94.3k
      data = xorPixel ^ fgPel;
53
94.3k
    else
54
94.3k
      data = xorPixel;
55
56
94.3k
    DESTWRITEPIXEL(pbDest, data);
57
94.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
94.3k
  });
59
94.3k
  return pbDest;
60
94.3k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
28.1k
{
35
28.1k
  PIXEL xorPixel = 0;
36
28.1k
  BYTE mask = 0x01;
37
38
28.1k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
28.1k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
27
    return NULL;
46
47
28.0k
  UNROLL(cBits, {
48
28.0k
    PIXEL data = 0;
49
28.0k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
28.0k
    if (bitmask & mask)
52
28.0k
      data = xorPixel ^ fgPel;
53
28.0k
    else
54
28.0k
      data = xorPixel;
55
56
28.0k
    DESTWRITEPIXEL(pbDest, data);
57
28.0k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
28.0k
  });
59
28.0k
  return pbDest;
60
28.0k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
66.2k
{
35
66.2k
  PIXEL xorPixel = 0;
36
66.2k
  BYTE mask = 0x01;
37
38
66.2k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
66.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
48
    return NULL;
46
47
66.2k
  UNROLL(cBits, {
48
66.2k
    PIXEL data = 0;
49
66.2k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
66.2k
    if (bitmask & mask)
52
66.2k
      data = xorPixel ^ fgPel;
53
66.2k
    else
54
66.2k
      data = xorPixel;
55
56
66.2k
    DESTWRITEPIXEL(pbDest, data);
57
66.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
66.2k
  });
59
66.2k
  return pbDest;
60
66.2k
}
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
77.5k
{
70
77.5k
  BYTE mask = 0x01;
71
72
77.5k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
77.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
83
    return NULL;
80
81
77.4k
  UNROLL(cBits, {
82
77.4k
    PIXEL data;
83
84
77.4k
    if (bitmask & mask)
85
77.4k
      data = fgPel;
86
77.4k
    else
87
77.4k
      data = BLACK_PIXEL;
88
89
77.4k
    DESTWRITEPIXEL(pbDest, data);
90
77.4k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
77.4k
  });
92
77.4k
  return pbDest;
93
77.4k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
27.7k
{
70
27.7k
  BYTE mask = 0x01;
71
72
27.7k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
27.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
29
    return NULL;
80
81
27.7k
  UNROLL(cBits, {
82
27.7k
    PIXEL data;
83
84
27.7k
    if (bitmask & mask)
85
27.7k
      data = fgPel;
86
27.7k
    else
87
27.7k
      data = BLACK_PIXEL;
88
89
27.7k
    DESTWRITEPIXEL(pbDest, data);
90
27.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
27.7k
  });
92
27.7k
  return pbDest;
93
27.7k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
49.8k
{
70
49.8k
  BYTE mask = 0x01;
71
72
49.8k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
49.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
54
    return NULL;
80
81
49.7k
  UNROLL(cBits, {
82
49.7k
    PIXEL data;
83
84
49.7k
    if (bitmask & mask)
85
49.7k
      data = fgPel;
86
49.7k
    else
87
49.7k
      data = BLACK_PIXEL;
88
89
49.7k
    DESTWRITEPIXEL(pbDest, data);
90
49.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
49.7k
  });
92
49.7k
  return pbDest;
93
49.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
18.2k
{
102
18.2k
  const BYTE* pbSrc = pbSrcBuffer;
103
18.2k
  BYTE* pbDest = pbDestBuffer;
104
18.2k
  PIXEL temp = 0;
105
18.2k
  PIXEL fgPel = WHITE_PIXEL;
106
18.2k
  BOOL fInsertFgPel = FALSE;
107
18.2k
  BOOL fFirstLine = TRUE;
108
18.2k
  BYTE bitmask = 0;
109
18.2k
  PIXEL pixelA = 0;
110
18.2k
  PIXEL pixelB = 0;
111
18.2k
  UINT32 runLength = 0;
112
18.2k
  UINT32 code = 0;
113
18.2k
  UINT32 advance = 0;
114
18.2k
  RLEEXTRA
115
116
18.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
18.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
18.2k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
18.2k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
545k
  while (pbSrc < pbEnd)
134
540k
  {
135
    /* Watch out for the end of the first scanline. */
136
540k
    if (fFirstLine)
137
87.5k
    {
138
87.5k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
13.3k
      {
140
13.3k
        fFirstLine = FALSE;
141
13.3k
        fInsertFgPel = FALSE;
142
13.3k
      }
143
87.5k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
540k
    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
540k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
370k
    {
158
370k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
370k
      if (advance == 0)
160
663
        return FALSE;
161
369k
      pbSrc = pbSrc + advance;
162
163
369k
      if (fFirstLine)
164
37.5k
      {
165
37.5k
        if (fInsertFgPel)
166
25.4k
        {
167
25.4k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
25.4k
          DESTWRITEPIXEL(pbDest, fgPel);
171
25.4k
          runLength = runLength - 1;
172
25.4k
        }
173
174
37.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
86
          return FALSE;
176
177
37.5k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
37.5k
      }
179
331k
      else
180
331k
      {
181
331k
        if (fInsertFgPel)
182
301k
        {
183
301k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
301k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
62
            return FALSE;
187
188
301k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
301k
          runLength--;
190
301k
        }
191
192
331k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.14k
          return FALSE;
194
195
330k
        UNROLL(runLength, {
196
330k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
330k
          DESTWRITEPIXEL(pbDest, temp);
198
330k
        });
199
330k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
368k
      fInsertFgPel = TRUE;
203
368k
      continue;
204
369k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
170k
    fInsertFgPel = FALSE;
209
210
170k
    switch (code)
211
170k
    {
212
      /* Handle Foreground Run Orders. */
213
27.6k
      case REGULAR_FG_RUN:
214
29.9k
      case MEGA_MEGA_FG_RUN:
215
48.4k
      case LITE_SET_FG_FG_RUN:
216
49.5k
      case MEGA_MEGA_SET_FG_RUN:
217
49.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
49.5k
        if (advance == 0)
219
133
          return FALSE;
220
49.4k
        pbSrc = pbSrc + advance;
221
222
49.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
19.5k
        {
224
19.5k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
257
            return FALSE;
226
19.3k
          SRCREADPIXEL(fgPel, pbSrc);
227
19.3k
        }
228
229
49.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
369
          return FALSE;
231
232
48.8k
        if (fFirstLine)
233
10.9k
        {
234
10.9k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.9k
        }
236
37.8k
        else
237
37.8k
        {
238
37.8k
          UNROLL(runLength, {
239
37.8k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
37.8k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
37.8k
          });
242
37.8k
        }
243
244
48.8k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
12.1k
      case LITE_DITHERED_RUN:
248
13.7k
      case MEGA_MEGA_DITHERED_RUN:
249
13.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
13.7k
        if (advance == 0)
251
73
          return FALSE;
252
13.6k
        pbSrc = pbSrc + advance;
253
13.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
278
          return FALSE;
255
13.3k
        SRCREADPIXEL(pixelA, pbSrc);
256
13.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
525
          return FALSE;
258
12.8k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
12.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
201
          return FALSE;
262
263
12.6k
        UNROLL(runLength, {
264
12.6k
          DESTWRITEPIXEL(pbDest, pixelA);
265
12.6k
          DESTWRITEPIXEL(pbDest, pixelB);
266
12.6k
        });
267
12.6k
        break;
268
269
      /* Handle Color Run Orders. */
270
51.8k
      case REGULAR_COLOR_RUN:
271
53.1k
      case MEGA_MEGA_COLOR_RUN:
272
53.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
53.1k
        if (advance == 0)
274
65
          return FALSE;
275
53.1k
        pbSrc = pbSrc + advance;
276
53.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
328
          return FALSE;
278
52.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
52.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
261
          return FALSE;
282
283
52.5k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
52.5k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
13.0k
      case REGULAR_FGBG_IMAGE:
288
15.2k
      case MEGA_MEGA_FGBG_IMAGE:
289
19.1k
      case LITE_SET_FG_FGBG_IMAGE:
290
20.9k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
20.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
20.9k
        if (advance == 0)
293
169
          return FALSE;
294
20.7k
        pbSrc = pbSrc + advance;
295
296
20.7k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
5.53k
        {
298
5.53k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
221
            return FALSE;
300
5.30k
          SRCREADPIXEL(fgPel, pbSrc);
301
5.30k
        }
302
303
20.5k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
849
          return FALSE;
305
19.6k
        if (fFirstLine)
306
5.63k
        {
307
79.4k
          while (runLength > 8)
308
73.8k
          {
309
73.8k
            bitmask = *pbSrc;
310
73.8k
            pbSrc = pbSrc + 1;
311
73.8k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
73.8k
            if (!pbDest)
314
80
              return FALSE;
315
316
73.7k
            runLength = runLength - 8;
317
73.7k
          }
318
5.63k
        }
319
14.0k
        else
320
14.0k
        {
321
90.7k
          while (runLength > 8)
322
76.7k
          {
323
76.7k
            bitmask = *pbSrc++;
324
325
76.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
76.7k
            if (!pbDest)
328
64
              return FALSE;
329
330
76.7k
            runLength = runLength - 8;
331
76.7k
          }
332
14.0k
        }
333
334
19.5k
        if (runLength > 0)
335
16.1k
        {
336
16.1k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
107
            return FALSE;
338
16.0k
          bitmask = *pbSrc++;
339
340
16.0k
          if (fFirstLine)
341
2.99k
          {
342
2.99k
            pbDest =
343
2.99k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.99k
          }
345
13.0k
          else
346
13.0k
          {
347
13.0k
            pbDest =
348
13.0k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
13.0k
          }
350
351
16.0k
          if (!pbDest)
352
6
            return FALSE;
353
16.0k
        }
354
355
19.4k
        break;
356
357
      /* Handle Color Image Orders. */
358
19.4k
      case REGULAR_COLOR_IMAGE:
359
14.5k
      case MEGA_MEGA_COLOR_IMAGE:
360
14.5k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
14.5k
        if (advance == 0)
362
69
          return FALSE;
363
14.4k
        pbSrc = pbSrc + advance;
364
14.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
127
          return FALSE;
366
14.3k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
908
          return FALSE;
368
369
13.3k
        UNROLL(runLength, {
370
4.27k
          SRCREADPIXEL(temp, pbSrc);
371
4.27k
          DESTWRITEPIXEL(pbDest, temp);
372
4.27k
        });
373
9.12k
        break;
374
375
      /* Handle Special Order 1. */
376
9.12k
      case SPECIAL_FGBG_1:
377
2.51k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.51k
        pbSrc = pbSrc + 1;
380
381
2.51k
        if (fFirstLine)
382
435
        {
383
435
          pbDest =
384
435
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
435
        }
386
2.07k
        else
387
2.07k
        {
388
2.07k
          pbDest =
389
2.07k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.07k
        }
391
392
2.51k
        if (!pbDest)
393
3
          return FALSE;
394
395
2.50k
        break;
396
397
      /* Handle Special Order 2. */
398
2.83k
      case SPECIAL_FGBG_2:
399
2.83k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.83k
        pbSrc = pbSrc + 1;
402
403
2.83k
        if (fFirstLine)
404
282
        {
405
282
          pbDest =
406
282
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
282
        }
408
2.54k
        else
409
2.54k
        {
410
2.54k
          pbDest =
411
2.54k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.54k
        }
413
414
2.83k
        if (!pbDest)
415
5
          return FALSE;
416
417
2.82k
        break;
418
419
      /* Handle White Order. */
420
4.23k
      case SPECIAL_WHITE:
421
4.23k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
4.23k
        pbSrc = pbSrc + 1;
424
425
4.23k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
4.23k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
4.23k
        break;
430
431
      /* Handle Black Order. */
432
2.84k
      case SPECIAL_BLACK:
433
2.84k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.84k
        pbSrc = pbSrc + 1;
436
437
2.84k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
2.84k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.84k
        break;
442
443
6.46k
      default:
444
6.46k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.46k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.46k
        return FALSE;
447
170k
    }
448
170k
  }
449
450
4.72k
  return TRUE;
451
18.2k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
6.08k
{
102
6.08k
  const BYTE* pbSrc = pbSrcBuffer;
103
6.08k
  BYTE* pbDest = pbDestBuffer;
104
6.08k
  PIXEL temp = 0;
105
6.08k
  PIXEL fgPel = WHITE_PIXEL;
106
6.08k
  BOOL fInsertFgPel = FALSE;
107
6.08k
  BOOL fFirstLine = TRUE;
108
6.08k
  BYTE bitmask = 0;
109
6.08k
  PIXEL pixelA = 0;
110
6.08k
  PIXEL pixelB = 0;
111
6.08k
  UINT32 runLength = 0;
112
6.08k
  UINT32 code = 0;
113
6.08k
  UINT32 advance = 0;
114
6.08k
  RLEEXTRA
115
116
6.08k
  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.08k
  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.08k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
6.08k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
175k
  while (pbSrc < pbEnd)
134
174k
  {
135
    /* Watch out for the end of the first scanline. */
136
174k
    if (fFirstLine)
137
29.2k
    {
138
29.2k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.21k
      {
140
4.21k
        fFirstLine = FALSE;
141
4.21k
        fInsertFgPel = FALSE;
142
4.21k
      }
143
29.2k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
174k
    code = ExtractCodeId(*pbSrc);
150
151
#if defined(WITH_DEBUG_CODECS)
152
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
153
#endif
154
155
    /* Handle Background Run Orders. */
156
174k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
119k
    {
158
119k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
119k
      if (advance == 0)
160
183
        return FALSE;
161
119k
      pbSrc = pbSrc + advance;
162
163
119k
      if (fFirstLine)
164
12.6k
      {
165
12.6k
        if (fInsertFgPel)
166
8.40k
        {
167
8.40k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.40k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.40k
          runLength = runLength - 1;
172
8.40k
        }
173
174
12.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
38
          return FALSE;
176
177
12.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.6k
      }
179
107k
      else
180
107k
      {
181
107k
        if (fInsertFgPel)
182
97.7k
        {
183
97.7k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
97.7k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
12
            return FALSE;
187
188
97.7k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
97.7k
          runLength--;
190
97.7k
        }
191
192
107k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
360
          return FALSE;
194
195
106k
        UNROLL(runLength, {
196
106k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
106k
          DESTWRITEPIXEL(pbDest, temp);
198
106k
        });
199
106k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
119k
      fInsertFgPel = TRUE;
203
119k
      continue;
204
119k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
54.5k
    fInsertFgPel = FALSE;
209
210
54.5k
    switch (code)
211
54.5k
    {
212
      /* Handle Foreground Run Orders. */
213
8.93k
      case REGULAR_FG_RUN:
214
9.69k
      case MEGA_MEGA_FG_RUN:
215
15.2k
      case LITE_SET_FG_FG_RUN:
216
15.6k
      case MEGA_MEGA_SET_FG_RUN:
217
15.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
15.6k
        if (advance == 0)
219
43
          return FALSE;
220
15.5k
        pbSrc = pbSrc + advance;
221
222
15.5k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
5.92k
        {
224
5.92k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
101
            return FALSE;
226
5.82k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.82k
        }
228
229
15.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
89
          return FALSE;
231
232
15.4k
        if (fFirstLine)
233
3.73k
        {
234
3.73k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.73k
        }
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.4k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
4.02k
      case LITE_DITHERED_RUN:
248
4.56k
      case MEGA_MEGA_DITHERED_RUN:
249
4.56k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.56k
        if (advance == 0)
251
21
          return FALSE;
252
4.54k
        pbSrc = pbSrc + advance;
253
4.54k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
114
          return FALSE;
255
4.42k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.42k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
261
          return FALSE;
258
4.16k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
4.16k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
61
          return FALSE;
262
263
4.10k
        UNROLL(runLength, {
264
4.10k
          DESTWRITEPIXEL(pbDest, pixelA);
265
4.10k
          DESTWRITEPIXEL(pbDest, pixelB);
266
4.10k
        });
267
4.10k
        break;
268
269
      /* Handle Color Run Orders. */
270
16.5k
      case REGULAR_COLOR_RUN:
271
16.9k
      case MEGA_MEGA_COLOR_RUN:
272
16.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
16.9k
        if (advance == 0)
274
23
          return FALSE;
275
16.9k
        pbSrc = pbSrc + advance;
276
16.9k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
140
          return FALSE;
278
16.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
16.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
83
          return FALSE;
282
283
16.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
16.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
3.99k
      case REGULAR_FGBG_IMAGE:
288
4.74k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.01k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.54k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.54k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.54k
        if (advance == 0)
293
51
          return FALSE;
294
6.48k
        pbSrc = pbSrc + advance;
295
296
6.48k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.76k
        {
298
1.76k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
75
            return FALSE;
300
1.68k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.68k
        }
302
303
6.41k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
279
          return FALSE;
305
6.13k
        if (fFirstLine)
306
1.92k
        {
307
28.2k
          while (runLength > 8)
308
26.3k
          {
309
26.3k
            bitmask = *pbSrc;
310
26.3k
            pbSrc = pbSrc + 1;
311
26.3k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
26.3k
            if (!pbDest)
314
28
              return FALSE;
315
316
26.3k
            runLength = runLength - 8;
317
26.3k
          }
318
1.92k
        }
319
4.20k
        else
320
4.20k
        {
321
26.9k
          while (runLength > 8)
322
22.7k
          {
323
22.7k
            bitmask = *pbSrc++;
324
325
22.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
22.7k
            if (!pbDest)
328
24
              return FALSE;
329
330
22.7k
            runLength = runLength - 8;
331
22.7k
          }
332
4.20k
        }
333
334
6.08k
        if (runLength > 0)
335
5.01k
        {
336
5.01k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
41
            return FALSE;
338
4.97k
          bitmask = *pbSrc++;
339
340
4.97k
          if (fFirstLine)
341
1.12k
          {
342
1.12k
            pbDest =
343
1.12k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.12k
          }
345
3.84k
          else
346
3.84k
          {
347
3.84k
            pbDest =
348
3.84k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
3.84k
          }
350
351
4.97k
          if (!pbDest)
352
2
            return FALSE;
353
4.97k
        }
354
355
6.04k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.04k
      case REGULAR_COLOR_IMAGE:
359
4.64k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.64k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.64k
        if (advance == 0)
362
23
          return FALSE;
363
4.62k
        pbSrc = pbSrc + advance;
364
4.62k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
41
          return FALSE;
366
4.58k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
302
          return FALSE;
368
369
4.27k
        UNROLL(runLength, {
370
4.27k
          SRCREADPIXEL(temp, pbSrc);
371
4.27k
          DESTWRITEPIXEL(pbDest, temp);
372
4.27k
        });
373
4.27k
        break;
374
375
      /* Handle Special Order 1. */
376
827
      case SPECIAL_FGBG_1:
377
827
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
827
        pbSrc = pbSrc + 1;
380
381
827
        if (fFirstLine)
382
133
        {
383
133
          pbDest =
384
133
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
133
        }
386
694
        else
387
694
        {
388
694
          pbDest =
389
694
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
694
        }
391
392
827
        if (!pbDest)
393
1
          return FALSE;
394
395
826
        break;
396
397
      /* Handle Special Order 2. */
398
900
      case SPECIAL_FGBG_2:
399
900
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
900
        pbSrc = pbSrc + 1;
402
403
900
        if (fFirstLine)
404
102
        {
405
102
          pbDest =
406
102
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
102
        }
408
798
        else
409
798
        {
410
798
          pbDest =
411
798
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
798
        }
413
414
900
        if (!pbDest)
415
1
          return FALSE;
416
417
899
        break;
418
419
      /* Handle White Order. */
420
1.36k
      case SPECIAL_WHITE:
421
1.36k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.36k
        pbSrc = pbSrc + 1;
424
425
1.36k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.36k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.36k
        break;
430
431
      /* Handle Black Order. */
432
988
      case SPECIAL_BLACK:
433
988
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
988
        pbSrc = pbSrc + 1;
436
437
988
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
987
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
987
        break;
442
443
2.13k
      default:
444
2.13k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.13k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.13k
        return FALSE;
447
54.5k
    }
448
54.5k
  }
449
450
1.54k
  return TRUE;
451
6.08k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
12.1k
{
102
12.1k
  const BYTE* pbSrc = pbSrcBuffer;
103
12.1k
  BYTE* pbDest = pbDestBuffer;
104
12.1k
  PIXEL temp = 0;
105
12.1k
  PIXEL fgPel = WHITE_PIXEL;
106
12.1k
  BOOL fInsertFgPel = FALSE;
107
12.1k
  BOOL fFirstLine = TRUE;
108
12.1k
  BYTE bitmask = 0;
109
12.1k
  PIXEL pixelA = 0;
110
12.1k
  PIXEL pixelB = 0;
111
12.1k
  UINT32 runLength = 0;
112
12.1k
  UINT32 code = 0;
113
12.1k
  UINT32 advance = 0;
114
12.1k
  RLEEXTRA
115
116
12.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
12.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
12.1k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
12.1k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
369k
  while (pbSrc < pbEnd)
134
366k
  {
135
    /* Watch out for the end of the first scanline. */
136
366k
    if (fFirstLine)
137
58.3k
    {
138
58.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
9.13k
      {
140
9.13k
        fFirstLine = FALSE;
141
9.13k
        fInsertFgPel = FALSE;
142
9.13k
      }
143
58.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
366k
    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
366k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
250k
    {
158
250k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
250k
      if (advance == 0)
160
480
        return FALSE;
161
249k
      pbSrc = pbSrc + advance;
162
163
249k
      if (fFirstLine)
164
24.9k
      {
165
24.9k
        if (fInsertFgPel)
166
17.0k
        {
167
17.0k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
17.0k
          DESTWRITEPIXEL(pbDest, fgPel);
171
17.0k
          runLength = runLength - 1;
172
17.0k
        }
173
174
24.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
48
          return FALSE;
176
177
24.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
24.8k
      }
179
224k
      else
180
224k
      {
181
224k
        if (fInsertFgPel)
182
203k
        {
183
203k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
203k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
50
            return FALSE;
187
188
203k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
203k
          runLength--;
190
203k
        }
191
192
224k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
788
          return FALSE;
194
195
223k
        UNROLL(runLength, {
196
223k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
223k
          DESTWRITEPIXEL(pbDest, temp);
198
223k
        });
199
223k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
248k
      fInsertFgPel = TRUE;
203
248k
      continue;
204
249k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
116k
    fInsertFgPel = FALSE;
209
210
116k
    switch (code)
211
116k
    {
212
      /* Handle Foreground Run Orders. */
213
18.6k
      case REGULAR_FG_RUN:
214
20.2k
      case MEGA_MEGA_FG_RUN:
215
33.1k
      case LITE_SET_FG_FG_RUN:
216
33.9k
      case MEGA_MEGA_SET_FG_RUN:
217
33.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
33.9k
        if (advance == 0)
219
90
          return FALSE;
220
33.8k
        pbSrc = pbSrc + advance;
221
222
33.8k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
13.6k
        {
224
13.6k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
156
            return FALSE;
226
13.5k
          SRCREADPIXEL(fgPel, pbSrc);
227
13.5k
        }
228
229
33.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
280
          return FALSE;
231
232
33.3k
        if (fFirstLine)
233
7.17k
        {
234
7.17k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
7.17k
        }
236
26.2k
        else
237
26.2k
        {
238
26.2k
          UNROLL(runLength, {
239
26.2k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
26.2k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
26.2k
          });
242
26.2k
        }
243
244
33.3k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
8.10k
      case LITE_DITHERED_RUN:
248
9.13k
      case MEGA_MEGA_DITHERED_RUN:
249
9.13k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
9.13k
        if (advance == 0)
251
52
          return FALSE;
252
9.08k
        pbSrc = pbSrc + advance;
253
9.08k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
164
          return FALSE;
255
8.92k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.92k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
264
          return FALSE;
258
8.65k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
8.65k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
140
          return FALSE;
262
263
8.51k
        UNROLL(runLength, {
264
8.51k
          DESTWRITEPIXEL(pbDest, pixelA);
265
8.51k
          DESTWRITEPIXEL(pbDest, pixelB);
266
8.51k
        });
267
8.51k
        break;
268
269
      /* Handle Color Run Orders. */
270
35.3k
      case REGULAR_COLOR_RUN:
271
36.2k
      case MEGA_MEGA_COLOR_RUN:
272
36.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
36.2k
        if (advance == 0)
274
42
          return FALSE;
275
36.2k
        pbSrc = pbSrc + advance;
276
36.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
188
          return FALSE;
278
36.0k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
36.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
178
          return FALSE;
282
283
35.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
35.8k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.01k
      case REGULAR_FGBG_IMAGE:
288
10.5k
      case MEGA_MEGA_FGBG_IMAGE:
289
13.1k
      case LITE_SET_FG_FGBG_IMAGE:
290
14.3k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
14.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
14.3k
        if (advance == 0)
293
118
          return FALSE;
294
14.2k
        pbSrc = pbSrc + advance;
295
296
14.2k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.76k
        {
298
3.76k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
146
            return FALSE;
300
3.62k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.62k
        }
302
303
14.1k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
570
          return FALSE;
305
13.5k
        if (fFirstLine)
306
3.70k
        {
307
51.1k
          while (runLength > 8)
308
47.4k
          {
309
47.4k
            bitmask = *pbSrc;
310
47.4k
            pbSrc = pbSrc + 1;
311
47.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
47.4k
            if (!pbDest)
314
52
              return FALSE;
315
316
47.4k
            runLength = runLength - 8;
317
47.4k
          }
318
3.70k
        }
319
9.82k
        else
320
9.82k
        {
321
63.7k
          while (runLength > 8)
322
53.9k
          {
323
53.9k
            bitmask = *pbSrc++;
324
325
53.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
53.9k
            if (!pbDest)
328
40
              return FALSE;
329
330
53.9k
            runLength = runLength - 8;
331
53.9k
          }
332
9.82k
        }
333
334
13.4k
        if (runLength > 0)
335
11.1k
        {
336
11.1k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
66
            return FALSE;
338
11.0k
          bitmask = *pbSrc++;
339
340
11.0k
          if (fFirstLine)
341
1.87k
          {
342
1.87k
            pbDest =
343
1.87k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.87k
          }
345
9.17k
          else
346
9.17k
          {
347
9.17k
            pbDest =
348
9.17k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
9.17k
          }
350
351
11.0k
          if (!pbDest)
352
4
            return FALSE;
353
11.0k
        }
354
355
13.3k
        break;
356
357
      /* Handle Color Image Orders. */
358
13.3k
      case REGULAR_COLOR_IMAGE:
359
9.85k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.85k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.85k
        if (advance == 0)
362
46
          return FALSE;
363
9.81k
        pbSrc = pbSrc + advance;
364
9.81k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
86
          return FALSE;
366
9.72k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
606
          return FALSE;
368
369
9.12k
        UNROLL(runLength, {
370
9.12k
          SRCREADPIXEL(temp, pbSrc);
371
9.12k
          DESTWRITEPIXEL(pbDest, temp);
372
9.12k
        });
373
9.12k
        break;
374
375
      /* Handle Special Order 1. */
376
9.12k
      case SPECIAL_FGBG_1:
377
1.68k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.68k
        pbSrc = pbSrc + 1;
380
381
1.68k
        if (fFirstLine)
382
302
        {
383
302
          pbDest =
384
302
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
302
        }
386
1.38k
        else
387
1.38k
        {
388
1.38k
          pbDest =
389
1.38k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.38k
        }
391
392
1.68k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.68k
        break;
396
397
      /* Handle Special Order 2. */
398
1.93k
      case SPECIAL_FGBG_2:
399
1.93k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.93k
        pbSrc = pbSrc + 1;
402
403
1.93k
        if (fFirstLine)
404
180
        {
405
180
          pbDest =
406
180
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
180
        }
408
1.75k
        else
409
1.75k
        {
410
1.75k
          pbDest =
411
1.75k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.75k
        }
413
414
1.93k
        if (!pbDest)
415
4
          return FALSE;
416
417
1.92k
        break;
418
419
      /* Handle White Order. */
420
2.87k
      case SPECIAL_WHITE:
421
2.87k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.87k
        pbSrc = pbSrc + 1;
424
425
2.87k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
2.86k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.86k
        break;
430
431
      /* Handle Black Order. */
432
1.85k
      case SPECIAL_BLACK:
433
1.85k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.85k
        pbSrc = pbSrc + 1;
436
437
1.85k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.85k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.85k
        break;
442
443
4.32k
      default:
444
4.32k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.32k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.32k
        return FALSE;
447
116k
    }
448
116k
  }
449
450
3.17k
  return TRUE;
451
12.1k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8