aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-03-15 17:50:08 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-21 00:05:30 +0000
commit0e032be6b25a943ae85f51aaf7309311da7fea44 (patch)
tree2739329310ce623c816b678d56c9e54b7d20b54e /src/images
parent29dd456c8993da208568ca1658579df03ff4375d (diff)
Add support for writing ICC profiles in png encodes
BUG=skia: Change-Id: I99eb2f157f249ed09d724461ec4a1e31db70816a Reviewed-on: https://skia-review.googlesource.com/9782 Reviewed-by: Leon Scroggins <scroggo@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/images')
-rw-r--r--src/images/SkImageEncoderPriv.h6
-rw-r--r--src/images/SkJPEGImageEncoder.cpp4
-rw-r--r--src/images/SkPNGImageEncoder.cpp18
-rw-r--r--src/images/SkWEBPImageEncoder.cpp2
4 files changed, 23 insertions, 7 deletions
diff --git a/src/images/SkImageEncoderPriv.h b/src/images/SkImageEncoderPriv.h
index 5f7560d2de..69d45fbf8c 100644
--- a/src/images/SkImageEncoderPriv.h
+++ b/src/images/SkImageEncoderPriv.h
@@ -11,15 +11,15 @@
#include "SkImageEncoder.h"
struct SkEncodeOptions {
- enum class PremulBehavior {
+ enum class ColorBehavior {
// Convert to a linear space before premultiplying or unpremultiplying.
- kGammaCorrect,
+ kCorrect,
// Ignore the transfer function when premultiplying or unpremultiplying.
kLegacy,
};
- PremulBehavior fPremulBehavior = PremulBehavior::kLegacy;
+ ColorBehavior fColorBehavior = ColorBehavior::kLegacy;
};
#ifdef SK_HAS_JPEG_LIBRARY
diff --git a/src/images/SkJPEGImageEncoder.cpp b/src/images/SkJPEGImageEncoder.cpp
index c37aa4687e..1f8f0d6394 100644
--- a/src/images/SkJPEGImageEncoder.cpp
+++ b/src/images/SkJPEGImageEncoder.cpp
@@ -86,10 +86,10 @@ bool SkEncodeImageAsJPEG(SkWStream* stream, const SkPixmap& pixmap, const SkEnco
pixmap.colorSpace()->gammaIsLinear());
SkPixmap src = pixmap;
- if (SkEncodeOptions::PremulBehavior::kLegacy == opts.fPremulBehavior) {
+ if (SkEncodeOptions::ColorBehavior::kLegacy == opts.fColorBehavior) {
src.setColorSpace(nullptr);
} else {
- // kGammaCorrect behavior requires a color space. It's not actually critical in the
+ // kCorrect behavior requires a color space. It's not actually critical in the
// jpeg case (since jpegs are opaque), but Skia color correct behavior generally
// requires pixels to be tagged with color spaces.
if (!src.colorSpace()) {
diff --git a/src/images/SkPNGImageEncoder.cpp b/src/images/SkPNGImageEncoder.cpp
index e4a60f917a..69a7b0780a 100644
--- a/src/images/SkPNGImageEncoder.cpp
+++ b/src/images/SkPNGImageEncoder.cpp
@@ -12,6 +12,7 @@
#include "SkColor.h"
#include "SkColorPriv.h"
#include "SkDither.h"
+#include "SkICC.h"
#include "SkMath.h"
#include "SkStream.h"
#include "SkTemplates.h"
@@ -168,7 +169,7 @@ bool SkEncodeImageAsPNG(SkWStream* stream, const SkPixmap& src, const SkEncodeOp
src.colorSpace()->gammaIsLinear());
SkPixmap pixmap = src;
- if (SkEncodeOptions::PremulBehavior::kLegacy == opts.fPremulBehavior) {
+ if (SkEncodeOptions::ColorBehavior::kLegacy == opts.fColorBehavior) {
pixmap.setColorSpace(nullptr);
} else {
if (!pixmap.colorSpace()) {
@@ -334,6 +335,21 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap,
}
}
+ if (pixmap.colorSpace()) {
+ SkColorSpaceTransferFn fn;
+ SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor);
+ if (pixmap.colorSpace()->isSRGB()) {
+ png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
+ } else if (pixmap.colorSpace()->isNumericalTransferFn(&fn) &&
+ pixmap.colorSpace()->toXYZD50(&toXYZD50))
+ {
+ sk_sp<SkData> icc = SkICC::WriteToICC(fn, toXYZD50);
+ png_set_iCCP(png_ptr, info_ptr, "Skia", 0, icc->bytes(), icc->size());
+ }
+
+ // TODO: Should we support writing ICC profiles for additional color spaces?
+ }
+
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
png_write_info(png_ptr, info_ptr);
int pngBytesPerPixel = num_components(pngColorType) * (bitDepth / 8);
diff --git a/src/images/SkWEBPImageEncoder.cpp b/src/images/SkWEBPImageEncoder.cpp
index 5928f97861..8797ff5925 100644
--- a/src/images/SkWEBPImageEncoder.cpp
+++ b/src/images/SkWEBPImageEncoder.cpp
@@ -126,7 +126,7 @@ static bool do_encode(SkWStream* stream, const SkPixmap& srcPixmap, const SkEnco
srcPixmap.colorSpace()->gammaIsLinear());
SkPixmap pixmap = srcPixmap;
- if (SkEncodeOptions::PremulBehavior::kLegacy == opts.fPremulBehavior) {
+ if (SkEncodeOptions::ColorBehavior::kLegacy == opts.fColorBehavior) {
pixmap.setColorSpace(nullptr);
} else {
if (!pixmap.colorSpace()) {