Coverage Report

Created: 2026-07-16 07:10

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
WINPR_ATTR_NODISCARD
32
static inline BYTE* WRITEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
33
                                   const BYTE* WINPR_RESTRICT pbDestEnd, UINT32 rowDelta,
34
                                   BYTE bitmask, PIXEL fgPel, UINT32 cBits)
35
95.3k
{
36
95.3k
  PIXEL xorPixel = 0;
37
95.3k
  BYTE mask = 0x01;
38
39
95.3k
  if (cBits > 8)
40
0
  {
41
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
42
0
    return nullptr;
43
0
  }
44
45
95.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
46
108
    return nullptr;
47
48
95.2k
  UNROLL(cBits, {
49
95.2k
    PIXEL data = 0;
50
95.2k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
51
52
95.2k
    if (bitmask & mask)
53
95.2k
      data = xorPixel ^ fgPel;
54
95.2k
    else
55
95.2k
      data = xorPixel;
56
57
95.2k
    DESTWRITEPIXEL(pbDest, data);
58
95.2k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
59
95.2k
  });
60
95.2k
  return pbDest;
61
95.3k
}
interleaved.c:WriteFgBgImage24to24
Line
Count
Source
35
26.3k
{
36
26.3k
  PIXEL xorPixel = 0;
37
26.3k
  BYTE mask = 0x01;
38
39
26.3k
  if (cBits > 8)
40
0
  {
41
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
42
0
    return nullptr;
43
0
  }
44
45
26.3k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
46
30
    return nullptr;
47
48
26.3k
  UNROLL(cBits, {
49
26.3k
    PIXEL data = 0;
50
26.3k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
51
52
26.3k
    if (bitmask & mask)
53
26.3k
      data = xorPixel ^ fgPel;
54
26.3k
    else
55
26.3k
      data = xorPixel;
56
57
26.3k
    DESTWRITEPIXEL(pbDest, data);
58
26.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
59
26.3k
  });
60
26.3k
  return pbDest;
61
26.3k
}
interleaved.c:WriteFgBgImage16to16
Line
Count
Source
35
68.9k
{
36
68.9k
  PIXEL xorPixel = 0;
37
68.9k
  BYTE mask = 0x01;
38
39
68.9k
  if (cBits > 8)
40
0
  {
41
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
42
0
    return nullptr;
43
0
  }
44
45
68.9k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
46
78
    return nullptr;
47
48
68.9k
  UNROLL(cBits, {
49
68.9k
    PIXEL data = 0;
50
68.9k
    DESTREADPIXEL(xorPixel, pbDest - rowDelta);
51
52
68.9k
    if (bitmask & mask)
53
68.9k
      data = xorPixel ^ fgPel;
54
68.9k
    else
55
68.9k
      data = xorPixel;
56
57
68.9k
    DESTWRITEPIXEL(pbDest, data);
58
68.9k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
59
68.9k
  });
60
68.9k
  return pbDest;
61
68.9k
}
Unexecuted instantiation: interleaved.c:WriteFgBgImage8to8
62
63
/**
64
 * Write a foreground/background image to a destination buffer
65
 * for the first line of compressed data.
66
 */
67
WINPR_ATTR_NODISCARD
68
static inline BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* WINPR_RESTRICT pbDest,
69
                                            const BYTE* WINPR_RESTRICT pbDestEnd, BYTE bitmask,
70
                                            PIXEL fgPel, UINT32 cBits)
71
44.4k
{
72
44.4k
  BYTE mask = 0x01;
73
74
44.4k
  if (cBits > 8)
75
0
  {
76
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
77
0
    return nullptr;
78
0
  }
79
80
44.4k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
81
24
    return nullptr;
82
83
44.3k
  UNROLL(cBits, {
84
44.3k
    PIXEL data;
85
86
44.3k
    if (bitmask & mask)
87
44.3k
      data = fgPel;
88
44.3k
    else
89
44.3k
      data = BLACK_PIXEL;
90
91
44.3k
    DESTWRITEPIXEL(pbDest, data);
92
44.3k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
93
44.3k
  });
94
44.3k
  return pbDest;
95
44.4k
}
interleaved.c:WriteFirstLineFgBgImage24to24
Line
Count
Source
71
16.8k
{
72
16.8k
  BYTE mask = 0x01;
73
74
16.8k
  if (cBits > 8)
75
0
  {
76
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
77
0
    return nullptr;
78
0
  }
79
80
16.8k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
81
10
    return nullptr;
82
83
16.8k
  UNROLL(cBits, {
84
16.8k
    PIXEL data;
85
86
16.8k
    if (bitmask & mask)
87
16.8k
      data = fgPel;
88
16.8k
    else
89
16.8k
      data = BLACK_PIXEL;
90
91
16.8k
    DESTWRITEPIXEL(pbDest, data);
92
16.8k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
93
16.8k
  });
94
16.8k
  return pbDest;
95
16.8k
}
interleaved.c:WriteFirstLineFgBgImage16to16
Line
Count
Source
71
27.5k
{
72
27.5k
  BYTE mask = 0x01;
73
74
27.5k
  if (cBits > 8)
75
0
  {
76
0
    WLog_ERR(TAG, "cBits %" PRIu32 " > 8", cBits);
77
0
    return nullptr;
78
0
  }
79
80
27.5k
  if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))
