Coverage Report

Created: 2025-10-12 06:29

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.2k
{
35
91.2k
  PIXEL xorPixel = 0;
36
91.2k
  BYTE mask = 0x01;
37
38
91.2k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
91.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
64
    return NULL;
46
47
91.1k
  UNROLL(cBits, {
48
91.1k
    PIXEL data = 0;
49
91.1k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
91.1k
    if (bitmask & mask)
52
91.1k
      data = xorPixel ^ fgPel;
53
91.1k
    else
54
91.1k
      data = xorPixel;
55
56
91.1k
    DESTWRITEPIXEL(pbDest, data);
57
91.1k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
91.1k
  });
59
91.1k
  return pbDest;
60
91.1k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
34
26.5k
{
35
26.5k
  PIXEL xorPixel = 0;
36
26.5k
  BYTE mask = 0x01;
37
38
26.5k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
26.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
22
    return NULL;
46
47
26.4k
  UNROLL(cBits, {
48
26.4k
    PIXEL data = 0;
49
26.4k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
26.4k
    if (bitmask & mask)
52
26.4k
      data = xorPixel ^ fgPel;
53
26.4k
    else
54
26.4k
      data = xorPixel;
55
56
26.4k
    DESTWRITEPIXEL(pbDest, data);
57
26.4k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
26.4k
  });
59
26.4k
  return pbDest;
60
26.4k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
34
64.7k
{
35
64.7k
  PIXEL xorPixel = 0;
36
64.7k
  BYTE mask = 0x01;
37
38
64.7k
  if (cBits > 8)
39
0
  {
40
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
41
0
    return NULL;
42
0
  }
43
44
64.7k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
45
42
    return NULL;
46
47
64.6k
  UNROLL(cBits, {
48
64.6k
    PIXEL data = 0;
49
64.6k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
50
51
64.6k
    if (bitmask & mask)
52
64.6k
      data = xorPixel ^ fgPel;
53
64.6k
    else
54
64.6k
      data = xorPixel;
55
56
64.6k
    DESTWRITEPIXEL(pbDest, data);
57
64.6k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
58
64.6k
  });
59
64.6k
  return pbDest;
60
64.6k
}
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
73.8k
{
70
73.8k
  BYTE mask = 0x01;
71
72
73.8k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
73.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
99
    return NULL;
80
81
73.7k
  UNROLL(cBits, {
82
73.7k
    PIXEL data;
83
84
73.7k
    if (bitmask & mask)
85
73.7k
      data = fgPel;
86
73.7k
    else
87
73.7k
      data = BLACK_PIXEL;
88
89
73.7k
    DESTWRITEPIXEL(pbDest, data);
90
73.7k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
73.7k
  });
92
73.7k
  return pbDest;
93
73.7k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
69
27.2k
{
70
27.2k
  BYTE mask = 0x01;
71
72
27.2k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
27.2k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
37
    return NULL;
80
81
27.2k
  UNROLL(cBits, {
82
27.2k
    PIXEL data;
83
84
27.2k
    if (bitmask & mask)
85
27.2k
      data = fgPel;
86
27.2k
    else
87
27.2k
      data = BLACK_PIXEL;
88
89
27.2k
    DESTWRITEPIXEL(pbDest, data);
90
27.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
27.2k
  });
92
27.2k
  return pbDest;
93
27.2k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
69
46.5k
{
70
46.5k
  BYTE mask = 0x01;
71
72
46.5k
  if (cBits > 8)
73
0
  {
74
0
    WLog_ERR(TAG, "cBits %d > 8", cBits);
75
0
    return NULL;
76
0
  }
77
78
46.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
79
62
    return NULL;
80
81
46.5k
  UNROLL(cBits, {
82
46.5k
    PIXEL data;
83
84
46.5k
    if (bitmask & mask)
85
46.5k
      data = fgPel;
86
46.5k
    else
87
46.5k
      data = BLACK_PIXEL;
88
89
46.5k
    DESTWRITEPIXEL(pbDest, data);
90
46.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
91
46.5k
  });
92
46.5k
  return pbDest;
93
46.5k
}
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.5k
{
102
17.5k
  const BYTE* pbSrc = pbSrcBuffer;
103
17.5k
  BYTE* pbDest = pbDestBuffer;
104
17.5k
  PIXEL temp = 0;
105
17.5k
  PIXEL fgPel = WHITE_PIXEL;
106
17.5k
  BOOL fInsertFgPel = FALSE;
107
17.5k
  BOOL fFirstLine = TRUE;
108
17.5k
  BYTE bitmask = 0;
109
17.5k
  PIXEL pixelA = 0;
110
17.5k
  PIXEL pixelB = 0;
111
17.5k
  UINT32 runLength = 0;
112
17.5k
  UINT32 code = 0;
113
17.5k
  UINT32 advance = 0;
114
17.5k
  RLEEXTRA
115
116
17.5k
  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.5k
  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.5k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
17.5k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
511k
  while (pbSrc < pbEnd)
134
507k
  {
135
    /* Watch out for the end of the first scanline. */
136
507k
    if (fFirstLine)
137
84.2k
    {
138
84.2k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
12.9k
      {
140
12.9k
        fFirstLine = FALSE;
141
12.9k
        fInsertFgPel = FALSE;
142
12.9k
      }
143
84.2k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
507k
    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
507k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
352k
    {
158
352k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
352k
      if (advance == 0)
160
605
        return FALSE;
161
351k
      pbSrc = pbSrc + advance;
162
163
351k
      if (fFirstLine)
164
36.9k
      {
165
36.9k
        if (fInsertFgPel)
166
25.3k
        {
167
25.3k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
25.3k
          DESTWRITEPIXEL(pbDest, fgPel);
171
25.3k
          runLength = runLength - 1;
172
25.3k
        }
173
174
36.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
88
          return FALSE;
176
177
36.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
36.8k
      }
179
314k
      else
180
314k
      {
181
314k
        if (fInsertFgPel)
182
285k
        {
183
285k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
285k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
34
            return FALSE;
187
188
285k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
285k
          runLength--;
190
285k
        }
191
192
314k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
1.11k
          return FALSE;
194
195
313k
        UNROLL(runLength, {
196
313k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
313k
          DESTWRITEPIXEL(pbDest, temp);
198
313k
        });
199
313k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
350k
      fInsertFgPel = TRUE;
203
350k
      continue;
204
351k
    }
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
27.7k
      case REGULAR_FG_RUN:
214
30.2k
      case MEGA_MEGA_FG_RUN:
215
47.6k
      case LITE_SET_FG_FG_RUN:
216
48.7k
      case MEGA_MEGA_SET_FG_RUN:
217
48.7k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
218
48.7k
        if (advance == 0)
219
122
          return FALSE;
220
48.5k
        pbSrc = pbSrc + advance;
221
222
48.5k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
223
18.3k
        {
224
18.3k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
244
            return FALSE;
226
18.1k
          SRCREADPIXEL(fgPel, pbSrc);
227
18.1k
        }
228
229
48.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
322
          return FALSE;
231
232
48.0k
        if (fFirstLine)
233
10.5k
        {
234
10.5k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
10.5k
        }
236
37.4k
        else
237
37.4k
        {
238
37.4k
          UNROLL(runLength, {
239
37.4k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
37.4k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
37.4k
          });
242
37.4k
        }
243
244
48.0k
        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
59
          return FALSE;
252
11.0k
        pbSrc = pbSrc + advance;
253
11.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
228
          return FALSE;
255
10.8k
        SRCREADPIXEL(pixelA, pbSrc);
256
10.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
524
          return FALSE;
258
10.2k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
10.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
132
          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.8k
      case REGULAR_COLOR_RUN:
271
41.3k
      case MEGA_MEGA_COLOR_RUN:
272
41.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
41.3k
        if (advance == 0)
274
82
          return FALSE;
275
41.2k
        pbSrc = pbSrc + advance;
276
41.2k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
325
          return FALSE;
278
40.9k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
40.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
199
          return FALSE;
282
283
40.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
40.7k
        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.5k
      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
153
          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.87k
        {
298
4.87k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
214
            return FALSE;
300
4.65k
          SRCREADPIXEL(fgPel, pbSrc);
301
4.65k
        }
302
303
20.6k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
837
          return FALSE;
305
19.7k
        if (fFirstLine)
306
5.33k
        {
307
75.4k
          while (runLength > 8)
308
70.2k
          {
309
70.2k
            bitmask = *pbSrc;
310
70.2k
            pbSrc = pbSrc + 1;
311
70.2k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
70.2k
            if (!pbDest)
314
96
              return FALSE;
315
316
70.1k
            runLength = runLength - 8;
317
70.1k
          }
318
5.33k
        }
319
14.4k
        else
320
14.4k
        {
321
86.9k
          while (runLength > 8)
322
72.5k
          {
323
72.5k
            bitmask = *pbSrc++;
324
325
72.5k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
72.5k
            if (!pbDest)
328
53
              return FALSE;
329
330
72.5k
            runLength = runLength - 8;
331
72.5k
          }
332
14.4k
        }
333
334
19.6k
        if (runLength > 0)
335
16.6k
        {
336
16.6k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
119
            return FALSE;
338
16.5k
          bitmask = *pbSrc++;
339
340
16.5k
          if (fFirstLine)
341
2.96k
          {
342
2.96k
            pbDest =
343
2.96k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
2.96k
          }
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.5k
          if (!pbDest)
352
8
            return FALSE;
353
16.5k
        }
354
355
19.5k
        break;
356
357
      /* Handle Color Image Orders. */
358
19.5k
      case REGULAR_COLOR_IMAGE:
359
13.9k
      case MEGA_MEGA_COLOR_IMAGE:
360
13.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
13.9k
        if (advance == 0)
362
69
          return FALSE;
363
13.9k
        pbSrc = pbSrc + advance;
364
13.9k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
138
          return FALSE;
366
13.7k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
1.04k
          return FALSE;
368
369
12.7k
        UNROLL(runLength, {
370
4.00k
          SRCREADPIXEL(temp, pbSrc);
371
4.00k
          DESTWRITEPIXEL(pbDest, temp);
372
4.00k
        });
373
8.72k
        break;
374
375
      /* Handle Special Order 1. */
376
8.72k
      case SPECIAL_FGBG_1:
377
2.67k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
2.67k
        pbSrc = pbSrc + 1;
380
381
2.67k
        if (fFirstLine)
382
337
        {
383
337
          pbDest =
384
337
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
337
        }
386
2.33k
        else
387
2.33k
        {
388
2.33k
          pbDest =
389
2.33k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
2.33k
        }
391
392
2.67k
        if (!pbDest)
393
3
          return FALSE;
394
395
2.67k
        break;
396
397
      /* Handle Special Order 2. */
398
3.09k
      case SPECIAL_FGBG_2:
399
3.09k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
3.09k
        pbSrc = pbSrc + 1;
402
403
3.09k
        if (fFirstLine)
404
312
        {
405
312
          pbDest =
406
312
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
312
        }
408
2.78k
        else
409
2.78k
        {
410
2.78k
          pbDest =
411
2.78k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
2.78k
        }
413
414
3.09k
        if (!pbDest)
415
3
          return FALSE;
416
417
3.09k
        break;
418
419
      /* Handle White Order. */
420
4.42k
      case SPECIAL_WHITE:
421
4.42k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
4.42k
        pbSrc = pbSrc + 1;
424
425
4.42k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
3
          return FALSE;
427
428
4.42k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
4.42k
        break;
430
431
      /* Handle Black Order. */
432
2.56k
      case SPECIAL_BLACK:
433
2.56k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
2.56k
        pbSrc = pbSrc + 1;
436
437
2.56k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
3
          return FALSE;
439
440
2.56k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
2.56k
        break;
442
443
6.19k
      default:
444
6.19k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
6.19k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
6.19k
        return FALSE;
447
155k
    }
448
155k
  }
449
450
4.49k
  return TRUE;
451
17.5k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
101
5.83k
{
102
5.83k
  const BYTE* pbSrc = pbSrcBuffer;
103
5.83k
  BYTE* pbDest = pbDestBuffer;
104
5.83k
  PIXEL temp = 0;
105
5.83k
  PIXEL fgPel = WHITE_PIXEL;
106
5.83k
  BOOL fInsertFgPel = FALSE;
107
5.83k
  BOOL fFirstLine = TRUE;
108
5.83k
  BYTE bitmask = 0;
109
5.83k
  PIXEL pixelA = 0;
110
5.83k
  PIXEL pixelB = 0;
111
5.83k
  UINT32 runLength = 0;
112
5.83k
  UINT32 code = 0;
113
5.83k
  UINT32 advance = 0;
114
5.83k
  RLEEXTRA
115
116
5.83k
  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.83k
  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.83k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
5.83k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
166k
  while (pbSrc < pbEnd)
134
164k
  {
135
    /* Watch out for the end of the first scanline. */
136
164k
    if (fFirstLine)
137
28.1k
    {
138
28.1k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
4.09k
      {
140
4.09k
        fFirstLine = FALSE;
141
4.09k
        fInsertFgPel = FALSE;
142
4.09k
      }
143
28.1k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
164k
    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
164k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
115k
    {
158
115k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
115k
      if (advance == 0)
160
165
        return FALSE;
161
114k
      pbSrc = pbSrc + advance;
162
163
114k
      if (fFirstLine)
164
12.4k
      {
165
12.4k
        if (fInsertFgPel)
166
8.36k
        {
167
8.36k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
8.36k
          DESTWRITEPIXEL(pbDest, fgPel);
171
8.36k
          runLength = runLength - 1;
172
8.36k
        }
173
174
12.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
28
          return FALSE;
176
177
12.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
12.3k
      }
179
102k
      else
180
102k
      {
181
102k
        if (fInsertFgPel)
182
93.3k
        {
183
93.3k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
93.3k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
10
            return FALSE;
187
188
93.3k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
93.3k
          runLength--;
190
93.3k
        }
191
192
102k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
347
          return FALSE;
194
195
102k
        UNROLL(runLength, {
196
102k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
102k
          DESTWRITEPIXEL(pbDest, temp);
198
102k
        });
199
102k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
114k
      fInsertFgPel = TRUE;
203
114k
      continue;
204
114k
    }
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.6k
    fInsertFgPel = FALSE;
209
210
49.6k
    switch (code)
211
49.6k
    {
212
      /* Handle Foreground Run Orders. */
213
8.91k
      case REGULAR_FG_RUN:
214
9.74k
      case MEGA_MEGA_FG_RUN:
215
15.1k
      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
40
          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.83k
        {
224
5.83k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
92
            return FALSE;
226
5.74k
          SRCREADPIXEL(fgPel, pbSrc);
227
5.74k
        }
228
229
15.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
92
          return FALSE;
231
232
15.3k
        if (fFirstLine)
233
3.61k
        {
234
3.61k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
3.61k
        }
236
11.7k
        else
237
11.7k
        {
238
11.7k
          UNROLL(runLength, {
239
11.7k
            DESTREADPIXEL(temp, pbDest - rowDelta);
240
11.7k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
241
11.7k
          });
242
11.7k
        }
243
244
15.3k
        break;
245
246
      /* Handle Dithered Run Orders. */
247
3.33k
      case LITE_DITHERED_RUN:
248
3.62k
      case MEGA_MEGA_DITHERED_RUN:
249
3.62k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
3.62k
        if (advance == 0)
251
13
          return FALSE;
252
3.61k
        pbSrc = pbSrc + advance;
253
3.61k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
102
          return FALSE;
255
3.50k
        SRCREADPIXEL(pixelA, pbSrc);
256
3.50k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
256
          return FALSE;
258
3.25k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
3.25k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
32
          return FALSE;
262
263
3.22k
        UNROLL(runLength, {
264
3.22k
          DESTWRITEPIXEL(pbDest, pixelA);
265
3.22k
          DESTWRITEPIXEL(pbDest, pixelB);
266
3.22k
        });
267
3.22k
        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
24
          return FALSE;
275
12.8k
        pbSrc = pbSrc + advance;
276
12.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
115
          return FALSE;
278
12.7k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
12.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
65
          return FALSE;
282
283
12.7k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
12.7k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
4.45k
      case REGULAR_FGBG_IMAGE:
288
5.17k
      case MEGA_MEGA_FGBG_IMAGE:
289
6.30k
      case LITE_SET_FG_FGBG_IMAGE:
290
6.72k
      case MEGA_MEGA_SET_FGBG_IMAGE:
291
6.72k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
292
6.72k
        if (advance == 0)
293
45
          return FALSE;
294
6.68k
        pbSrc = pbSrc + advance;
295
296
6.68k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
297
1.52k
        {
298
1.52k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
74
            return FALSE;
300
1.44k
          SRCREADPIXEL(fgPel, pbSrc);
301
1.44k
        }
302
303
6.60k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
275
          return FALSE;
305
6.33k
        if (fFirstLine)
306
1.85k
        {
307
27.7k
          while (runLength > 8)
308
25.9k
          {
309
25.9k
            bitmask = *pbSrc;
310
25.9k
            pbSrc = pbSrc + 1;
311
25.9k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
25.9k
            if (!pbDest)
314
36
              return FALSE;
315
316
25.9k
            runLength = runLength - 8;
317
25.9k
          }
318
1.85k
        }
319
4.47k
        else
320
4.47k
        {
321
25.0k
          while (runLength > 8)
322
20.6k
          {
323
20.6k
            bitmask = *pbSrc++;
324
325
20.6k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
326
327
20.6k
            if (!pbDest)
328
19
              return FALSE;
329
330
20.5k
            runLength = runLength - 8;
331
20.5k
          }
332
4.47k
        }
333
334
6.27k
        if (runLength > 0)
335
5.33k
        {
336
5.33k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
43
            return FALSE;
338
5.28k
          bitmask = *pbSrc++;
339
340
5.28k
          if (fFirstLine)
341
1.10k
          {
342
1.10k
            pbDest =
343
1.10k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.10k
          }
345
4.18k
          else
346
4.18k
          {
347
4.18k
            pbDest =
348
4.18k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
4.18k
          }
350
351
5.28k
          if (!pbDest)
352
2
            return FALSE;
353
5.28k
        }
354
355
6.23k
        break;
356
357
      /* Handle Color Image Orders. */
358
6.23k
      case REGULAR_COLOR_IMAGE:
359
4.42k
      case MEGA_MEGA_COLOR_IMAGE:
360
4.42k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
4.42k
        if (advance == 0)
362
23
          return FALSE;
363
4.39k
        pbSrc = pbSrc + advance;
364
4.39k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
48
          return FALSE;
366
4.35k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
350
          return FALSE;
368
369
4.00k
        UNROLL(runLength, {
370
4.00k
          SRCREADPIXEL(temp, pbSrc);
371
4.00k
          DESTWRITEPIXEL(pbDest, temp);
372
4.00k
        });
373
4.00k
        break;
374
375
      /* Handle Special Order 1. */
376
893
      case SPECIAL_FGBG_1:
377
893
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
893
        pbSrc = pbSrc + 1;
380
381
893
        if (fFirstLine)
382
97
        {
383
97
          pbDest =
384
97
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
97
        }
386
796
        else
387
796
        {
388
796
          pbDest =
389
796
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
796
        }
391
392
893
        if (!pbDest)
393
1
          return FALSE;
394
395
892
        break;
396
397
      /* Handle Special Order 2. */
398
1.03k
      case SPECIAL_FGBG_2:
399
1.03k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
1.03k
        pbSrc = pbSrc + 1;
402
403
1.03k
        if (fFirstLine)
404
104
        {
405
104
          pbDest =
406
104
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
104
        }
408
927
        else
409
927
        {
410
927
          pbDest =
411
927
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
927
        }
413
414
1.03k
        if (!pbDest)
415
1
          return FALSE;
416
417
1.03k
        break;
418
419
      /* Handle White Order. */
420
1.47k
      case SPECIAL_WHITE:
421
1.47k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
1.47k
        pbSrc = pbSrc + 1;
424
425
1.47k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
1
          return FALSE;
427
428
1.47k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
1.47k
        break;
430
431
      /* Handle Black Order. */
432
867
      case SPECIAL_BLACK:
433
867
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
867
        pbSrc = pbSrc + 1;
436
437
867
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
1
          return FALSE;
439
440
866
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
866
        break;
442
443
2.05k
      default:
444
2.05k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
2.05k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
2.05k
        return FALSE;
447
49.6k
    }
448
49.6k
  }
449
450
1.48k
  return TRUE;
451
5.83k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
101
11.6k
{
102
11.6k
  const BYTE* pbSrc = pbSrcBuffer;
103
11.6k
  BYTE* pbDest = pbDestBuffer;
104
11.6k
  PIXEL temp = 0;
105
11.6k
  PIXEL fgPel = WHITE_PIXEL;
106
11.6k
  BOOL fInsertFgPel = FALSE;
107
11.6k
  BOOL fFirstLine = TRUE;
108
11.6k
  BYTE bitmask = 0;
109
11.6k
  PIXEL pixelA = 0;
110
11.6k
  PIXEL pixelB = 0;
111
11.6k
  UINT32 runLength = 0;
112
11.6k
  UINT32 code = 0;
113
11.6k
  UINT32 advance = 0;
114
11.6k
  RLEEXTRA
115
116
11.6k
  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.6k
  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.6k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
131
11.6k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
132
133
345k
  while (pbSrc < pbEnd)
134
342k
  {
135
    /* Watch out for the end of the first scanline. */
136
342k
    if (fFirstLine)
137
56.1k
    {
138
56.1k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
139
8.83k
      {
140
8.83k
        fFirstLine = FALSE;
141
8.83k
        fInsertFgPel = FALSE;
142
8.83k
      }
143
56.1k
    }
144
145
    /*
146
       Extract the compression order code ID from the compression
147
       order header.
148
    */
149
342k
    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
342k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
157
237k
    {
158
237k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
159
237k
      if (advance == 0)
160
440
        return FALSE;
161
236k
      pbSrc = pbSrc + advance;
162
163
236k
      if (fFirstLine)
164
24.5k
      {
165
24.5k
        if (fInsertFgPel)
166
16.9k
        {
167
16.9k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
168
0
            return FALSE;
169
170
16.9k
          DESTWRITEPIXEL(pbDest, fgPel);
171
16.9k
          runLength = runLength - 1;
172
16.9k
        }
173
174
24.5k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
175
60
          return FALSE;
176
177
24.4k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
178
24.4k
      }
179
212k
      else
180
212k
      {
181
212k
        if (fInsertFgPel)
182
192k
        {
183
192k
          DESTREADPIXEL(temp, pbDest - rowDelta);
184
185
192k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
186
24
            return FALSE;
187
188
192k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
189
192k
          runLength--;
190
192k
        }
191
192
212k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
193
764
          return FALSE;
194
195
211k
        UNROLL(runLength, {
196
211k
          DESTREADPIXEL(temp, pbDest - rowDelta);
197
211k
          DESTWRITEPIXEL(pbDest, temp);
198
211k
        });
199
211k
      }
200
201
      /* A follow-on background run order will need a foreground pel inserted. */
202
235k
      fInsertFgPel = TRUE;
203
235k
      continue;
204
236k
    }
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
18.8k
      case REGULAR_FG_RUN:
214
20.5k
      case MEGA_MEGA_FG_RUN:
215
32.4k
      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.5k
        {
224
12.5k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
225
152
            return FALSE;
226
12.3k
          SRCREADPIXEL(fgPel, pbSrc);
227
12.3k
        }
228
229
32.8k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
230
230
          return FALSE;
231
232
32.6k
        if (fFirstLine)
233
6.94k
        {
234
6.94k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
235
6.94k
        }
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.88k
      case LITE_DITHERED_RUN:
248
7.47k
      case MEGA_MEGA_DITHERED_RUN:
249
7.47k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
250
7.47k
        if (advance == 0)
251
46
          return FALSE;
252
7.42k
        pbSrc = pbSrc + advance;
253
7.42k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
254
126
          return FALSE;
255
7.30k
        SRCREADPIXEL(pixelA, pbSrc);
256
7.30k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
257
268
          return FALSE;
258
7.03k
        SRCREADPIXEL(pixelB, pbSrc);
259
260
7.03k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
261
100
          return FALSE;
262
263
6.93k
        UNROLL(runLength, {
264
6.93k
          DESTWRITEPIXEL(pbDest, pixelA);
265
6.93k
          DESTWRITEPIXEL(pbDest, pixelB);
266
6.93k
        });
267
6.93k
        break;
268
269
      /* Handle Color Run Orders. */
270
27.3k
      case REGULAR_COLOR_RUN:
271
28.4k
      case MEGA_MEGA_COLOR_RUN:
272
28.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
273
28.4k
        if (advance == 0)
274
58
          return FALSE;
275
28.4k
        pbSrc = pbSrc + advance;
276
28.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
277
210
          return FALSE;
278
28.1k
        SRCREADPIXEL(pixelA, pbSrc);
279
280
28.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
281
134
          return FALSE;
282
283
28.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
284
28.0k
        break;
285
286
      /* Handle Foreground/Background Image Orders. */
287
9.39k
      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
108
          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.35k
        {
298
3.35k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
299
140
            return FALSE;
300
3.21k
          SRCREADPIXEL(fgPel, pbSrc);
301
3.21k
        }
302
303
14.0k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
304
562
          return FALSE;
305
13.4k
        if (fFirstLine)
306
3.47k
        {
307
47.6k
          while (runLength > 8)
308
44.2k
          {
309
44.2k
            bitmask = *pbSrc;
310
44.2k
            pbSrc = pbSrc + 1;
311
44.2k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
312
313
44.2k
            if (!pbDest)
314
60
              return FALSE;
315
316
44.2k
            runLength = runLength - 8;
317
44.2k
          }
318
3.47k
        }
319
9.97k
        else
320
9.97k
        {
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.97k
        }
333
334
13.3k
        if (runLength > 0)
335
11.3k
        {
336
11.3k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
337
76
            return FALSE;
338
11.2k
          bitmask = *pbSrc++;
339
340
11.2k
          if (fFirstLine)
341
1.85k
          {
342
1.85k
            pbDest =
343
1.85k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
344
1.85k
          }
345
9.37k
          else
346
9.37k
          {
347
9.37k
            pbDest =
348
9.37k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
349
9.37k
          }
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.55k
      case MEGA_MEGA_COLOR_IMAGE:
360
9.55k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
361
9.55k
        if (advance == 0)
362
46
          return FALSE;
363
9.50k
        pbSrc = pbSrc + advance;
364
9.50k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
365
90
          return FALSE;
366
9.41k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
367
696
          return FALSE;
368
369
8.72k
        UNROLL(runLength, {
370
8.72k
          SRCREADPIXEL(temp, pbSrc);
371
8.72k
          DESTWRITEPIXEL(pbDest, temp);
372
8.72k
        });
373
8.72k
        break;
374
375
      /* Handle Special Order 1. */
376
8.72k
      case SPECIAL_FGBG_1:
377
1.78k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
378
0
          return FALSE;
379
1.78k
        pbSrc = pbSrc + 1;
380
381
1.78k
        if (fFirstLine)
382
240
        {
383
240
          pbDest =
384
240
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
385
240
        }
386
1.54k
        else
387
1.54k
        {
388
1.54k
          pbDest =
389
1.54k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
390
1.54k
        }
391
392
1.78k
        if (!pbDest)
393
2
          return FALSE;
394
395
1.78k
        break;
396
397
      /* Handle Special Order 2. */
398
2.06k
      case SPECIAL_FGBG_2:
399
2.06k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
400
0
          return FALSE;
401
2.06k
        pbSrc = pbSrc + 1;
402
403
2.06k
        if (fFirstLine)
404
208
        {
405
208
          pbDest =
406
208
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
407
208
        }
408
1.85k
        else
409
1.85k
        {
410
1.85k
          pbDest =
411
1.85k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
412
1.85k
        }
413
414
2.06k
        if (!pbDest)
415
2
          return FALSE;
416
417
2.06k
        break;
418
419
      /* Handle White Order. */
420
2.95k
      case SPECIAL_WHITE:
421
2.95k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
422
0
          return FALSE;
423
2.95k
        pbSrc = pbSrc + 1;
424
425
2.95k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
426
2
          return FALSE;
427
428
2.95k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
429
2.95k
        break;
430
431
      /* Handle Black Order. */
432
1.70k
      case SPECIAL_BLACK:
433
1.70k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
434
0
          return FALSE;
435
1.70k
        pbSrc = pbSrc + 1;
436
437
1.70k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
438
2
          return FALSE;
439
440
1.70k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
441
1.70k
        break;
442
443
4.14k
      default:
444
4.14k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
445
4.14k
                 code, pbSrcBuffer, pbSrc, pbEnd);
446
4.14k
        return FALSE;
447
105k
    }
448
105k
  }
449
450
3.01k
  return TRUE;
451
11.6k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8