OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "fx_bmp.h" | 7 #include "fx_bmp.h" |
8 FX_DWORD _GetDWord_LSBFirst(FX_LPBYTE p) | 8 FX_DWORD _GetDWord_LSBFirst(FX_LPBYTE p) |
9 { | 9 { |
10 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); | 10 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); |
11 } | 11 } |
12 FX_WORD _GetWord_LSBFirst(FX_LPBYTE p) | 12 FX_WORD _GetWord_LSBFirst(FX_LPBYTE p) |
13 { | 13 { |
14 return p[0] | (p[1] << 8); | 14 return p[0] | (p[1] << 8); |
15 } | 15 } |
16 void _SetDWord_LSBFirst(FX_LPBYTE p, FX_DWORD v) | 16 void _SetDWord_LSBFirst(FX_LPBYTE p, FX_DWORD v) |
17 { | 17 { |
18 p[0] = (FX_BYTE)v; | 18 p[0] = (uint8_t)v; |
19 p[1] = (FX_BYTE)(v >> 8); | 19 p[1] = (uint8_t)(v >> 8); |
20 p[2] = (FX_BYTE)(v >> 16); | 20 p[2] = (uint8_t)(v >> 16); |
21 p[3] = (FX_BYTE)(v >> 24); | 21 p[3] = (uint8_t)(v >> 24); |
22 } | 22 } |
23 void _SetWord_LSBFirst(FX_LPBYTE p, FX_WORD v) | 23 void _SetWord_LSBFirst(FX_LPBYTE p, FX_WORD v) |
24 { | 24 { |
25 p[0] = (FX_BYTE)v; | 25 p[0] = (uint8_t)v; |
26 p[1] = (FX_BYTE)(v >> 8); | 26 p[1] = (uint8_t)(v >> 8); |
27 } | 27 } |
28 void _bmp_error(bmp_decompress_struct_p bmp_ptr, FX_LPCSTR err_msg) | 28 void _bmp_error(bmp_decompress_struct_p bmp_ptr, FX_LPCSTR err_msg) |
29 { | 29 { |
30 if(bmp_ptr != NULL && bmp_ptr->_bmp_error_fn != NULL) { | 30 if(bmp_ptr != NULL && bmp_ptr->_bmp_error_fn != NULL) { |
31 bmp_ptr->_bmp_error_fn(bmp_ptr, err_msg); | 31 bmp_ptr->_bmp_error_fn(bmp_ptr, err_msg); |
32 } | 32 } |
33 } | 33 } |
34 bmp_decompress_struct_p _bmp_create_decompress() | 34 bmp_decompress_struct_p _bmp_create_decompress() |
35 { | 35 { |
36 bmp_decompress_struct_p bmp_ptr = FX_Alloc(bmp_decompress_struct, 1); | 36 bmp_decompress_struct_p bmp_ptr = FX_Alloc(bmp_decompress_struct, 1); |
(...skipping 16 matching lines...) Expand all Loading... |
53 FX_Free(bmp_ptr->out_row_buffer); | 53 FX_Free(bmp_ptr->out_row_buffer); |
54 } | 54 } |
55 if(bmp_ptr->pal_ptr != NULL) { | 55 if(bmp_ptr->pal_ptr != NULL) { |
56 FX_Free(bmp_ptr->pal_ptr); | 56 FX_Free(bmp_ptr->pal_ptr); |
57 } | 57 } |
58 if(bmp_ptr->bmp_header_ptr != NULL) { | 58 if(bmp_ptr->bmp_header_ptr != NULL) { |
59 FX_Free(bmp_ptr->bmp_header_ptr); | 59 FX_Free(bmp_ptr->bmp_header_ptr); |
60 } | 60 } |
61 FX_Free(bmp_ptr); | 61 FX_Free(bmp_ptr); |
62 } | 62 } |
63 FX_INT32 _bmp_read_header(bmp_decompress_struct_p bmp_ptr) | 63 int32_t _bmp_read_header(bmp_decompress_struct_p bmp_ptr) |
64 { | 64 { |
65 if(bmp_ptr == NULL) { | 65 if(bmp_ptr == NULL) { |
66 return 0; | 66 return 0; |
67 } | 67 } |
68 FX_DWORD skip_size_org = bmp_ptr->skip_size; | 68 FX_DWORD skip_size_org = bmp_ptr->skip_size; |
69 if(bmp_ptr->decode_status == BMP_D_STATUS_HEADER) { | 69 if(bmp_ptr->decode_status == BMP_D_STATUS_HEADER) { |
70 ASSERT(sizeof(BmpFileHeader) == 14); | 70 ASSERT(sizeof(BmpFileHeader) == 14); |
71 BmpFileHeader* bmp_header_ptr = NULL; | 71 BmpFileHeader* bmp_header_ptr = NULL; |
72 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_header_ptr, 14) == NULL) { | 72 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_header_ptr, 14) == NULL) { |
73 return 2; | 73 return 2; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 106 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
107 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_info_header_ptr,
bmp_ptr->img_ifh_size) == NULL) { | 107 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_info_header_ptr,
bmp_ptr->img_ifh_size) == NULL) { |
108 bmp_ptr->skip_size = skip_size_org; | 108 bmp_ptr->skip_size = skip_size_org; |
109 return 2; | 109 return 2; |
110 } | 110 } |
111 bmp_ptr->width = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_info_hea
der_ptr->biWidth); | 111 bmp_ptr->width = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_info_hea
der_ptr->biWidth); |
112 bmp_ptr->height = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_info_he
ader_ptr->biHeight); | 112 bmp_ptr->height = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_info_he
ader_ptr->biHeight); |
113 bmp_ptr->bitCounts = _GetWord_LSBFirst((FX_LPBYTE)&bmp_info_
header_ptr->biBitCount); | 113 bmp_ptr->bitCounts = _GetWord_LSBFirst((FX_LPBYTE)&bmp_info_
header_ptr->biBitCount); |
114 bmp_ptr->compress_flag = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_
info_header_ptr->biCompression); | 114 bmp_ptr->compress_flag = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_
info_header_ptr->biCompression); |
115 bmp_ptr->color_used = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_inf
o_header_ptr->biClrUsed); | 115 bmp_ptr->color_used = _GetDWord_LSBFirst((FX_LPBYTE)&bmp_inf
o_header_ptr->biClrUsed); |
116 bmp_ptr->dpi_x = (FX_INT32)_GetDWord_LSBFirst((FX_LPBYTE)&bm
p_info_header_ptr->biXPelsPerMeter); | 116 bmp_ptr->dpi_x = (int32_t)_GetDWord_LSBFirst((FX_LPBYTE)&bmp
_info_header_ptr->biXPelsPerMeter); |
117 bmp_ptr->dpi_y = (FX_INT32)_GetDWord_LSBFirst((FX_LPBYTE)&bm
p_info_header_ptr->biYPelsPerMeter); | 117 bmp_ptr->dpi_y = (int32_t)_GetDWord_LSBFirst((FX_LPBYTE)&bmp
_info_header_ptr->biYPelsPerMeter); |
118 if(bmp_ptr->height < 0) { | 118 if(bmp_ptr->height < 0) { |
119 bmp_ptr->height = -bmp_ptr->height; | 119 bmp_ptr->height = -bmp_ptr->height; |
120 bmp_ptr->imgTB_flag = TRUE; | 120 bmp_ptr->imgTB_flag = TRUE; |
121 } | 121 } |
122 } | 122 } |
123 break; | 123 break; |
124 default: { | 124 default: { |
125 if(bmp_ptr->img_ifh_size > FX_MIN(40, sizeof(BmpInfoHeader))
) { | 125 if(bmp_ptr->img_ifh_size > FX_MIN(40, sizeof(BmpInfoHeader))
) { |
126 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 126 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
127 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_info_header_
ptr, bmp_ptr->img_ifh_size) == NULL) { | 127 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&bmp_info_header_
ptr, bmp_ptr->img_ifh_size) == NULL) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 break; | 190 break; |
191 case 32: | 191 case 32: |
192 bmp_ptr->out_row_bytes = bmp_ptr->src_row_bytes; | 192 bmp_ptr->out_row_bytes = bmp_ptr->src_row_bytes; |
193 bmp_ptr->components = 4; | 193 bmp_ptr->components = 4; |
194 break; | 194 break; |
195 } | 195 } |
196 if(bmp_ptr->out_row_buffer != NULL) { | 196 if(bmp_ptr->out_row_buffer != NULL) { |
197 FX_Free(bmp_ptr->out_row_buffer); | 197 FX_Free(bmp_ptr->out_row_buffer); |
198 bmp_ptr->out_row_buffer = NULL; | 198 bmp_ptr->out_row_buffer = NULL; |
199 } | 199 } |
200 bmp_ptr->out_row_buffer = FX_Alloc(FX_BYTE, bmp_ptr->out_row_bytes); | 200 bmp_ptr->out_row_buffer = FX_Alloc(uint8_t, bmp_ptr->out_row_bytes); |
201 BMP_PTR_NOT_NULL(bmp_ptr->out_row_buffer, bmp_ptr); | 201 BMP_PTR_NOT_NULL(bmp_ptr->out_row_buffer, bmp_ptr); |
202 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); | 202 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); |
203 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_PAL); | 203 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_PAL); |
204 } | 204 } |
205 if (bmp_ptr->decode_status == BMP_D_STATUS_PAL) { | 205 if (bmp_ptr->decode_status == BMP_D_STATUS_PAL) { |
206 skip_size_org = bmp_ptr->skip_size; | 206 skip_size_org = bmp_ptr->skip_size; |
207 #ifdef BMP_SUPPORT_BITFIELD | 207 #ifdef BMP_SUPPORT_BITFIELD |
208 if(bmp_ptr->compress_flag == BMP_BITFIELDS) { | 208 if(bmp_ptr->compress_flag == BMP_BITFIELDS) { |
209 if(bmp_ptr->bitCounts != 16 && bmp_ptr->bitCounts != 32) { | 209 if(bmp_ptr->bitCounts != 16 && bmp_ptr->bitCounts != 32) { |
210 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); | 210 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&src_pal_ptr, src_pal_size) =
= NULL) { | 251 if(_bmp_read_data(bmp_ptr, (FX_LPBYTE*)&src_pal_ptr, src_pal_size) =
= NULL) { |
252 bmp_ptr->skip_size = skip_size_org; | 252 bmp_ptr->skip_size = skip_size_org; |
253 return 2; | 253 return 2; |
254 } | 254 } |
255 if(bmp_ptr->pal_ptr != NULL) { | 255 if(bmp_ptr->pal_ptr != NULL) { |
256 FX_Free(bmp_ptr->pal_ptr); | 256 FX_Free(bmp_ptr->pal_ptr); |
257 bmp_ptr->pal_ptr = NULL; | 257 bmp_ptr->pal_ptr = NULL; |
258 } | 258 } |
259 bmp_ptr->pal_ptr = FX_Alloc(FX_DWORD, bmp_ptr->pal_num); | 259 bmp_ptr->pal_ptr = FX_Alloc(FX_DWORD, bmp_ptr->pal_num); |
260 BMP_PTR_NOT_NULL(bmp_ptr->pal_ptr, bmp_ptr); | 260 BMP_PTR_NOT_NULL(bmp_ptr->pal_ptr, bmp_ptr); |
261 FX_INT32 src_pal_index = 0; | 261 int32_t src_pal_index = 0; |
262 if(bmp_ptr->pal_type == BMP_PAL_OLD) { | 262 if(bmp_ptr->pal_type == BMP_PAL_OLD) { |
263 while(src_pal_index < bmp_ptr->pal_num) { | 263 while(src_pal_index < bmp_ptr->pal_num) { |
264 bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE(0x00, src
_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); | 264 bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE(0x00, src
_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); |
265 src_pal_ptr += 3; | 265 src_pal_ptr += 3; |
266 } | 266 } |
267 } else { | 267 } else { |
268 while(src_pal_index < bmp_ptr->pal_num) { | 268 while(src_pal_index < bmp_ptr->pal_num) { |
269 bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE(src_pal_p
tr[3], src_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); | 269 bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE(src_pal_p
tr[3], src_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); |
270 src_pal_ptr += 4; | 270 src_pal_ptr += 4; |
271 } | 271 } |
272 } | 272 } |
273 } | 273 } |
274 if(bmp_ptr->bmp_header_ptr->bfOffBits < 14 + bmp_ptr->img_ifh_size + bmp
_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4)) { | 274 if(bmp_ptr->bmp_header_ptr->bfOffBits < 14 + bmp_ptr->img_ifh_size + bmp
_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4)) { |
275 bmp_ptr->bmp_header_ptr->bfOffBits = 14 + bmp_ptr->img_ifh_size + bm
p_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4); | 275 bmp_ptr->bmp_header_ptr->bfOffBits = 14 + bmp_ptr->img_ifh_size + bm
p_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4); |
276 } | 276 } |
277 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA_PRE); | 277 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA_PRE); |
278 } | 278 } |
279 return 1; | 279 return 1; |
280 } | 280 } |
281 FX_INT32 _bmp_decode_image(bmp_decompress_struct_p bmp_ptr) | 281 int32_t _bmp_decode_image(bmp_decompress_struct_p bmp_ptr) |
282 { | 282 { |
283 if(bmp_ptr->decode_status == BMP_D_STATUS_DATA_PRE) { | 283 if(bmp_ptr->decode_status == BMP_D_STATUS_DATA_PRE) { |
284 bmp_ptr->avail_in = 0; | 284 bmp_ptr->avail_in = 0; |
285 if(!bmp_ptr->_bmp_get_data_position_fn(bmp_ptr, bmp_ptr->bmp_header_ptr-
>bfOffBits)) { | 285 if(!bmp_ptr->_bmp_get_data_position_fn(bmp_ptr, bmp_ptr->bmp_header_ptr-
>bfOffBits)) { |
286 bmp_ptr->decode_status = BMP_D_STATUS_TAIL; | 286 bmp_ptr->decode_status = BMP_D_STATUS_TAIL; |
287 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt, Unexpected Stream Offs
et"); | 287 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt, Unexpected Stream Offs
et"); |
288 return 0; | 288 return 0; |
289 } | 289 } |
290 bmp_ptr->row_num = 0; | 290 bmp_ptr->row_num = 0; |
291 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); | 291 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); |
292 } | 292 } |
293 if(bmp_ptr->decode_status == BMP_D_STATUS_DATA) { | 293 if(bmp_ptr->decode_status == BMP_D_STATUS_DATA) { |
294 switch(bmp_ptr->compress_flag) { | 294 switch(bmp_ptr->compress_flag) { |
295 case BMP_RGB: | 295 case BMP_RGB: |
296 case BMP_BITFIELDS: | 296 case BMP_BITFIELDS: |
297 return _bmp_decode_rgb(bmp_ptr); | 297 return _bmp_decode_rgb(bmp_ptr); |
298 case BMP_RLE8: | 298 case BMP_RLE8: |
299 return _bmp_decode_rle8(bmp_ptr); | 299 return _bmp_decode_rle8(bmp_ptr); |
300 case BMP_RLE4: | 300 case BMP_RLE4: |
301 return _bmp_decode_rle4(bmp_ptr); | 301 return _bmp_decode_rle4(bmp_ptr); |
302 } | 302 } |
303 } | 303 } |
304 _bmp_error(bmp_ptr, "Any Uncontrol Error"); | 304 _bmp_error(bmp_ptr, "Any Uncontrol Error"); |
305 return 0; | 305 return 0; |
306 } | 306 } |
307 FX_INT32 _bmp_decode_rgb(bmp_decompress_struct_p bmp_ptr) | 307 int32_t _bmp_decode_rgb(bmp_decompress_struct_p bmp_ptr) |
308 { | 308 { |
309 FX_LPBYTE row_buf = bmp_ptr->out_row_buffer; | 309 FX_LPBYTE row_buf = bmp_ptr->out_row_buffer; |
310 FX_LPBYTE des_buf = NULL; | 310 FX_LPBYTE des_buf = NULL; |
311 while (bmp_ptr->row_num < bmp_ptr->height) { | 311 while (bmp_ptr->row_num < bmp_ptr->height) { |
312 if(_bmp_read_data(bmp_ptr, &des_buf, bmp_ptr->src_row_bytes) == NULL) { | 312 if(_bmp_read_data(bmp_ptr, &des_buf, bmp_ptr->src_row_bytes) == NULL) { |
313 return 2; | 313 return 2; |
314 } | 314 } |
315 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); | 315 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); |
316 switch(bmp_ptr->bitCounts) { | 316 switch(bmp_ptr->bitCounts) { |
317 case 1: { | 317 case 1: { |
318 for (FX_INT32 col = 0; col < bmp_ptr->width; col++) { | 318 for (int32_t col = 0; col < bmp_ptr->width; col++) { |
319 *row_buf++ = des_buf[col >> 3] & (0x80 >> (col % 8)) ? 0
x01 : 0x00; | 319 *row_buf++ = des_buf[col >> 3] & (0x80 >> (col % 8)) ? 0
x01 : 0x00; |
320 } | 320 } |
321 } | 321 } |
322 break; | 322 break; |
323 case 4: { | 323 case 4: { |
324 for (FX_INT32 col = 0; col < bmp_ptr->width; col++) { | 324 for (int32_t col = 0; col < bmp_ptr->width; col++) { |
325 *row_buf++ = (col & 0x01) ? | 325 *row_buf++ = (col & 0x01) ? |
326 (des_buf[col >> 1] & 0x0F) : | 326 (des_buf[col >> 1] & 0x0F) : |
327 ((des_buf[col >> 1] & 0xF0) >> 4); | 327 ((des_buf[col >> 1] & 0xF0) >> 4); |
328 } | 328 } |
329 } | 329 } |
330 break; | 330 break; |
331 #ifdef BMP_SUPPORT_BITFIELD | 331 #ifdef BMP_SUPPORT_BITFIELD |
332 case 16: { | 332 case 16: { |
333 FX_WORD* buf = (FX_WORD*)des_buf; | 333 FX_WORD* buf = (FX_WORD*)des_buf; |
334 FX_BYTE blue_bits = 0; | 334 uint8_t blue_bits = 0; |
335 FX_BYTE green_bits = 0; | 335 uint8_t green_bits = 0; |
336 FX_BYTE red_bits = 0; | 336 uint8_t red_bits = 0; |
337 for(FX_INT32 i = 0; i < 16; i++) { | 337 for(int32_t i = 0; i < 16; i++) { |
338 if((bmp_ptr->mask_blue >> i) & 0x01) { | 338 if((bmp_ptr->mask_blue >> i) & 0x01) { |
339 blue_bits++; | 339 blue_bits++; |
340 } | 340 } |
341 if((bmp_ptr->mask_green >> i) & 0x01) { | 341 if((bmp_ptr->mask_green >> i) & 0x01) { |
342 green_bits++; | 342 green_bits++; |
343 } | 343 } |
344 if((bmp_ptr->mask_red >> i) & 0x01) { | 344 if((bmp_ptr->mask_red >> i) & 0x01) { |
345 red_bits++; | 345 red_bits++; |
346 } | 346 } |
347 } | 347 } |
348 green_bits += blue_bits; | 348 green_bits += blue_bits; |
349 red_bits += green_bits; | 349 red_bits += green_bits; |
350 blue_bits = 8 - blue_bits; | 350 blue_bits = 8 - blue_bits; |
351 green_bits -= 8; | 351 green_bits -= 8; |
352 red_bits -= 8; | 352 red_bits -= 8; |
353 for (FX_INT32 col = 0; col < bmp_ptr->width; col++) { | 353 for (int32_t col = 0; col < bmp_ptr->width; col++) { |
354 *buf = _GetWord_LSBFirst((FX_LPBYTE)buf); | 354 *buf = _GetWord_LSBFirst((FX_LPBYTE)buf); |
355 *row_buf++ = (FX_BYTE)((*buf & bmp_ptr->mask_blue) << bl
ue_bits); | 355 *row_buf++ = (uint8_t)((*buf & bmp_ptr->mask_blue) << bl
ue_bits); |
356 *row_buf++ = (FX_BYTE)((*buf & bmp_ptr->mask_green) >> g
reen_bits); | 356 *row_buf++ = (uint8_t)((*buf & bmp_ptr->mask_green) >> g
reen_bits); |
357 *row_buf++ = (FX_BYTE)((*buf++ & bmp_ptr->mask_red) >> r
ed_bits); | 357 *row_buf++ = (uint8_t)((*buf++ & bmp_ptr->mask_red) >> r
ed_bits); |
358 } | 358 } |
359 } | 359 } |
360 break; | 360 break; |
361 #endif | 361 #endif |
362 case 8: | 362 case 8: |
363 case 24: | 363 case 24: |
364 case 32: | 364 case 32: |
365 FXSYS_memcpy32(bmp_ptr->out_row_buffer, des_buf, bmp_ptr->src_ro
w_bytes); | 365 FXSYS_memcpy32(bmp_ptr->out_row_buffer, des_buf, bmp_ptr->src_ro
w_bytes); |
366 break; | 366 break; |
367 } | 367 } |
368 row_buf = bmp_ptr->out_row_buffer; | 368 row_buf = bmp_ptr->out_row_buffer; |
369 bmp_ptr->_bmp_get_row_fn(bmp_ptr, | 369 bmp_ptr->_bmp_get_row_fn(bmp_ptr, |
370 bmp_ptr->imgTB_flag ? bmp_ptr->row_num++ : (bmp
_ptr->height - 1 - bmp_ptr->row_num++), | 370 bmp_ptr->imgTB_flag ? bmp_ptr->row_num++ : (bmp
_ptr->height - 1 - bmp_ptr->row_num++), |
371 bmp_ptr->out_row_buffer); | 371 bmp_ptr->out_row_buffer); |
372 } | 372 } |
373 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); | 373 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); |
374 return 1; | 374 return 1; |
375 } | 375 } |
376 FX_INT32 _bmp_decode_rle8(bmp_decompress_struct_p bmp_ptr) | 376 int32_t _bmp_decode_rle8(bmp_decompress_struct_p bmp_ptr) |
377 { | 377 { |
378 FX_LPBYTE first_byte_ptr = NULL; | 378 FX_LPBYTE first_byte_ptr = NULL; |
379 FX_LPBYTE second_byte_ptr = NULL; | 379 FX_LPBYTE second_byte_ptr = NULL; |
380 bmp_ptr->col_num = 0; | 380 bmp_ptr->col_num = 0; |
381 while(TRUE) { | 381 while(TRUE) { |
382 FX_DWORD skip_size_org = bmp_ptr->skip_size; | 382 FX_DWORD skip_size_org = bmp_ptr->skip_size; |
383 if(_bmp_read_data(bmp_ptr, &first_byte_ptr, 1) == NULL) { | 383 if(_bmp_read_data(bmp_ptr, &first_byte_ptr, 1) == NULL) { |
384 return 2; | 384 return 2; |
385 } | 385 } |
386 switch(*first_byte_ptr) { | 386 switch(*first_byte_ptr) { |
(...skipping 25 matching lines...) Expand all Loading... |
412 } | 412 } |
413 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_
TAIL); | 413 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_
TAIL); |
414 return 1; | 414 return 1; |
415 } | 415 } |
416 case RLE_DELTA: { | 416 case RLE_DELTA: { |
417 FX_LPBYTE delta_ptr; | 417 FX_LPBYTE delta_ptr; |
418 if(_bmp_read_data(bmp_ptr, &delta_ptr, 2) == NUL
L) { | 418 if(_bmp_read_data(bmp_ptr, &delta_ptr, 2) == NUL
L) { |
419 bmp_ptr->skip_size = skip_size_org; | 419 bmp_ptr->skip_size = skip_size_org; |
420 return 2; | 420 return 2; |
421 } | 421 } |
422 bmp_ptr->col_num += (FX_INT32)delta_ptr[0]; | 422 bmp_ptr->col_num += (int32_t)delta_ptr[0]; |
423 FX_INT32 bmp_row_num_next = bmp_ptr->row_num + (
FX_INT32)delta_ptr[1]; | 423 int32_t bmp_row_num_next = bmp_ptr->row_num + (i
nt32_t)delta_ptr[1]; |
424 if(bmp_ptr->col_num >= bmp_ptr->out_row_bytes ||
bmp_row_num_next >= bmp_ptr->height) { | 424 if(bmp_ptr->col_num >= bmp_ptr->out_row_bytes ||
bmp_row_num_next >= bmp_ptr->height) { |
425 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
Or Not Supported"); | 425 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
Or Not Supported"); |
426 return 0; | 426 return 0; |
427 } | 427 } |
428 while(bmp_ptr->row_num < bmp_row_num_next) { | 428 while(bmp_ptr->row_num < bmp_row_num_next) { |
429 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, b
mp_ptr->out_row_bytes); | 429 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, b
mp_ptr->out_row_bytes); |
430 bmp_ptr->_bmp_get_row_fn(bmp_ptr, | 430 bmp_ptr->_bmp_get_row_fn(bmp_ptr, |
431 bmp_ptr->imgTB_flag
? bmp_ptr->row_num++ : (bmp_ptr->height - 1 - bmp_ptr->row_num++), | 431 bmp_ptr->imgTB_flag
? bmp_ptr->row_num++ : (bmp_ptr->height - 1 - bmp_ptr->row_num++), |
432 bmp_ptr->out_row_bu
ffer); | 432 bmp_ptr->out_row_bu
ffer); |
433 } | 433 } |
434 } | 434 } |
435 break; | 435 break; |
436 default: { | 436 default: { |
437 if((FX_INT32)(*first_byte_ptr) > bmp_ptr->src_ro
w_bytes - bmp_ptr->col_num) { | 437 if((int32_t)(*first_byte_ptr) > bmp_ptr->src_row
_bytes - bmp_ptr->col_num) { |
438 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
"); | 438 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
"); |
439 return 0; | 439 return 0; |
440 } | 440 } |
441 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, | 441 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, |
442 *first_byte_ptr & 1 ? *first_b
yte_ptr + 1 : *first_byte_ptr) == NULL) { | 442 *first_byte_ptr & 1 ? *first_b
yte_ptr + 1 : *first_byte_ptr) == NULL) { |
443 bmp_ptr->skip_size = skip_size_org; | 443 bmp_ptr->skip_size = skip_size_org; |
444 return 2; | 444 return 2; |
445 } | 445 } |
446 FXSYS_memcpy32(bmp_ptr->out_row_buffer + bmp_ptr
->col_num, second_byte_ptr, *first_byte_ptr); | 446 FXSYS_memcpy32(bmp_ptr->out_row_buffer + bmp_ptr
->col_num, second_byte_ptr, *first_byte_ptr); |
447 bmp_ptr->col_num += (FX_INT32)(*first_byte_ptr); | 447 bmp_ptr->col_num += (int32_t)(*first_byte_ptr); |
448 } | 448 } |
449 } | 449 } |
450 } | 450 } |
451 break; | 451 break; |
452 default: { | 452 default: { |
453 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, 1) == NULL) { | 453 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, 1) == NULL) { |
454 bmp_ptr->skip_size = skip_size_org; | 454 bmp_ptr->skip_size = skip_size_org; |
455 return 2; | 455 return 2; |
456 } | 456 } |
457 if((FX_INT32)(*first_byte_ptr) > bmp_ptr->src_row_bytes - bm
p_ptr->col_num) { | 457 if((int32_t)(*first_byte_ptr) > bmp_ptr->src_row_bytes - bmp
_ptr->col_num) { |
458 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); | 458 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); |
459 return 0; | 459 return 0; |
460 } | 460 } |
461 FXSYS_memset8(bmp_ptr->out_row_buffer + bmp_ptr->col_num, *s
econd_byte_ptr, *first_byte_ptr); | 461 FXSYS_memset8(bmp_ptr->out_row_buffer + bmp_ptr->col_num, *s
econd_byte_ptr, *first_byte_ptr); |
462 bmp_ptr->col_num += (FX_INT32)(*first_byte_ptr); | 462 bmp_ptr->col_num += (int32_t)(*first_byte_ptr); |
463 } | 463 } |
464 } | 464 } |
465 } | 465 } |
466 _bmp_error(bmp_ptr, "Any Uncontrol Error"); | 466 _bmp_error(bmp_ptr, "Any Uncontrol Error"); |
467 return 0; | 467 return 0; |
468 } | 468 } |
469 FX_INT32 _bmp_decode_rle4(bmp_decompress_struct_p bmp_ptr) | 469 int32_t _bmp_decode_rle4(bmp_decompress_struct_p bmp_ptr) |
470 { | 470 { |
471 FX_LPBYTE first_byte_ptr = NULL; | 471 FX_LPBYTE first_byte_ptr = NULL; |
472 FX_LPBYTE second_byte_ptr = NULL; | 472 FX_LPBYTE second_byte_ptr = NULL; |
473 bmp_ptr->col_num = 0; | 473 bmp_ptr->col_num = 0; |
474 while (TRUE) { | 474 while (TRUE) { |
475 FX_DWORD skip_size_org = bmp_ptr->skip_size; | 475 FX_DWORD skip_size_org = bmp_ptr->skip_size; |
476 if(_bmp_read_data(bmp_ptr, &first_byte_ptr, 1) == NULL) { | 476 if(_bmp_read_data(bmp_ptr, &first_byte_ptr, 1) == NULL) { |
477 return 2; | 477 return 2; |
478 } | 478 } |
479 switch(*first_byte_ptr) { | 479 switch(*first_byte_ptr) { |
(...skipping 25 matching lines...) Expand all Loading... |
505 } | 505 } |
506 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_
TAIL); | 506 _bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_
TAIL); |
507 return 1; | 507 return 1; |
508 } | 508 } |
509 case RLE_DELTA: { | 509 case RLE_DELTA: { |
510 FX_LPBYTE delta_ptr; | 510 FX_LPBYTE delta_ptr; |
511 if(_bmp_read_data(bmp_ptr, &delta_ptr, 2) == NUL
L) { | 511 if(_bmp_read_data(bmp_ptr, &delta_ptr, 2) == NUL
L) { |
512 bmp_ptr->skip_size = skip_size_org; | 512 bmp_ptr->skip_size = skip_size_org; |
513 return 2; | 513 return 2; |
514 } | 514 } |
515 bmp_ptr->col_num += (FX_INT32)delta_ptr[0]; | 515 bmp_ptr->col_num += (int32_t)delta_ptr[0]; |
516 FX_INT32 bmp_row_num_next = bmp_ptr->row_num + (
FX_INT32)delta_ptr[1]; | 516 int32_t bmp_row_num_next = bmp_ptr->row_num + (i
nt32_t)delta_ptr[1]; |
517 if(bmp_ptr->col_num >= bmp_ptr->out_row_bytes ||
bmp_row_num_next >= bmp_ptr->height) { | 517 if(bmp_ptr->col_num >= bmp_ptr->out_row_bytes ||
bmp_row_num_next >= bmp_ptr->height) { |
518 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
Or Not Supported"); | 518 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt
Or Not Supported"); |
519 return 0; | 519 return 0; |
520 } | 520 } |
521 while(bmp_ptr->row_num < bmp_row_num_next) { | 521 while(bmp_ptr->row_num < bmp_row_num_next) { |
522 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, b
mp_ptr->out_row_bytes); | 522 FXSYS_memset32(bmp_ptr->out_row_buffer, 0, b
mp_ptr->out_row_bytes); |
523 bmp_ptr->_bmp_get_row_fn(bmp_ptr, | 523 bmp_ptr->_bmp_get_row_fn(bmp_ptr, |
524 bmp_ptr->imgTB_flag
? bmp_ptr->row_num++ : (bmp_ptr->height - 1 - bmp_ptr->row_num++), | 524 bmp_ptr->imgTB_flag
? bmp_ptr->row_num++ : (bmp_ptr->height - 1 - bmp_ptr->row_num++), |
525 bmp_ptr->out_row_bu
ffer); | 525 bmp_ptr->out_row_bu
ffer); |
526 } | 526 } |
527 } | 527 } |
528 break; | 528 break; |
529 default: { | 529 default: { |
530 FX_BYTE size = (FX_BYTE)(((FX_WORD)(*first_byte_
ptr) + 1) >> 1); | 530 uint8_t size = (uint8_t)(((FX_WORD)(*first_byte_
ptr) + 1) >> 1); |
531 if((FX_INT32)*first_byte_ptr >= bmp_ptr->out_row
_bytes - bmp_ptr->col_num) { | 531 if((int32_t)*first_byte_ptr >= bmp_ptr->out_row_
bytes - bmp_ptr->col_num) { |
532 if(size + (bmp_ptr->col_num >> 1) > bmp_ptr-
>src_row_bytes) { | 532 if(size + (bmp_ptr->col_num >> 1) > bmp_ptr-
>src_row_bytes) { |
533 _bmp_error(bmp_ptr, "The Bmp File Is Cor
rupt"); | 533 _bmp_error(bmp_ptr, "The Bmp File Is Cor
rupt"); |
534 return 0; | 534 return 0; |
535 } | 535 } |
536 *first_byte_ptr = bmp_ptr->out_row_bytes - b
mp_ptr->col_num - 1; | 536 *first_byte_ptr = bmp_ptr->out_row_bytes - b
mp_ptr->col_num - 1; |
537 } | 537 } |
538 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, siz
e & 1 ? size + 1 : size) == NULL) { | 538 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, siz
e & 1 ? size + 1 : size) == NULL) { |
539 bmp_ptr->skip_size = skip_size_org; | 539 bmp_ptr->skip_size = skip_size_org; |
540 return 2; | 540 return 2; |
541 } | 541 } |
542 for (FX_BYTE i = 0; i < *first_byte_ptr; i++) { | 542 for (uint8_t i = 0; i < *first_byte_ptr; i++) { |
543 if(i & 0x01) { | 543 if(i & 0x01) { |
544 *(bmp_ptr->out_row_buffer + bmp_ptr->col
_num++) = (*second_byte_ptr++ & 0x0F); | 544 *(bmp_ptr->out_row_buffer + bmp_ptr->col
_num++) = (*second_byte_ptr++ & 0x0F); |
545 } else { | 545 } else { |
546 *(bmp_ptr->out_row_buffer + bmp_ptr->col
_num++) = ((*second_byte_ptr & 0xF0) >> 4); | 546 *(bmp_ptr->out_row_buffer + bmp_ptr->col
_num++) = ((*second_byte_ptr & 0xF0) >> 4); |
547 } | 547 } |
548 } | 548 } |
549 } | 549 } |
550 } | 550 } |
551 } | 551 } |
552 break; | 552 break; |
553 default: { | 553 default: { |
554 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, 1) == NULL) { | 554 if(_bmp_read_data(bmp_ptr, &second_byte_ptr, 1) == NULL) { |
555 bmp_ptr->skip_size = skip_size_org; | 555 bmp_ptr->skip_size = skip_size_org; |
556 return 2; | 556 return 2; |
557 } | 557 } |
558 if((FX_INT32)*first_byte_ptr > bmp_ptr->out_row_bytes - bmp_
ptr->col_num) { | 558 if((int32_t)*first_byte_ptr > bmp_ptr->out_row_bytes - bmp_p
tr->col_num) { |
559 FX_BYTE size = (FX_BYTE)(((FX_WORD)(*first_byte_ptr) + 1
) >> 1); | 559 uint8_t size = (uint8_t)(((FX_WORD)(*first_byte_ptr) + 1
) >> 1); |
560 if(size + (bmp_ptr->col_num >> 1) > bmp_ptr->src_row_byt
es) { | 560 if(size + (bmp_ptr->col_num >> 1) > bmp_ptr->src_row_byt
es) { |
561 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); | 561 _bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); |
562 return 0; | 562 return 0; |
563 } | 563 } |
564 *first_byte_ptr = bmp_ptr->out_row_bytes - bmp_ptr->col_
num - 1; | 564 *first_byte_ptr = bmp_ptr->out_row_bytes - bmp_ptr->col_
num - 1; |
565 } | 565 } |
566 for (FX_BYTE i = 0; i < *first_byte_ptr; i++) { | 566 for (uint8_t i = 0; i < *first_byte_ptr; i++) { |
567 if(i & 0x01) { | 567 if(i & 0x01) { |
568 *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = (*
second_byte_ptr & 0x0F); | 568 *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = (*
second_byte_ptr & 0x0F); |
569 } else { | 569 } else { |
570 *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = ((
*second_byte_ptr & 0xF0) >> 4); | 570 *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = ((
*second_byte_ptr & 0xF0) >> 4); |
571 } | 571 } |
572 } | 572 } |
573 } | 573 } |
574 } | 574 } |
575 } | 575 } |
576 _bmp_error(bmp_ptr, "Any Uncontrol Error"); | 576 _bmp_error(bmp_ptr, "Any Uncontrol Error"); |
577 return 0; | 577 return 0; |
578 } | 578 } |
579 FX_LPBYTE _bmp_read_data(bmp_decompress_struct_p bmp_ptr, FX_LPBYTE* des_buf_pp,
FX_DWORD data_size) | 579 FX_LPBYTE _bmp_read_data(bmp_decompress_struct_p bmp_ptr, FX_LPBYTE* des_buf_pp,
FX_DWORD data_size) |
580 { | 580 { |
581 if(bmp_ptr == NULL || | 581 if(bmp_ptr == NULL || |
582 bmp_ptr->avail_in < bmp_ptr->skip_size + data_size) { | 582 bmp_ptr->avail_in < bmp_ptr->skip_size + data_size) { |
583 return NULL; | 583 return NULL; |
584 } | 584 } |
585 *des_buf_pp = bmp_ptr->next_in + bmp_ptr->skip_size; | 585 *des_buf_pp = bmp_ptr->next_in + bmp_ptr->skip_size; |
586 bmp_ptr->skip_size += data_size; | 586 bmp_ptr->skip_size += data_size; |
587 return *des_buf_pp; | 587 return *des_buf_pp; |
588 } | 588 } |
589 void _bmp_save_decoding_status(bmp_decompress_struct_p bmp_ptr, FX_INT32 status) | 589 void _bmp_save_decoding_status(bmp_decompress_struct_p bmp_ptr, int32_t status) |
590 { | 590 { |
591 bmp_ptr->decode_status = status; | 591 bmp_ptr->decode_status = status; |
592 bmp_ptr->next_in += bmp_ptr->skip_size; | 592 bmp_ptr->next_in += bmp_ptr->skip_size; |
593 bmp_ptr->avail_in -= bmp_ptr->skip_size; | 593 bmp_ptr->avail_in -= bmp_ptr->skip_size; |
594 bmp_ptr->skip_size = 0; | 594 bmp_ptr->skip_size = 0; |
595 } | 595 } |
596 void _bmp_input_buffer(bmp_decompress_struct_p bmp_ptr, FX_LPBYTE src_buf, FX_DW
ORD src_size) | 596 void _bmp_input_buffer(bmp_decompress_struct_p bmp_ptr, FX_LPBYTE src_buf, FX_DW
ORD src_size) |
597 { | 597 { |
598 bmp_ptr->next_in = src_buf; | 598 bmp_ptr->next_in = src_buf; |
599 bmp_ptr->avail_in = src_size; | 599 bmp_ptr->avail_in = src_size; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 #ifdef BMP_SUPPORT_BITFIELD | 672 #ifdef BMP_SUPPORT_BITFIELD |
673 static void _bmp_encode_bitfields(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_
buf, FX_DWORD& dst_size) | 673 static void _bmp_encode_bitfields(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_
buf, FX_DWORD& dst_size) |
674 { | 674 { |
675 if (bmp_ptr->info_header.biBitCount != 16 && bmp_ptr->info_header.biBitCount
!= 32) { | 675 if (bmp_ptr->info_header.biBitCount != 16 && bmp_ptr->info_header.biBitCount
!= 32) { |
676 return; | 676 return; |
677 } | 677 } |
678 FX_DWORD size, dst_pos, i; | 678 FX_DWORD size, dst_pos, i; |
679 size = bmp_ptr->src_pitch * bmp_ptr->src_row * bmp_ptr->info_header.biBitCou
nt / 16; | 679 size = bmp_ptr->src_pitch * bmp_ptr->src_row * bmp_ptr->info_header.biBitCou
nt / 16; |
680 dst_pos = bmp_ptr->file_header.bfOffBits; | 680 dst_pos = bmp_ptr->file_header.bfOffBits; |
681 dst_size += size; | 681 dst_size += size; |
682 dst_buf = FX_Realloc(FX_BYTE, dst_buf, dst_size); | 682 dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); |
683 if (dst_buf == NULL) { | 683 if (dst_buf == NULL) { |
684 return; | 684 return; |
685 } | 685 } |
686 FXSYS_memset32(&dst_buf[dst_pos], 0, size); | 686 FXSYS_memset32(&dst_buf[dst_pos], 0, size); |
687 FX_DWORD mask_red; | 687 FX_DWORD mask_red; |
688 FX_DWORD mask_green; | 688 FX_DWORD mask_green; |
689 FX_DWORD mask_blue; | 689 FX_DWORD mask_blue; |
690 mask_red = 0x7C00; | 690 mask_red = 0x7C00; |
691 mask_green = 0x03E0; | 691 mask_green = 0x03E0; |
692 mask_blue = 0x001F; | 692 mask_blue = 0x001F; |
693 if (bmp_ptr->info_header.biCompression == BMP_BITFIELDS) { | 693 if (bmp_ptr->info_header.biCompression == BMP_BITFIELDS) { |
694 if (bmp_ptr->bit_type == BMP_BIT_565) { | 694 if (bmp_ptr->bit_type == BMP_BIT_565) { |
695 mask_red = 0xF800; | 695 mask_red = 0xF800; |
696 mask_green = 0x07E0; | 696 mask_green = 0x07E0; |
697 mask_blue = 0x001F; | 697 mask_blue = 0x001F; |
698 } | 698 } |
699 if (bmp_ptr->info_header.biBitCount == 32) { | 699 if (bmp_ptr->info_header.biBitCount == 32) { |
700 mask_red = 0xFF0000; | 700 mask_red = 0xFF0000; |
701 mask_green = 0x00FF00; | 701 mask_green = 0x00FF00; |
702 mask_blue = 0x0000FF; | 702 mask_blue = 0x0000FF; |
703 } | 703 } |
704 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_red); | 704 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_red); |
705 dst_pos += 4; | 705 dst_pos += 4; |
706 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_green); | 706 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_green); |
707 dst_pos += 4; | 707 dst_pos += 4; |
708 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_blue); | 708 _SetDWord_LSBFirst(&dst_buf[dst_pos], mask_blue); |
709 dst_pos += 4; | 709 dst_pos += 4; |
710 bmp_ptr->file_header.bfOffBits = dst_pos; | 710 bmp_ptr->file_header.bfOffBits = dst_pos; |
711 } | 711 } |
712 FX_BYTE blue_bits = 0; | 712 uint8_t blue_bits = 0; |
713 FX_BYTE green_bits = 0; | 713 uint8_t green_bits = 0; |
714 FX_BYTE red_bits = 0; | 714 uint8_t red_bits = 0; |
715 for(i = 0; i < bmp_ptr->info_header.biBitCount; i++) { | 715 for(i = 0; i < bmp_ptr->info_header.biBitCount; i++) { |
716 if((mask_blue >> i) & 0x01) { | 716 if((mask_blue >> i) & 0x01) { |
717 blue_bits++; | 717 blue_bits++; |
718 } | 718 } |
719 if((mask_green >> i) & 0x01) { | 719 if((mask_green >> i) & 0x01) { |
720 green_bits++; | 720 green_bits++; |
721 } | 721 } |
722 if((mask_red >> i) & 0x01) { | 722 if((mask_red >> i) & 0x01) { |
723 red_bits++; | 723 red_bits++; |
724 } | 724 } |
725 } | 725 } |
726 green_bits += blue_bits; | 726 green_bits += blue_bits; |
727 red_bits += green_bits; | 727 red_bits += green_bits; |
728 blue_bits = 8 - blue_bits; | 728 blue_bits = 8 - blue_bits; |
729 green_bits -= 8; | 729 green_bits -= 8; |
730 red_bits -= 8; | 730 red_bits -= 8; |
731 i = 0; | 731 i = 0; |
732 for (FX_INT32 row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--, i = 0
) { | 732 for (int32_t row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--, i = 0)
{ |
733 while (i < bmp_ptr->src_width * bmp_ptr->src_bpp / 8) { | 733 while (i < bmp_ptr->src_width * bmp_ptr->src_bpp / 8) { |
734 FX_BYTE b = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; | 734 uint8_t b = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; |
735 FX_BYTE g = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; | 735 uint8_t g = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; |
736 FX_BYTE r = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; | 736 uint8_t r = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; |
737 if (bmp_ptr->src_bpp == 32) { | 737 if (bmp_ptr->src_bpp == 32) { |
738 i++; | 738 i++; |
739 } | 739 } |
740 FX_DWORD pix_val = 0; | 740 FX_DWORD pix_val = 0; |
741 pix_val |= (b >> blue_bits) & mask_blue; | 741 pix_val |= (b >> blue_bits) & mask_blue; |
742 pix_val |= (g << green_bits) & mask_green; | 742 pix_val |= (g << green_bits) & mask_green; |
743 pix_val |= (r << red_bits) & mask_red; | 743 pix_val |= (r << red_bits) & mask_red; |
744 if (bmp_ptr->info_header.biBitCount == 16) { | 744 if (bmp_ptr->info_header.biBitCount == 16) { |
745 _SetWord_LSBFirst(&dst_buf[dst_pos], (FX_WORD)pix_val); | 745 _SetWord_LSBFirst(&dst_buf[dst_pos], (FX_WORD)pix_val); |
746 dst_pos += 2; | 746 dst_pos += 2; |
(...skipping 12 matching lines...) Expand all Loading... |
759 #ifdef BMP_SUPPORT_BITFIELD | 759 #ifdef BMP_SUPPORT_BITFIELD |
760 _bmp_encode_bitfields(bmp_ptr, dst_buf, dst_size); | 760 _bmp_encode_bitfields(bmp_ptr, dst_buf, dst_size); |
761 #endif | 761 #endif |
762 return; | 762 return; |
763 } | 763 } |
764 FX_DWORD size, dst_pos; | 764 FX_DWORD size, dst_pos; |
765 FX_DWORD dst_pitch = (bmp_ptr->src_width * bmp_ptr->info_header.biBitCount +
31) / 32 * 4; | 765 FX_DWORD dst_pitch = (bmp_ptr->src_width * bmp_ptr->info_header.biBitCount +
31) / 32 * 4; |
766 size = dst_pitch * bmp_ptr->src_row; | 766 size = dst_pitch * bmp_ptr->src_row; |
767 dst_pos = bmp_ptr->file_header.bfOffBits; | 767 dst_pos = bmp_ptr->file_header.bfOffBits; |
768 dst_size += size; | 768 dst_size += size; |
769 dst_buf = FX_Realloc(FX_BYTE, dst_buf, dst_size); | 769 dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); |
770 if (dst_buf == NULL) { | 770 if (dst_buf == NULL) { |
771 return; | 771 return; |
772 } | 772 } |
773 FXSYS_memset32(&dst_buf[dst_pos], 0, size); | 773 FXSYS_memset32(&dst_buf[dst_pos], 0, size); |
774 for (FX_INT32 row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--) { | 774 for (int32_t row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--) { |
775 FXSYS_memcpy32(&dst_buf[dst_pos], &bmp_ptr->src_buf[row_num * bmp_ptr->s
rc_pitch], bmp_ptr->src_pitch); | 775 FXSYS_memcpy32(&dst_buf[dst_pos], &bmp_ptr->src_buf[row_num * bmp_ptr->s
rc_pitch], bmp_ptr->src_pitch); |
776 dst_pos += dst_pitch; | 776 dst_pos += dst_pitch; |
777 } | 777 } |
778 dst_size = dst_pos; | 778 dst_size = dst_pos; |
779 } | 779 } |
780 static FX_BYTE _bmp_rle8_search(FX_LPCBYTE buf, FX_INT32 len) | 780 static uint8_t _bmp_rle8_search(FX_LPCBYTE buf, int32_t len) |
781 { | 781 { |
782 FX_BYTE num; | 782 uint8_t num; |
783 num = 1; | 783 num = 1; |
784 while (num < len) { | 784 while (num < len) { |
785 if (buf[num - 1] != buf[num] || num == 0xFF) { | 785 if (buf[num - 1] != buf[num] || num == 0xFF) { |
786 break; | 786 break; |
787 } | 787 } |
788 num++; | 788 num++; |
789 } | 789 } |
790 return num; | 790 return num; |
791 } | 791 } |
792 static void _bmp_encode_rle8(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf,
FX_DWORD& dst_size) | 792 static void _bmp_encode_rle8(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf,
FX_DWORD& dst_size) |
793 { | 793 { |
794 FX_DWORD size, dst_pos, index; | 794 FX_DWORD size, dst_pos, index; |
795 FX_BYTE rle[2] = {0}; | 795 uint8_t rle[2] = {0}; |
796 size = bmp_ptr->src_pitch * bmp_ptr->src_row * 2; | 796 size = bmp_ptr->src_pitch * bmp_ptr->src_row * 2; |
797 dst_pos = bmp_ptr->file_header.bfOffBits; | 797 dst_pos = bmp_ptr->file_header.bfOffBits; |
798 dst_size += size; | 798 dst_size += size; |
799 dst_buf = FX_Realloc(FX_BYTE, dst_buf, dst_size); | 799 dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); |
800 if (dst_buf == NULL) { | 800 if (dst_buf == NULL) { |
801 return; | 801 return; |
802 } | 802 } |
803 FXSYS_memset32(&dst_buf[dst_pos], 0, size); | 803 FXSYS_memset32(&dst_buf[dst_pos], 0, size); |
804 for (FX_INT32 row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1; ) { | 804 for (int32_t row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1; ) { |
805 index = row_num * bmp_ptr->src_pitch; | 805 index = row_num * bmp_ptr->src_pitch; |
806 rle[0] = _bmp_rle8_search(&bmp_ptr->src_buf[index + i], size - index - i
); | 806 rle[0] = _bmp_rle8_search(&bmp_ptr->src_buf[index + i], size - index - i
); |
807 rle[1] = bmp_ptr->src_buf[index + i]; | 807 rle[1] = bmp_ptr->src_buf[index + i]; |
808 if (i + rle[0] >= (FX_INT32)bmp_ptr->src_pitch) { | 808 if (i + rle[0] >= (int32_t)bmp_ptr->src_pitch) { |
809 rle[0] = FX_BYTE(bmp_ptr->src_pitch - i); | 809 rle[0] = uint8_t(bmp_ptr->src_pitch - i); |
810 if (rle[0]) { | 810 if (rle[0]) { |
811 dst_buf[dst_pos++] = rle[0]; | 811 dst_buf[dst_pos++] = rle[0]; |
812 dst_buf[dst_pos++] = rle[1]; | 812 dst_buf[dst_pos++] = rle[1]; |
813 } | 813 } |
814 dst_buf[dst_pos++] = RLE_MARKER; | 814 dst_buf[dst_pos++] = RLE_MARKER; |
815 dst_buf[dst_pos++] = RLE_EOL; | 815 dst_buf[dst_pos++] = RLE_EOL; |
816 i = 0; | 816 i = 0; |
817 row_num--; | 817 row_num--; |
818 } else { | 818 } else { |
819 i += rle[0]; | 819 i += rle[0]; |
820 dst_buf[dst_pos++] = rle[0]; | 820 dst_buf[dst_pos++] = rle[0]; |
821 dst_buf[dst_pos++] = rle[1]; | 821 dst_buf[dst_pos++] = rle[1]; |
822 } | 822 } |
823 } | 823 } |
824 dst_buf[dst_pos++] = RLE_MARKER; | 824 dst_buf[dst_pos++] = RLE_MARKER; |
825 dst_buf[dst_pos++] = RLE_EOI; | 825 dst_buf[dst_pos++] = RLE_EOI; |
826 dst_size = dst_pos; | 826 dst_size = dst_pos; |
827 } | 827 } |
828 static FX_BYTE _bmp_rle4_search(FX_LPCBYTE buf, FX_INT32 len) | 828 static uint8_t _bmp_rle4_search(FX_LPCBYTE buf, int32_t len) |
829 { | 829 { |
830 FX_BYTE num; | 830 uint8_t num; |
831 num = 2; | 831 num = 2; |
832 while (num < len) { | 832 while (num < len) { |
833 if (buf[num - 2] != buf[num] || num == 0xFF) { | 833 if (buf[num - 2] != buf[num] || num == 0xFF) { |
834 break; | 834 break; |
835 } | 835 } |
836 num++; | 836 num++; |
837 } | 837 } |
838 return num; | 838 return num; |
839 } | 839 } |
840 static void _bmp_encode_rle4(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf,
FX_DWORD& dst_size) | 840 static void _bmp_encode_rle4(bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf,
FX_DWORD& dst_size) |
841 { | 841 { |
842 FX_DWORD size, dst_pos, index; | 842 FX_DWORD size, dst_pos, index; |
843 FX_BYTE rle[2] = {0}; | 843 uint8_t rle[2] = {0}; |
844 size = bmp_ptr->src_pitch * bmp_ptr->src_row; | 844 size = bmp_ptr->src_pitch * bmp_ptr->src_row; |
845 dst_pos = bmp_ptr->file_header.bfOffBits; | 845 dst_pos = bmp_ptr->file_header.bfOffBits; |
846 dst_size += size; | 846 dst_size += size; |
847 dst_buf = FX_Realloc(FX_BYTE, dst_buf, dst_size); | 847 dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); |
848 if (dst_buf == NULL) { | 848 if (dst_buf == NULL) { |
849 return; | 849 return; |
850 } | 850 } |
851 FXSYS_memset32(&dst_buf[dst_pos], 0, size); | 851 FXSYS_memset32(&dst_buf[dst_pos], 0, size); |
852 for (FX_INT32 row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1; rle[1] =
0) { | 852 for (int32_t row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1; rle[1] = 0
) { |
853 index = row_num * bmp_ptr->src_pitch; | 853 index = row_num * bmp_ptr->src_pitch; |
854 rle[0] = _bmp_rle4_search(&bmp_ptr->src_buf[index + i], size - index - i
); | 854 rle[0] = _bmp_rle4_search(&bmp_ptr->src_buf[index + i], size - index - i
); |
855 rle[1] |= (bmp_ptr->src_buf[index + i] & 0x0f) << 4; | 855 rle[1] |= (bmp_ptr->src_buf[index + i] & 0x0f) << 4; |
856 rle[1] |= bmp_ptr->src_buf[index + i + 1] & 0x0f; | 856 rle[1] |= bmp_ptr->src_buf[index + i + 1] & 0x0f; |
857 if (i + rle[0] >= (FX_INT32)bmp_ptr->src_pitch) { | 857 if (i + rle[0] >= (int32_t)bmp_ptr->src_pitch) { |
858 rle[0] = FX_BYTE(bmp_ptr->src_pitch - i); | 858 rle[0] = uint8_t(bmp_ptr->src_pitch - i); |
859 if (rle[0]) { | 859 if (rle[0]) { |
860 dst_buf[dst_pos++] = rle[0]; | 860 dst_buf[dst_pos++] = rle[0]; |
861 dst_buf[dst_pos++] = rle[1]; | 861 dst_buf[dst_pos++] = rle[1]; |
862 } | 862 } |
863 dst_buf[dst_pos++] = RLE_MARKER; | 863 dst_buf[dst_pos++] = RLE_MARKER; |
864 dst_buf[dst_pos++] = RLE_EOL; | 864 dst_buf[dst_pos++] = RLE_EOL; |
865 i = 0; | 865 i = 0; |
866 row_num--; | 866 row_num--; |
867 } else { | 867 } else { |
868 i += rle[0]; | 868 i += rle[0]; |
869 dst_buf[dst_pos++] = rle[0]; | 869 dst_buf[dst_pos++] = rle[0]; |
870 dst_buf[dst_pos++] = rle[1]; | 870 dst_buf[dst_pos++] = rle[1]; |
871 } | 871 } |
872 } | 872 } |
873 dst_buf[dst_pos++] = RLE_MARKER; | 873 dst_buf[dst_pos++] = RLE_MARKER; |
874 dst_buf[dst_pos++] = RLE_EOI; | 874 dst_buf[dst_pos++] = RLE_EOI; |
875 dst_size = dst_pos; | 875 dst_size = dst_pos; |
876 } | 876 } |
877 FX_BOOL _bmp_encode_image( bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf, FX
_DWORD& dst_size ) | 877 FX_BOOL _bmp_encode_image( bmp_compress_struct_p bmp_ptr, FX_LPBYTE& dst_buf, FX
_DWORD& dst_size ) |
878 { | 878 { |
879 FX_DWORD head_size = sizeof(BmpFileHeader) + sizeof(BmpInfoHeader); | 879 FX_DWORD head_size = sizeof(BmpFileHeader) + sizeof(BmpInfoHeader); |
880 FX_DWORD pal_size = sizeof(FX_DWORD) * bmp_ptr->pal_num; | 880 FX_DWORD pal_size = sizeof(FX_DWORD) * bmp_ptr->pal_num; |
881 if (bmp_ptr->info_header.biClrUsed > 0 && bmp_ptr->info_header.biClrUsed < b
mp_ptr->pal_num) { | 881 if (bmp_ptr->info_header.biClrUsed > 0 && bmp_ptr->info_header.biClrUsed < b
mp_ptr->pal_num) { |
882 pal_size = sizeof(FX_DWORD) * bmp_ptr->info_header.biClrUsed; | 882 pal_size = sizeof(FX_DWORD) * bmp_ptr->info_header.biClrUsed; |
883 } | 883 } |
884 dst_size = head_size + sizeof(FX_DWORD) * bmp_ptr->pal_num; | 884 dst_size = head_size + sizeof(FX_DWORD) * bmp_ptr->pal_num; |
885 dst_buf = FX_TryAlloc(FX_BYTE, dst_size); | 885 dst_buf = FX_TryAlloc(uint8_t, dst_size); |
886 if (dst_buf == NULL) { | 886 if (dst_buf == NULL) { |
887 return FALSE; | 887 return FALSE; |
888 } | 888 } |
889 FXSYS_memset32(dst_buf, 0, dst_size); | 889 FXSYS_memset32(dst_buf, 0, dst_size); |
890 bmp_ptr->file_header.bfOffBits = head_size; | 890 bmp_ptr->file_header.bfOffBits = head_size; |
891 if (bmp_ptr->pal_ptr && pal_size) { | 891 if (bmp_ptr->pal_ptr && pal_size) { |
892 FXSYS_memcpy32(&dst_buf[head_size], bmp_ptr->pal_ptr, pal_size); | 892 FXSYS_memcpy32(&dst_buf[head_size], bmp_ptr->pal_ptr, pal_size); |
893 bmp_ptr->file_header.bfOffBits += pal_size; | 893 bmp_ptr->file_header.bfOffBits += pal_size; |
894 } | 894 } |
895 WriteInfoHeader(&bmp_ptr->info_header, dst_buf); | 895 WriteInfoHeader(&bmp_ptr->info_header, dst_buf); |
(...skipping 12 matching lines...) Expand all Loading... |
908 case BMP_RLE4: | 908 case BMP_RLE4: |
909 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); | 909 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); |
910 break; | 910 break; |
911 default: | 911 default: |
912 ; | 912 ; |
913 } | 913 } |
914 bmp_ptr->file_header.bfSize = dst_size; | 914 bmp_ptr->file_header.bfSize = dst_size; |
915 WriteFileHeader(&bmp_ptr->file_header, dst_buf); | 915 WriteFileHeader(&bmp_ptr->file_header, dst_buf); |
916 return TRUE; | 916 return TRUE; |
917 } | 917 } |
OLD | NEW |