81
14
    return nullptr;
82
83
27.5k
  UNROLL(cBits, {
84
27.5k
    PIXEL data;
85
86
27.5k
    if (bitmask & mask)
87
27.5k
      data = fgPel;
88
27.5k
    else
89
27.5k
      data = BLACK_PIXEL;
90
91
27.5k
    DESTWRITEPIXEL(pbDest, data);
92
27.5k
    mask = WINPR_ASSERTING_INT_CAST(BYTE, (mask << 1) & 0xFF);
93
27.5k
  });
94
27.5k
  return pbDest;
95
27.5k
}
Unexecuted instantiation: interleaved.c:WriteFirstLineFgBgImage8to8
96
97
/**
98
 * Decompress an RLE compressed bitmap.
99
 */
100
WINPR_ATTR_NODISCARD
101
static inline BOOL RLEDECOMPRESS(const BYTE* WINPR_RESTRICT pbSrcBuffer, UINT32 cbSrcBuffer,
102
                                 BYTE* WINPR_RESTRICT pbDestBuffer, UINT32 rowDelta, UINT32 width,
103
                                 UINT32 height)
104
17.0k
{
105
17.0k
  const BYTE* pbSrc = pbSrcBuffer;
106
17.0k
  BYTE* pbDest = pbDestBuffer;
107
17.0k
  PIXEL temp = 0;
108
17.0k
  PIXEL fgPel = WHITE_PIXEL;
109
17.0k
  BOOL fInsertFgPel = FALSE;
110
17.0k
  BOOL fFirstLine = TRUE;
111
17.0k
  BYTE bitmask = 0;
112
17.0k
  PIXEL pixelA = 0;
113
17.0k
  PIXEL pixelB = 0;
114
17.0k
  UINT32 runLength = 0;
115
17.0k
  UINT32 code = 0;
116
17.0k
  UINT32 advance = 0;
117
17.0k
  RLEEXTRA
118
119
17.0k
  if ((rowDelta == 0) || (rowDelta < width))
120
0
  {
121
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
122
0
             width);
123
0
    return FALSE;
124
0
  }
125
126
17.0k
  if (!pbSrcBuffer || !pbDestBuffer)
127
0
  {
128
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p",
129
0
             WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
130
0
             WINPR_CXX_COMPAT_CAST(const void*, pbDestBuffer));
131
0
    return FALSE;
132
0
  }
133
134
17.0k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
135
17.0k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
136
137
468k
  while (pbSrc < pbEnd)
