aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-06-14 07:11:04 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-06-14 07:11:04 +0000
commit1923776ac891c5cd810ec7feee6088ee168601a7 (patch)
treef7cf4537fbd7b1c834681114ee6c5667a82dd0c6
parent285f5db565ad64f9314025e2c619f3d323c694cc (diff)
parenta24e12f1fd51c0c7cabd5e6220ae961eadb5e52e (diff)
downloadskia-1923776ac891c5cd810ec7feee6088ee168601a7.tar.gz
release-request-0b3ce0b0-0f38-494b-a590-b594ba11c2d2-for-git_oc-release-4098933 snap-temp-L41500000074000728
Change-Id: I835e4e96417869f2354e778f8399866609381695
-rw-r--r--src/images/SkImageEncoderFns.h16
-rw-r--r--src/images/SkJPEGImageEncoder.cpp28
-rw-r--r--src/images/SkPNGImageEncoder.cpp14
-rw-r--r--src/images/SkWEBPImageEncoder.cpp2
4 files changed, 34 insertions, 26 deletions
diff --git a/src/images/SkImageEncoderFns.h b/src/images/SkImageEncoderFns.h
index 5120570c48..cfac46e66e 100644
--- a/src/images/SkImageEncoderFns.h
+++ b/src/images/SkImageEncoderFns.h
@@ -15,6 +15,7 @@
#include "SkBitmap.h"
#include "SkColor.h"
#include "SkColorPriv.h"
+#include "SkColorSpace_Base.h"
#include "SkICC.h"
#include "SkPreConfig.h"
#include "SkRasterPipeline.h"
@@ -276,10 +277,21 @@ static inline void transform_scanline_F16_premul_to_8888(char* SK_RESTRICT dst,
p.run(0, width);
}
-static inline sk_sp<SkData> icc_from_color_space(const SkColorSpace& cs) {
+static inline sk_sp<SkData> icc_from_color_space(const SkImageInfo& info) {
+ SkColorSpace* cs = info.colorSpace();
+ if (!cs) {
+ return nullptr;
+ }
+
+ sk_sp<SkColorSpace> owned;
+ if (kRGBA_F16_SkColorType == info.colorType()) {
+ owned = as_CSB(cs)->makeSRGBGamma();
+ cs = owned.get();
+ }
+
SkColorSpaceTransferFn fn;
SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor);
- if (cs.isNumericalTransferFn(&fn) && cs.toXYZD50(&toXYZD50)) {
+ if (cs->isNumericalTransferFn(&fn) && cs->toXYZD50(&toXYZD50)) {
return SkICC::WriteToICC(fn, toXYZD50);
}
diff --git a/src/images/SkJPEGImageEncoder.cpp b/src/images/SkJPEGImageEncoder.cpp
index 764e9c43b0..1524de3c33 100644
--- a/src/images/SkJPEGImageEncoder.cpp
+++ b/src/images/SkJPEGImageEncoder.cpp
@@ -136,21 +136,19 @@ bool SkEncodeImageAsJPEG(SkWStream* stream, const SkPixmap& pixmap, int quality)
jpeg_start_compress(&cinfo, TRUE);
- if (pixmap.colorSpace()) {
- sk_sp<SkData> icc = icc_from_color_space(*pixmap.colorSpace());
- if (icc) {
- // Create a contiguous block of memory with the icc signature followed by the profile.
- sk_sp<SkData> markerData =
- SkData::MakeUninitialized(kICCMarkerHeaderSize + icc->size());
- uint8_t* ptr = (uint8_t*) markerData->writable_data();
- memcpy(ptr, kICCSig, sizeof(kICCSig));
- ptr += sizeof(kICCSig);
- *ptr++ = 1; // This is the first marker.
- *ptr++ = 1; // Out of one total markers.
- memcpy(ptr, icc->data(), icc->size());
-
- jpeg_write_marker(&cinfo, kICCMarker, markerData->bytes(), markerData->size());
- }
+ sk_sp<SkData> icc = icc_from_color_space(pixmap.info());
+ if (icc) {
+ // Create a contiguous block of memory with the icc signature followed by the profile.
+ sk_sp<SkData> markerData =
+ SkData::MakeUninitialized(kICCMarkerHeaderSize + icc->size());
+ uint8_t* ptr = (uint8_t*) markerData->writable_data();
+ memcpy(ptr, kICCSig, sizeof(kICCSig));
+ ptr += sizeof(kICCSig);
+ *ptr++ = 1; // This is the first marker.
+ *ptr++ = 1; // Out of one total markers.
+ memcpy(ptr, icc->data(), icc->size());
+
+ jpeg_write_marker(&cinfo, kICCMarker, markerData->bytes(), markerData->size());
}
if (proc) {
diff --git a/src/images/SkPNGImageEncoder.cpp b/src/images/SkPNGImageEncoder.cpp
index b57c32a0fc..eb08fa4b83 100644
--- a/src/images/SkPNGImageEncoder.cpp
+++ b/src/images/SkPNGImageEncoder.cpp
@@ -347,14 +347,12 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, int pngColorTyp
}
}
- if (pixmap.colorSpace()) {
- if (pixmap.colorSpace()->isSRGB()) {
- png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
- } else {
- sk_sp<SkData> icc = icc_from_color_space(*pixmap.colorSpace());
- if (icc) {
- set_icc(png_ptr, info_ptr, std::move(icc));
- }
+ if (pixmap.colorSpace() && pixmap.colorSpace()->isSRGB()) {
+ png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
+ } else {
+ sk_sp<SkData> icc = icc_from_color_space(pixmap.info());
+ if (icc) {
+ set_icc(png_ptr, info_ptr, std::move(icc));
}
}
diff --git a/src/images/SkWEBPImageEncoder.cpp b/src/images/SkWEBPImageEncoder.cpp
index c0cd4a6cae..f77e17fb09 100644
--- a/src/images/SkWEBPImageEncoder.cpp
+++ b/src/images/SkWEBPImageEncoder.cpp
@@ -180,7 +180,7 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkEncodeO
// If there is no need to embed an ICC profile, we write directly to the input stream.
// Otherwise, we will first encode to |tmp| and use a mux to add the ICC chunk. libwebp
// forces us to have an encoded image before we can add a profile.
- sk_sp<SkData> icc = pixmap.colorSpace() ? icc_from_color_space(*pixmap.colorSpace()) : nullptr;
+ sk_sp<SkData> icc = icc_from_color_space(pixmap.info());
SkDynamicMemoryWStream tmp;
pic.custom_ptr = icc ? (void*)&tmp : (void*)stream;