| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBmpStandardCodec.h" | 8 #include "SkBmpStandardCodec.h" |
| 9 #include "SkCodecPriv.h" | 9 #include "SkCodecPriv.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| 11 #include "SkStream.h" | 11 #include "SkStream.h" |
| 12 | 12 |
| 13 /* | 13 /* |
| 14 * Creates an instance of the decoder | 14 * Creates an instance of the decoder |
| 15 * Called only by NewFromStream | 15 * Called only by NewFromStream |
| 16 */ | 16 */ |
| 17 SkBmpStandardCodec::SkBmpStandardCodec(const SkImageInfo& info, SkStream* stream
, | 17 SkBmpStandardCodec::SkBmpStandardCodec(const SkImageInfo& info, SkStream* stream
, |
| 18 uint16_t bitsPerPixel, uint32_t numColors
, | 18 uint16_t bitsPerPixel, uint32_t numColors
, |
| 19 uint32_t bytesPerColor, uint32_t offset, | 19 uint32_t bytesPerColor, uint32_t offset, |
| 20 SkCodec::SkScanlineOrder rowOrder, bool i
nIco) | 20 SkCodec::SkScanlineOrder rowOrder, |
| 21 bool isOpaque, bool inIco) |
| 21 : INHERITED(info, stream, bitsPerPixel, rowOrder) | 22 : INHERITED(info, stream, bitsPerPixel, rowOrder) |
| 22 , fColorTable(nullptr) | 23 , fColorTable(nullptr) |
| 23 , fNumColors(numColors) | 24 , fNumColors(numColors) |
| 24 , fBytesPerColor(bytesPerColor) | 25 , fBytesPerColor(bytesPerColor) |
| 25 , fOffset(offset) | 26 , fOffset(offset) |
| 26 , fSwizzler(nullptr) | 27 , fSwizzler(nullptr) |
| 27 , fSrcRowBytes(SkAlign4(compute_row_bytes(this->getInfo().width(), this->bit
sPerPixel()))) | 28 , fSrcRowBytes(SkAlign4(compute_row_bytes(this->getInfo().width(), this->bit
sPerPixel()))) |
| 28 , fSrcBuffer(new uint8_t [fSrcRowBytes]) | 29 , fSrcBuffer(new uint8_t [fSrcRowBytes]) |
| 30 , fIsOpaque(isOpaque) |
| 29 , fInIco(inIco) | 31 , fInIco(inIco) |
| 30 , fAndMaskRowBytes(fInIco ? SkAlign4(compute_row_bytes(this->getInfo().width
(), 1)) : 0) | 32 , fAndMaskRowBytes(fInIco ? SkAlign4(compute_row_bytes(this->getInfo().width
(), 1)) : 0) |
| 31 {} | 33 {} |
| 32 | 34 |
| 33 /* | 35 /* |
| 34 * Initiates the bitmap decode | 36 * Initiates the bitmap decode |
| 35 */ | 37 */ |
| 36 SkCodec::Result SkBmpStandardCodec::onGetPixels(const SkImageInfo& dstInfo, | 38 SkCodec::Result SkBmpStandardCodec::onGetPixels(const SkImageInfo& dstInfo, |
| 37 void* dst, size_t dstRowBytes, | 39 void* dst, size_t dstRowBytes, |
| 38 const Options& opts, | 40 const Options& opts, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 // Read the color table from the stream | 89 // Read the color table from the stream |
| 88 colorBytes = numColorsToRead * fBytesPerColor; | 90 colorBytes = numColorsToRead * fBytesPerColor; |
| 89 SkAutoTDeleteArray<uint8_t> cBuffer(new uint8_t[colorBytes]); | 91 SkAutoTDeleteArray<uint8_t> cBuffer(new uint8_t[colorBytes]); |
| 90 if (stream()->read(cBuffer.get(), colorBytes) != colorBytes) { | 92 if (stream()->read(cBuffer.get(), colorBytes) != colorBytes) { |
| 91 SkCodecPrintf("Error: unable to read color table.\n"); | 93 SkCodecPrintf("Error: unable to read color table.\n"); |
| 92 return false; | 94 return false; |
| 93 } | 95 } |
| 94 | 96 |
| 95 // Choose the proper packing function | 97 // Choose the proper packing function |
| 96 SkPMColor (*packARGB) (uint32_t, uint32_t, uint32_t, uint32_t); | 98 SkPMColor (*packARGB) (uint32_t, uint32_t, uint32_t, uint32_t); |
| 97 SkAlphaType encodedAlphaType = this->getInfo().alphaType(); | 99 if (fIsOpaque || kUnpremul_SkAlphaType == dstAlphaType) { |
| 98 if (kOpaque_SkAlphaType == encodedAlphaType || kUnpremul_SkAlphaType ==
dstAlphaType) { | |
| 99 packARGB = &SkPackARGB32NoCheck; | 100 packARGB = &SkPackARGB32NoCheck; |
| 100 } else { | 101 } else { |
| 101 packARGB = &SkPremultiplyARGBInline; | 102 packARGB = &SkPremultiplyARGBInline; |
| 102 } | 103 } |
| 103 | 104 |
| 104 // Fill in the color table | 105 // Fill in the color table |
| 105 uint32_t i = 0; | 106 uint32_t i = 0; |
| 106 for (; i < numColorsToRead; i++) { | 107 for (; i < numColorsToRead; i++) { |
| 107 uint8_t blue = get_byte(cBuffer.get(), i*fBytesPerColor); | 108 uint8_t blue = get_byte(cBuffer.get(), i*fBytesPerColor); |
| 108 uint8_t green = get_byte(cBuffer.get(), i*fBytesPerColor + 1); | 109 uint8_t green = get_byte(cBuffer.get(), i*fBytesPerColor + 1); |
| 109 uint8_t red = get_byte(cBuffer.get(), i*fBytesPerColor + 2); | 110 uint8_t red = get_byte(cBuffer.get(), i*fBytesPerColor + 2); |
| 110 uint8_t alpha; | 111 uint8_t alpha; |
| 111 if (kOpaque_SkAlphaType == encodedAlphaType) { | 112 if (fIsOpaque) { |
| 112 alpha = 0xFF; | 113 alpha = 0xFF; |
| 113 } else { | 114 } else { |
| 114 alpha = get_byte(cBuffer.get(), i*fBytesPerColor + 3); | 115 alpha = get_byte(cBuffer.get(), i*fBytesPerColor + 3); |
| 115 } | 116 } |
| 116 colorTable[i] = packARGB(alpha, red, green, blue); | 117 colorTable[i] = packARGB(alpha, red, green, blue); |
| 117 } | 118 } |
| 118 | 119 |
| 119 // To avoid segmentation faults on bad pixel data, fill the end of the | 120 // To avoid segmentation faults on bad pixel data, fill the end of the |
| 120 // color table with black. This is the same the behavior as the | 121 // color table with black. This is the same the behavior as the |
| 121 // chromium decoder. | 122 // chromium decoder. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 case 4: | 166 case 4: |
| 166 config = SkSwizzler::kIndex4; | 167 config = SkSwizzler::kIndex4; |
| 167 break; | 168 break; |
| 168 case 8: | 169 case 8: |
| 169 config = SkSwizzler::kIndex; | 170 config = SkSwizzler::kIndex; |
| 170 break; | 171 break; |
| 171 case 24: | 172 case 24: |
| 172 config = SkSwizzler::kBGR; | 173 config = SkSwizzler::kBGR; |
| 173 break; | 174 break; |
| 174 case 32: | 175 case 32: |
| 175 if (kOpaque_SkAlphaType == this->getInfo().alphaType()) { | 176 if (fIsOpaque) { |
| 176 config = SkSwizzler::kBGRX; | 177 config = SkSwizzler::kBGRX; |
| 177 } else { | 178 } else { |
| 178 config = SkSwizzler::kBGRA; | 179 config = SkSwizzler::kBGRA; |
| 179 } | 180 } |
| 180 break; | 181 break; |
| 181 default: | 182 default: |
| 182 SkASSERT(false); | 183 SkASSERT(false); |
| 183 return false; | 184 return false; |
| 184 } | 185 } |
| 185 | 186 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 } | 328 } |
| 328 } | 329 } |
| 329 | 330 |
| 330 uint32_t SkBmpStandardCodec::onGetFillValue(SkColorType colorType) const { | 331 uint32_t SkBmpStandardCodec::onGetFillValue(SkColorType colorType) const { |
| 331 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); | 332 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); |
| 332 if (colorPtr) { | 333 if (colorPtr) { |
| 333 return get_color_table_fill_value(colorType, colorPtr, 0); | 334 return get_color_table_fill_value(colorType, colorPtr, 0); |
| 334 } | 335 } |
| 335 return INHERITED::onGetFillValue(colorType); | 336 return INHERITED::onGetFillValue(colorType); |
| 336 } | 337 } |
| OLD | NEW |