138
464k
  {
139
    /* Watch out for the end of the first scanline. */
140
464k
    if (fFirstLine)
141
77.9k
    {
142
77.9k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
143
12.3k
      {
144
12.3k
        fFirstLine = FALSE;
145
12.3k
        fInsertFgPel = FALSE;
146
12.3k
      }
147
77.9k
    }
148
149
    /*
150
       Extract the compression order code ID from the compression
151
       order header.
152
    */
153
464k
    code = ExtractCodeId(*pbSrc);
154
155
#if defined(WITH_DEBUG_CODECS)
156
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
157
#endif
158
159
    /* Handle Background Run Orders. */
160
464k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
161
320k
    {
162
320k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
163
320k
      if (advance == 0)
164
650
        return FALSE;
165
320k
      pbSrc = pbSrc + advance;
166
167
320k
      if (fFirstLine)
168
33.4k
      {
169
33.4k
        if (fInsertFgPel)
170
22.6k
        {
171
22.6k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
172
0
            return FALSE;
173
174
22.6k
          DESTWRITEPIXEL(pbDest, fgPel);
175
22.6k
          runLength = runLength - 1;
176
22.6k
        }
177
178
33.4k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
179
77
          return FALSE;
180
181
33.3k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
182
33.3k
      }
183
286k
      else
184
286k
      {
185
286k
        if (fInsertFgPel)
186
260k
        {
187
260k
          DESTREADPIXEL(temp, pbDest - rowDelta);
188
189
260k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
190
35
            return FALSE;
191
192
260k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
193
260k
          runLength--;
194
260k
        }
195
196
286k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
197
902
          return FALSE;
198
199
285k
        UNROLL(runLength, {
200
285k
          DESTREADPIXEL(temp, pbDest - rowDelta);
201
285k
          DESTWRITEPIXEL(pbDest, temp);
202
285k
        });
203
285k
      }
204
205
      /* A follow-on background run order will need a foreground pel inserted. */
206
319k
      fInsertFgPel = TRUE;
207
319k
      continue;
208
320k
    }
209
210
    /* For any of the other run-types a follow-on background run
211
        order does not need a foreground pel inserted. */
212
143k
    fInsertFgPel = FALSE;
213
214
143k
    switch (code)
215
143k
    {
216
      /* Handle Foreground Run Orders. */
217
24.4k
      case REGULAR_FG_RUN:
218
25.9k
      case MEGA_MEGA_FG_RUN:
219
41.5k
      case LITE_SET_FG_FG_RUN:
220
42.3k
      case MEGA_MEGA_SET_FG_RUN:
221
42.3k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
222
42.3k
        if (advance == 0)
223
100
          return FALSE;
224
42.2k
        pbSrc = pbSrc + advance;
225
226
42.2k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
227
16.3k
        {
228
16.3k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
229
209
            return FALSE;
230
16.1k
          SRCREADPIXEL(fgPel, pbSrc);
231
16.1k
        }
232
233
42.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
234
240
          return FALSE;
235
236
41.8k
        if (fFirstLine)
237
9.75k
        {
238
9.75k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
239
9.75k
        }
240
32.0k
        else
241
32.0k
        {
242
32.0k
          UNROLL(runLength, {
243
32.0k
            DESTREADPIXEL(temp, pbDest - rowDelta);
244
32.0k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
245
32.0k
          });
246
32.0k
        }
247
248
41.8k
        break;
249
250
      /* Handle Dithered Run Orders. */
251
12.0k
      case LITE_DITHERED_RUN:
252
13.1k
      case MEGA_MEGA_DITHERED_RUN:
253
13.1k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
254
13.1k
        if (advance == 0)
255
45
          return FALSE;
256
13.0k
        pbSrc = pbSrc + advance;
257
13.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
258
228
          return FALSE;
259
12.8k
        SRCREADPIXEL(pixelA, pbSrc);
260
12.8k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
261
525
          return FALSE;
262
12.3k
        SRCREADPIXEL(pixelB, pbSrc);
263
264
12.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
265
171
          return FALSE;
266
267
12.1k
        UNROLL(runLength, {
268
12.1k
          DESTWRITEPIXEL(pbDest, pixelA);
269
12.1k
          DESTWRITEPIXEL(pbDest, pixelB);
270
12.1k
        });
271
12.1k
        break;
272
273
      /* Handle Color Run Orders. */
274
35.3k
      case REGULAR_COLOR_RUN:
275
36.4k
      case MEGA_MEGA_COLOR_RUN:
276
36.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
277
36.4k
        if (advance == 0)
278
43
          return FALSE;
279
36.4k
        pbSrc = pbSrc + advance;
280
36.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
281
360
          return FALSE;
282
36.0k
        SRCREADPIXEL(pixelA, pbSrc);
283
284
36.0k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
285
247
          return FALSE;
286
287
35.8k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
288
35.8k
        break;
289
290
      /* Handle Foreground/Background Image Orders. */
291
12.2k
      case REGULAR_FGBG_IMAGE:
292
14.0k
      case MEGA_MEGA_FGBG_IMAGE:
293
18.0k
      case LITE_SET_FG_FGBG_IMAGE:
294
19.8k
      case MEGA_MEGA_SET_FGBG_IMAGE:
295
19.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
296
19.8k
        if (advance == 0)
297
120
          return FALSE;
298
19.7k
        pbSrc = pbSrc + advance;
299
300
19.7k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
301
5.75k
        {
302
5.75k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
303
216
            return FALSE;
304
5.54k
          SRCREADPIXEL(fgPel, pbSrc);
305
5.54k
        }
306
307
19.5k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
308
896
          return FALSE;
309
18.6k
        if (fFirstLine)
310
4.50k
        {
311
45.5k
          while (runLength > 8)
312
41.0k
          {
313
41.0k
            bitmask = *pbSrc;
314
41.0k
            pbSrc = pbSrc + 1;
315
41.0k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
316
317
41.0k
            if (!pbDest)
318
21
              return FALSE;
319
320
41.0k
            runLength = runLength - 8;
321
41.0k
          }
322
4.50k
        }
323
14.1k
        else
324
14.1k
        {
325
90.4k
          while (runLength > 8)
326
76.4k
          {
327
76.4k
            bitmask = *pbSrc++;
328
329
76.4k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
330
331
76.4k
            if (!pbDest)
332
82
              return FALSE;
333
334
76.3k
            runLength = runLength - 8;
335
76.3k
          }
336
14.1k
        }
337
338
18.5k
        if (runLength > 0)
339
15.4k
        {
340
15.4k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
341
78
            return FALSE;
342
15.3k
          bitmask = *pbSrc++;
343
344
15.3k
          if (fFirstLine)
345
2.67k
          {
346
2.67k
            pbDest =
347
2.67k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
348
2.67k
          }
349
12.7k
          else
350
12.7k
          {
351
12.7k
            pbDest =
352
12.7k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
353
12.7k
          }
354
355
15.3k
          if (!pbDest)
356
12
            return FALSE;
357
15.3k
        }
358
359
18.4k
        break;
360
361
      /* Handle Color Image Orders. */
362
18.4k
      case REGULAR_COLOR_IMAGE:
363
11.8k
      case MEGA_MEGA_COLOR_IMAGE:
364
11.8k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
365
11.8k
        if (advance == 0)
366
61
          return FALSE;
367
11.7k
        pbSrc = pbSrc + advance;
368
11.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
369
97
          return FALSE;
370
11.6k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
371
1.01k
          return FALSE;
372
373
10.6k
        UNROLL(runLength, {
374
10.6k
          SRCREADPIXEL(temp, pbSrc);
375
10.6k
          DESTWRITEPIXEL(pbDest, temp);
376
10.6k
        });
377
10.6k
        break;
378
379
      /* Handle Special Order 1. */
380
4.08k
      case SPECIAL_FGBG_1:
381
4.08k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
382
0
          return FALSE;
383
4.08k
        pbSrc = pbSrc + 1;
384
385
4.08k
        if (fFirstLine)
386
342
        {
387
342
          pbDest =
388
342
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
389
342
        }
390
3.74k
        else
391
3.74k
        {
392
3.74k
          pbDest =
393
3.74k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
394
3.74k
        }
395
396
4.08k
        if (!pbDest)
397
10
          return FALSE;
398
399
4.07k
        break;
400
401
      /* Handle Special Order 2. */
402
4.07k
      case SPECIAL_FGBG_2:
403
2.81k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
404
0
          return FALSE;
405
2.81k
        pbSrc = pbSrc + 1;
406
407
2.81k
        if (fFirstLine)
408
321
        {
409
321
          pbDest =
410
321
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
411
321
        }
412
2.49k
        else
413
2.49k
        {
414
2.49k
          pbDest =
415
2.49k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
416
2.49k
        }
417
418
2.81k
        if (!pbDest)
419
7
          return FALSE;
420
421
2.80k
        break;
422
423
      /* Handle White Order. */
424
3.36k
      case SPECIAL_WHITE:
425
3.36k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
426
0
          return FALSE;
427
3.36k
        pbSrc = pbSrc + 1;
428
429
3.36k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
430
3
          return FALSE;
431
432
3.35k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
433
3.35k
        break;
434
435
      /* Handle Black Order. */
436
2.86k
      case SPECIAL_BLACK:
437
2.86k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
438
0
          return FALSE;
439
2.86k
        pbSrc = pbSrc + 1;
440
441
2.86k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
442
4
          return FALSE;
443
444
2.86k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
445
2.86k
        break;
446
447
6.38k
      default:
448
6.38k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
449
6.38k
                 code, WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
450
6.38k
                 WINPR_CXX_COMPAT_CAST(const void*, pbSrc),
451
6.38k
                 WINPR_CXX_COMPAT_CAST(const void*, pbEnd));
452
6.38k
        return FALSE;
453
143k
    }
