Coverage Report

Created: 2025-11-09 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/libfreerdp/codec/include/bitmap.h
Line
Count
Source
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * RLE Compressed Bitmap Stream
4
 *
5
 * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
6
 * Copyright 2016 Armin Novak <armin.novak@thincast.com>
7
 * Copyright 2016 Thincast Technologies GmbH
8
 *
9
 * Licensed under the Apache License, Version 2.0 (the "License");
10
 * you may not use this file except in compliance with the License.
11
 * You may obtain a copy of the License at
12
 *
13
 *     http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 * Unless required by applicable law or agreed to in writing, software
16
 * distributed under the License is distributed on an "AS IS" BASIS,
17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 * See the License for the specific language governing permissions and
19
 * limitations under the License.
20
 */
21
22
#include <winpr/assert.h>
23
#include <winpr/cast.h>
24
#include <winpr/wtypes.h>
25
26
/* do not compile the file directly */
27
28
/**
29
 * Write a foreground/background image to a destination buffer.
30
 */
31
static inline BYTE* WRITEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
32
                                   const BYTE* WINPR_RESTRICT pbDestEnd, UINT32 rowDelta,
33
                                   BYTE bitmask, PIXEL fgPel, UINT32 cBits)
34
91.9k
{
35
91.9k
  PIXEL xorPixel = 0;
36
91.9k
  BYTE mask = 0x01;
37
38
91.9k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
91.9k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
69
    return NULL;
46
47
91.8k
  UNROLL(cBits, {
48
91.8k
    PIXEL data = 0;
49
91.8k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
91.8k
    if (bitmask & mask)
52
91.8k
      data = xorPixel ^ fgPel;
53
91.8k
    else
54
91.8k
      data = xorPixel;
55
56
91.8k
    DESTWRITEPIXEL(pbDest, data);
57
91.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
91.8k
  });
59
91.8k
  return pbDest;
60
91.8k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
26.3k
{
35
26.3k
  PIXEL xorPixel = 0;
36
26.3k
  BYTE mask = 0x01;
37
38
26.3k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
26.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
23
    return NULL;
46
47
26.2k
  UNROLL(cBits, {
48
26.2k
    PIXEL data = 0;
49
26.2k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
26.2k
    if (bitmask & mask)
52
26.2k
      data = xorPixel ^ fgPel;
53
26.2k
    else
54
26.2k
      data = xorPixel;
55
56
26.2k
    DESTWRITEPIXEL(pbDest, data);
57
26.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
26.2k
  });
59
26.2k
  return pbDest;
60
26.2k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
65.6k
{
35
65.6k
  PIXEL xorPixel = 0;
36
65.6k
  BYTE mask = 0x01;
37
38
65.6k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
65.6k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
46
    return NULL;
46
47
65.5k
  UNROLL(cBits, {
48
65.5k
    PIXEL data = 0;
49
65.5k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
65.5k
    if (bitmask & mask)
52
65.5k
      data = xorPixel ^ fgPel;
53
65.5k
    else
54
65.5k
      data = xorPixel;
55
56
65.5k
    DESTWRITEPIXEL(pbDest, data);
57
65.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
65.5k
  });
59
65.5k
  return pbDest;
60
65.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
69.2k
{
70
69.2k
  BYTE mask = 0x01;
71
72
69.2k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
69.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
83
    return NULL;
80
81
69.2k
  UNROLL(cBits, {
82
69.2k
    PIXEL data;
83
84
69.2k
    if (bitmask & mask)
85
69.2k
      data = fgPel;
86
69.2k
    else
87
69.2k
      data = BLACK_PIXEL;
88
89
69.2k
    DESTWRITEPIXEL(pbDest, data);
90
69.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
69.2k
  });
92
69.2k
  return pbDest;
93
69.2k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
24.9k
{
70
24.9k
  BYTE mask = 0x01;
71
72
24.9k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
24.9k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
29
    return NULL;
80
81
24.8k
  UNROLL(cBits, {
82
24.8k
    PIXEL data;
83
84
24.8k
    if (bitmask & mask)
85
24.8k
      data = fgPel;
86
24.8k
    else
87
24.8k
      data = BLACK_PIXEL;
88
89
24.8k
    DESTWRITEPIXEL(pbDest, data);
90
24.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
24.8k
  });
92
24.8k
  return pbDest;
93
24.8k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
44.3k
{
70
44.3k
  BYTE mask = 0x01;
71
72
44.3k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
44.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
54
    return NULL;
80
81
44.3k
  UNROLL(cBits, {
82
44.3k
    PIXEL data;
83
84
44.3k
    if (bitmask & mask)
85
44.3k
      data = fgPel;
86
44.3k
    else
87
44.3k
      data = BLACK_PIXEL;
88
89
44.3k
    DESTWRITEPIXEL(pbDest, data);
90
44.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
44.3k
  });
92
44.3k
  return pbDest;
93
44.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
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
567k
  while (pbSrc < pbEnd)
134
562k
  {
135
    /* Watch out for the end of the first scanline. */
136
562k
    if (fFirstLine)
137
87.7k
    {
138
87.7k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
13.3k
      {
140
13.3k
        fFirstLine = FALSE;
141
13.3k
        fInsertFgPel = FALSE;
142
13.3k
      }
143
87.7k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
562k
    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
562k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
368k
    {
158
368k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
368k
      if (advance == 0)
160
670
        return FALSE;
161
368k
      pbSrc = pbSrc + advance;
162
163
368k
      if (fFirstLine)
164
37.9k
      {
165
37.9k
        if (fInsertFgPel)
166
25.8k
        {
167
25.8k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
25.8k
          DESTWRITEPIXEL(pbDest, fgPel);
171
25.8k
          runLength = runLength - 1;
172
25.8k
        }
173
174
37.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
85
          return FALSE;
176
177
37.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
37.8k
      }
179
330k
      else
180
330k
      {
181
330k
        if (fInsertFgPel)
182
300k
        {
183
300k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
300k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
64
            return FALSE;
187
188
300k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
300k
          runLength--;
190
300k
        }
191
192
330k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.07k
          return FALSE;
194
195
329k
        UNROLL(runLength, {
196
329k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
329k
          DESTWRITEPIXEL(pbDest, temp);
198
329k
        });
199
329k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
366k
      fInsertFgPel = TRUE;
203
366k
      continue;
204
368k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
194k
    fInsertFgPel = FALSE;
209
210
194k
    switch (code)
211
194k
    {
212
      /* Handle Foreground Run Orders. */
213
26.9k
      case REGULAR_FG_RUN:
214
29.3k
      case MEGA_MEGA_FG_RUN:
215
47.4k
      case LITE_SET_FG_FG_RUN:
216
48.3k
      case MEGA_MEGA_SET_FG_RUN:
217
48.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
48.3k
        if (advance == 0)
219
124
          return FALSE;
220
48.2k
        pbSrc = pbSrc + advance;
221
222
48.2k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.9k
        {
224
18.9k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
223
            return FALSE;
226
18.7k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.7k
        }
228
229
48.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
324
          return FALSE;
231
232
47.7k
        if (fFirstLine)
233
10.9k
        {
234
10.9k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.9k
        }
236
36.7k
        else
237
36.7k
        {
238
36.7k
          UNROLL(runLength, {
239
36.7k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
36.7k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
36.7k
          });
242
36.7k
        }
243
244
47.7k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
11.3k
      case LITE_DITHERED_RUN:
248
12.9k
      case MEGA_MEGA_DITHERED_RUN:
249
12.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
12.9k
        if (advance == 0)
251
81
          return FALSE;
252
12.9k
        pbSrc = pbSrc + advance;
253
12.9k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
294
          return FALSE;
255
12.6k
        SRCREADPIXEL(pixelA, pbSrc);
256
12.6k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
521
          return FALSE;
258
12.0k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
12.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
159
          return FALSE;
262
263
11.9k
        UNROLL(runLength, {
264
11.9k
          DESTWRITEPIXEL(pbDest, pixelA);
265
11.9k
          DESTWRITEPIXEL(pbDest, pixelB);
266
11.9k
        });
267
11.9k
        break;
268
269
      /* Handle Color Run Orders. */
270
77.0k
      case REGULAR_COLOR_RUN:
271
78.3k
      case MEGA_MEGA_COLOR_RUN:
272
78.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
78.3k
        if (advance == 0)
274
69
          return FALSE;
275
78.2k
        pbSrc = pbSrc + advance;
276
78.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
337
          return FALSE;
278
77.9k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
77.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
261
          return FALSE;
282
283
77.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
77.6k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
13.0k
      case REGULAR_FGBG_IMAGE:
288
15.4k
      case MEGA_MEGA_FGBG_IMAGE:
289
19.0k
      case LITE_SET_FG_FGBG_IMAGE:
290
20.6k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
20.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
20.6k
        if (advance == 0)
293
157
          return FALSE;
294
20.4k
        pbSrc = pbSrc + advance;
295
296
20.4k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
5.08k
        {
298
5.08k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
238
            return FALSE;
300
4.84k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.84k
        }
302
303
20.2k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
855
          return FALSE;
305
19.3k
        if (fFirstLine)
306
5.64k
        {
307
71.1k
          while (runLength > 8)
308
65.6k
          {
309
65.6k
            bitmask = *pbSrc;
310
65.6k
            pbSrc = pbSrc + 1;
311
65.6k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
65.6k
            if (!pbDest)
314
80
              return FALSE;
315
316
65.5k
            runLength = runLength - 8;
317
65.5k
          }
318
5.64k
        }
319
13.7k
        else
320
13.7k
        {
321
88.2k
          while (runLength > 8)
322
74.5k
          {
323
74.5k
            bitmask = *pbSrc++;
324
325
74.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
74.5k
            if (!pbDest)
328
53
              return FALSE;
329
330
74.5k
            runLength = runLength - 8;
331
74.5k
          }
332
13.7k
        }
333
334
19.2k
        if (runLength > 0)
335
15.8k
        {
336
15.8k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
127
            return FALSE;
338
15.7k
          bitmask = *pbSrc++;
339
340
15.7k
          if (fFirstLine)
341
2.94k
          {
342
2.94k
            pbDest =
343
2.94k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.94k
          }
345
12.7k
          else
346
12.7k
          {
347
12.7k
            pbDest =
348
12.7k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
12.7k
          }
350
351
15.7k
          if (!pbDest)
352
6
            return FALSE;
353
15.7k
        }
354
355
19.1k
        break;
356
357
      /* Handle Color Image Orders. */
358
19.1k
      case REGULAR_COLOR_IMAGE:
359
14.9k
      case MEGA_MEGA_COLOR_IMAGE:
360
14.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
14.9k
        if (advance == 0)
362
75
          return FALSE;
363
14.8k
        pbSrc = pbSrc + advance;
364
14.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
161
          return FALSE;
366
14.7k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
1.05k
          return FALSE;
368
369
13.6k
        UNROLL(runLength, {
370
4.28k
          SRCREADPIXEL(temp, pbSrc);
371
4.28k
          DESTWRITEPIXEL(pbDest, temp);
372
4.28k
        });
373
9.36k
        break;
374
375
      /* Handle Special Order 1. */
376
9.36k
      case SPECIAL_FGBG_1:
377
2.48k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.48k
        pbSrc = pbSrc + 1;
380
381
2.48k
        if (fFirstLine)
382
427
        {
383
427
          pbDest =
384
427
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
427
        }
386
2.05k
        else
387
2.05k
        {
388
2.05k
          pbDest =
389
2.05k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.05k
        }
391
392
2.48k
        if (!pbDest)
393
6
          return FALSE;
394
395
2.48k
        break;
396
397
      /* Handle Special Order 2. */
398
2.86k
      case SPECIAL_FGBG_2:
399
2.86k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.86k
        pbSrc = pbSrc + 1;
402
403
2.86k
        if (fFirstLine)
404
317
        {
405
317
          pbDest =
406
317
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
317
        }
408
2.55k
        else
409
2.55k
        {
410
2.55k
          pbDest =
411
2.55k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.55k
        }
413
414
2.86k
        if (!pbDest)
415
7
          return FALSE;
416
417
2.86k
        break;
418
419
      /* Handle White Order. */
420
3.93k
      case SPECIAL_WHITE:
421
3.93k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.93k
        pbSrc = pbSrc + 1;
424
425
3.93k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
3.92k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.92k
        break;
430
431
      /* Handle Black Order. */
432
3.06k
      case SPECIAL_BLACK:
433
3.06k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
3.06k
        pbSrc = pbSrc + 1;
436
437
3.06k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
3.05k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
3.05k
        break;
442
443
6.41k
      default:
444
6.41k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.41k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.41k
        return FALSE;
447
194k
    }
448
194k
  }
449
450
4.69k
  return TRUE;
451
18.2k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
6.07k
{
102
6.07k
  const BYTE* pbSrc = pbSrcBuffer;
103
6.07k
  BYTE* pbDest = pbDestBuffer;
104
6.07k
  PIXEL temp = 0;
105
6.07k
  PIXEL fgPel = WHITE_PIXEL;
106
6.07k
  BOOL fInsertFgPel = FALSE;
107
6.07k
  BOOL fFirstLine = TRUE;
108
6.07k
  BYTE bitmask = 0;
109
6.07k
  PIXEL pixelA = 0;
110
6.07k
  PIXEL pixelB = 0;
111
6.07k
  UINT32 runLength = 0;
112
6.07k
  UINT32 code = 0;
113
6.07k
  UINT32 advance = 0;
114
6.07k
  RLEEXTRA
115
116
6.07k
  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.07k
  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.07k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
6.07k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
183k
  while (pbSrc < pbEnd)
134
182k
  {
135
    /* Watch out for the end of the first scanline. */
136
182k
    if (fFirstLine)
137
29.3k
    {
138
29.3k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.22k
      {
140
4.22k
        fFirstLine = FALSE;
141
4.22k
        fInsertFgPel = FALSE;
142
4.22k
      }
143
29.3k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
182k
    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
182k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
120k
    {
158
120k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
120k
      if (advance == 0)
160
186
        return FALSE;
161
119k
      pbSrc = pbSrc + advance;
162
163
119k
      if (fFirstLine)
164
12.7k
      {
165
12.7k
        if (fInsertFgPel)
166
8.55k
        {
167
8.55k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.55k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.55k
          runLength = runLength - 1;
172
8.55k
        }
173
174
12.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
29
          return FALSE;
176
177
12.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.7k
      }
179
107k
      else
180
107k
      {
181
107k
        if (fInsertFgPel)
182
98.1k
        {
183
98.1k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
98.1k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
16
            return FALSE;
187
188
98.1k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
98.1k
          runLength--;
190
98.1k
        }
191
192
107k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
349
          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
62.1k
    fInsertFgPel = FALSE;
209
210
62.1k
    switch (code)
211
62.1k
    {
212
      /* Handle Foreground Run Orders. */
213
8.60k
      case REGULAR_FG_RUN:
214
9.40k
      case MEGA_MEGA_FG_RUN:
215
14.7k
      case LITE_SET_FG_FG_RUN:
216
15.1k
      case MEGA_MEGA_SET_FG_RUN:
217
15.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
15.1k
        if (advance == 0)
219
38
          return FALSE;
220
15.1k
        pbSrc = pbSrc + advance;
221
222
15.1k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
5.75k
        {
224
5.75k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
89
            return FALSE;
226
5.67k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.67k
        }
228
229
15.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
92
          return FALSE;
231
232
14.9k
        if (fFirstLine)
233
3.79k
        {
234
3.79k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.79k
        }
236
11.1k
        else
237
11.1k
        {
238
11.1k
          UNROLL(runLength, {
239
11.1k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.1k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.1k
          });
242
11.1k
        }
243
244
14.9k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.66k
      case LITE_DITHERED_RUN:
248
4.27k
      case MEGA_MEGA_DITHERED_RUN:
249
4.27k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
4.27k
        if (advance == 0)
251
19
          return FALSE;
252
4.25k
        pbSrc = pbSrc + advance;
253
4.25k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
114
          return FALSE;
255
4.14k
        SRCREADPIXEL(pixelA, pbSrc);
256
4.14k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
265
          return FALSE;
258
3.88k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.88k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
57
          return FALSE;
262
263
3.82k
        UNROLL(runLength, {
264
3.82k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.82k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.82k
        });
267
3.82k
        break;
268
269
      /* Handle Color Run Orders. */
270
24.9k
      case REGULAR_COLOR_RUN:
271
25.3k
      case MEGA_MEGA_COLOR_RUN:
272
25.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
25.3k
        if (advance == 0)
274
21
          return FALSE;
275
25.3k
        pbSrc = pbSrc + advance;
276
25.3k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
133
          return FALSE;
278
25.1k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
25.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
83
          return FALSE;
282
283
25.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
25.1k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.07k
      case REGULAR_FGBG_IMAGE:
288
4.88k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.03k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.47k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.47k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.47k
        if (advance == 0)
293
47
          return FALSE;
294
6.43k
        pbSrc = pbSrc + advance;
295
296
6.43k
        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
88
            return FALSE;
300
1.48k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.48k
        }
302
303
6.34k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
277
          return FALSE;
305
6.06k
        if (fFirstLine)
306
1.97k
        {
307
25.5k
          while (runLength > 8)
308
23.5k
          {
309
23.5k
            bitmask = *pbSrc;
310
23.5k
            pbSrc = pbSrc + 1;
311
23.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
23.5k
            if (!pbDest)
314
28
              return FALSE;
315
316
23.5k
            runLength = runLength - 8;
317
23.5k
          }
318
1.97k
        }
319
4.08k
        else
320
4.08k
        {
321
25.0k
          while (runLength > 8)
322
20.9k
          {
323
20.9k
            bitmask = *pbSrc++;
324
325
20.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
20.9k
            if (!pbDest)
328
19
              return FALSE;
329
330
20.9k
            runLength = runLength - 8;
331
20.9k
          }
332
4.08k
        }
333
334
6.02k
        if (runLength > 0)
335
4.97k
        {
336
4.97k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
47
            return FALSE;
338
4.92k
          bitmask = *pbSrc++;
339
340
4.92k
          if (fFirstLine)
341
1.10k
          {
342
1.10k
            pbDest =
343
1.10k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.10k
          }
345
3.82k
          else
346
3.82k
          {
347
3.82k
            pbDest =
348
3.82k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
3.82k
          }
350
351
4.92k
          if (!pbDest)
352
2
            return FALSE;
353
4.92k
        }
354
355
5.97k
        break;
356
357
      /* Handle Color Image Orders. */
358
5.97k
      case REGULAR_COLOR_IMAGE:
359
4.70k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.70k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.70k
        if (advance == 0)
362
23
          return FALSE;
363
4.67k
        pbSrc = pbSrc + advance;
364
4.67k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
51
          return FALSE;
366
4.62k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
337
          return FALSE;
368
369
4.28k
        UNROLL(runLength, {
370
4.28k
          SRCREADPIXEL(temp, pbSrc);
371
4.28k
          DESTWRITEPIXEL(pbDest, temp);
372
4.28k
        });
373
4.28k
        break;
374
375
      /* Handle Special Order 1. */
376
834
      case SPECIAL_FGBG_1:
377
834
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
834
        pbSrc = pbSrc + 1;
380
381
834
        if (fFirstLine)
382
127
        {
383
127
          pbDest =
384
127
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
127
        }
386
707
        else
387
707
        {
388
707
          pbDest =
389
707
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
707
        }
391
392
834
        if (!pbDest)
393
2
          return FALSE;
394
395
832
        break;
396
397
      /* Handle Special Order 2. */
398
897
      case SPECIAL_FGBG_2:
399
897
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
897
        pbSrc = pbSrc + 1;
402
403
897
        if (fFirstLine)
404
107
        {
405
107
          pbDest =
406
107
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
107
        }
408
790
        else
409
790
        {
410
790
          pbDest =
411
790
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
790
        }
413
414
897
        if (!pbDest)
415
1
          return FALSE;
416
417
896
        break;
418
419
      /* Handle White Order. */
420
1.27k
      case SPECIAL_WHITE:
421
1.27k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.27k
        pbSrc = pbSrc + 1;
424
425
1.27k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.27k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.27k
        break;
430
431
      /* Handle Black Order. */
432
1.06k
      case SPECIAL_BLACK:
433
1.06k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.06k
        pbSrc = pbSrc + 1;
436
437
1.06k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
1.06k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.06k
        break;
442
443
2.12k
      default:
444
2.12k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.12k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.12k
        return FALSE;
447
62.1k
    }
448
62.1k
  }
449
450
1.53k
  return TRUE;
451
6.07k
}
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
383k
  while (pbSrc < pbEnd)
134
380k
  {
135
    /* Watch out for the end of the first scanline. */
136
380k
    if (fFirstLine)
137
58.4k
    {
138
58.4k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
9.15k
      {
140
9.15k
        fFirstLine = FALSE;
141
9.15k
        fInsertFgPel = FALSE;
142
9.15k
      }
143
58.4k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
380k
    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
380k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
248k
    {
158
248k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
248k
      if (advance == 0)
160
484
        return FALSE;
161
248k
      pbSrc = pbSrc + advance;
162
163
248k
      if (fFirstLine)
164
25.1k
      {
165
25.1k
        if (fInsertFgPel)
166
17.2k
        {
167
17.2k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
17.2k
          DESTWRITEPIXEL(pbDest, fgPel);
171
17.2k
          runLength = runLength - 1;
172
17.2k
        }
173
174
25.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
56
          return FALSE;
176
177
25.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
25.0k
      }
179
223k
      else
180
223k
      {
181
223k
        if (fInsertFgPel)
182
202k
        {
183
202k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
202k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
48
            return FALSE;
187
188
202k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
202k
          runLength--;
190
202k
        }
191
192
222k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
726
          return FALSE;
194
195
222k
        UNROLL(runLength, {
196
222k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
222k
          DESTWRITEPIXEL(pbDest, temp);
198
222k
        });
199
222k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
247k
      fInsertFgPel = TRUE;
203
247k
      continue;
204
248k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
131k
    fInsertFgPel = FALSE;
209
210
131k
    switch (code)
211
131k
    {
212
      /* Handle Foreground Run Orders. */
213
18.3k
      case REGULAR_FG_RUN:
214
19.9k
      case MEGA_MEGA_FG_RUN:
215
32.6k
      case LITE_SET_FG_FG_RUN:
216
33.2k
      case MEGA_MEGA_SET_FG_RUN:
217
33.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
33.2k
        if (advance == 0)
219
86
          return FALSE;
220
33.1k
        pbSrc = pbSrc + advance;
221
222
33.1k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
13.1k
        {
224
13.1k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
134
            return FALSE;
226
13.0k
          SRCREADPIXEL(fgPel, pbSrc);
227
13.0k
        }
228
229
32.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
232
          return FALSE;
231
232
32.7k
        if (fFirstLine)
233
7.16k
        {
234
7.16k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
7.16k
        }
236
25.5k
        else
237
25.5k
        {
238
25.5k
          UNROLL(runLength, {
239
25.5k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
25.5k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
25.5k
          });
242
25.5k
        }
243
244
32.7k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
7.66k
      case LITE_DITHERED_RUN:
248
8.70k
      case MEGA_MEGA_DITHERED_RUN:
249
8.70k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
8.70k
        if (advance == 0)
251
62
          return FALSE;
252
8.64k
        pbSrc = pbSrc + advance;
253
8.64k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
180
          return FALSE;
255
8.46k
        SRCREADPIXEL(pixelA, pbSrc);
256
8.46k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
256
          return FALSE;
258
8.20k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
8.20k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
102
          return FALSE;
262
263
8.10k
        UNROLL(runLength, {
264
8.10k
          DESTWRITEPIXEL(pbDest, pixelA);
265
8.10k
          DESTWRITEPIXEL(pbDest, pixelB);
266
8.10k
        });
267
8.10k
        break;
268
269
      /* Handle Color Run Orders. */
270
52.0k
      case REGULAR_COLOR_RUN:
271
52.9k
      case MEGA_MEGA_COLOR_RUN:
272
52.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
52.9k
        if (advance == 0)
274
48
          return FALSE;
275
52.9k
        pbSrc = pbSrc + advance;
276
52.9k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
204
          return FALSE;
278
52.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
52.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
178
          return FALSE;
282
283
52.5k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
52.5k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
8.94k
      case REGULAR_FGBG_IMAGE:
288
10.5k
      case MEGA_MEGA_FGBG_IMAGE:
289
12.9k
      case LITE_SET_FG_FGBG_IMAGE:
290
14.1k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
14.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
14.1k
        if (advance == 0)
293
110
          return FALSE;
294
14.0k
        pbSrc = pbSrc + advance;
295
296
14.0k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
3.51k
        {
298
3.51k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
150
            return FALSE;
300
3.36k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.36k
        }
302
303
13.8k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
578
          return FALSE;
305
13.3k
        if (fFirstLine)
306
3.66k
        {
307
45.6k
          while (runLength > 8)
308
42.0k
          {
309
42.0k
            bitmask = *pbSrc;
310
42.0k
            pbSrc = pbSrc + 1;
311
42.0k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
42.0k
            if (!pbDest)
314
52
              return FALSE;
315
316
41.9k
            runLength = runLength - 8;
317
41.9k
          }
318
3.66k
        }
319
9.64k
        else
320
9.64k
        {
321
63.1k
          while (runLength > 8)
322
53.5k
          {
323
53.5k
            bitmask = *pbSrc++;
324
325
53.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
53.5k
            if (!pbDest)
328
34
              return FALSE;
329
330
53.5k
            runLength = runLength - 8;
331
53.5k
          }
332
9.64k
        }
333
334
13.2k
        if (runLength > 0)
335
10.8k
        {
336
10.8k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
80
            return FALSE;
338
10.7k
          bitmask = *pbSrc++;
339
340
10.7k
          if (fFirstLine)
341
1.83k
          {
342
1.83k
            pbDest =
343
1.83k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.83k
          }
345
8.94k
          else
346
8.94k
          {
347
8.94k
            pbDest =
348
8.94k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
8.94k
          }
350
351
10.7k
          if (!pbDest)
352
4
            return FALSE;
353
10.7k
        }
354
355
13.1k
        break;
356
357
      /* Handle Color Image Orders. */
358
13.1k
      case REGULAR_COLOR_IMAGE:
359
10.2k
      case MEGA_MEGA_COLOR_IMAGE:
360
10.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
10.2k
        if (advance == 0)
362
52
          return FALSE;
363
10.1k
        pbSrc = pbSrc + advance;
364
10.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
110
          return FALSE;
366
10.0k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
718
          return FALSE;
368
369
9.36k
        UNROLL(runLength, {
370
9.36k
          SRCREADPIXEL(temp, pbSrc);
371
9.36k
          DESTWRITEPIXEL(pbDest, temp);
372
9.36k
        });
373
9.36k
        break;
374
375
      /* Handle Special Order 1. */
376
9.36k
      case SPECIAL_FGBG_1:
377
1.65k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.65k
        pbSrc = pbSrc + 1;
380
381
1.65k
        if (fFirstLine)
382
300
        {
383
300
          pbDest =
384
300
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
300
        }
386
1.35k
        else
387
1.35k
        {
388
1.35k
          pbDest =
389
1.35k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.35k
        }
391
392
1.65k
        if (!pbDest)
393
4
          return FALSE;
394
395
1.64k
        break;
396
397
      /* Handle Special Order 2. */
398
1.97k
      case SPECIAL_FGBG_2:
399
1.97k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.97k
        pbSrc = pbSrc + 1;
402
403
1.97k
        if (fFirstLine)
404
210
        {
405
210
          pbDest =
406
210
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
210
        }
408
1.76k
        else
409
1.76k
        {
410
1.76k
          pbDest =
411
1.76k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.76k
        }
413
414
1.97k
        if (!pbDest)
415
6
          return FALSE;
416
417
1.96k
        break;
418
419
      /* Handle White Order. */
420
2.65k
      case SPECIAL_WHITE:
421
2.65k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.65k
        pbSrc = pbSrc + 1;
424
425
2.65k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
2.65k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.65k
        break;
430
431
      /* Handle Black Order. */
432
2.00k
      case SPECIAL_BLACK:
433
2.00k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.00k
        pbSrc = pbSrc + 1;
436
437
2.00k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.99k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.99k
        break;
442
443
4.29k
      default:
444
4.29k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.29k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.29k
        return FALSE;
447
131k
    }
448
131k
  }
449
450
3.15k
  return TRUE;
451
12.1k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8