Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(502)

Unified Diff: third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp

Issue 2426723005: Use SkColorSpaceXform to handle color conversions in decoders (Closed)
Patch Set: Rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
index 40e600f0c69ea348d784d65e3d4bc9eee2b94b79..bb33f86670a8b109fdda624be2510a8c9fe7e055 100644
--- a/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoder.cpp
@@ -28,10 +28,6 @@
#include "platform/image-decoders/webp/WEBPImageDecoder.h"
-#if USE(QCMSLIB)
-#include "qcms.h"
-#endif
-
#if CPU(BIG_ENDIAN) || CPU(MIDDLE_ENDIAN)
#error Blink assumes a little-endian target.
#endif
@@ -346,8 +342,8 @@ void WEBPImageDecoder::readColorProfile() {
reinterpret_cast<const char*>(chunkIterator.chunk.bytes);
size_t profileSize = chunkIterator.chunk.size;
- setColorProfileAndComputeTransform(profileData, profileSize,
- true /* hasAlpha */, false /* useSRGB */);
+ setColorSpaceAndComputeTransform(profileData, profileSize,
+ false /* useSRGB */);
WebPDemuxReleaseChunkIterator(&chunkIterator);
}
@@ -367,12 +363,25 @@ void WEBPImageDecoder::applyPostProcessing(size_t frameIndex) {
const int left = frameRect.x();
const int top = frameRect.y();
-#if USE(QCMSLIB)
- if (qcms_transform* transform = colorTransform()) {
+#if USE(SKCOLORXFORM)
+ // TODO (msarett):
+ // Here we apply the color space transformation to the dst space.
+ // It does not really make sense to transform to a gamma-encoded
+ // space and then immediately after, perform a linear premultiply
+ // and linear blending. Can we find a way to perform the
+ // premultiplication and blending in a linear space?
+ SkColorSpaceXform* xform = colorTransform();
+ if (xform) {
+ const SkColorSpaceXform::ColorFormat srcFormat =
+ SkColorSpaceXform::kBGRA_8888_ColorFormat;
+ const SkColorSpaceXform::ColorFormat dstFormat =
+ SkColorSpaceXform::kRGBA_8888_ColorFormat;
for (int y = m_decodedHeight; y < decodedHeight; ++y) {
const int canvasY = top + y;
uint8_t* row = reinterpret_cast<uint8_t*>(buffer.getAddr(left, canvasY));
- qcms_transform_data_type(transform, row, row, width, QCMS_OUTPUT_RGBX);
+ xform->apply(dstFormat, row, srcFormat, row, width,
+ kUnpremul_SkAlphaType);
+
uint8_t* pixel = row;
for (int x = 0; x < width; ++x, pixel += 4) {
const int canvasX = left + x;
@@ -381,7 +390,7 @@ void WEBPImageDecoder::applyPostProcessing(size_t frameIndex) {
}
}
}
-#endif // USE(QCMSLIB)
+#endif // USE(SKCOLORXFORM)
// During the decoding of the current frame, we may have set some pixels to be
// transparent (i.e. alpha < 255). If the alpha blend source was
@@ -531,9 +540,17 @@ bool WEBPImageDecoder::decodeSingleFrame(const uint8_t* dataBytes,
WEBP_CSP_MODE mode = outputMode(m_formatFlags & ALPHA_FLAG);
if (!m_premultiplyAlpha)
mode = outputMode(false);
-#if USE(QCMSLIB)
- if (colorTransform())
- mode = MODE_RGBA; // Decode to RGBA for input to libqcms.
+#if USE(SKCOLORXFORM)
+ if (colorTransform()) {
+ // Swizzling between RGBA and BGRA is zero cost in a color transform.
+ // So when we have a color transform, we should decode to whatever is
+ // easiest for libwebp, and then let the color transform swizzle if
+ // necessary.
+ // Lossy webp is encoded as YUV (so RGBA and BGRA are the same cost).
+ // Lossless webp is encoded as BGRA. This means decoding to BGRA is
+ // either faster or the same cost as RGBA.
+ mode = MODE_BGRA;
+ }
#endif
WebPInitDecBuffer(&m_decoderBuffer);
m_decoderBuffer.colorspace = mode;

Powered by Google App Engine
This is Rietveld 408576698