454
143k
  }
455
456
4.19k
  return TRUE;
457
17.0k
}
interleaved.c:RleDecompress24to24
Line
Count
Source
104
5.67k
{
105
5.67k
  const BYTE* pbSrc = pbSrcBuffer;
106
5.67k
  BYTE* pbDest = pbDestBuffer;
107
5.67k
  PIXEL temp = 0;
108
5.67k
  PIXEL fgPel = WHITE_PIXEL;
109
5.67k
  BOOL fInsertFgPel = FALSE;
110
5.67k
  BOOL fFirstLine = TRUE;
111
5.67k
  BYTE bitmask = 0;
112
5.67k
  PIXEL pixelA = 0;
113
5.67k
  PIXEL pixelB = 0;
114
5.67k
  UINT32 runLength = 0;
115
5.67k
  UINT32 code = 0;
116
5.67k
  UINT32 advance = 0;
117
5.67k
  RLEEXTRA
118
119
5.67k
  if ((rowDelta == 0) || (rowDelta < width))
120
0
  {
121
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
122
0
             width);
123
0
    return FALSE;
124
0
  }
125
126
5.67k
  if (!pbSrcBuffer || !pbDestBuffer)
127
0
  {
128
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p",
129
0
             WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
130
0
             WINPR_CXX_COMPAT_CAST(const void*, pbDestBuffer));
131
0
    return FALSE;
132
0
  }
133
134
5.67k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
135
5.67k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
136
137
150k
  while (pbSrc < pbEnd)
