Revert of Add color xform support to SkWebpCodec (patchset #2 id:80001 of https://codereview.chromium.org/2294993002/ )
Reason for revert: Windows bots hate it when I upload new images. Original issue's description: > Add color xform support to SkWebpCodec > > BUG=skia: > GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2294993002 > > Committed: https://skia.googlesource.com/skia/+/828ed1777da74692d0c8a5834017929f5aedcc6b TBR=scroggo@google.com # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia: Review-Url: https://codereview.chromium.org/2318253004
This commit is contained in:
parent
828ed1777d
commit
2eb00e7b77
@ -1 +1 @@
|
||||
5
|
||||
4
|
@ -331,8 +331,4 @@ static inline bool needs_color_xform(const SkImageInfo& dstInfo, const SkImageIn
|
||||
return !isLegacy && (needsPremul || isF16 || srcDstNotEqual);
|
||||
}
|
||||
|
||||
static inline SkAlphaType select_alpha_xform(SkAlphaType dstAlphaType, SkAlphaType srcAlphaType) {
|
||||
return (kOpaque_SkAlphaType == srcAlphaType) ? kOpaque_SkAlphaType : dstAlphaType;
|
||||
}
|
||||
|
||||
#endif // SkCodecPriv_DEFINED
|
||||
|
@ -94,6 +94,10 @@ private:
|
||||
};
|
||||
#define AutoCleanPng(...) SK_REQUIRE_LOCAL_VAR(AutoCleanPng)
|
||||
|
||||
static inline SkAlphaType xform_alpha_type(SkAlphaType dstAlphaType, SkAlphaType srcAlphaType) {
|
||||
return (kOpaque_SkAlphaType == srcAlphaType) ? kOpaque_SkAlphaType : dstAlphaType;
|
||||
}
|
||||
|
||||
// Note: SkColorTable claims to store SkPMColors, which is not necessarily the case here.
|
||||
bool SkPngCodec::createColorTable(const SkImageInfo& dstInfo, int* ctableCount) {
|
||||
|
||||
@ -151,7 +155,7 @@ bool SkPngCodec::createColorTable(const SkImageInfo& dstInfo, int* ctableCount)
|
||||
if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) {
|
||||
SkColorType xformColorType = is_rgba(dstInfo.colorType()) ?
|
||||
kRGBA_8888_SkColorType : kBGRA_8888_SkColorType;
|
||||
SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(),
|
||||
SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(),
|
||||
this->getInfo().alphaType());
|
||||
fColorXform->apply(colorTable, colorTable, numColors, xformColorType, xformAlphaType);
|
||||
}
|
||||
@ -443,7 +447,7 @@ public:
|
||||
return y;
|
||||
}
|
||||
|
||||
SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(),
|
||||
SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(),
|
||||
this->getInfo().alphaType());
|
||||
int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width();
|
||||
|
||||
@ -529,7 +533,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(),
|
||||
SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(),
|
||||
this->getInfo().alphaType());
|
||||
int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width();
|
||||
srcRow = storage.get();
|
||||
|
@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include "SkCodecPriv.h"
|
||||
#include "SkColorSpaceXform.h"
|
||||
#include "SkWebpCodec.h"
|
||||
#include "SkStreamPriv.h"
|
||||
#include "SkTemplates.h"
|
||||
@ -144,20 +143,20 @@ SkCodec* SkWebpCodec::NewFromStream(SkStream* stream) {
|
||||
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 @@ bool SkWebpCodec::onGetValidSubset(SkIRect* desiredSubset) const {
|
||||
|
||||
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 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
|
||||
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.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.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;
|
||||
|
||||
WebPIterator frame;
|
||||
SkAutoTCallVProc<WebPIterator, WebPDemuxReleaseIterator> autoFrame(&frame);
|
||||
@ -309,36 +286,15 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user