| 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 |
| 9 #include <algorithm> |
| 10 |
| 11 namespace { |
| 12 |
| 13 const size_t kBmpCoreHeaderSize = 12; |
| 14 const size_t kBmpInfoHeaderSize = 40; |
| 15 |
| 16 } // namespace |
| 17 |
| 8 FX_DWORD _GetDWord_LSBFirst(uint8_t* p) { | 18 FX_DWORD _GetDWord_LSBFirst(uint8_t* p) { |
| 9 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); | 19 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); |
| 10 } | 20 } |
| 11 FX_WORD _GetWord_LSBFirst(uint8_t* p) { | 21 FX_WORD _GetWord_LSBFirst(uint8_t* p) { |
| 12 return p[0] | (p[1] << 8); | 22 return p[0] | (p[1] << 8); |
| 13 } | 23 } |
| 14 void _SetDWord_LSBFirst(uint8_t* p, FX_DWORD v) { | 24 void _SetDWord_LSBFirst(uint8_t* p, FX_DWORD v) { |
| 15 p[0] = (uint8_t)v; | 25 p[0] = (uint8_t)v; |
| 16 p[1] = (uint8_t)(v >> 8); | 26 p[1] = (uint8_t)(v >> 8); |
| 17 p[2] = (uint8_t)(v >> 16); | 27 p[2] = (uint8_t)(v >> 16); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 _bmp_error(bmp_ptr, "Not A Bmp Image"); | 83 _bmp_error(bmp_ptr, "Not A Bmp Image"); |
| 74 return 0; | 84 return 0; |
| 75 } | 85 } |
| 76 if (bmp_ptr->avail_in < sizeof(FX_DWORD)) { | 86 if (bmp_ptr->avail_in < sizeof(FX_DWORD)) { |
| 77 bmp_ptr->skip_size = skip_size_org; | 87 bmp_ptr->skip_size = skip_size_org; |
| 78 return 2; | 88 return 2; |
| 79 } | 89 } |
| 80 bmp_ptr->img_ifh_size = | 90 bmp_ptr->img_ifh_size = |
| 81 _GetDWord_LSBFirst(bmp_ptr->next_in + bmp_ptr->skip_size); | 91 _GetDWord_LSBFirst(bmp_ptr->next_in + bmp_ptr->skip_size); |
| 82 bmp_ptr->pal_type = 0; | 92 bmp_ptr->pal_type = 0; |
| 83 ASSERT(sizeof(BmpCoreHeader) == 12); | 93 static_assert(sizeof(BmpCoreHeader) == kBmpCoreHeaderSize, |
| 84 ASSERT(sizeof(BmpInfoHeader) == 40); | 94 "BmpCoreHeader has wrong size"); |
| 95 static_assert(sizeof(BmpInfoHeader) == kBmpInfoHeaderSize, |
| 96 "BmpInfoHeader has wrong size"); |
| 85 switch (bmp_ptr->img_ifh_size) { | 97 switch (bmp_ptr->img_ifh_size) { |
| 86 case FX_MIN(12, sizeof(BmpCoreHeader)): { | 98 case kBmpCoreHeaderSize: { |
| 87 bmp_ptr->pal_type = 1; | 99 bmp_ptr->pal_type = 1; |
| 88 BmpCoreHeaderPtr bmp_core_header_ptr = NULL; | 100 BmpCoreHeaderPtr bmp_core_header_ptr = NULL; |
| 89 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_core_header_ptr, | 101 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_core_header_ptr, |
| 90 bmp_ptr->img_ifh_size) == NULL) { | 102 bmp_ptr->img_ifh_size) == NULL) { |
| 91 bmp_ptr->skip_size = skip_size_org; | 103 bmp_ptr->skip_size = skip_size_org; |
| 92 return 2; | 104 return 2; |
| 93 } | 105 } |
| 94 bmp_ptr->width = (FX_DWORD)_GetWord_LSBFirst( | 106 bmp_ptr->width = (FX_DWORD)_GetWord_LSBFirst( |
| 95 (uint8_t*)&bmp_core_header_ptr->bcWidth); | 107 (uint8_t*)&bmp_core_header_ptr->bcWidth); |
| 96 bmp_ptr->height = (FX_DWORD)_GetWord_LSBFirst( | 108 bmp_ptr->height = (FX_DWORD)_GetWord_LSBFirst( |
| 97 (uint8_t*)&bmp_core_header_ptr->bcHeight); | 109 (uint8_t*)&bmp_core_header_ptr->bcHeight); |
| 98 bmp_ptr->bitCounts = | 110 bmp_ptr->bitCounts = |
| 99 _GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcBitCount); | 111 _GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcBitCount); |
| 100 bmp_ptr->compress_flag = BMP_RGB; | 112 bmp_ptr->compress_flag = BMP_RGB; |
| 101 bmp_ptr->imgTB_flag = FALSE; | 113 bmp_ptr->imgTB_flag = FALSE; |
| 102 } break; | 114 } break; |
| 103 case FX_MIN(40, sizeof(BmpInfoHeader)): { | 115 case kBmpInfoHeaderSize: { |
| 104 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 116 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
| 105 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, | 117 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, |
| 106 bmp_ptr->img_ifh_size) == NULL) { | 118 bmp_ptr->img_ifh_size) == NULL) { |
| 107 bmp_ptr->skip_size = skip_size_org; | 119 bmp_ptr->skip_size = skip_size_org; |
| 108 return 2; | 120 return 2; |
| 109 } | 121 } |
| 110 bmp_ptr->width = | 122 bmp_ptr->width = |
| 111 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); | 123 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); |
| 112 bmp_ptr->height = | 124 bmp_ptr->height = |
| 113 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); | 125 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); |
| 114 bmp_ptr->bitCounts = | 126 bmp_ptr->bitCounts = |
| 115 _GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); | 127 _GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); |
| 116 bmp_ptr->compress_flag = | 128 bmp_ptr->compress_flag = |
| 117 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); | 129 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); |
| 118 bmp_ptr->color_used = | 130 bmp_ptr->color_used = |
| 119 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); | 131 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); |
| 120 bmp_ptr->dpi_x = (int32_t)_GetDWord_LSBFirst( | 132 bmp_ptr->dpi_x = (int32_t)_GetDWord_LSBFirst( |
| 121 (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); | 133 (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); |
| 122 bmp_ptr->dpi_y = (int32_t)_GetDWord_LSBFirst( | 134 bmp_ptr->dpi_y = (int32_t)_GetDWord_LSBFirst( |
| 123 (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); | 135 (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); |
| 124 if (bmp_ptr->height < 0) { | 136 if (bmp_ptr->height < 0) { |
| 125 bmp_ptr->height = -bmp_ptr->height; | 137 bmp_ptr->height = -bmp_ptr->height; |
| 126 bmp_ptr->imgTB_flag = TRUE; | 138 bmp_ptr->imgTB_flag = TRUE; |
| 127 } | 139 } |
| 128 } break; | 140 } break; |
| 129 default: { | 141 default: { |
| 130 if (bmp_ptr->img_ifh_size > FX_MIN(40, sizeof(BmpInfoHeader))) { | 142 if (bmp_ptr->img_ifh_size > |
| 143 std::min(kBmpInfoHeaderSize, sizeof(BmpInfoHeader))) { |
| 131 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 144 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
| 132 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, | 145 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, |
| 133 bmp_ptr->img_ifh_size) == NULL) { | 146 bmp_ptr->img_ifh_size) == NULL) { |
| 134 bmp_ptr->skip_size = skip_size_org; | 147 bmp_ptr->skip_size = skip_size_org; |
| 135 return 2; | 148 return 2; |
| 136 } | 149 } |
| 137 FX_WORD biPlanes; | 150 FX_WORD biPlanes; |
| 138 bmp_ptr->width = | 151 bmp_ptr->width = |
| 139 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); | 152 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); |
| 140 bmp_ptr->height = | 153 bmp_ptr->height = |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 break; | 966 break; |
| 954 case BMP_RLE4: | 967 case BMP_RLE4: |
| 955 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); | 968 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); |
| 956 break; | 969 break; |
| 957 default:; | 970 default:; |
| 958 } | 971 } |
| 959 bmp_ptr->file_header.bfSize = dst_size; | 972 bmp_ptr->file_header.bfSize = dst_size; |
| 960 WriteFileHeader(&bmp_ptr->file_header, dst_buf); | 973 WriteFileHeader(&bmp_ptr->file_header, dst_buf); |
| 961 return TRUE; | 974 return TRUE; |
| 962 } | 975 } |
| OLD | NEW |