138
149k
  {
139
    /* Watch out for the end of the first scanline. */
140
149k
    if (fFirstLine)
141
26.2k
    {
142
26.2k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
143
3.91k
      {
144
3.91k
        fFirstLine = FALSE;
145
3.91k
        fInsertFgPel = FALSE;
146
3.91k
      }
147
26.2k
    }
148
149
    /*
150
       Extract the compression order code ID from the compression
151
       order header.
152
    */
153
149k
    code = ExtractCodeId(*pbSrc);
154
155
#if defined(WITH_DEBUG_CODECS)
156
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
157
#endif
158
159
    /* Handle Background Run Orders. */
160
149k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
161
104k
    {
162
104k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
163
104k
      if (advance == 0)
164
172
        return FALSE;
165
104k
      pbSrc = pbSrc + advance;
166
167
104k
      if (fFirstLine)
168
11.3k
      {
169
11.3k
        if (fInsertFgPel)
170
7.53k
        {
171
7.53k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
172
0
            return FALSE;
173
174
7.53k
          DESTWRITEPIXEL(pbDest, fgPel);
175
7.53k
          runLength = runLength - 1;
176
7.53k
        }
177
178
11.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
179
25
          return FALSE;
180
181
11.2k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
182
11.2k
      }
183
93.3k
      else
184
93.3k
      {
185
93.3k
        if (fInsertFgPel)
186
85.2k
        {
187
85.2k
          DESTREADPIXEL(temp, pbDest - rowDelta);
188
189
85.2k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
190
13
            return FALSE;
191
192
85.2k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
193
85.2k
          runLength--;
194
85.2k
        }
195
196
93.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
197
284
          return FALSE;
198
199
93.0k
        UNROLL(runLength, {
200
93.0k
          DESTREADPIXEL(temp, pbDest - rowDelta);
201
93.0k
          DESTWRITEPIXEL(pbDest, temp);
202
93.0k
        });
203
93.0k
      }
204
205
      /* A follow-on background run order will need a foreground pel inserted. */
206
104k
      fInsertFgPel = TRUE;
207
104k
      continue;
208
104k
    }
209
210
    /* For any of the other run-types a follow-on background run
211
        order does not need a foreground pel inserted. */
212
44.3k
    fInsertFgPel = FALSE;
213
214
44.3k
    switch (code)
215
44.3k
    {
216
      /* Handle Foreground Run Orders. */
217
7.85k
      case REGULAR_FG_RUN:
218
8.32k
      case MEGA_MEGA_FG_RUN:
219
13.1k
      case LITE_SET_FG_FG_RUN:
220
13.4k
      case MEGA_MEGA_SET_FG_RUN:
221
13.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
222
13.4k
        if (advance == 0)
223
30
          return FALSE;
224
13.4k
        pbSrc = pbSrc + advance;
225
226
13.4k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
227
5.11k
        {
228
5.11k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
229
75
            return FALSE;
230
5.03k
          SRCREADPIXEL(fgPel, pbSrc);
231
5.03k
        }
232
233
13.3k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
234
72
          return FALSE;
235
236
13.2k
        if (fFirstLine)
237
3.36k
        {
238
3.36k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
239
3.36k
        }
240
9.90k
        else
241
9.90k
        {
242
9.90k
          UNROLL(runLength, {
243
9.90k
            DESTREADPIXEL(temp, pbDest - rowDelta);
244
9.90k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
245
9.90k
          });
246
9.90k
        }
247
248
13.2k
        break;
249
250
      /* Handle Dithered Run Orders. */
251
3.96k
      case LITE_DITHERED_RUN:
252
4.29k
      case MEGA_MEGA_DITHERED_RUN:
253
4.29k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
254
4.29k
        if (advance == 0)
255
13
          return FALSE;
256
4.27k
        pbSrc = pbSrc + advance;
257
4.27k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
258
100
          return FALSE;
259
4.17k
        SRCREADPIXEL(pixelA, pbSrc);
260
4.17k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
261
251
          return FALSE;
262
3.92k
        SRCREADPIXEL(pixelB, pbSrc);
263
264
3.92k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
265
53
          return FALSE;
266
267
3.87k
        UNROLL(runLength, {
268
3.87k
          DESTWRITEPIXEL(pbDest, pixelA);
269
3.87k
          DESTWRITEPIXEL(pbDest, pixelB);
270
3.87k
        });
271
3.87k
        break;
272
273
      /* Handle Color Run Orders. */
274
10.0k
      case REGULAR_COLOR_RUN:
275
10.4k
      case MEGA_MEGA_COLOR_RUN:
276
10.4k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
277
10.4k
        if (advance == 0)
278
11
          return FALSE;
279
10.4k
        pbSrc = pbSrc + advance;
280
10.4k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
281
134
          return FALSE;
282
10.2k
        SRCREADPIXEL(pixelA, pbSrc);
283
284
10.2k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
285
91
          return FALSE;
286
287
10.1k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
288
10.1k
        break;
289
290
      /* Handle Foreground/Background Image Orders. */
291
3.76k
      case REGULAR_FGBG_IMAGE:
292
4.36k
      case MEGA_MEGA_FGBG_IMAGE:
293
5.67k
      case LITE_SET_FG_FGBG_IMAGE:
294
6.24k
      case MEGA_MEGA_SET_FGBG_IMAGE:
295
6.24k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
296
6.24k
        if (advance == 0)
297
40
          return FALSE;
298
6.20k
        pbSrc = pbSrc + advance;
299
300
6.20k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
301
1.86k
        {
302
1.86k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
303
82
            return FALSE;
304
1.77k
          SRCREADPIXEL(fgPel, pbSrc);
305
1.77k
        }
306
307
6.11k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
308
288
          return FALSE;
309
5.83k
        if (fFirstLine)
310
1.64k
        {
311
17.1k
          while (runLength > 8)
312
15.5k
          {
313
15.5k
            bitmask = *pbSrc;
314
15.5k
            pbSrc = pbSrc + 1;
315
15.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
316
317
15.5k
            if (!pbDest)
318
9
              return FALSE;
319
320
15.5k
            runLength = runLength - 8;
321
15.5k
          }
322
1.64k
        }
323
4.18k
        else
324
4.18k
        {
325
24.7k
          while (runLength > 8)
326
20.6k
          {
327
20.6k
            bitmask = *pbSrc++;
328
329
20.6k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
330
331
20.6k
            if (!pbDest)
332
20
              return FALSE;
333
334
20.5k
            runLength = runLength - 8;
335
20.5k
          }
336
4.18k
        }
337
338
5.80k
        if (runLength > 0)
339
4.83k
        {
340
4.83k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
341
24
            return FALSE;
342
4.81k
          bitmask = *pbSrc++;
343
344
4.81k
          if (fFirstLine)
345
1.06k
          {
346
1.06k
            pbDest =
347
1.06k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
348
1.06k
          }
349
3.74k
          else
350
3.74k
          {
351
3.74k
            pbDest =
352
3.74k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
353
3.74k
          }
354
355
4.81k
          if (!pbDest)
356
6
            return FALSE;
357
4.81k
        }
358
359
5.77k
        break;
360
361
      /* Handle Color Image Orders. */
362
5.77k
      case REGULAR_COLOR_IMAGE:
363
3.52k
      case MEGA_MEGA_COLOR_IMAGE:
364
3.52k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
365
3.52k
        if (advance == 0)
366
19
          return FALSE;
367
3.50k
        pbSrc = pbSrc + advance;
368
3.50k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
369
37
          return FALSE;
370
3.46k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
371
329
          return FALSE;
372
373
3.13k
        UNROLL(runLength, {
374
3.13k
          SRCREADPIXEL(temp, pbSrc);
375
3.13k
          DESTWRITEPIXEL(pbDest, temp);
376
3.13k
        });
377
3.13k
        break;
378
379
      /* Handle Special Order 1. */
380
1.30k
      case SPECIAL_FGBG_1:
381
1.30k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
382
0
          return FALSE;
383
1.30k
        pbSrc = pbSrc + 1;
384
385
1.30k
        if (fFirstLine)
386
102
        {
387
102
          pbDest =
388
102
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
389
102
        }
390
1.20k
        else
391
1.20k
        {
392
1.20k
          pbDest =
393
1.20k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
394
1.20k
        }
395
396
1.30k
        if (!pbDest)
397
2
          return FALSE;
398
399
1.30k
        break;
400
401
      /* Handle Special Order 2. */
402
1.30k
      case SPECIAL_FGBG_2:
403
931
        if (!buffer_within_range(pbSrc, 1, pbEnd))
404
0
          return FALSE;
405
931
        pbSrc = pbSrc + 1;
406
407
931
        if (fFirstLine)
408
107
        {
409
107
          pbDest =
410
107
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
411
107
        }
412
824
        else
413
824
        {
414
824
          pbDest =
415
824
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
416
824
        }
417
418
931
        if (!pbDest)
419
3
          return FALSE;
420
421
928
        break;
422
423
      /* Handle White Order. */
424
1.11k
      case SPECIAL_WHITE:
425
1.11k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
426
0
          return FALSE;
427
1.11k
        pbSrc = pbSrc + 1;
428
429
1.11k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
430
1
          return FALSE;
431
432
1.11k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
433
1.11k
        break;
434
435
      /* Handle Black Order. */
436
965
      case SPECIAL_BLACK:
437
965
        if (!buffer_within_range(pbSrc, 1, pbEnd))
438
0
          return FALSE;
439
965
        pbSrc = pbSrc + 1;
440
441
965
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
442
2
          return FALSE;
443
444
963
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
445
963
        break;
446
447
2.08k
      default:
448
2.08k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
449
2.08k
                 code, WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
450
2.08k
                 WINPR_CXX_COMPAT_CAST(const void*, pbSrc),
451
2.08k
                 WINPR_CXX_COMPAT_CAST(const void*, pbEnd));
452
2.08k
        return FALSE;
453
44.3k
    }
