Chromium Code Reviews| Index: src/images/SkImageDecoder_libjpeg.cpp |
| diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp |
| index d32e2a21c91bea0fe06e472a5e6cce22518f41c5..caa1300124443a5f81aba764ea0d0d4e4d963fe0 100644 |
| --- a/src/images/SkImageDecoder_libjpeg.cpp |
| +++ b/src/images/SkImageDecoder_libjpeg.cpp |
| @@ -768,14 +768,25 @@ static SkISize compute_yuv_size(const jpeg_decompress_struct& info, int componen |
| info.cur_comp_info[component]->downsampled_height); |
| } |
| -static void update_components_sizes(const jpeg_decompress_struct& cinfo, SkISize componentSizes[3], |
| +static bool contains_three_planes(const jpeg_decompress_struct& cinfo) { |
|
hal.canary
2015/03/17 21:32:48
// Either explain why this is needed or note that
|
| + return cinfo.cur_comp_info[0] && cinfo.cur_comp_info[1] && cinfo.cur_comp_info[2]; |
| +} |
| + |
| +static bool update_components_sizes(const jpeg_decompress_struct& cinfo, SkISize componentSizes[3], |
| SizeType sizeType) { |
| + if (!contains_three_planes(cinfo)) { |
| + return false; |
| + } |
| for (int i = 0; i < 3; ++i) { |
| componentSizes[i] = compute_yuv_size(cinfo, i, sizeType); |
| } |
| + return true; |
| } |
| static bool output_raw_data(jpeg_decompress_struct& cinfo, void* planes[3], size_t rowBytes[3]) { |
| + if (!contains_three_planes(cinfo)) { |
| + return false; |
| + } |
| // U size and V size have to be the same if we're calling output_raw_data() |
| SkISize uvSize = compute_yuv_size(cinfo, 1, kSizeForMemoryAllocation_SizeType); |
| SkASSERT(uvSize == compute_yuv_size(cinfo, 2, kSizeForMemoryAllocation_SizeType)); |
| @@ -897,8 +908,7 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS |
| cinfo.raw_data_out = TRUE; |
| if (!planes || !planes[0] || !rowBytes || !rowBytes[0]) { // Compute size only |
| - update_components_sizes(cinfo, componentSizes, kSizeForMemoryAllocation_SizeType); |
| - return true; |
| + return update_components_sizes(cinfo, componentSizes, kSizeForMemoryAllocation_SizeType); |
| } |
| set_dct_method(*this, &cinfo); |
| @@ -924,7 +934,9 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS |
| return return_false(cinfo, "output_raw_data"); |
| } |
| - update_components_sizes(cinfo, componentSizes, kActualSize_SizeType); |
| + if (!update_components_sizes(cinfo, componentSizes, kActualSize_SizeType)) { |
| + return false; |
| + } |
| jpeg_finish_decompress(&cinfo); |
| if (NULL != colorSpace) { |