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

Unified Diff: third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp

Issue 1309393007: [poc] redecode Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: resetColorProfileForTesting rename Created 5 years, 1 month 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/png/PNGImageDecoder.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
index 643a2dc5255bb46bf9d40d48c05574727d203a39..522797d8b05f46f34898d8c886086ef1089e8969 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -39,6 +39,8 @@
#include "config.h"
#include "platform/image-decoders/png/PNGImageDecoder.h"
+#include "platform/graphics/GraphicsScreen.h"
+
#include "png.h"
#if !defined(PNG_LIBPNG_VER_MAJOR) || !defined(PNG_LIBPNG_VER_MINOR)
#error version error: compile against a versioned libpng.
@@ -157,28 +159,53 @@ public:
m_transform = 0;
}
- void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha, bool sRGB)
+ PassRefPtr<ColorSpaceProfile> createColorTransform(const ColorProfile& colorProfile, bool hasAlpha, bool sRGB)
{
clearColorTransform();
+ fprintf(stderr, "PNG decoder %p createColorTransform ", m_decoder);
+ if (m_decoder->deviceProfile())
+ fprintf(stderr, ": device %p\n", m_decoder->deviceProfile().get());
+ else
+ fprintf(stderr, ": %p\n", nullptr);
+ fprintf(stderr, "image color profiles enabled: %d\n", imageColorProfilesEnabled());
+ fflush(stderr);
+
if (colorProfile.isEmpty() && !sRGB)
- return;
+ return nullptr;
+
qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile();
+ if (m_decoder->deviceProfile())
+ deviceProfile = m_decoder->deviceProfile()->profile();
if (!deviceProfile)
- return;
- qcms_profile* inputProfile = 0;
+ return nullptr;
+
+ qcms_profile* inputProfile = nullptr;
if (!colorProfile.isEmpty())
inputProfile = qcms_profile_from_memory(colorProfile.data(), colorProfile.size());
else
inputProfile = qcms_profile_sRGB();
if (!inputProfile)
- return;
+ return nullptr;
+
+ fprintf(stderr, " from source profile [%s]", qcms_profile_get_description(inputProfile));
+ fprintf(stderr, " to [%s]\n", qcms_profile_get_description(deviceProfile));
+ fflush(stderr);
+
+ // There is no need to create a color transform if the color profiles match.
+ if (imageColorProfilesEnabled() && qcms_profile_match(inputProfile, deviceProfile))
+ return ColorSpaceProfile::create(inputProfile);
+
// We currently only support color profiles for RGB and RGBA images.
ASSERT(rgbData == qcms_profile_get_color_space(inputProfile));
qcms_data_type dataFormat = hasAlpha ? QCMS_DATA_RGBA_8 : QCMS_DATA_RGB_8;
// FIXME: Don't force perceptual intent if the image profile contains an intent.
m_transform = qcms_transform_create(inputProfile, dataFormat, deviceProfile, dataFormat, QCMS_INTENT_PERCEPTUAL);
+ if (m_transform)
+ return ColorSpaceProfile::create(inputProfile);
+
qcms_profile_release(inputProfile);
+ return nullptr;
}
#endif
@@ -202,10 +229,12 @@ PNGImageDecoder::PNGImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOp
, m_hasColorProfile(false)
, m_offset(offset)
{
+ fprintf(stderr, "PNG decoder %p created %s\n", this, !isMainThread() ? "impl-side-thread" : "");
}
PNGImageDecoder::~PNGImageDecoder()
{
+ fprintf(stderr, "PNG decoder %p ~PNGImageDecoder() %s\n", this, !isMainThread() ? "impl-side-thread" : "");
}
#if USE(QCMSLIB)
@@ -299,8 +328,12 @@ void PNGImageDecoder::headerAvailable()
ColorProfile colorProfile;
getColorProfile(png, info, colorProfile, sRGB);
bool imageHasAlpha = (colorType & PNG_COLOR_MASK_ALPHA) || trnsCount;
- m_reader->createColorTransform(colorProfile, imageHasAlpha, sRGB);
- m_hasColorProfile = !!m_reader->colorTransform();
+ RefPtr<ColorSpaceProfile> imageColorProfile = m_reader->createColorTransform(colorProfile, imageHasAlpha, sRGB);
+ m_hasColorProfile = !!imageColorProfile.get();
+ if (m_hasColorProfile && imageColorProfilesEnabled()) {
+ RELEASE_ASSERT(imageColorProfile->profile());
+ m_colorProfile = imageColorProfile;
+ }
}
#endif
@@ -332,6 +365,8 @@ void PNGImageDecoder::headerAvailable()
m_reader->setHasAlpha(channels == 4);
+ fprintf(stderr, "PNG decoder %p headerAvailable %lux%lu %s\n", this, width, height, m_reader->decodingSizeOnly() ? "size-only-decode" : "");
+
if (m_reader->decodingSizeOnly()) {
// If we only needed the size, halt the reader.
#if PNG_LIBPNG_VER_MAJOR > 1 || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 5)
@@ -434,11 +469,20 @@ void PNGImageDecoder::rowAvailable(unsigned char* rowBuffer, unsigned rowIndex,
#if USE(QCMSLIB)
if (qcms_transform* transform = m_reader->colorTransform()) {
+ if (rowIndex < 3 || rowIndex >= (unsigned)size().height() - 1)
+ fprintf(stderr, "PNG decoder %p %dx%d color transform row %d\n", this, size().width(), size().height(), rowIndex);
qcms_transform_data(transform, row, m_reader->rowBuffer(), size().width());
row = m_reader->rowBuffer();
}
#endif
+ if (rowIndex < 3)
+ fprintf(stderr, "PNG decoder %p %dx%d row %d\n", this, size().width(), size().height(), rowIndex);
+ if (rowIndex >= (unsigned)size().height() - 1) {
+ fprintf(stderr, "PNG decoder %p %dx%d row %d\n", this, size().width(), size().height(), rowIndex);
+ fflush(stderr);
+ }
+
// Write the decoded row pixels to the frame buffer. The repetitive
// form of the row write loops is for speed.
ImageFrame::PixelData* address = buffer.getAddr(0, y);
@@ -472,6 +516,8 @@ void PNGImageDecoder::rowAvailable(unsigned char* rowBuffer, unsigned rowIndex,
void PNGImageDecoder::complete()
{
+ fflush(stderr);
+
if (m_frameBufferCache.isEmpty())
return;

Powered by Google App Engine
This is Rietveld 408576698