Chromium Code Reviews| 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 ASSERT(sizeof(BmpCoreHeader) == kBmpCoreHeaderSize); |
|
Tom Sepez
2016/01/09 00:48:12
nit: static_assert
| |
| 84 ASSERT(sizeof(BmpInfoHeader) == 40); | 94 ASSERT(sizeof(BmpInfoHeader) == kBmpInfoHeaderSize); |
| 85 switch (bmp_ptr->img_ifh_size) { | 95 switch (bmp_ptr->img_ifh_size) { |
| 86 case FX_MIN(12, sizeof(BmpCoreHeader)): { | 96 case kBmpCoreHeaderSize: { |
| 87 bmp_ptr->pal_type = 1; | 97 bmp_ptr->pal_type = 1; |
| 88 BmpCoreHeaderPtr bmp_core_header_ptr = NULL; | 98 BmpCoreHeaderPtr bmp_core_header_ptr = NULL; |
| 89 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_core_header_ptr, | 99 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_core_header_ptr, |
| 90 bmp_ptr->img_ifh_size) == NULL) { | 100 bmp_ptr->img_ifh_size) == NULL) { |
| 91 bmp_ptr->skip_size = skip_size_org; | 101 bmp_ptr->skip_size = skip_size_org; |
| 92 return 2; | 102 return 2; |
| 93 } | 103 } |
| 94 bmp_ptr->width = (FX_DWORD)_GetWord_LSBFirst( | 104 bmp_ptr->width = (FX_DWORD)_GetWord_LSBFirst( |
| 95 (uint8_t*)&bmp_core_header_ptr->bcWidth); | 105 (uint8_t*)&bmp_core_header_ptr->bcWidth); |
| 96 bmp_ptr->height = (FX_DWORD)_GetWord_LSBFirst( | 106 bmp_ptr->height = (FX_DWORD)_GetWord_LSBFirst( |
| 97 (uint8_t*)&bmp_core_header_ptr->bcHeight); | 107 (uint8_t*)&bmp_core_header_ptr->bcHeight); |
| 98 bmp_ptr->bitCounts = | 108 bmp_ptr->bitCounts = |
| 99 _GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcBitCount); | 109 _GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcBitCount); |
| 100 bmp_ptr->compress_flag = BMP_RGB; | 110 bmp_ptr->compress_flag = BMP_RGB; |
| 101 bmp_ptr->imgTB_flag = FALSE; | 111 bmp_ptr->imgTB_flag = FALSE; |
| 102 } break; | 112 } break; |
| 103 case FX_MIN(40, sizeof(BmpInfoHeader)): { | 113 case kBmpInfoHeaderSize: { |
| 104 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 114 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
| 105 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, | 115 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, |
| 106 bmp_ptr->img_ifh_size) == NULL) { | 116 bmp_ptr->img_ifh_size) == NULL) { |
| 107 bmp_ptr->skip_size = skip_size_org; | 117 bmp_ptr->skip_size = skip_size_org; |
| 108 return 2; | 118 return 2; |
| 109 } | 119 } |
| 110 bmp_ptr->width = | 120 bmp_ptr->width = |
| 111 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); | 121 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); |
| 112 bmp_ptr->height = | 122 bmp_ptr->height = |
| 113 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); | 123 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); |
| 114 bmp_ptr->bitCounts = | 124 bmp_ptr->bitCounts = |
| 115 _GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); | 125 _GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); |
| 116 bmp_ptr->compress_flag = | 126 bmp_ptr->compress_flag = |
| 117 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); | 127 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); |
| 118 bmp_ptr->color_used = | 128 bmp_ptr->color_used = |
| 119 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); | 129 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); |
| 120 bmp_ptr->dpi_x = (int32_t)_GetDWord_LSBFirst( | 130 bmp_ptr->dpi_x = (int32_t)_GetDWord_LSBFirst( |
| 121 (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); | 131 (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); |
| 122 bmp_ptr->dpi_y = (int32_t)_GetDWord_LSBFirst( | 132 bmp_ptr->dpi_y = (int32_t)_GetDWord_LSBFirst( |
| 123 (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); | 133 (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); |
| 124 if (bmp_ptr->height < 0) { | 134 if (bmp_ptr->height < 0) { |
| 125 bmp_ptr->height = -bmp_ptr->height; | 135 bmp_ptr->height = -bmp_ptr->height; |
| 126 bmp_ptr->imgTB_flag = TRUE; | 136 bmp_ptr->imgTB_flag = TRUE; |
| 127 } | 137 } |
| 128 } break; | 138 } break; |
| 129 default: { | 139 default: { |
| 130 if (bmp_ptr->img_ifh_size > FX_MIN(40, sizeof(BmpInfoHeader))) { | 140 if (bmp_ptr->img_ifh_size > |
| 141 std::min(kBmpInfoHeaderSize, sizeof(BmpInfoHeader))) { | |
| 131 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; | 142 BmpInfoHeaderPtr bmp_info_header_ptr = NULL; |
| 132 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, | 143 if (_bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, |
| 133 bmp_ptr->img_ifh_size) == NULL) { | 144 bmp_ptr->img_ifh_size) == NULL) { |
| 134 bmp_ptr->skip_size = skip_size_org; | 145 bmp_ptr->skip_size = skip_size_org; |
| 135 return 2; | 146 return 2; |
| 136 } | 147 } |
| 137 FX_WORD biPlanes; | 148 FX_WORD biPlanes; |
| 138 bmp_ptr->width = | 149 bmp_ptr->width = |
| 139 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); | 150 _GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); |
| 140 bmp_ptr->height = | 151 bmp_ptr->height = |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 953 break; | 964 break; |
| 954 case BMP_RLE4: | 965 case BMP_RLE4: |
| 955 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); | 966 _bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); |
| 956 break; | 967 break; |
| 957 default:; | 968 default:; |
| 958 } | 969 } |
| 959 bmp_ptr->file_header.bfSize = dst_size; | 970 bmp_ptr->file_header.bfSize = dst_size; |
| 960 WriteFileHeader(&bmp_ptr->file_header, dst_buf); | 971 WriteFileHeader(&bmp_ptr->file_header, dst_buf); |
| 961 return TRUE; | 972 return TRUE; |
| 962 } | 973 } |
| OLD | NEW |