Index: src/codec/SkWebpCodec.cpp |
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp |
index 0c3aa402bd70bfd2659b01d8468d4cfa252be82a..c12b1df5edf955d547aad34892d441544528f485 100644 |
--- a/src/codec/SkWebpCodec.cpp |
+++ b/src/codec/SkWebpCodec.cpp |
@@ -6,7 +6,6 @@ |
*/ |
#include "SkCodecPriv.h" |
-#include "SkColorSpaceXform.h" |
#include "SkWebpCodec.h" |
#include "SkStreamPriv.h" |
#include "SkTemplates.h" |
@@ -144,20 +143,20 @@ |
streamDeleter.release(), demux.release(), std::move(data)); |
} |
-static bool webp_conversion_possible(const SkImageInfo& dst, const SkImageInfo& src, |
- SkColorSpaceXform* colorXform) { |
+// This version is slightly different from SkCodecPriv's version of conversion_possible. It |
+// supports both byte orders for 8888. |
+static bool webp_conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { |
if (!valid_alpha(dst.alphaType(), src.alphaType())) { |
return false; |
} |
switch (dst.colorType()) { |
- case kRGBA_F16_SkColorType: |
- return nullptr != colorXform; |
+ // Both byte orders are supported. |
case kBGRA_8888_SkColorType: |
case kRGBA_8888_SkColorType: |
return true; |
case kRGB_565_SkColorType: |
- return nullptr == colorXform && src.alphaType() == kOpaque_SkAlphaType; |
+ return src.alphaType() == kOpaque_SkAlphaType; |
default: |
return false; |
} |
@@ -211,15 +210,8 @@ |
SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t rowBytes, |
const Options& options, SkPMColor*, int*, |
- int* rowsDecodedPtr) { |
- |
- std::unique_ptr<SkColorSpaceXform> colorXform = nullptr; |
- if (needs_color_xform(dstInfo, this->getInfo())) { |
- colorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace()), |
- sk_ref_sp(dstInfo.colorSpace())); |
- } |
- |
- if (!webp_conversion_possible(dstInfo, this->getInfo(), colorXform.get())) { |
+ int* rowsDecoded) { |
+ if (!webp_conversion_possible(dstInfo, this->getInfo())) { |
return kInvalidConversion; |
} |
@@ -277,27 +269,12 @@ |
config.options.scaled_height = dstDimensions.height(); |
} |
- // FIXME (msarett): |
- // Lossless webp is encoded as BGRA. In that case, it would be more efficient to |
- // to decode BGRA and apply the color xform to a BGRA buffer. |
- config.output.colorspace = colorXform ? MODE_RGBA : |
- webp_decode_mode(dstInfo.colorType(), dstInfo.alphaType() == kPremul_SkAlphaType); |
+ config.output.colorspace = webp_decode_mode(dstInfo.colorType(), |
+ dstInfo.alphaType() == kPremul_SkAlphaType); |
+ config.output.u.RGBA.rgba = (uint8_t*) dst; |
+ config.output.u.RGBA.stride = (int) rowBytes; |
+ config.output.u.RGBA.size = dstInfo.getSafeSize(rowBytes); |
config.output.is_external_memory = 1; |
- |
- // We will decode the entire image and then perform the color transform. libwebp |
- // does not provide a row-by-row API. This is a shame particularly in the F16 case, |
- // where we need to allocate an extra image-sized buffer. |
- SkAutoTMalloc<uint32_t> pixels; |
- if (kRGBA_F16_SkColorType == dstInfo.colorType()) { |
- pixels.reset(dstDimensions.width() * dstDimensions.height()); |
- config.output.u.RGBA.rgba = (uint8_t*) pixels.get(); |
- config.output.u.RGBA.stride = (int) dstDimensions.width() * sizeof(uint32_t); |
- config.output.u.RGBA.size = config.output.u.RGBA.stride * dstDimensions.height(); |
- } else { |
- config.output.u.RGBA.rgba = (uint8_t*) dst; |
- config.output.u.RGBA.stride = (int) rowBytes; |
- config.output.u.RGBA.size = dstInfo.getSafeSize(rowBytes); |
- } |
WebPIterator frame; |
SkAutoTCallVProc<WebPIterator, WebPDemuxReleaseIterator> autoFrame(&frame); |
@@ -309,36 +286,15 @@ |
return kInvalidInput; |
} |
- int rowsDecoded; |
- SkCodec::Result result; |
switch (WebPIUpdate(idec, frame.fragment.bytes, frame.fragment.size)) { |
case VP8_STATUS_OK: |
- rowsDecoded = dstInfo.height(); |
- result = kSuccess; |
- break; |
+ return kSuccess; |
case VP8_STATUS_SUSPENDED: |
- WebPIDecGetRGB(idec, rowsDecodedPtr, nullptr, nullptr, nullptr); |
- rowsDecoded = *rowsDecodedPtr; |
- result = kIncompleteInput; |
- break; |
+ WebPIDecGetRGB(idec, rowsDecoded, nullptr, nullptr, nullptr); |
+ return kIncompleteInput; |
default: |
return kInvalidInput; |
} |
- |
- if (colorXform) { |
- SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), |
- this->getInfo().alphaType()); |
- |
- uint32_t* src = (uint32_t*) config.output.u.RGBA.rgba; |
- size_t srcRowBytes = config.output.u.RGBA.stride; |
- for (int y = 0; y < rowsDecoded; y++) { |
- colorXform->apply(dst, src, dstInfo.width(), dstInfo.colorType(), xformAlphaType); |
- dst = SkTAddOffset<void>(dst, rowBytes); |
- src = SkTAddOffset<uint32_t>(src, srcRowBytes); |
- } |
- } |
- |
- return result; |
} |
SkWebpCodec::SkWebpCodec(int width, int height, const SkEncodedInfo& info, |