/src/FreeRDP/libfreerdp/codec/include/bitmap.c
Line  | Count  | Source (jump to first uncovered line)  | 
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  |  | /* do not compile the file directly */  | 
23  |  |  | 
24  |  | /**  | 
25  |  |  * Write a foreground/background image to a destination buffer.  | 
26  |  |  */  | 
27  |  | static INLINE BYTE* WRITEFGBGIMAGE(BYTE* pbDest, const BYTE* pbDestEnd, UINT32 rowDelta,  | 
28  |  |                                    BYTE bitmask, PIXEL fgPel, INT32 cBits)  | 
29  | 100k  | { | 
30  | 100k  |   PIXEL xorPixel;  | 
31  | 100k  |   BYTE mask = 0x01;  | 
32  |  |  | 
33  | 100k  |   if (cBits > 8)  | 
34  | 0  |   { | 
35  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  | 
36  | 0  |     return NULL;  | 
37  | 0  |   }  | 
38  |  |  | 
39  | 100k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  | 
40  | 133  |     return NULL;  | 
41  |  |  | 
42  | 100k  |   UNROLL(cBits, { | 
43  | 100k  |     UINT32 data;  | 
44  | 100k  |     DESTREADPIXEL(xorPixel, pbDest - rowDelta);  | 
45  |  |  | 
46  | 100k  |     if (bitmask & mask)  | 
47  | 100k  |       data = xorPixel ^ fgPel;  | 
48  | 100k  |     else  | 
49  | 100k  |       data = xorPixel;  | 
50  |  |  | 
51  | 100k  |     DESTWRITEPIXEL(pbDest, data);  | 
52  | 100k  |     mask = mask << 1;  | 
53  | 100k  |   });  | 
54  | 100k  |   return pbDest;  | 
55  | 100k  | } interleaved.c:WriteFgBgImage24to24 Line  | Count  | Source  |  29  | 29.1k  | { |  30  | 29.1k  |   PIXEL xorPixel;  |  31  | 29.1k  |   BYTE mask = 0x01;  |  32  |  |  |  33  | 29.1k  |   if (cBits > 8)  |  34  | 0  |   { |  35  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  |  36  | 0  |     return NULL;  |  37  | 0  |   }  |  38  |  |  |  39  | 29.1k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  |  40  | 35  |     return NULL;  |  41  |  |  |  42  | 29.1k  |   UNROLL(cBits, { |  43  | 29.1k  |     UINT32 data;  |  44  | 29.1k  |     DESTREADPIXEL(xorPixel, pbDest - rowDelta);  |  45  |  |  |  46  | 29.1k  |     if (bitmask & mask)  |  47  | 29.1k  |       data = xorPixel ^ fgPel;  |  48  | 29.1k  |     else  |  49  | 29.1k  |       data = xorPixel;  |  50  |  |  |  51  | 29.1k  |     DESTWRITEPIXEL(pbDest, data);  |  52  | 29.1k  |     mask = mask << 1;  |  53  | 29.1k  |   });  |  54  | 29.1k  |   return pbDest;  |  55  | 29.1k  | }  |  
 interleaved.c:WriteFgBgImage16to16 Line  | Count  | Source  |  29  | 71.6k  | { |  30  | 71.6k  |   PIXEL xorPixel;  |  31  | 71.6k  |   BYTE mask = 0x01;  |  32  |  |  |  33  | 71.6k  |   if (cBits > 8)  |  34  | 0  |   { |  35  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  |  36  | 0  |     return NULL;  |  37  | 0  |   }  |  38  |  |  |  39  | 71.6k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  |  40  | 98  |     return NULL;  |  41  |  |  |  42  | 71.5k  |   UNROLL(cBits, { |  43  | 71.5k  |     UINT32 data;  |  44  | 71.5k  |     DESTREADPIXEL(xorPixel, pbDest - rowDelta);  |  45  |  |  |  46  | 71.5k  |     if (bitmask & mask)  |  47  | 71.5k  |       data = xorPixel ^ fgPel;  |  48  | 71.5k  |     else  |  49  | 71.5k  |       data = xorPixel;  |  50  |  |  |  51  | 71.5k  |     DESTWRITEPIXEL(pbDest, data);  |  52  | 71.5k  |     mask = mask << 1;  |  53  | 71.5k  |   });  |  54  | 71.5k  |   return pbDest;  |  55  | 71.6k  | }  |  
 Unexecuted instantiation: interleaved.c:WriteFgBgImage8to8  | 
56  |  |  | 
57  |  | /**  | 
58  |  |  * Write a foreground/background image to a destination buffer  | 
59  |  |  * for the first line of compressed data.  | 
60  |  |  */  | 
61  |  | static INLINE BYTE* WRITEFIRSTLINEFGBGIMAGE(BYTE* pbDest, const BYTE* pbDestEnd, BYTE bitmask,  | 
62  |  |                                             PIXEL fgPel, UINT32 cBits)  | 
63  | 29.0k  | { | 
64  | 29.0k  |   BYTE mask = 0x01;  | 
65  |  |  | 
66  | 29.0k  |   if (cBits > 8)  | 
67  | 0  |   { | 
68  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  | 
69  | 0  |     return NULL;  | 
70  | 0  |   }  | 
71  |  |  | 
72  | 29.0k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  | 
73  | 24  |     return NULL;  | 
74  |  |  | 
75  | 29.0k  |   UNROLL(cBits, { | 
76  | 29.0k  |     UINT32 data;  | 
77  |  |  | 
78  | 29.0k  |     if (bitmask & mask)  | 
79  | 29.0k  |       data = fgPel;  | 
80  | 29.0k  |     else  | 
81  | 29.0k  |       data = BLACK_PIXEL;  | 
82  |  |  | 
83  | 29.0k  |     DESTWRITEPIXEL(pbDest, data);  | 
84  | 29.0k  |     mask = mask << 1;  | 
85  | 29.0k  |   });  | 
86  | 29.0k  |   return pbDest;  | 
87  | 29.0k  | } interleaved.c:WriteFirstLineFgBgImage24to24 Line  | Count  | Source  |  63  | 10.9k  | { |  64  | 10.9k  |   BYTE mask = 0x01;  |  65  |  |  |  66  | 10.9k  |   if (cBits > 8)  |  67  | 0  |   { |  68  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  |  69  | 0  |     return NULL;  |  70  | 0  |   }  |  71  |  |  |  72  | 10.9k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  |  73  | 10  |     return NULL;  |  74  |  |  |  75  | 10.9k  |   UNROLL(cBits, { |  76  | 10.9k  |     UINT32 data;  |  77  |  |  |  78  | 10.9k  |     if (bitmask & mask)  |  79  | 10.9k  |       data = fgPel;  |  80  | 10.9k  |     else  |  81  | 10.9k  |       data = BLACK_PIXEL;  |  82  |  |  |  83  | 10.9k  |     DESTWRITEPIXEL(pbDest, data);  |  84  | 10.9k  |     mask = mask << 1;  |  85  | 10.9k  |   });  |  86  | 10.9k  |   return pbDest;  |  87  | 10.9k  | }  |  
 interleaved.c:WriteFirstLineFgBgImage16to16 Line  | Count  | Source  |  63  | 18.1k  | { |  64  | 18.1k  |   BYTE mask = 0x01;  |  65  |  |  |  66  | 18.1k  |   if (cBits > 8)  |  67  | 0  |   { |  68  | 0  |     WLog_ERR(TAG, "cBits %d > 8", cBits);  |  69  | 0  |     return NULL;  |  70  | 0  |   }  |  71  |  |  |  72  | 18.1k  |   if (!ENSURE_CAPACITY(pbDest, pbDestEnd, cBits))  |  73  | 14  |     return NULL;  |  74  |  |  |  75  | 18.1k  |   UNROLL(cBits, { |  76  | 18.1k  |     UINT32 data;  |  77  |  |  |  78  | 18.1k  |     if (bitmask & mask)  |  79  | 18.1k  |       data = fgPel;  |  80  | 18.1k  |     else  |  81  | 18.1k  |       data = BLACK_PIXEL;  |  82  |  |  |  83  | 18.1k  |     DESTWRITEPIXEL(pbDest, data);  |  84  | 18.1k  |     mask = mask << 1;  |  85  | 18.1k  |   });  |  86  | 18.1k  |   return pbDest;  |  87  | 18.1k  | }  |  
 Unexecuted instantiation: interleaved.c:WriteFirstLineFgBgImage8to8  | 
