Index: src/codec/SkJpegCodec.cpp |
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp |
index c094d50a3bbac8c7f9239c32c811a95b6b48ebbb..83656da42dc8d110f106ffc3693b621ccdad388c 100644 |
--- a/src/codec/SkJpegCodec.cpp |
+++ b/src/codec/SkJpegCodec.cpp |
@@ -11,7 +11,6 @@ |
#include "SkJpegUtility_codec.h" |
#include "SkCodecPriv.h" |
#include "SkColorPriv.h" |
-#include "SkScaledCodec.h" |
#include "SkScanlineDecoder.h" |
#include "SkStream.h" |
#include "SkTemplates.h" |
@@ -150,14 +149,6 @@ |
{} |
/* |
- * Return the row bytes of a particular image type and width |
- */ |
-static int get_row_bytes(const j_decompress_ptr dinfo) { |
- int colorBytes = (dinfo->out_color_space == JCS_RGB565) ? 2 : dinfo->out_color_components; |
- return dinfo->output_width * colorBytes; |
- |
-} |
-/* |
* Return a valid set of output dimensions for this decoder, given an input scale |
*/ |
SkISize SkJpegCodec::onGetScaledDimensions(float desiredScale) const { |
@@ -267,10 +258,10 @@ |
} |
/* |
- * Checks if we can natively scale to the requested dimensions and natively scales the |
- * dimensions if possible |
- */ |
-bool SkJpegCodec::nativelyScaleToDimensions(uint32_t dstWidth, uint32_t dstHeight) { |
+ * Checks if we can scale to the requested dimensions and scales the dimensions |
+ * if possible |
+ */ |
+bool SkJpegCodec::scaleToDimensions(uint32_t dstWidth, uint32_t dstHeight) { |
// libjpeg-turbo can scale to 1/8, 1/4, 3/8, 1/2, 5/8, 3/4, 7/8, and 1/1 |
fDecoderMgr->dinfo()->scale_denom = 8; |
fDecoderMgr->dinfo()->scale_num = 8; |
@@ -282,10 +273,7 @@ |
if (1 == fDecoderMgr->dinfo()->scale_num || |
dstWidth > fDecoderMgr->dinfo()->output_width || |
dstHeight > fDecoderMgr->dinfo()->output_height) { |
- // reset native scale settings on failure because this may be supported by the swizzler |
- this->fDecoderMgr->dinfo()->scale_num = 8; |
- chromium_jpeg_calc_output_dimensions(this->fDecoderMgr->dinfo()); |
- return false; |
+ return fDecoderMgr->returnFalse("could not scale to requested dimensions"); |
} |
// Try the next scale |
@@ -325,7 +313,7 @@ |
} |
// Perform the necessary scaling |
- if (!this->nativelyScaleToDimensions(dstInfo.width(), dstInfo.height())) { |
+ if (!this->scaleToDimensions(dstInfo.width(), dstInfo.height())) { |
return fDecoderMgr->returnFailure("cannot scale to requested dims", kInvalidScale); |
} |
@@ -393,47 +381,6 @@ |
, fOpts() |
{} |
- /* |
- * Return a valid set of output dimensions for this decoder, given an input scale |
- */ |
- SkISize onGetScaledDimensions(float desiredScale) override { |
- return fCodec->onGetScaledDimensions(desiredScale); |
- } |
- |
- /* |
- * Create the swizzler based on the encoded format. |
- * The swizzler is only used for sampling in the x direction. |
- */ |
- |
- SkCodec::Result initializeSwizzler(const SkImageInfo& info, const SkCodec::Options& options) { |
- SkSwizzler::SrcConfig srcConfig; |
- switch (info.colorType()) { |
- case kGray_8_SkColorType: |
- srcConfig = SkSwizzler::kGray; |
- break; |
- case kRGBA_8888_SkColorType: |
- srcConfig = SkSwizzler::kRGBX; |
- break; |
- case kBGRA_8888_SkColorType: |
- srcConfig = SkSwizzler::kBGRX; |
- break; |
- case kRGB_565_SkColorType: |
- srcConfig = SkSwizzler::kRGB_565; |
- break; |
- default: |
- //would have exited before now if the colorType was supported by jpeg |
- SkASSERT(false); |
- } |
- |
- fSwizzler.reset(SkSwizzler::CreateSwizzler(srcConfig, NULL, info, options.fZeroInitialized, |
- this->getInfo())); |
- if (!fSwizzler) { |
- // FIXME: CreateSwizzler could fail for another reason. |
- return SkCodec::kUnimplemented; |
- } |
- return SkCodec::kSuccess; |
- } |
- |
SkCodec::Result onStart(const SkImageInfo& dstInfo, const SkCodec::Options& options, |
SkPMColor ctable[], int* ctableCount) override { |
@@ -454,23 +401,8 @@ |
} |
// Perform the necessary scaling |
- if (!fCodec->nativelyScaleToDimensions(dstInfo.width(), dstInfo.height())) { |
- // full native scaling to dstInfo dimensions not supported |
- |
- if (!SkScaledCodec::DimensionsSupportedForSampling(this->getInfo(), dstInfo)) { |
- return SkCodec::kInvalidScale; |
- } |
- // create swizzler for sampling |
- SkCodec::Result result = this->initializeSwizzler(dstInfo, options); |
- if (SkCodec::kSuccess != result) { |
- SkCodecPrintf("failed to initialize the swizzler.\n"); |
- return result; |
- } |
- fStorage.reset(get_row_bytes(fCodec->fDecoderMgr->dinfo())); |
- fSrcRow = static_cast<uint8_t*>(fStorage.get()); |
- } else { |
- fSrcRow = NULL; |
- fSwizzler.reset(NULL); |
+ if (!fCodec->scaleToDimensions(dstInfo.width(), dstInfo.height())) { |
+ return SkCodec::kInvalidScale; |
} |
// Now, given valid output dimensions, we can start the decompress |
@@ -501,16 +433,9 @@ |
if (setjmp(fCodec->fDecoderMgr->getJmpBuf())) { |
return fCodec->fDecoderMgr->returnFailure("setjmp", SkCodec::kInvalidInput); |
} |
+ |
// Read rows one at a time |
- JSAMPLE* dstRow; |
- if (fSwizzler) { |
- // write data to storage row, then sample using swizzler |
- dstRow = fSrcRow; |
- } else { |
- // write data directly to dst |
- dstRow = (JSAMPLE*) dst; |
- } |
- |
+ JSAMPLE* dstRow = (JSAMPLE*) dst; |
for (int y = 0; y < count; y++) { |
// Read row of the image |
uint32_t rowsDecoded = |
@@ -527,17 +452,13 @@ |
// Convert to RGBA if necessary |
if (JCS_CMYK == fCodec->fDecoderMgr->dinfo()->out_color_space) { |
- convert_CMYK_to_RGBA(dstRow, fCodec->fDecoderMgr->dinfo()->output_width); |
+ convert_CMYK_to_RGBA(dstRow, this->dstInfo().width()); |
} |
- if(fSwizzler) { |
- // use swizzler to sample row |
- fSwizzler->swizzle(dst, dstRow); |
- dst = SkTAddOffset<JSAMPLE>(dst, rowBytes); |
- } else { |
- dstRow = SkTAddOffset<JSAMPLE>(dstRow, rowBytes); |
- } |
- } |
+ // Move to the next row |
+ dstRow = SkTAddOffset<JSAMPLE>(dstRow, rowBytes); |
+ } |
+ |
return SkCodec::kSuccess; |
} |
@@ -545,7 +466,7 @@ |
// TODO (msarett): Make this a member function and avoid reallocating the |
// memory buffer on each call to skip. |
#define chromium_jpeg_skip_scanlines(dinfo, count) \ |
- SkAutoMalloc storage(get_row_bytes(dinfo)); \ |
+ SkAutoMalloc storage(dinfo->output_width * dinfo->out_color_components); \ |
uint8_t* storagePtr = static_cast<uint8_t*>(storage.get()); \ |
for (int y = 0; y < count; y++) { \ |
chromium_jpeg_read_scanlines(dinfo, &storagePtr, 1); \ |
@@ -563,16 +484,13 @@ |
return SkCodec::kSuccess; |
} |
- SkEncodedFormat onGetEncodedFormat() const override { |
- return kJPEG_SkEncodedFormat; |
- } |
+#ifndef TURBO_HAS_SKIP |
+#undef chromium_jpeg_skip_scanlines |
+#endif |
private: |
SkAutoTDelete<SkJpegCodec> fCodec; |
- SkAutoMalloc fStorage; // Only used if sampling is needed |
- uint8_t* fSrcRow; // Only used if sampling is needed |
SkCodec::Options fOpts; |
- SkAutoTDelete<SkSwizzler> fSwizzler; |
typedef SkScanlineDecoder INHERITED; |
}; |
@@ -584,7 +502,6 @@ |
} |
const SkImageInfo& srcInfo = codec->getInfo(); |
- |
// Return the new scanline decoder |
return SkNEW_ARGS(SkJpegScanlineDecoder, (srcInfo, codec.detach())); |
} |