454
44.3k
  }
455
456
1.41k
  return TRUE;
457
5.67k
}
interleaved.c:RleDecompress16to16
Line
Count
Source
104
11.3k
{
105
11.3k
  const BYTE* pbSrc = pbSrcBuffer;
106
11.3k
  BYTE* pbDest = pbDestBuffer;
107
11.3k
  PIXEL temp = 0;
108
11.3k
  PIXEL fgPel = WHITE_PIXEL;
109
11.3k
  BOOL fInsertFgPel = FALSE;
110
11.3k
  BOOL fFirstLine = TRUE;
111
11.3k
  BYTE bitmask = 0;
112
11.3k
  PIXEL pixelA = 0;
113
11.3k
  PIXEL pixelB = 0;
114
11.3k
  UINT32 runLength = 0;
115
11.3k
  UINT32 code = 0;
116
11.3k
  UINT32 advance = 0;
117
11.3k
  RLEEXTRA
118
119
11.3k
  if ((rowDelta == 0) || (rowDelta < width))
120
0
  {
121
0
    WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,
122
0
             width);
123
0
    return FALSE;
124
0
  }
125
126
11.3k
  if (!pbSrcBuffer || !pbDestBuffer)
127
0
  {
128
0
    WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p",
129
0
             WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
130
0
             WINPR_CXX_COMPAT_CAST(const void*, pbDestBuffer));
131
0
    return FALSE;
132
0
  }
133
134
11.3k
  const BYTE* pbEnd = &pbSrcBuffer[cbSrcBuffer];
135
11.3k
  const BYTE* pbDestEnd = &pbDestBuffer[1ULL * rowDelta * height];
136
137
317k
  while (pbSrc < pbEnd)
138
315k
  {
139
    /* Watch out for the end of the first scanline. */
140
315k
    if (fFirstLine)
141
51.6k
    {
142
51.6k
      if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)
143
8.41k
      {
144
8.41k
        fFirstLine = FALSE;
145
8.41k
        fInsertFgPel = FALSE;
146
8.41k
      }
147
51.6k
    }