88  |  |  | 
89  |  | /**  | 
90  |  |  * Decompress an RLE compressed bitmap.  | 
91  |  |  */  | 
92  |  | static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, BYTE* pbDestBuffer,  | 
93  |  |                                  UINT32 rowDelta, UINT32 width, UINT32 height)  | 
94  | 17.1k  | { | 
95  |  | #if defined(WITH_DEBUG_CODECS)  | 
96  |  |   char sbuffer[128] = { 0 }; | 
97  |  | #endif  | 
98  | 17.1k  |   const BYTE* pbSrc = pbSrcBuffer;  | 
99  | 17.1k  |   const BYTE* pbEnd;  | 
100  | 17.1k  |   const BYTE* pbDestEnd;  | 
101  | 17.1k  |   BYTE* pbDest = pbDestBuffer;  | 
102  | 17.1k  |   PIXEL temp;  | 
103  | 17.1k  |   PIXEL fgPel = WHITE_PIXEL;  | 
104  | 17.1k  |   BOOL fInsertFgPel = FALSE;  | 
105  | 17.1k  |   BOOL fFirstLine = TRUE;  | 
106  | 17.1k  |   BYTE bitmask;  | 
107  | 17.1k  |   PIXEL pixelA, pixelB;  | 
108  | 17.1k  |   UINT32 runLength;  | 
109  | 17.1k  |   UINT32 code;  | 
110  | 17.1k  |   UINT32 advance = 0;  | 
111  | 17.1k  |   RLEEXTRA  | 
112  |  |  | 
113  | 17.1k  |   if ((rowDelta == 0) || (rowDelta < width))  | 
114  | 0  |   { | 
115  | 0  |     WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,  | 
116  | 0  |              width);  | 
117  | 0  |     return FALSE;  | 
118  | 0  |   }  | 
119  |  |  | 
120  | 17.1k  |   if (!pbSrcBuffer || !pbDestBuffer)  | 
121  | 0  |   { | 
122  | 0  |     WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,  | 
123  | 0  |              pbDestBuffer);  | 
124  | 0  |     return FALSE;  | 
125  | 0  |   }  | 
126  |  |  | 
127  | 17.1k  |   pbEnd = pbSrcBuffer + cbSrcBuffer;  | 
128  | 17.1k  |   pbDestEnd = pbDestBuffer + rowDelta * height;  | 
129  |  |  | 
130  | 505k  |   while (pbSrc < pbEnd)  | 
131  | 501k  |   { | 
132  |  |     /* Watch out for the end of the first scanline. */  | 
133  | 501k  |     if (fFirstLine)  | 
134  | 73.7k  |     { | 
135  | 73.7k  |       if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)  | 
136  | 12.2k  |       { | 
137  | 12.2k  |         fFirstLine = FALSE;  | 
138  | 12.2k  |         fInsertFgPel = FALSE;  | 
139  | 12.2k  |       }  | 
140  | 73.7k  |     }  | 
141  |  |  | 
142  |  |     /*  | 
143  |  |        Extract the compression order code ID from the compression  | 
144  |  |        order header.  | 
145  |  |     */  | 
146  | 501k  |     code = ExtractCodeId(*pbSrc);  | 
147  |  |  | 
148  |  | #if defined(WITH_DEBUG_CODECS)  | 
149  |  |     WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc,  | 
150  |  |              rle_code_str_buffer(code, sbuffer, sizeof(sbuffer)), pbEnd - pbSrc);  | 
151  |  | #endif  | 
152  |  |  | 
153  |  |     /* Handle Background Run Orders. */  | 
154  | 501k  |     if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))  | 
155  | 273k  |     { | 
156  | 273k  |       runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
157  | 273k  |       if (advance == 0)  | 
158  | 599  |         return FALSE;  | 
159  | 273k  |       pbSrc = pbSrc + advance;  | 
160  |  |  | 
161  | 273k  |       if (fFirstLine)  | 
162  | 29.1k  |       { | 
163  | 29.1k  |         if (fInsertFgPel)  | 
164  | 18.4k  |         { | 
165  | 18.4k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  | 
166  | 0  |             return FALSE;  | 
167  |  |  | 
168  | 18.4k  |           DESTWRITEPIXEL(pbDest, fgPel);  | 
169  | 18.4k  |           runLength = runLength - 1;  | 
170  | 18.4k  |         }  | 
171  |  |  | 
172  | 29.1k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  | 
173  | 151  |           return FALSE;  | 
174  |  |  | 
175  | 29.0k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); }); | 
176  | 29.0k  |       }  | 
177  | 244k  |       else  | 
178  | 244k  |       { | 
179  | 244k  |         if (fInsertFgPel)  | 
180  | 218k  |         { | 
181  | 218k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  | 
182  |  |  | 
183  | 218k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  | 
184  | 50  |             return FALSE;  | 
185  |  |  | 
186  | 218k  |           DESTWRITEPIXEL(pbDest, temp ^ fgPel);  | 
187  | 218k  |           runLength--;  | 
188  | 218k  |         }  | 
189  |  |  | 
190  | 244k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  | 
191  | 499  |           return FALSE;  | 
192  |  |  | 
193  | 243k  |         UNROLL(runLength, { | 
194  | 243k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  | 
195  | 243k  |           DESTWRITEPIXEL(pbDest, temp);  | 
196  | 243k  |         });  | 
197  | 243k  |       }  | 
198  |  |  | 
199  |  |       /* A follow-on background run order will need a foreground pel inserted. */  | 
200  | 272k  |       fInsertFgPel = TRUE;  | 
201  | 272k  |       continue;  | 
202  | 273k  |     }  | 
203  |  |  | 
204  |  |     /* For any of the other run-types a follow-on background run  | 
205  |  |         order does not need a foreground pel inserted. */  | 
206  | 227k  |     fInsertFgPel = FALSE;  | 
207  |  |  | 
208  | 227k  |     switch (code)  | 
209  | 227k  |     { | 
210  |  |       /* Handle Foreground Run Orders. */  | 
211  | 46.8k  |       case REGULAR_FG_RUN:  | 
212  | 49.0k  |       case MEGA_MEGA_FG_RUN:  | 
213  | 60.9k  |       case LITE_SET_FG_FG_RUN:  | 
214  | 62.2k  |       case MEGA_MEGA_SET_FG_RUN:  | 
215  | 62.2k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
216  | 62.2k  |         if (advance == 0)  | 
217  | 162  |           return FALSE;  | 
218  | 62.0k  |         pbSrc = pbSrc + advance;  | 
219  |  |  | 
220  | 62.0k  |         if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)  | 
221  | 13.0k  |         { | 
222  | 13.0k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  | 
223  | 237  |             return FALSE;  | 
224  | 12.8k  |           SRCREADPIXEL(fgPel, pbSrc);  | 
225  | 12.8k  |         }  | 
226  |  |  | 
227  | 61.8k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  | 
228  | 437  |           return FALSE;  | 
229  |  |  | 
230  | 61.4k  |         if (fFirstLine)  | 
231  | 9.23k  |         { | 
232  | 9.23k  |           UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); }); | 
233  | 9.23k  |         }  | 
234  | 52.1k  |         else  | 
235  | 52.1k  |         { | 
236  | 52.1k  |           UNROLL(runLength, { | 
237  | 52.1k  |             DESTREADPIXEL(temp, pbDest - rowDelta);  | 
238  | 52.1k  |             DESTWRITEPIXEL(pbDest, temp ^ fgPel);  | 
239  | 52.1k  |           });  | 
240  | 52.1k  |         }  | 
241  |  |  | 
242  | 61.4k  |         break;  | 
243  |  |  | 
244  |  |       /* Handle Dithered Run Orders. */  | 
245  | 13.0k  |       case LITE_DITHERED_RUN:  | 
246  | 14.2k  |       case MEGA_MEGA_DITHERED_RUN:  | 
247  | 14.2k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
248  | 14.2k  |         if (advance == 0)  | 
249  | 66  |           return FALSE;  | 
250  | 14.1k  |         pbSrc = pbSrc + advance;  | 
251  | 14.1k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  | 
252  | 273  |           return FALSE;  | 
253  | 13.8k  |         SRCREADPIXEL(pixelA, pbSrc);  | 
254  | 13.8k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  | 
255  | 571  |           return FALSE;  | 
256  | 13.3k  |         SRCREADPIXEL(pixelB, pbSrc);  | 
257  |  |  | 
258  | 13.3k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))  | 
259  | 105  |           return FALSE;  | 
260  |  |  | 
261  | 13.2k  |         UNROLL(runLength, { | 
262  | 13.2k  |           DESTWRITEPIXEL(pbDest, pixelA);  | 
263  | 13.2k  |           DESTWRITEPIXEL(pbDest, pixelB);  | 
264  | 13.2k  |         });  | 
265  | 13.2k  |         break;  | 
266  |  |  | 
267  |  |       /* Handle Color Run Orders. */  | 
268  | 96.3k  |       case REGULAR_COLOR_RUN:  | 
269  | 97.4k  |       case MEGA_MEGA_COLOR_RUN:  | 
270  | 97.4k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
271  | 97.4k  |         if (advance == 0)  | 
272  | 73  |           return FALSE;  | 
273  | 97.4k  |         pbSrc = pbSrc + advance;  | 
274  | 97.4k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  | 
275  | 356  |           return FALSE;  | 
276  | 97.0k  |         SRCREADPIXEL(pixelA, pbSrc);  | 
277  |  |  | 
278  | 97.0k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  | 
279  | 347  |           return FALSE;  | 
280  |  |  | 
281  | 96.7k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); }); | 
282  | 96.7k  |         break;  | 
283  |  |  | 
284  |  |       /* Handle Foreground/Background Image Orders. */  | 
285  | 14.0k  |       case REGULAR_FGBG_IMAGE:  | 
286  | 15.9k  |       case MEGA_MEGA_FGBG_IMAGE:  | 
287  | 20.5k  |       case LITE_SET_FG_FGBG_IMAGE:  | 
288  | 21.5k  |       case MEGA_MEGA_SET_FGBG_IMAGE:  | 
289  | 21.5k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
290  | 21.5k  |         if (advance == 0)  | 
291  | 138  |           return FALSE;  | 
292  | 21.4k  |         pbSrc = pbSrc + advance;  | 
293  |  |  | 
294  | 21.4k  |         if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)  | 
295  | 5.56k  |         { | 
296  | 5.56k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  | 
297  | 203  |             return FALSE;  | 
298  | 5.36k  |           SRCREADPIXEL(fgPel, pbSrc);  | 
299  | 5.36k  |         }  | 
300  |  |  | 
301  | 21.2k  |         if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))  | 
302  | 918  |           return FALSE;  | 
303  | 20.3k  |         if (fFirstLine)  | 
304  | 4.30k  |         { | 
305  | 29.9k  |           while (runLength > 8)  | 
306  | 25.6k  |           { | 
307  | 25.6k  |             bitmask = *pbSrc;  | 
308  | 25.6k  |             pbSrc = pbSrc + 1;  | 
309  | 25.6k  |             pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);  | 
310  |  |  | 
311  | 25.6k  |             if (!pbDest)  | 
312  | 24  |               return FALSE;  | 
313  |  |  | 
314  | 25.6k  |             runLength = runLength - 8;  | 
315  | 25.6k  |           }  | 
316  | 4.30k  |         }  | 
317  | 16.0k  |         else  | 
318  | 16.0k  |         { | 
319  | 96.4k  |           while (runLength > 8)  | 
320  | 80.5k  |           { | 
321  | 80.5k  |             bitmask = *pbSrc++;  | 
322  |  |  | 
323  | 80.5k  |             pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);  | 
324  |  |  | 
325  | 80.5k  |             if (!pbDest)  | 
326  | 116  |               return FALSE;  | 
327  |  |  | 
328  | 80.4k  |             runLength = runLength - 8;  | 
329  | 80.4k  |           }  | 
330  | 16.0k  |         }  | 
331  |  |  | 
332  | 20.1k  |         if (runLength > 0)  | 
333  | 17.7k  |         { | 
334  | 17.7k  |           if (!buffer_within_range(pbSrc, 1, pbEnd))  | 
335  | 105  |             return FALSE;  | 
336  | 17.5k  |           bitmask = *pbSrc++;  | 
337  |  |  | 
338  | 17.5k  |           if (fFirstLine)  | 
339  | 2.80k  |           { | 
340  | 2.80k  |             pbDest =  | 
341  | 2.80k  |                 WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);  | 
342  | 2.80k  |           }  | 
343  | 14.7k  |           else  | 
344  | 14.7k  |           { | 
345  | 14.7k  |             pbDest =  | 
346  | 14.7k  |                 WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);  | 
347  | 14.7k  |           }  | 
348  |  |  | 
349  | 17.5k  |           if (!pbDest)  | 
350  | 7  |             return FALSE;  | 
351  | 17.5k  |         }  | 
352  |  |  | 
353  | 20.0k  |         break;  | 
354  |  |  | 
355  |  |       /* Handle Color Image Orders. */  | 
356  | 20.0k  |       case REGULAR_COLOR_IMAGE:  | 
357  | 14.3k  |       case MEGA_MEGA_COLOR_IMAGE:  | 
358  | 14.3k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  | 
359  | 14.3k  |         if (advance == 0)  | 
360  | 61  |           return FALSE;  | 
361  | 14.2k  |         pbSrc = pbSrc + advance;  | 
362  | 14.2k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  | 
363  | 202  |           return FALSE;  | 
364  | 14.0k  |         if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))  | 
365  | 783  |           return FALSE;  | 
366  |  |  | 
367  | 13.2k  |         UNROLL(runLength, { | 
368  | 13.2k  |           SRCREADPIXEL(temp, pbSrc);  | 
369  | 13.2k  |           DESTWRITEPIXEL(pbDest, temp);  | 
370  | 13.2k  |         });  | 
371  | 13.2k  |         break;  | 
372  |  |  | 
373  |  |       /* Handle Special Order 1. */  | 
374  | 2.31k  |       case SPECIAL_FGBG_1:  | 
375  | 2.31k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  | 
376  | 0  |           return FALSE;  | 
377  | 2.31k  |         pbSrc = pbSrc + 1;  | 
378  |  |  | 
379  | 2.31k  |         if (fFirstLine)  | 
380  | 267  |         { | 
381  | 267  |           pbDest =  | 
382  | 267  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);  | 
383  | 267  |         }  | 
384  | 2.04k  |         else  | 
385  | 2.04k  |         { | 
386  | 2.04k  |           pbDest =  | 
387  | 2.04k  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);  | 
388  | 2.04k  |         }  | 
389  |  |  | 
390  | 2.31k  |         if (!pbDest)  | 
391  | 3  |           return FALSE;  | 
392  |  |  | 
393  | 2.31k  |         break;  | 
394  |  |  | 
395  |  |       /* Handle Special Order 2. */  | 
396  | 3.75k  |       case SPECIAL_FGBG_2:  | 
397  | 3.75k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  | 
398  | 0  |           return FALSE;  | 
399  | 3.75k  |         pbSrc = pbSrc + 1;  | 
400  |  |  | 
401  | 3.75k  |         if (fFirstLine)  | 
402  | 348  |         { | 
403  | 348  |           pbDest =  | 
404  | 348  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);  | 
405  | 348  |         }  | 
406  | 3.40k  |         else  | 
407  | 3.40k  |         { | 
408  | 3.40k  |           pbDest =  | 
409  | 3.40k  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);  | 
410  | 3.40k  |         }  | 
411  |  |  | 
412  | 3.75k  |         if (!pbDest)  | 
413  | 7  |           return FALSE;  | 
414  |  |  | 
415  | 3.74k  |         break;  | 
416  |  |  | 
417  |  |       /* Handle White Order. */  | 
418  | 3.74k  |       case SPECIAL_WHITE:  | 
419  | 2.14k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  | 
420  | 0  |           return FALSE;  | 
421  | 2.14k  |         pbSrc = pbSrc + 1;  | 
422  |  |  | 
423  | 2.14k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  | 
424  | 3  |           return FALSE;  | 
425  |  |  | 
426  | 2.14k  |         DESTWRITEPIXEL(pbDest, WHITE_PIXEL);  | 
427  | 2.14k  |         break;  | 
428  |  |  | 
429  |  |       /* Handle Black Order. */  | 
430  | 2.88k  |       case SPECIAL_BLACK:  | 
431  | 2.88k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  | 
432  | 0  |           return FALSE;  | 
433  | 2.88k  |         pbSrc = pbSrc + 1;  | 
434  |  |  | 
435  | 2.88k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  | 
436  | 5  |           return FALSE;  | 
437  |  |  | 
438  | 2.87k  |         DESTWRITEPIXEL(pbDest, BLACK_PIXEL);  | 
439  | 2.87k  |         break;  | 
440  |  |  | 
441  | 6.45k  |       default:  | 
442  | 6.45k  |         WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",  | 
443  | 6.45k  |                  code, pbSrcBuffer, pbSrc, pbEnd);  | 
444  | 6.45k  |         return FALSE;  | 
445  | 227k  |     }  | 
446  | 227k  |   }  | 
447  |  |  | 
448  | 4.18k  |   return TRUE;  | 
449  | 17.1k  | } interleaved.c:RleDecompress24to24 Line  | Count  | Source  |  94  | 5.71k  | { |  95  |  | #if defined(WITH_DEBUG_CODECS)  |  96  |  |   char sbuffer[128] = { 0 }; |  97  |  | #endif  |  98  | 5.71k  |   const BYTE* pbSrc = pbSrcBuffer;  |  99  | 5.71k  |   const BYTE* pbEnd;  |  100  | 5.71k  |   const BYTE* pbDestEnd;  |  101  | 5.71k  |   BYTE* pbDest = pbDestBuffer;  |  102  | 5.71k  |   PIXEL temp;  |  103  | 5.71k  |   PIXEL fgPel = WHITE_PIXEL;  |  104  | 5.71k  |   BOOL fInsertFgPel = FALSE;  |  105  | 5.71k  |   BOOL fFirstLine = TRUE;  |  106  | 5.71k  |   BYTE bitmask;  |  107  | 5.71k  |   PIXEL pixelA, pixelB;  |  108  | 5.71k  |   UINT32 runLength;  |  109  | 5.71k  |   UINT32 code;  |  110  | 5.71k  |   UINT32 advance = 0;  |  111  | 5.71k  |   RLEEXTRA  |  112  |  |  |  113  | 5.71k  |   if ((rowDelta == 0) || (rowDelta < width))  |  114  | 0  |   { |  115  | 0  |     WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,  |  116  | 0  |              width);  |  117  | 0  |     return FALSE;  |  118  | 0  |   }  |  119  |  |  |  120  | 5.71k  |   if (!pbSrcBuffer || !pbDestBuffer)  |  121  | 0  |   { |  122  | 0  |     WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,  |  123  | 0  |              pbDestBuffer);  |  124  | 0  |     return FALSE;  |  125  | 0  |   }  |  126  |  |  |  127  | 5.71k  |   pbEnd = pbSrcBuffer + cbSrcBuffer;  |  128  | 5.71k  |   pbDestEnd = pbDestBuffer + rowDelta * height;  |  129  |  |  |  130  | 161k  |   while (pbSrc < pbEnd)  |  131  | 160k  |   { |  132  |  |     /* Watch out for the end of the first scanline. */  |  133  | 160k  |     if (fFirstLine)  |  134  | 24.8k  |     { |  135  | 24.8k  |       if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)  |  136  | 3.90k  |       { |  137  | 3.90k  |         fFirstLine = FALSE;  |  138  | 3.90k  |         fInsertFgPel = FALSE;  |  139  | 3.90k  |       }  |  140  | 24.8k  |     }  |  141  |  |  |  142  |  |     /*  |  143  |  |        Extract the compression order code ID from the compression  |  144  |  |        order header.  |  145  |  |     */  |  146  | 160k  |     code = ExtractCodeId(*pbSrc);  |  147  |  |  |  148  |  | #if defined(WITH_DEBUG_CODECS)  |  149  |  |     WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc,  |  150  |  |              rle_code_str_buffer(code, sbuffer, sizeof(sbuffer)), pbEnd - pbSrc);  |  151  |  | #endif  |  152  |  |  |  153  |  |     /* Handle Background Run Orders. */  |  154  | 160k  |     if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))  |  155  | 88.4k  |     { |  156  | 88.4k  |       runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  157  | 88.4k  |       if (advance == 0)  |  158  | 167  |         return FALSE;  |  159  | 88.2k  |       pbSrc = pbSrc + advance;  |  160  |  |  |  161  | 88.2k  |       if (fFirstLine)  |  162  | 10.1k  |       { |  163  | 10.1k  |         if (fInsertFgPel)  |  164  | 6.42k  |         { |  165  | 6.42k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  166  | 0  |             return FALSE;  |  167  |  |  |  168  | 6.42k  |           DESTWRITEPIXEL(pbDest, fgPel);  |  169  | 6.42k  |           runLength = runLength - 1;  |  170  | 6.42k  |         }  |  171  |  |  |  172  | 10.1k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  173  | 49  |           return FALSE;  |  174  |  |  |  175  | 10.0k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); }); |  176  | 10.0k  |       }  |  177  | 78.1k  |       else  |  178  | 78.1k  |       { |  179  | 78.1k  |         if (fInsertFgPel)  |  180  | 71.4k  |         { |  181  | 71.4k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  |  182  |  |  |  183  | 71.4k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  184  | 14  |             return FALSE;  |  185  |  |  |  186  | 71.3k  |           DESTWRITEPIXEL(pbDest, temp ^ fgPel);  |  187  | 71.3k  |           runLength--;  |  188  | 71.3k  |         }  |  189  |  |  |  190  | 78.1k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  191  | 149  |           return FALSE;  |  192  |  |  |  193  | 77.9k  |         UNROLL(runLength, { |  194  | 77.9k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  |  195  | 77.9k  |           DESTWRITEPIXEL(pbDest, temp);  |  196  | 77.9k  |         });  |  197  | 77.9k  |       }  |  198  |  |  |  199  |  |       /* A follow-on background run order will need a foreground pel inserted. */  |  200  | 88.0k  |       fInsertFgPel = TRUE;  |  201  | 88.0k  |       continue;  |  202  | 88.2k  |     }  |  203  |  |  |  204  |  |     /* For any of the other run-types a follow-on background run  |  205  |  |         order does not need a foreground pel inserted. */  |  206  | 71.5k  |     fInsertFgPel = FALSE;  |  207  |  |  |  208  | 71.5k  |     switch (code)  |  209  | 71.5k  |     { |  210  |  |       /* Handle Foreground Run Orders. */  |  211  | 15.2k  |       case REGULAR_FG_RUN:  |  212  | 16.0k  |       case MEGA_MEGA_FG_RUN:  |  213  | 19.5k  |       case LITE_SET_FG_FG_RUN:  |  214  | 19.9k  |       case MEGA_MEGA_SET_FG_RUN:  |  215  | 19.9k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  216  | 19.9k  |         if (advance == 0)  |  217  | 48  |           return FALSE;  |  218  | 19.9k  |         pbSrc = pbSrc + advance;  |  219  |  |  |  220  | 19.9k  |         if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)  |  221  | 3.90k  |         { |  222  | 3.90k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  223  | 83  |             return FALSE;  |  224  | 3.82k  |           SRCREADPIXEL(fgPel, pbSrc);  |  225  | 3.82k  |         }  |  226  |  |  |  227  | 19.8k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  228  | 123  |           return FALSE;  |  229  |  |  |  230  | 19.6k  |         if (fFirstLine)  |  231  | 3.18k  |         { |  232  | 3.18k  |           UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); }); |  233  | 3.18k  |         }  |  234  | 16.5k  |         else  |  235  | 16.5k  |         { |  236  | 16.5k  |           UNROLL(runLength, { |  237  | 16.5k  |             DESTREADPIXEL(temp, pbDest - rowDelta);  |  238  | 16.5k  |             DESTWRITEPIXEL(pbDest, temp ^ fgPel);  |  239  | 16.5k  |           });  |  240  | 16.5k  |         }  |  241  |  |  |  242  | 19.6k  |         break;  |  243  |  |  |  244  |  |       /* Handle Dithered Run Orders. */  |  245  | 3.69k  |       case LITE_DITHERED_RUN:  |  246  | 4.10k  |       case MEGA_MEGA_DITHERED_RUN:  |  247  | 4.10k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  248  | 4.10k  |         if (advance == 0)  |  249  | 20  |           return FALSE;  |  250  | 4.08k  |         pbSrc = pbSrc + advance;  |  251  | 4.08k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  252  | 111  |           return FALSE;  |  253  | 3.96k  |         SRCREADPIXEL(pixelA, pbSrc);  |  254  | 3.96k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  255  | 279  |           return FALSE;  |  256  | 3.69k  |         SRCREADPIXEL(pixelB, pbSrc);  |  257  |  |  |  258  | 3.69k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))  |  259  | 27  |           return FALSE;  |  260  |  |  |  261  | 3.66k  |         UNROLL(runLength, { |  262  | 3.66k  |           DESTWRITEPIXEL(pbDest, pixelA);  |  263  | 3.66k  |           DESTWRITEPIXEL(pbDest, pixelB);  |  264  | 3.66k  |         });  |  265  | 3.66k  |         break;  |  266  |  |  |  267  |  |       /* Handle Color Run Orders. */  |  268  | 30.1k  |       case REGULAR_COLOR_RUN:  |  269  | 30.6k  |       case MEGA_MEGA_COLOR_RUN:  |  270  | 30.6k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  271  | 30.6k  |         if (advance == 0)  |  272  | 21  |           return FALSE;  |  273  | 30.5k  |         pbSrc = pbSrc + advance;  |  274  | 30.5k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  275  | 138  |           return FALSE;  |  276  | 30.4k  |         SRCREADPIXEL(pixelA, pbSrc);  |  277  |  |  |  278  | 30.4k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  279  | 101  |           return FALSE;  |  280  |  |  |  281  | 30.3k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); }); |  282  | 30.3k  |         break;  |  283  |  |  |  284  |  |       /* Handle Foreground/Background Image Orders. */  |  285  | 4.34k  |       case REGULAR_FGBG_IMAGE:  |  286  | 4.96k  |       case MEGA_MEGA_FGBG_IMAGE:  |  287  | 6.34k  |       case LITE_SET_FG_FGBG_IMAGE:  |  288  | 6.72k  |       case MEGA_MEGA_SET_FGBG_IMAGE:  |  289  | 6.72k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  290  | 6.72k  |         if (advance == 0)  |  291  | 46  |           return FALSE;  |  292  | 6.68k  |         pbSrc = pbSrc + advance;  |  293  |  |  |  294  | 6.68k  |         if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)  |  295  | 1.74k  |         { |  296  | 1.74k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  297  | 75  |             return FALSE;  |  298  | 1.67k  |           SRCREADPIXEL(fgPel, pbSrc);  |  299  | 1.67k  |         }  |  300  |  |  |  301  | 6.60k  |         if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))  |  302  | 272  |           return FALSE;  |  303  | 6.33k  |         if (fFirstLine)  |  304  | 1.50k  |         { |  305  | 11.2k  |           while (runLength > 8)  |  306  | 9.72k  |           { |  307  | 9.72k  |             bitmask = *pbSrc;  |  308  | 9.72k  |             pbSrc = pbSrc + 1;  |  309  | 9.72k  |             pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);  |  310  |  |  |  311  | 9.72k  |             if (!pbDest)  |  312  | 10  |               return FALSE;  |  313  |  |  |  314  | 9.71k  |             runLength = runLength - 8;  |  315  | 9.71k  |           }  |  316  | 1.50k  |         }  |  317  | 4.83k  |         else  |  318  | 4.83k  |         { |  319  | 27.6k  |           while (runLength > 8)  |  320  | 22.8k  |           { |  321  | 22.8k  |             bitmask = *pbSrc++;  |  322  |  |  |  323  | 22.8k  |             pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);  |  324  |  |  |  325  | 22.8k  |             if (!pbDest)  |  326  | 28  |               return FALSE;  |  327  |  |  |  328  | 22.8k  |             runLength = runLength - 8;  |  329  | 22.8k  |           }  |  330  | 4.83k  |         }  |  331  |  |  |  332  | 6.29k  |         if (runLength > 0)  |  333  | 5.45k  |         { |  334  | 5.45k  |           if (!buffer_within_range(pbSrc, 1, pbEnd))  |  335  | 39  |             return FALSE;  |  336  | 5.41k  |           bitmask = *pbSrc++;  |  337  |  |  |  338  | 5.41k  |           if (fFirstLine)  |  339  | 988  |           { |  340  | 988  |             pbDest =  |  341  | 988  |                 WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);  |  342  | 988  |           }  |  343  | 4.42k  |           else  |  344  | 4.42k  |           { |  345  | 4.42k  |             pbDest =  |  346  | 4.42k  |                 WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);  |  347  | 4.42k  |           }  |  348  |  |  |  349  | 5.41k  |           if (!pbDest)  |  350  | 3  |             return FALSE;  |  351  | 5.41k  |         }  |  352  |  |  |  353  | 6.25k  |         break;  |  354  |  |  |  355  |  |       /* Handle Color Image Orders. */  |  356  | 6.25k  |       case REGULAR_COLOR_IMAGE:  |  357  | 4.37k  |       case MEGA_MEGA_COLOR_IMAGE:  |  358  | 4.37k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  359  | 4.37k  |         if (advance == 0)  |  360  | 19  |           return FALSE;  |  361  | 4.36k  |         pbSrc = pbSrc + advance;  |  362  | 4.36k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  363  | 64  |           return FALSE;  |  364  | 4.29k  |         if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))  |  365  | 269  |           return FALSE;  |  366  |  |  |  367  | 4.02k  |         UNROLL(runLength, { |  368  | 4.02k  |           SRCREADPIXEL(temp, pbSrc);  |  369  | 4.02k  |           DESTWRITEPIXEL(pbDest, temp);  |  370  | 4.02k  |         });  |  371  | 4.02k  |         break;  |  372  |  |  |  373  |  |       /* Handle Special Order 1. */  |  374  | 747  |       case SPECIAL_FGBG_1:  |  375  | 747  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  376  | 0  |           return FALSE;  |  377  | 747  |         pbSrc = pbSrc + 1;  |  378  |  |  |  379  | 747  |         if (fFirstLine)  |  380  | 81  |         { |  381  | 81  |           pbDest =  |  382  | 81  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);  |  383  | 81  |         }  |  384  | 666  |         else  |  385  | 666  |         { |  386  | 666  |           pbDest =  |  387  | 666  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);  |  388  | 666  |         }  |  389  |  |  |  390  | 747  |         if (!pbDest)  |  391  | 1  |           return FALSE;  |  392  |  |  |  393  | 746  |         break;  |  394  |  |  |  395  |  |       /* Handle Special Order 2. */  |  396  | 1.35k  |       case SPECIAL_FGBG_2:  |  397  | 1.35k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  398  | 0  |           return FALSE;  |  399  | 1.35k  |         pbSrc = pbSrc + 1;  |  400  |  |  |  401  | 1.35k  |         if (fFirstLine)  |  402  | 122  |         { |  403  | 122  |           pbDest =  |  404  | 122  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);  |  405  | 122  |         }  |  406  | 1.22k  |         else  |  407  | 1.22k  |         { |  408  | 1.22k  |           pbDest =  |  409  | 1.22k  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);  |  410  | 1.22k  |         }  |  411  |  |  |  412  | 1.35k  |         if (!pbDest)  |  413  | 3  |           return FALSE;  |  414  |  |  |  415  | 1.34k  |         break;  |  416  |  |  |  417  |  |       /* Handle White Order. */  |  418  | 1.34k  |       case SPECIAL_WHITE:  |  419  | 637  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  420  | 0  |           return FALSE;  |  421  | 637  |         pbSrc = pbSrc + 1;  |  422  |  |  |  423  | 637  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  424  | 1  |           return FALSE;  |  425  |  |  |  426  | 636  |         DESTWRITEPIXEL(pbDest, WHITE_PIXEL);  |  427  | 636  |         break;  |  428  |  |  |  429  |  |       /* Handle Black Order. */  |  430  | 926  |       case SPECIAL_BLACK:  |  431  | 926  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  432  | 0  |           return FALSE;  |  433  | 926  |         pbSrc = pbSrc + 1;  |  434  |  |  |  435  | 926  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  436  | 1  |           return FALSE;  |  437  |  |  |  438  | 925  |         DESTWRITEPIXEL(pbDest, BLACK_PIXEL);  |  439  | 925  |         break;  |  440  |  |  |  441  | 2.13k  |       default:  |  442  | 2.13k  |         WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",  |  443  | 2.13k  |                  code, pbSrcBuffer, pbSrc, pbEnd);  |  444  | 2.13k  |         return FALSE;  |  445  | 71.5k  |     }  |  446  | 71.5k  |   }  |  447  |  |  |  448  | 1.41k  |   return TRUE;  |  449  | 5.71k  | }  |  
 interleaved.c:RleDecompress16to16 Line  | Count  | Source  |  94  | 11.4k  | { |  95  |  | #if defined(WITH_DEBUG_CODECS)  |  96  |  |   char sbuffer[128] = { 0 }; |  97  |  | #endif  |  98  | 11.4k  |   const BYTE* pbSrc = pbSrcBuffer;  |  99  | 11.4k  |   const BYTE* pbEnd;  |  100  | 11.4k  |   const BYTE* pbDestEnd;  |  101  | 11.4k  |   BYTE* pbDest = pbDestBuffer;  |  102  | 11.4k  |   PIXEL temp;  |  103  | 11.4k  |   PIXEL fgPel = WHITE_PIXEL;  |  104  | 11.4k  |   BOOL fInsertFgPel = FALSE;  |  105  | 11.4k  |   BOOL fFirstLine = TRUE;  |  106  | 11.4k  |   BYTE bitmask;  |  107  | 11.4k  |   PIXEL pixelA, pixelB;  |  108  | 11.4k  |   UINT32 runLength;  |  109  | 11.4k  |   UINT32 code;  |  110  | 11.4k  |   UINT32 advance = 0;  |  111  | 11.4k  |   RLEEXTRA  |  112  |  |  |  113  | 11.4k  |   if ((rowDelta == 0) || (rowDelta < width))  |  114  | 0  |   { |  115  | 0  |     WLog_ERR(TAG, "Invalid arguments: rowDelta=%" PRIu32 " == 0 || < width=%" PRIu32, rowDelta,  |  116  | 0  |              width);  |  117  | 0  |     return FALSE;  |  118  | 0  |   }  |  119  |  |  |  120  | 11.4k  |   if (!pbSrcBuffer || !pbDestBuffer)  |  121  | 0  |   { |  122  | 0  |     WLog_ERR(TAG, "Invalid arguments: pbSrcBuffer=%p, pbDestBuffer=%p", pbSrcBuffer,  |  123  | 0  |              pbDestBuffer);  |  124  | 0  |     return FALSE;  |  125  | 0  |   }  |  126  |  |  |  127  | 11.4k  |   pbEnd = pbSrcBuffer + cbSrcBuffer;  |  128  | 11.4k  |   pbDestEnd = pbDestBuffer + rowDelta * height;  |  129  |  |  |  130  | 344k  |   while (pbSrc < pbEnd)  |  131  | 341k  |   { |  132  |  |     /* Watch out for the end of the first scanline. */  |  133  | 341k  |     if (fFirstLine)  |  134  | 48.9k  |     { |  135  | 48.9k  |       if ((UINT32)(pbDest - pbDestBuffer) >= rowDelta)  |  136  | 8.34k  |       { |  137  | 8.34k  |         fFirstLine = FALSE;  |  138  | 8.34k  |         fInsertFgPel = FALSE;  |  139  | 8.34k  |       }  |  140  | 48.9k  |     }  |  141  |  |  |  142  |  |     /*  |  143  |  |        Extract the compression order code ID from the compression  |  144  |  |        order header.  |  145  |  |     */  |  146  | 341k  |     code = ExtractCodeId(*pbSrc);  |  147  |  |  |  148  |  | #if defined(WITH_DEBUG_CODECS)  |  149  |  |     WLog_VRB(TAG, "pbSrc=%p code=%s, rem=%" PRIuz, pbSrc,  |  150  |  |              rle_code_str_buffer(code, sbuffer, sizeof(sbuffer)), pbEnd - pbSrc);  |  151  |  | #endif  |  152  |  |  |  153  |  |     /* Handle Background Run Orders. */  |  154  | 341k  |     if ((code == REGULAR_BG_RUN) || (code == MEGA_MEGA_BG_RUN))  |  155  | 185k  |     { |  156  | 185k  |       runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  157  | 185k  |       if (advance == 0)  |  158  | 432  |         return FALSE;  |  159  | 185k  |       pbSrc = pbSrc + advance;  |  160  |  |  |  161  | 185k  |       if (fFirstLine)  |  162  | 19.0k  |       { |  163  | 19.0k  |         if (fInsertFgPel)  |  164  | 12.0k  |         { |  165  | 12.0k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  166  | 0  |             return FALSE;  |  167  |  |  |  168  | 12.0k  |           DESTWRITEPIXEL(pbDest, fgPel);  |  169  | 12.0k  |           runLength = runLength - 1;  |  170  | 12.0k  |         }  |  171  |  |  |  172  | 19.0k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  173  | 102  |           return FALSE;  |  174  |  |  |  175  | 18.9k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); }); |  176  | 18.9k  |       }  |  177  | 166k  |       else  |  178  | 166k  |       { |  179  | 166k  |         if (fInsertFgPel)  |  180  | 147k  |         { |  181  | 147k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  |  182  |  |  |  183  | 147k  |           if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  184  | 36  |             return FALSE;  |  185  |  |  |  186  | 147k  |           DESTWRITEPIXEL(pbDest, temp ^ fgPel);  |  187  | 147k  |           runLength--;  |  188  | 147k  |         }  |  189  |  |  |  190  | 165k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  191  | 350  |           return FALSE;  |  192  |  |  |  193  | 165k  |         UNROLL(runLength, { |  194  | 165k  |           DESTREADPIXEL(temp, pbDest - rowDelta);  |  195  | 165k  |           DESTWRITEPIXEL(pbDest, temp);  |  196  | 165k  |         });  |  197  | 165k  |       }  |  198  |  |  |  199  |  |       /* A follow-on background run order will need a foreground pel inserted. */  |  200  | 184k  |       fInsertFgPel = TRUE;  |  201  | 184k  |       continue;  |  202  | 185k  |     }  |  203  |  |  |  204  |  |     /* For any of the other run-types a follow-on background run  |  205  |  |         order does not need a foreground pel inserted. */  |  206  | 155k  |     fInsertFgPel = FALSE;  |  207  |  |  |  208  | 155k  |     switch (code)  |  209  | 155k  |     { |  210  |  |       /* Handle Foreground Run Orders. */  |  211  | 31.5k  |       case REGULAR_FG_RUN:  |  212  | 33.0k  |       case MEGA_MEGA_FG_RUN:  |  213  | 41.3k  |       case LITE_SET_FG_FG_RUN:  |  214  | 42.2k  |       case MEGA_MEGA_SET_FG_RUN:  |  215  | 42.2k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  216  | 42.2k  |         if (advance == 0)  |  217  | 114  |           return FALSE;  |  218  | 42.1k  |         pbSrc = pbSrc + advance;  |  219  |  |  |  220  | 42.1k  |         if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)  |  221  | 9.18k  |         { |  222  | 9.18k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  223  | 154  |             return FALSE;  |  224  | 9.03k  |           SRCREADPIXEL(fgPel, pbSrc);  |  225  | 9.03k  |         }  |  226  |  |  |  227  | 42.0k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  228  | 314  |           return FALSE;  |  229  |  |  |  230  | 41.7k  |         if (fFirstLine)  |  231  | 6.05k  |         { |  232  | 6.05k  |           UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); }); |  233  | 6.05k  |         }  |  234  | 35.6k  |         else  |  235  | 35.6k  |         { |  236  | 35.6k  |           UNROLL(runLength, { |  237  | 35.6k  |             DESTREADPIXEL(temp, pbDest - rowDelta);  |  238  | 35.6k  |             DESTWRITEPIXEL(pbDest, temp ^ fgPel);  |  239  | 35.6k  |           });  |  240  | 35.6k  |         }  |  241  |  |  |  242  | 41.7k  |         break;  |  243  |  |  |  244  |  |       /* Handle Dithered Run Orders. */  |  245  | 9.35k  |       case LITE_DITHERED_RUN:  |  246  | 10.1k  |       case MEGA_MEGA_DITHERED_RUN:  |  247  | 10.1k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  248  | 10.1k  |         if (advance == 0)  |  249  | 46  |           return FALSE;  |  250  | 10.0k  |         pbSrc = pbSrc + advance;  |  251  | 10.0k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  252  | 162  |           return FALSE;  |  253  | 9.91k  |         SRCREADPIXEL(pixelA, pbSrc);  |  254  | 9.91k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  255  | 292  |           return FALSE;  |  256  | 9.62k  |         SRCREADPIXEL(pixelB, pbSrc);  |  257  |  |  |  258  | 9.62k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2))  |  259  | 78  |           return FALSE;  |  260  |  |  |  261  | 9.54k  |         UNROLL(runLength, { |  262  | 9.54k  |           DESTWRITEPIXEL(pbDest, pixelA);  |  263  | 9.54k  |           DESTWRITEPIXEL(pbDest, pixelB);  |  264  | 9.54k  |         });  |  265  | 9.54k  |         break;  |  266  |  |  |  267  |  |       /* Handle Color Run Orders. */  |  268  | 66.1k  |       case REGULAR_COLOR_RUN:  |  269  | 66.8k  |       case MEGA_MEGA_COLOR_RUN:  |  270  | 66.8k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  271  | 66.8k  |         if (advance == 0)  |  272  | 52  |           return FALSE;  |  273  | 66.8k  |         pbSrc = pbSrc + advance;  |  274  | 66.8k  |         if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  275  | 218  |           return FALSE;  |  276  | 66.6k  |         SRCREADPIXEL(pixelA, pbSrc);  |  277  |  |  |  278  | 66.6k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  279  | 246  |           return FALSE;  |  280  |  |  |  281  | 66.3k  |         UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); }); |  282  | 66.3k  |         break;  |  283  |  |  |  284  |  |       /* Handle Foreground/Background Image Orders. */  |  285  | 9.71k  |       case REGULAR_FGBG_IMAGE:  |  286  | 10.9k  |       case MEGA_MEGA_FGBG_IMAGE:  |  287  | 14.2k  |       case LITE_SET_FG_FGBG_IMAGE:  |  288  | 14.8k  |       case MEGA_MEGA_SET_FGBG_IMAGE:  |  289  | 14.8k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  290  | 14.8k  |         if (advance == 0)  |  291  | 92  |           return FALSE;  |  292  | 14.7k  |         pbSrc = pbSrc + advance;  |  293  |  |  |  294  | 14.7k  |         if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)  |  295  | 3.82k  |         { |  296  | 3.82k  |           if (!buffer_within_range(pbSrc, PIXEL_SIZE, pbEnd))  |  297  | 128  |             return FALSE;  |  298  | 3.69k  |           SRCREADPIXEL(fgPel, pbSrc);  |  299  | 3.69k  |         }  |  300  |  |  |  301  | 14.6k  |         if (!buffer_within_range(pbSrc, runLength / 8, pbEnd))  |  302  | 646  |           return FALSE;  |  303  | 13.9k  |         if (fFirstLine)  |  304  | 2.80k  |         { |  305  | 18.7k  |           while (runLength > 8)  |  306  | 15.9k  |           { |  307  | 15.9k  |             bitmask = *pbSrc;  |  308  | 15.9k  |             pbSrc = pbSrc + 1;  |  309  | 15.9k  |             pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, 8);  |  310  |  |  |  311  | 15.9k  |             if (!pbDest)  |  312  | 14  |               return FALSE;  |  313  |  |  |  314  | 15.9k  |             runLength = runLength - 8;  |  315  | 15.9k  |           }  |  316  | 2.80k  |         }  |  317  | 11.1k  |         else  |  318  | 11.1k  |         { |  319  | 68.8k  |           while (runLength > 8)  |  320  | 57.7k  |           { |  321  | 57.7k  |             bitmask = *pbSrc++;  |  322  |  |  |  323  | 57.7k  |             pbDest = WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, 8);  |  324  |  |  |  325  | 57.7k  |             if (!pbDest)  |  326  | 88  |               return FALSE;  |  327  |  |  |  328  | 57.6k  |             runLength = runLength - 8;  |  329  | 57.6k  |           }  |  330  | 11.1k  |         }  |  331  |  |  |  332  | 13.8k  |         if (runLength > 0)  |  333  | 12.2k  |         { |  334  | 12.2k  |           if (!buffer_within_range(pbSrc, 1, pbEnd))  |  335  | 66  |             return FALSE;  |  336  | 12.1k  |           bitmask = *pbSrc++;  |  337  |  |  |  338  | 12.1k  |           if (fFirstLine)  |  339  | 1.81k  |           { |  340  | 1.81k  |             pbDest =  |  341  | 1.81k  |                 WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, bitmask, fgPel, runLength);  |  342  | 1.81k  |           }  |  343  | 10.3k  |           else  |  344  | 10.3k  |           { |  345  | 10.3k  |             pbDest =  |  346  | 10.3k  |                 WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, bitmask, fgPel, runLength);  |  347  | 10.3k  |           }  |  348  |  |  |  349  | 12.1k  |           if (!pbDest)  |  350  | 4  |             return FALSE;  |  351  | 12.1k  |         }  |  352  |  |  |  353  | 13.8k  |         break;  |  354  |  |  |  355  |  |       /* Handle Color Image Orders. */  |  356  | 13.8k  |       case REGULAR_COLOR_IMAGE:  |  357  | 9.95k  |       case MEGA_MEGA_COLOR_IMAGE:  |  358  | 9.95k  |         runLength = ExtractRunLength(code, pbSrc, pbEnd, &advance);  |  359  | 9.95k  |         if (advance == 0)  |  360  | 42  |           return FALSE;  |  361  | 9.91k  |         pbSrc = pbSrc + advance;  |  362  | 9.91k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength))  |  363  | 138  |           return FALSE;  |  364  | 9.77k  |         if (!ENSURE_CAPACITY(pbSrc, pbEnd, runLength))  |  365  | 514  |           return FALSE;  |  366  |  |  |  367  | 9.26k  |         UNROLL(runLength, { |  368  | 9.26k  |           SRCREADPIXEL(temp, pbSrc);  |  369  | 9.26k  |           DESTWRITEPIXEL(pbDest, temp);  |  370  | 9.26k  |         });  |  371  | 9.26k  |         break;  |  372  |  |  |  373  |  |       /* Handle Special Order 1. */  |  374  | 1.56k  |       case SPECIAL_FGBG_1:  |  375  | 1.56k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  376  | 0  |           return FALSE;  |  377  | 1.56k  |         pbSrc = pbSrc + 1;  |  378  |  |  |  379  | 1.56k  |         if (fFirstLine)  |  380  | 186  |         { |  381  | 186  |           pbDest =  |  382  | 186  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg1, fgPel, 8);  |  383  | 186  |         }  |  384  | 1.38k  |         else  |  385  | 1.38k  |         { |  386  | 1.38k  |           pbDest =  |  387  | 1.38k  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);  |  388  | 1.38k  |         }  |  389  |  |  |  390  | 1.56k  |         if (!pbDest)  |  391  | 2  |           return FALSE;  |  392  |  |  |  393  | 1.56k  |         break;  |  394  |  |  |  395  |  |       /* Handle Special Order 2. */  |  396  | 2.40k  |       case SPECIAL_FGBG_2:  |  397  | 2.40k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  398  | 0  |           return FALSE;  |  399  | 2.40k  |         pbSrc = pbSrc + 1;  |  400  |  |  |  401  | 2.40k  |         if (fFirstLine)  |  402  | 226  |         { |  403  | 226  |           pbDest =  |  404  | 226  |               WRITEFIRSTLINEFGBGIMAGE(pbDest, pbDestEnd, g_MaskSpecialFgBg2, fgPel, 8);  |  405  | 226  |         }  |  406  | 2.17k  |         else  |  407  | 2.17k  |         { |  408  | 2.17k  |           pbDest =  |  409  | 2.17k  |               WRITEFGBGIMAGE(pbDest, pbDestEnd, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);  |  410  | 2.17k  |         }  |  411  |  |  |  412  | 2.40k  |         if (!pbDest)  |  413  | 4  |           return FALSE;  |  414  |  |  |  415  | 2.39k  |         break;  |  416  |  |  |  417  |  |       /* Handle White Order. */  |  418  | 2.39k  |       case SPECIAL_WHITE:  |  419  | 1.50k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  420  | 0  |           return FALSE;  |  421  | 1.50k  |         pbSrc = pbSrc + 1;  |  422  |  |  |  423  | 1.50k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  424  | 2  |           return FALSE;  |  425  |  |  |  426  | 1.50k  |         DESTWRITEPIXEL(pbDest, WHITE_PIXEL);  |  427  | 1.50k  |         break;  |  428  |  |  |  429  |  |       /* Handle Black Order. */  |  430  | 1.95k  |       case SPECIAL_BLACK:  |  431  | 1.95k  |         if (!buffer_within_range(pbSrc, 1, pbEnd))  |  432  | 0  |           return FALSE;  |  433  | 1.95k  |         pbSrc = pbSrc + 1;  |  434  |  |  |  435  | 1.95k  |         if (!ENSURE_CAPACITY(pbDest, pbDestEnd, 1))  |  436  | 4  |           return FALSE;  |  437  |  |  |  438  | 1.95k  |         DESTWRITEPIXEL(pbDest, BLACK_PIXEL);  |  439  | 1.95k  |         break;  |  440  |  |  |  441  | 4.31k  |       default:  |  442  | 4.31k  |         WLog_ERR(TAG, "invalid code 0x%08" PRIx32 ", pbSrcBuffer=%p, pbSrc=%p, pbEnd=%p",  |  443  | 4.31k  |                  code, pbSrcBuffer, pbSrc, pbEnd);  |  444  | 4.31k  |         return FALSE;  |  445  | 155k  |     }  |  446  | 155k  |   }  |  447  |  |  |  448  | 2.77k  |   return TRUE;  |  449  | 11.4k  | }  |  
 Unexecuted instantiation: interleaved.c:RleDecompress8to8  |