| 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,
|
|
|