148
149
    /*
150
       Extract the compression order code ID from the compression
151
       order header.
152
    */
153
315k
    code = ExtractCodeId(*pbSrc);
154
155
#if defined(WITH_DEBUG_CODECS)
156
    WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc, rle_code_str(code), pbEnd - pbSrc);
157
#endif
158
159
    /* Handle Background Run Orders. */
160
315k
    if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))
161
216k
    {
162
216k
      runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
163
216k
      if (advance == 0)
164
478
        return FALSE;
165
215k
      pbSrc = pbSrc + advance;
166
167
215k
      if (fFirstLine)
168
22.1k
      {
169
22.1k
        if (fInsertFgPel)
170
15.1k
        {
171
15.1k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
172
0
            return FALSE;
173
174
15.1k
          DESTWRITEPIXEL(pbDest, fgPel);
175
15.1k
          runLength = runLength - 1;
176
15.1k
        }
177
178
22.1k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
179
52
          return FALSE;
180
181
22.0k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); });
182
22.0k
      }
183
193k
      else
184
193k
      {
185
193k
        if (fInsertFgPel)
186
174k
        {
187
174k
          DESTREADPIXEL(temp, pbDest - rowDelta);
188
189
174k
          if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
190
22
            return FALSE;
191
192
174k
          DESTWRITEPIXEL(pbDest, temp ^ fgPel);
193
174k
          runLength--;
194
174k
        }
195
196
193k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
197
618
          return FALSE;
198
199
192k
        UNROLL(runLength, {
200
192k
          DESTREADPIXEL(temp, pbDest - rowDelta);
201
192k
          DESTWRITEPIXEL(pbDest, temp);
202
192k
        });
203
192k
      }
204
205
      /* A follow-on background run order will need a foreground pel inserted. */
206
214k
      fInsertFgPel = TRUE;
207
214k
      continue;
208
215k
    }
209
210
    /* For any of the other run-types a follow-on background run
211
        order does not need a foreground pel inserted. */
212
98.8k
    fInsertFgPel = FALSE;
213
214
98.8k
    switch (code)
215
98.8k
    {
216
      /* Handle Foreground Run Orders. */
217
16.6k
      case REGULAR_FG_RUN:
218
17.6k
      case MEGA_MEGA_FG_RUN:
219
28.3k
      case LITE_SET_FG_FG_RUN:
220
28.9k
      case MEGA_MEGA_SET_FG_RUN:
221
28.9k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
222
28.9k
        if (advance == 0)
223
70
          return FALSE;
224
28.8k
        pbSrc = pbSrc + advance;
225
226
28.8k
        if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
227
11.2k
        {
228
11.2k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
229
134
            return FALSE;
230
11.1k
          SRCREADPIXEL(fgPel, pbSrc);
231
11.1k
        }
232
233
28.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
234
168
          return FALSE;
235
236
28.5k
        if (fFirstLine)
237
6.39k
        {
238
6.39k
          UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); });
239
6.39k
        }
240
22.1k
        else
241
22.1k
        {
242
22.1k
          UNROLL(runLength, {
243
22.1k
            DESTREADPIXEL(temp, pbDest - rowDelta);
244
22.1k
            DESTWRITEPIXEL(pbDest, temp ^ fgPel);
245
22.1k
          });
246
22.1k
        }
247
248
28.5k
        break;
249
250
      /* Handle Dithered Run Orders. */
251
8.09k
      case LITE_DITHERED_RUN:
252
8.85k
      case MEGA_MEGA_DITHERED_RUN:
253
8.85k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
254
8.85k
        if (advance == 0)
255
32
          return FALSE;
256
8.82k
        pbSrc = pbSrc + advance;
257
8.82k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
258
128
          return FALSE;
259
8.69k
        SRCREADPIXEL(pixelA, pbSrc);
260
8.69k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
261
274
          return FALSE;
262
8.42k
        SRCREADPIXEL(pixelB, pbSrc);
263
264
8.42k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))
265
118
          return FALSE;
266
267
8.30k
        UNROLL(runLength, {
268
8.30k
          DESTWRITEPIXEL(pbDest, pixelA);
269
8.30k
          DESTWRITEPIXEL(pbDest, pixelB);
270
8.30k
        });
271
8.30k
        break;
272
273
      /* Handle Color Run Orders. */
274
25.3k
      case REGULAR_COLOR_RUN:
275
26.0k
      case MEGA_MEGA_COLOR_RUN:
276
26.0k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
277
26.0k
        if (advance == 0)
278
32
          return FALSE;
279
26.0k
        pbSrc = pbSrc + advance;
280
26.0k
        if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
281
226
          return FALSE;
282
25.7k
        SRCREADPIXEL(pixelA, pbSrc);
283
284
25.7k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
285
156
          return FALSE;
286
287
25.6k
        UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); });
288
25.6k
        break;
289
290
      /* Handle Foreground/Background Image Orders. */
291
8.46k
      case REGULAR_FGBG_IMAGE:
292
9.69k
      case MEGA_MEGA_FGBG_IMAGE:
293
12.3k
      case LITE_SET_FG_FGBG_IMAGE:
294
13.6k
      case MEGA_MEGA_SET_FGBG_IMAGE:
