| 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 |