Coverage Report

Created: 2025-10-10 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/libfreerdp/codec/include/bitmap.h
Line
Count
Source
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * RLE Compressed Bitmap Stream
4
 *
5
 * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
6
 * Copyright 2016 Armin Novak <armin.novak@thincast.com>
7
 * Copyright 2016 Thincast Technologies GmbH
8
 *
9
 * Licensed under the Apache License, Version 2.0 (the "License");
10
 * you may not use this file except in compliance with the License.
11
 * You may obtain a copy of the License at
12
 *
13
 *     http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 * Unless required by applicable law or agreed to in writing, software
16
 * distributed under the License is distributed on an "AS IS" BASIS,
17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 * See the License for the specific language governing permissions and
19
 * limitations under the License.
20
 */
21
22
#include <winpr/assert.h>
23
#include <winpr/cast.h>
24
#include <winpr/wtypes.h>
25
26
/* do not compile the file directly */
27
28
/**
29
 * Write a foreground/background image to a destination buffer.
30
 */
31
static inline BYTE* WRITEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
32
                                   const BYTE* WINPR_RESTRICT pbDestEnd, UINT32 rowDelta,
33
                                   BYTE bitmask, PIXEL fgPel, UINT32 cBits)
34
92.5k
{
35
92.5k
  PIXEL xorPixel = 0;
36
92.5k
  BYTE mask = 0x01;
37
38
92.5k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
92.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
66
    return NULL;
46
47
92.4k
  UNROLL(cBits, {
48
92.4k
    PIXEL data = 0;
49
92.4k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
92.4k
    if (bitmask & mask)
52
92.4k
      data = xorPixel ^ fgPel;
53
92.4k
    else
54
92.4k
      data = xorPixel;
55
56
92.4k
    DESTWRITEPIXEL(pbDest, data);
57
92.4k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
92.4k
  });
59
92.4k
  return pbDest;
60
92.4k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
27.7k
{
35
27.7k
  PIXEL xorPixel = 0;
36
27.7k
  BYTE mask = 0x01;
37
38
27.7k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
27.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
24
    return NULL;
46
47
27.7k
  UNROLL(cBits, {
48
27.7k
    PIXEL data = 0;
49
27.7k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
27.7k
    if (bitmask & mask)
52
27.7k
      data = xorPixel ^ fgPel;
53
27.7k
    else
54
27.7k
      data = xorPixel;
55
56
27.7k
    DESTWRITEPIXEL(pbDest, data);
57
27.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
27.7k
  });
59
27.7k
  return pbDest;
60
27.7k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
64.8k
{
35
64.8k
  PIXEL xorPixel = 0;
36
64.8k
  BYTE mask = 0x01;
37
38
64.8k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
64.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
42
    return NULL;
46
47
64.7k
  UNROLL(cBits, {
48
64.7k
    PIXEL data = 0;
49
64.7k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
64.7k
    if (bitmask & mask)
52
64.7k
      data = xorPixel ^ fgPel;
53
64.7k
    else
54
64.7k
      data = xorPixel;
55
56
64.7k
    DESTWRITEPIXEL(pbDest, data);
57
64.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
64.7k
  });
59
64.7k
  return pbDest;
60
64.7k
}
Unexecuted instantiation: interleaved.c:WriteFgBgImage8to8
61
62
/**
63
 * Write a foreground/background image to a destination buffer
64
 * for the first line of compressed data.
65
 */
66
static inline BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
67
                                            const BYTE* WINPR_RESTRICT pbDestEnd, BYTE bitmask,
68
                                            PIXEL fgPel, UINT32 cBits)
69
70.1k
{
70
70.1k
  BYTE mask = 0x01;
71
72
70.1k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
70.1k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
93
    return NULL;
80
81
70.0k
  UNROLL(cBits, {
82
70.0k
    PIXEL data;
83
84
70.0k
    if (bitmask & mask)
85
70.0k
      data = fgPel;
86
70.0k
    else
87
70.0k
      data = BLACK_PIXEL;
88
89
70.0k
    DESTWRITEPIXEL(pbDest, data);
90
70.0k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
70.0k
  });
92
70.0k
  return pbDest;
93
70.0k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
25.2k
{
70
25.2k
  BYTE mask = 0x01;
71
72
25.2k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
25.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
33
    return NULL;
80
81
25.2k
  UNROLL(cBits, {
82
25.2k
    PIXEL data;
83
84
25.2k
    if (bitmask & mask)
85
25.2k
      data = fgPel;
86
25.2k
    else
87
25.2k
      data = BLACK_PIXEL;
88
89
25.2k
    DESTWRITEPIXEL(pbDest, data);
90
25.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
25.2k
  });
92
25.2k
  return pbDest;
93
25.2k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
44.8k
{
70
44.8k
  BYTE mask = 0x01;
71
72
44.8k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
44.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
60
    return NULL;
80
81
44.8k
  UNROLL(cBits, {
82
44.8k
    PIXEL data;
83
84
44.8k
    if (bitmask & mask)
85
44.8k
      data = fgPel;
86
44.8k
    else
87
44.8k
      data = BLACK_PIXEL;
88
89
44.8k
    DESTWRITEPIXEL(pbDest, data);
90
44.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
44.8k
  });
92
44.8k
  return pbDest;
93
44.8k
}
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
17.2k
{
102
17.2k
  const BYTE* pbSrc = pbSrcBuffer;
103
17.2k
  BYTE* pbDest = pbDestBuffer;
104
17.2k
  PIXEL temp = 0;
105
17.2k
  PIXEL fgPel = WHITE_PIXEL;
106
17.2k
  BOOL fInsertFgPel = FALSE;
107
17.2k
  BOOL fFirstLine = TRUE;
108
17.2k
  BYTE bitmask = 0;
109
17.2k
  PIXEL pixelA = 0;
110
17.2k
  PIXEL pixelB = 0;
111
17.2k
  UINT32 runLength = 0;
112
17.2k
  UINT32 code = 0;
113
17.2k
  UINT32 advance = 0;
114
17.2k
  RLEEXTRA
115
116
17.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
17.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
17.2k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
17.2k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
505k
  while (pbSrc < pbEnd)
134
500k
  {
135
    /* Watch out for the end of the first scanline. */
136
500k
    if (fFirstLine)
137
83.2k
    {
138
83.2k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
12.7k
      {
140
12.7k
        fFirstLine = FALSE;
141
12.7k
        fInsertFgPel = FALSE;
142
12.7k
      }
143
83.2k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
500k
    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
500k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
345k
    {
158
345k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
345k
      if (advance == 0)
160
589
        return FALSE;
161
344k
      pbSrc = pbSrc + advance;
162
163
344k
      if (fFirstLine)
164
36.2k
      {
165
36.2k
        if (fInsertFgPel)
166
24.8k
        {
167
24.8k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
24.8k
          DESTWRITEPIXEL(pbDest, fgPel);
171
24.8k
          runLength = runLength - 1;
172
24.8k
        }
173
174
36.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
91
          return FALSE;
176
177
36.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
36.1k
      }
179
308k
      else
180
308k
      {
181
308k
        if (fInsertFgPel)
182
279k
        {
183
279k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
279k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
29
            return FALSE;
187
188
279k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
279k
          runLength--;
190
279k
        }
191
192
308k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.06k
          return FALSE;
194
195
307k
        UNROLL(runLength, {
196
307k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
307k
          DESTWRITEPIXEL(pbDest, temp);
198
307k
        });
199
307k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
343k
      fInsertFgPel = TRUE;
203
343k
      continue;
204
344k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
155k
    fInsertFgPel = FALSE;
209
210
155k
    switch (code)
211
155k
    {
212
      /* Handle Foreground Run Orders. */
213
28.2k
      case REGULAR_FG_RUN:
214
30.7k
      case MEGA_MEGA_FG_RUN:
215
47.8k
      case LITE_SET_FG_FG_RUN:
216
48.8k
      case MEGA_MEGA_SET_FG_RUN:
217
48.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
48.8k
        if (advance == 0)
219
120
          return FALSE;
220
48.7k
        pbSrc = pbSrc + advance;
221
222
48.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.1k
        {
224
18.1k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
235
            return FALSE;
226
17.9k
          SRCREADPIXEL(fgPel, pbSrc);
227
17.9k
        }
228
229
48.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
319
          return FALSE;
231
232
48.2k
        if (fFirstLine)
233
10.6k
        {
234
10.6k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.6k
        }
236
37.6k
        else
237
37.6k
        {
238
37.6k
          UNROLL(runLength, {
239
37.6k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
37.6k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
37.6k
          });
242
37.6k
        }
243
244
48.2k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
10.2k
      case LITE_DITHERED_RUN:
248
11.0k
      case MEGA_MEGA_DITHERED_RUN:
249
11.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
11.0k
        if (advance == 0)
251
60
          return FALSE;
252
11.0k
        pbSrc = pbSrc + advance;
253
11.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
227
          return FALSE;
255
10.8k
        SRCREADPIXEL(pixelA, pbSrc);
256
10.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
488
          return FALSE;
258
10.3k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
10.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
139
          return FALSE;
262
263
10.1k
        UNROLL(runLength, {
264
10.1k
          DESTWRITEPIXEL(pbDest, pixelA);
265
10.1k
          DESTWRITEPIXEL(pbDest, pixelB);
266
10.1k
        });
267
10.1k
        break;
268
269
      /* Handle Color Run Orders. */
270
39.5k
      case REGULAR_COLOR_RUN:
271
41.1k
      case MEGA_MEGA_COLOR_RUN:
272
41.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
41.1k
        if (advance == 0)
274
85
          return FALSE;
275
41.0k
        pbSrc = pbSrc + advance;
276
41.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
294
          return FALSE;
278
40.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
40.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
201
          return FALSE;
282
283
40.5k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
40.5k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
13.8k
      case REGULAR_FGBG_IMAGE:
288
16.0k
      case MEGA_MEGA_FGBG_IMAGE:
289
19.6k
      case LITE_SET_FG_FGBG_IMAGE:
290
21.0k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
21.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
21.0k
        if (advance == 0)
293
160
          return FALSE;
294
20.8k
        pbSrc = pbSrc + advance;
295
296
20.8k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
4.93k
        {
298
4.93k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
210
            return FALSE;
300
4.72k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.72k
        }
302
303
20.6k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
824
          return FALSE;
305
19.8k
        if (fFirstLine)
306
5.44k
        {
307
71.8k
          while (runLength > 8)
308
66.4k
          {
309
66.4k
            bitmask = *pbSrc;
310
66.4k
            pbSrc = pbSrc + 1;
311
66.4k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
66.4k
            if (!pbDest)
314
90
              return FALSE;
315
316
66.3k
            runLength = runLength - 8;
317
66.3k
          }
318
5.44k
        }
319
14.4k
        else
320
14.4k
        {
321
88.1k
          while (runLength > 8)
322
73.7k
          {
323
73.7k
            bitmask = *pbSrc++;
324
325
73.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
73.7k
            if (!pbDest)
328
55
              return FALSE;
329
330
73.6k
            runLength = runLength - 8;
331
73.6k
          }
332
14.4k
        }
333
334
19.7k
        if (runLength > 0)
335
16.7k
        {
336
16.7k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
118
            return FALSE;
338
16.6k
          bitmask = *pbSrc++;
339
340
16.6k
          if (fFirstLine)
341
3.07k
          {
342
3.07k
            pbDest =
343
3.07k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
3.07k
          }
345
13.5k
          else
346
13.5k
          {
347
13.5k
            pbDest =
348
13.5k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
13.5k
          }
350
351
16.6k
          if (!pbDest)
352
8
            return FALSE;
353
16.6k
        }
354
355
19.5k
        break;
356
357
      /* Handle Color Image Orders. */
358
19.5k
      case REGULAR_COLOR_IMAGE:
359
14.0k
      case MEGA_MEGA_COLOR_IMAGE:
360
14.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
14.0k
        if (advance == 0)
362
72
          return FALSE;
363
14.0k
        pbSrc = pbSrc + advance;
364
14.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
135
          return FALSE;
366
13.8k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
1.01k
          return FALSE;
368
369
12.8k
        UNROLL(runLength, {
370
4.05k
          SRCREADPIXEL(temp, pbSrc);
371
4.05k
          DESTWRITEPIXEL(pbDest, temp);
372
4.05k
        });
373
8.80k
        break;
374
375
      /* Handle Special Order 1. */
376
8.80k
      case SPECIAL_FGBG_1:
377
2.59k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.59k
        pbSrc = pbSrc + 1;
380
381
2.59k
        if (fFirstLine)
382
325
        {
383
325
          pbDest =
384
325
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
325
        }
386
2.27k
        else
387
2.27k
        {
388
2.27k
          pbDest =
389
2.27k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.27k
        }
391
392
2.59k
        if (!pbDest)
393
3
          return FALSE;
394
395
2.59k
        break;
396
397
      /* Handle Special Order 2. */
398
3.27k
      case SPECIAL_FGBG_2:
399
3.27k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.27k
        pbSrc = pbSrc + 1;
402
403
3.27k
        if (fFirstLine)
404
280
        {
405
280
          pbDest =
406
280
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
280
        }
408
2.99k
        else
409
2.99k
        {
410
2.99k
          pbDest =
411
2.99k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.99k
        }
413
414
3.27k
        if (!pbDest)
415
3
          return FALSE;
416
417
3.27k
        break;
418
419
      /* Handle White Order. */
420
4.54k
      case SPECIAL_WHITE:
421
4.54k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
4.54k
        pbSrc = pbSrc + 1;
424
425
4.54k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
4.53k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
4.53k
        break;
430
431
      /* Handle Black Order. */
432
2.57k
      case SPECIAL_BLACK:
433
2.57k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.57k
        pbSrc = pbSrc + 1;
436
437
2.57k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
2.57k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.57k
        break;
442
443
6.15k
      default:
444
6.15k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.15k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.15k
        return FALSE;
447
155k
    }
448
155k
  }
449
450
4.42k
  return TRUE;
451
17.2k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
5.74k
{
102
5.74k
  const BYTE* pbSrc = pbSrcBuffer;
103
5.74k
  BYTE* pbDest = pbDestBuffer;
104
5.74k
  PIXEL temp = 0;
105
5.74k
  PIXEL fgPel = WHITE_PIXEL;
106
5.74k
  BOOL fInsertFgPel = FALSE;
107
5.74k
  BOOL fFirstLine = TRUE;
108
5.74k
  BYTE bitmask = 0;
109
5.74k
  PIXEL pixelA = 0;
110
5.74k
  PIXEL pixelB = 0;
111
5.74k
  UINT32 runLength = 0;
112
5.74k
  UINT32 code = 0;
113
5.74k
  UINT32 advance = 0;
114
5.74k
  RLEEXTRA
115
116
5.74k
  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.74k
  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.74k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
5.74k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
164k
  while (pbSrc < pbEnd)
134
162k
  {
135
    /* Watch out for the end of the first scanline. */
136
162k
    if (fFirstLine)
137
27.8k
    {
138
27.8k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.03k
      {
140
4.03k
        fFirstLine = FALSE;
141
4.03k
        fInsertFgPel = FALSE;
142
4.03k
      }
143
27.8k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
162k
    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
162k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
113k
    {
158
113k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
113k
      if (advance == 0)
160
159
        return FALSE;
161
112k
      pbSrc = pbSrc + advance;
162
163
112k
      if (fFirstLine)
164
12.1k
      {
165
12.1k
        if (fInsertFgPel)
166
8.22k
        {
167
8.22k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.22k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.22k
          runLength = runLength - 1;
172
8.22k
        }
173
174
12.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
29
          return FALSE;
176
177
12.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.1k
      }
179
100k
      else
180
100k
      {
181
100k
        if (fInsertFgPel)
182
91.7k
        {
183
91.7k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
91.7k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
9
            return FALSE;
187
188
91.7k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
91.7k
          runLength--;
190
91.7k
        }
191
192
100k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
338
          return FALSE;
194
195
100k
        UNROLL(runLength, {
196
100k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
100k
          DESTWRITEPIXEL(pbDest, temp);
198
100k
        });
199
100k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
112k
      fInsertFgPel = TRUE;
203
112k
      continue;
204
112k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
49.9k
    fInsertFgPel = FALSE;
209
210
49.9k
    switch (code)
211
49.9k
    {
212
      /* Handle Foreground Run Orders. */
213
9.08k
      case REGULAR_FG_RUN:
214
9.90k
      case MEGA_MEGA_FG_RUN:
215
15.3k
      case LITE_SET_FG_FG_RUN:
216
15.7k
      case MEGA_MEGA_SET_FG_RUN:
217
15.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
15.7k
        if (advance == 0)
219
38
          return FALSE;
220
15.7k
        pbSrc = pbSrc + advance;
221
222
15.7k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
5.82k
        {
224
5.82k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
87
            return FALSE;
226
5.73k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.73k
        }
228
229
15.6k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
91
          return FALSE;
231
232
15.5k
        if (fFirstLine)
233
3.63k
        {
234
3.63k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.63k
        }
236
11.8k
        else
237
11.8k
        {
238
11.8k
          UNROLL(runLength, {
239
11.8k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.8k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.8k
          });
242
11.8k
        }
243
244
15.5k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.35k
      case LITE_DITHERED_RUN:
248
3.64k
      case MEGA_MEGA_DITHERED_RUN:
249
3.64k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
3.64k
        if (advance == 0)
251
16
          return FALSE;
252
3.63k
        pbSrc = pbSrc + advance;
253
3.63k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
103
          return FALSE;
255
3.53k
        SRCREADPIXEL(pixelA, pbSrc);
256
3.53k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
240
          return FALSE;
258
3.29k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.29k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
37
          return FALSE;
262
263
3.25k
        UNROLL(runLength, {
264
3.25k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.25k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.25k
        });
267
3.25k
        break;
268
269
      /* Handle Color Run Orders. */
270
12.4k
      case REGULAR_COLOR_RUN:
271
12.9k
      case MEGA_MEGA_COLOR_RUN:
272
12.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
12.9k
        if (advance == 0)
274
25
          return FALSE;
275
12.8k
        pbSrc = pbSrc + advance;
276
12.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
108
          return FALSE;
278
12.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
12.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
63
          return FALSE;
282
283
12.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
12.7k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.48k
      case REGULAR_FGBG_IMAGE:
288
5.21k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.37k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.78k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.78k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.78k
        if (advance == 0)
293
46
          return FALSE;
294
6.74k
        pbSrc = pbSrc + advance;
295
296
6.74k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.55k
        {
298
1.55k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
76
            return FALSE;
300
1.47k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.47k
        }
302
303
6.66k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
268
          return FALSE;
305
6.39k
        if (fFirstLine)
306
1.89k
        {
307
25.8k
          while (runLength > 8)
308
23.9k
          {
309
23.9k
            bitmask = *pbSrc;
310
23.9k
            pbSrc = pbSrc + 1;
311
23.9k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
23.9k
            if (!pbDest)
314
32
              return FALSE;
315
316
23.9k
            runLength = runLength - 8;
317
23.9k
          }
318
1.89k
        }
319
4.50k
        else
320
4.50k
        {
321
26.2k
          while (runLength > 8)
322
21.7k
          {
323
21.7k
            bitmask = *pbSrc++;
324
325
21.7k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
21.7k
            if (!pbDest)
328
21
              return FALSE;
329
330
21.7k
            runLength = runLength - 8;
331
21.7k
          }
332
4.50k
        }
333
334
6.34k
        if (runLength > 0)
335
5.40k
        {
336
5.40k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
44
            return FALSE;
338
5.35k
          bitmask = *pbSrc++;
339
340
5.35k
          if (fFirstLine)
341
1.15k
          {
342
1.15k
            pbDest =
343
1.15k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.15k
          }
345
4.20k
          else
346
4.20k
          {
347
4.20k
            pbDest =
348
4.20k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
4.20k
          }
350
351
5.35k
          if (!pbDest)
352
2
            return FALSE;
353
5.35k
        }
354
355
6.29k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.29k
      case REGULAR_COLOR_IMAGE:
359
4.46k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.46k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.46k
        if (advance == 0)
362
22
          return FALSE;
363
4.43k
        pbSrc = pbSrc + advance;
364
4.43k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
47
          return FALSE;
366
4.39k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
338
          return FALSE;
368
369
4.05k
        UNROLL(runLength, {
370
4.05k
          SRCREADPIXEL(temp, pbSrc);
371
4.05k
          DESTWRITEPIXEL(pbDest, temp);
372
4.05k
        });
373
4.05k
        break;
374
375
      /* Handle Special Order 1. */
376
864
      case SPECIAL_FGBG_1:
377
864
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
864
        pbSrc = pbSrc + 1;
380
381
864
        if (fFirstLine)
382
89
        {
383
89
          pbDest =
384
89
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
89
        }
386
775
        else
387
775
        {
388
775
          pbDest =
389
775
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
775
        }
391
392
864
        if (!pbDest)
393
1
          return FALSE;
394
395
863
        break;
396
397
      /* Handle Special Order 2. */
398
1.09k
      case SPECIAL_FGBG_2:
399
1.09k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.09k
        pbSrc = pbSrc + 1;
402
403
1.09k
        if (fFirstLine)
404
96
        {
405
96
          pbDest =
406
96
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
96
        }
408
996
        else
409
996
        {
410
996
          pbDest =
411
996
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
996
        }
413
414
1.09k
        if (!pbDest)
415
1
          return FALSE;
416
417
1.09k
        break;
418
419
      /* Handle White Order. */
420
1.51k
      case SPECIAL_WHITE:
421
1.51k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.51k
        pbSrc = pbSrc + 1;
424
425
1.51k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.51k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.51k
        break;
430
431
      /* Handle Black Order. */
432
883
      case SPECIAL_BLACK:
433
883
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
883
        pbSrc = pbSrc + 1;
436
437
883
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
882
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
882
        break;
442
443
2.03k
      default:
444
2.03k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.03k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.03k
        return FALSE;
447
49.9k
    }
448
49.9k
  }
449
450
1.45k
  return TRUE;
451
5.74k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
11.4k
{
102
11.4k
  const BYTE* pbSrc = pbSrcBuffer;
103
11.4k
  BYTE* pbDest = pbDestBuffer;
104
11.4k
  PIXEL temp = 0;
105
11.4k
  PIXEL fgPel = WHITE_PIXEL;
106
11.4k
  BOOL fInsertFgPel = FALSE;
107
11.4k
  BOOL fFirstLine = TRUE;
108
11.4k
  BYTE bitmask = 0;
109
11.4k
  PIXEL pixelA = 0;
110
11.4k
  PIXEL pixelB = 0;
111
11.4k
  UINT32 runLength = 0;
112
11.4k
  UINT32 code = 0;
113
11.4k
  UINT32 advance = 0;
114
11.4k
  RLEEXTRA
115
116
11.4k
  if ((rowDelta == 0) || (rowDelta < width))
117
0
  {
118
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
119
0
             width);
120
0
    return FALSE;
121
0
  }
122
123
11.4k
  if (!pbSrcBuffer || !pbDestBuffer)
124
0
  {
125
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,
126
0
             pbDestBuffer);
127
0
    return FALSE;
128
0
  }
129
130
11.4k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
11.4k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
340k
  while (pbSrc < pbEnd)
134
337k
  {
135
    /* Watch out for the end of the first scanline. */
136
337k
    if (fFirstLine)
137
55.4k
    {
138
55.4k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.70k
      {
140
8.70k
        fFirstLine = FALSE;
141
8.70k
        fInsertFgPel = FALSE;
142
8.70k
      }
143
55.4k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
337k
    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
337k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
232k
    {
158
232k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
232k
      if (advance == 0)
160
430
        return FALSE;
161
231k
      pbSrc = pbSrc + advance;
162
163
231k
      if (fFirstLine)
164
24.0k
      {
165
24.0k
        if (fInsertFgPel)
166
16.6k
        {
167
16.6k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
16.6k
          DESTWRITEPIXEL(pbDest, fgPel);
171
16.6k
          runLength = runLength - 1;
172
16.6k
        }
173
174
24.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
62
          return FALSE;
176
177
23.9k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
23.9k
      }
179
207k
      else
180
207k
      {
181
207k
        if (fInsertFgPel)
182
188k
        {
183
188k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
188k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
20
            return FALSE;
187
188
188k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
188k
          runLength--;
190
188k
        }
191
192
207k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
730
          return FALSE;
194
195
207k
        UNROLL(runLength, {
196
207k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
207k
          DESTWRITEPIXEL(pbDest, temp);
198
207k
        });
199
207k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
231k
      fInsertFgPel = TRUE;
203
231k
      continue;
204
231k
    }
205
206
    /* For any of the other run-types a follow-on background run
207
        order does not need a foreground pel inserted. */
208
105k
    fInsertFgPel = FALSE;
209
210
105k
    switch (code)
211
105k
    {
212
      /* Handle Foreground Run Orders. */
213
19.1k
      case REGULAR_FG_RUN:
214
20.7k
      case MEGA_MEGA_FG_RUN:
215
32.5k
      case LITE_SET_FG_FG_RUN:
216
33.1k
      case MEGA_MEGA_SET_FG_RUN:
217
33.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
33.1k
        if (advance == 0)
219
82
          return FALSE;
220
33.0k
        pbSrc = pbSrc + advance;
221
222
33.0k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
12.3k
        {
224
12.3k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
148
            return FALSE;
226
12.1k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.1k
        }
228
229
32.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
228
          return FALSE;
231
232
32.6k
        if (fFirstLine)
233
6.98k
        {
234
6.98k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
6.98k
        }
236
25.7k
        else
237
25.7k
        {
238
25.7k
          UNROLL(runLength, {
239
25.7k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
25.7k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
25.7k
          });
242
25.7k
        }
243
244
32.6k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
6.85k
      case LITE_DITHERED_RUN:
248
7.43k
      case MEGA_MEGA_DITHERED_RUN:
249
7.43k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
7.43k
        if (advance == 0)
251
44
          return FALSE;
252
7.39k
        pbSrc = pbSrc + advance;
253
7.39k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
124
          return FALSE;
255
7.27k
        SRCREADPIXEL(pixelA, pbSrc);
256
7.27k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
248
          return FALSE;
258
7.02k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.02k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
102
          return FALSE;
262
263
6.92k
        UNROLL(runLength, {
264
6.92k
          DESTWRITEPIXEL(pbDest, pixelA);
265
6.92k
          DESTWRITEPIXEL(pbDest, pixelB);
266
6.92k
        });
267
6.92k
        break;
268
269
      /* Handle Color Run Orders. */
270
27.1k
      case REGULAR_COLOR_RUN:
271
28.2k
      case MEGA_MEGA_COLOR_RUN:
272
28.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
28.2k
        if (advance == 0)
274
60
          return FALSE;
275
28.1k
        pbSrc = pbSrc + advance;
276
28.1k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
186
          return FALSE;
278
27.9k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
27.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
138
          return FALSE;
282
283
27.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
27.8k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.37k
      case REGULAR_FGBG_IMAGE:
288
10.8k
      case MEGA_MEGA_FGBG_IMAGE:
289
13.2k
      case LITE_SET_FG_FGBG_IMAGE:
290
14.2k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
14.2k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
14.2k
        if (advance == 0)
293
114
          return FALSE;
294
14.1k
        pbSrc = pbSrc + advance;
295
296
14.1k
        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
134
            return FALSE;
300
3.24k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.24k
        }
302
303
14.0k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
556
          return FALSE;
305
13.4k
        if (fFirstLine)
306
3.54k
        {
307
46.0k
          while (runLength > 8)
308
42.5k
          {
309
42.5k
            bitmask = *pbSrc;
310
42.5k
            pbSrc = pbSrc + 1;
311
42.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
42.5k
            if (!pbDest)
314
58
              return FALSE;
315
316
42.4k
            runLength = runLength - 8;
317
42.4k
          }
318
3.54k
        }
319
9.92k
        else
320
9.92k
        {
321
61.8k
          while (runLength > 8)
322
51.9k
          {
323
51.9k
            bitmask = *pbSrc++;
324
325
51.9k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
51.9k
            if (!pbDest)
328
34
              return FALSE;
329
330
51.9k
            runLength = runLength - 8;
331
51.9k
          }
332
9.92k
        }
333
334
13.3k
        if (runLength > 0)
335
11.3k
        {
336
11.3k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
74
            return FALSE;
338
11.2k
          bitmask = *pbSrc++;
339
340
11.2k
          if (fFirstLine)
341
1.92k
          {
342
1.92k
            pbDest =
343
1.92k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.92k
          }
345
9.32k
          else
346
9.32k
          {
347
9.32k
            pbDest =
348
9.32k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
9.32k
          }
350
351
11.2k
          if (!pbDest)
352
6
            return FALSE;
353
11.2k
        }
354
355
13.2k
        break;
356
357
      /* Handle Color Image Orders. */
358
13.2k
      case REGULAR_COLOR_IMAGE:
359
9.61k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.61k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.61k
        if (advance == 0)
362
50
          return FALSE;
363
9.56k
        pbSrc = pbSrc + advance;
364
9.56k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
88
          return FALSE;
366
9.47k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
672
          return FALSE;
368
369
8.80k
        UNROLL(runLength, {
370
8.80k
          SRCREADPIXEL(temp, pbSrc);
371
8.80k
          DESTWRITEPIXEL(pbDest, temp);
372
8.80k
        });
373
8.80k
        break;
374
375
      /* Handle Special Order 1. */
376
8.80k
      case SPECIAL_FGBG_1:
377
1.73k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.73k
        pbSrc = pbSrc + 1;
380
381
1.73k
        if (fFirstLine)
382
236
        {
383
236
          pbDest =
384
236
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
236
        }
386
1.49k
        else
387
1.49k
        {
388
1.49k
          pbDest =
389
1.49k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.49k
        }
391
392
1.73k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.73k
        break;
396
397
      /* Handle Special Order 2. */
398
2.18k
      case SPECIAL_FGBG_2:
399
2.18k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.18k
        pbSrc = pbSrc + 1;
402
403
2.18k
        if (fFirstLine)
404
184
        {
405
184
          pbDest =
406
184
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
184
        }
408
2.00k
        else
409
2.00k
        {
410
2.00k
          pbDest =
411
2.00k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.00k
        }
413
414
2.18k
        if (!pbDest)
415
2
          return FALSE;
416
417
2.18k
        break;
418
419
      /* Handle White Order. */
420
3.02k
      case SPECIAL_WHITE:
421
3.02k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
3.02k
        pbSrc = pbSrc + 1;
424
425
3.02k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
3.02k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
3.02k
        break;
430
431
      /* Handle Black Order. */
432
1.69k
      case SPECIAL_BLACK:
433
1.69k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.69k
        pbSrc = pbSrc + 1;
436
437
1.69k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.68k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.68k
        break;
442
443
4.11k
      default:
444
4.11k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.11k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.11k
        return FALSE;
447
105k
    }
448
105k
  }
449
450
2.96k
  return TRUE;
451
11.4k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8