295
13.6k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
296
13.6k
        if (advance == 0)
297
80
          return FALSE;
298
13.5k
        pbSrc = pbSrc + advance;
299
300
13.5k
        if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
301
3.89k
        {
302
3.89k
          if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))
303
134
            return FALSE;
304
3.76k
          SRCREADPIXEL(fgPel, pbSrc);
305
3.76k
        }
306
307
13.4k
        if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))
308
608
          return FALSE;
309
12.8k
        if (fFirstLine)
310
2.85k
        {
311
28.3k
          while (runLength > 8)
312
25.5k
          {
313
25.5k
            bitmask = *pbSrc;
314
25.5k
            pbSrc = pbSrc + 1;
315
25.5k
            pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);
316
317
25.5k
            if (!pbDest)
318
12
              return FALSE;
319
320
25.5k
            runLength = runLength - 8;
321
25.5k
          }
322
2.85k
        }
323
9.95k
        else
324
9.95k
        {
325
65.7k
          while (runLength > 8)
326
55.8k
          {
327
55.8k
            bitmask = *pbSrc++;
328
329
55.8k
            pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);
330
331
55.8k
            if (!pbDest)
332
62
              return FALSE;
333
334
55.7k
            runLength = runLength - 8;
335
55.7k
          }
336
9.95k
        }
337
338
12.7k
        if (runLength > 0)
339
10.6k
        {
340
10.6k
          if (!buffer_within_range(pbSrc, 1, pbEnd))
341
54
            return FALSE;
342
10.5k
          bitmask = *pbSrc++;
343
344
10.5k
          if (fFirstLine)
345
1.60k
          {
346
1.60k
            pbDest =
347
1.60k
                WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);
348
1.60k
          }
349
8.96k
          else
350
8.96k
          {
351
8.96k
            pbDest =
352
8.96k
                WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);
353
8.96k
          }
354
355
10.5k
          if (!pbDest)
356
6
            return FALSE;
357
10.5k
        }
358
359
12.6k
        break;
360
361
      /* Handle Color Image Orders. */
362
12.6k
      case REGULAR_COLOR_IMAGE:
363
8.32k
      case MEGA_MEGA_COLOR_IMAGE:
364
8.32k
        runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);
365
8.32k
        if (advance == 0)
366
42
          return FALSE;
367
8.28k
        pbSrc = pbSrc + advance;
368
8.28k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))
369
60
          return FALSE;
370
8.22k
        if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))
371
688
          return FALSE;
372
373
7.53k
        UNROLL(runLength, {
374
7.53k
          SRCREADPIXEL(temp, pbSrc);
375
7.53k
          DESTWRITEPIXEL(pbDest, temp);
376
7.53k
        });
377
7.53k
        break;
378
379
      /* Handle Special Order 1. */
380
2.78k
      case SPECIAL_FGBG_1:
381
2.78k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
382
0
          return FALSE;
383
2.78k
        pbSrc = pbSrc + 1;
384
385
2.78k
        if (fFirstLine)
386
240
        {
387
240
          pbDest =
388
240
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);
389
240
        }
390
2.54k
        else
391
2.54k
        {
392
2.54k
          pbDest =
393
2.54k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
394
2.54k
        }
395
396
2.78k
        if (!pbDest)
397
8
          return FALSE;
398
399
2.77k
        break;
400
401
      /* Handle Special Order 2. */
402
2.77k
      case SPECIAL_FGBG_2:
403
1.88k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
404
0
          return FALSE;
405
1.88k
        pbSrc = pbSrc + 1;
406
407
1.88k
        if (fFirstLine)
408
214
        {
409
214
          pbDest =
410
214
              WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);
411
214
        }
412
1.66k
        else
413
1.66k
        {
414
1.66k
          pbDest =
415
1.66k
              WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
416
1.66k
        }
417
418
1.88k
        if (!pbDest)
419
4
          return FALSE;
420
421
1.87k
        break;
422
423
      /* Handle White Order. */
424
2.25k
      case SPECIAL_WHITE:
425
2.25k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
426
0
          return FALSE;
427
2.25k
        pbSrc = pbSrc + 1;
428
429
2.25k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
430
2
          return FALSE;
431
432
2.24k
        DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
433
2.24k
        break;
434
435
      /* Handle Black Order. */
436
1.90k
      case SPECIAL_BLACK:
437
1.90k
        if (!buffer_within_range(pbSrc, 1, pbEnd))
438
0
          return FALSE;
439
1.90k
        pbSrc = pbSrc + 1;
440
441
1.90k
        if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))
442
2
          return FALSE;
443
444
1.90k
        DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
445
1.90k
        break;
446
447
4.30k
      default:
448
4.30k
        WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",
449
4.30k
                 code, WINPR_CXX_COMPAT_CAST(const void*, pbSrcBuffer),
450
4.30k
                 WINPR_CXX_COMPAT_CAST(const void*, pbSrc),
451
4.30k
                 WINPR_CXX_COMPAT_CAST(const void*, pbEnd));
452
4.30k
        return FALSE;
453
98.8k
    }
454
98.8k
  }
455
456
2.77k
  return TRUE;
457
11.3k
}
Unexecuted instantiation: interleaved.c:RleDecompress8to8