aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Raster.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-05-04 12:40:30 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-04 12:40:41 +0000
commitb59a9da7eba4ea5f3101b87deae3d67395c58a7e (patch)
treee7a147109af134bcfadfb454ed8df71213e9fa27 /src/image/SkImage_Raster.cpp
parent64dbb89efc9daba9f62b4a385354a77aaa54861e (diff)
Revert "Add SkImage::makeColorSpace() with correct transfer fn behavior"
This reverts commit 9ad0531a18f854e5a2c8034880140dd6cd3ea3c1. Reason for revert: Does not handle transfer fn behavior. Original change's description: > Add SkImage::makeColorSpace() with correct transfer fn behavior > > Completes implementation for lazy and raster images. gpu is > still a TODO. > > Bug: skia:6553 > Change-Id: I04eea5c4fb53c50c0406c2e6b6778b0e21fd85f8 > Reviewed-on: https://skia-review.googlesource.com/14403 > Commit-Queue: Matt Sarett <msarett@google.com> > Reviewed-by: Mike Reed <reed@google.com> > TBR=mtklein@google.com,msarett@google.com,brianosman@google.com,reed@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Change-Id: I3830321aea7d0dc5ab38a40f3318bb53a41df383 Reviewed-on: https://skia-review.googlesource.com/15306 Reviewed-by: Matt Sarett <msarett@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/image/SkImage_Raster.cpp')
-rw-r--r--src/image/SkImage_Raster.cpp62
1 files changed, 54 insertions, 8 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 1c3c515a60..88847551d1 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -112,8 +112,7 @@ public:
SkASSERT(bitmapMayBeMutable || fBitmap.isImmutable());
}
- sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>, SkColorType,
- SkTransferFunctionBehavior) const override;
+ sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const override;
#if SK_SUPPORT_GPU
sk_sp<GrTextureProxy> refPinnedTextureProxy(uint32_t* uniqueID) const override;
@@ -343,22 +342,69 @@ bool SkImage_Raster::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) c
///////////////////////////////////////////////////////////////////////////////
-sk_sp<SkImage> SkImage_Raster::onMakeColorSpace(sk_sp<SkColorSpace> target,
- SkColorType targetColorType,
- SkTransferFunctionBehavior premulBehavior) const {
- SkImageInfo dstInfo = fBitmap.info().makeColorType(targetColorType).makeColorSpace(target);
+static inline void do_color_xform_non_linear_blending(SkBitmap* dst, const SkPixmap& src) {
+ SkDEBUGCODE(SkColorSpaceTransferFn fn;);
+ SkASSERT(dst->colorSpace()->isNumericalTransferFn(&fn) &&
+ src.colorSpace()->isNumericalTransferFn(&fn));
+
+ void* dstPixels = dst->getPixels();
+ const void* srcPixels = src.addr();
+ size_t dstRowBytes = dst->rowBytes();
+ size_t srcRowBytes = src.rowBytes();
+ if (kN32_SkColorType != src.colorType()) {
+ SkAssertResult(src.readPixels(src.info().makeColorType(kN32_SkColorType), dstPixels,
+ dstRowBytes, 0, 0));
+
+ srcPixels = dstPixels;
+ srcRowBytes = dstRowBytes;
+ }
+
+ std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform_Base::New(
+ src.colorSpace(), dst->colorSpace(), SkTransferFunctionBehavior::kIgnore);
+
+ void* dstRow = dstPixels;
+ const void* srcRow = srcPixels;
+ for (int y = 0; y < dst->height(); y++) {
+ // This function assumes non-linear blending. Which means that we must start by
+ // unpremultiplying in the gamma encoded space.
+ const void* tmpRow = srcRow;
+ if (kPremul_SkAlphaType == src.alphaType()) {
+ SkUnpremultiplyRow<false>((uint32_t*) dstRow, (const uint32_t*) srcRow, dst->width());
+ tmpRow = dstRow;
+ }
+
+ SkColorSpaceXform::ColorFormat fmt = select_xform_format(kN32_SkColorType);
+ SkAssertResult(xform->apply(fmt, dstRow, fmt, tmpRow, dst->width(), dst->alphaType()));
+
+ dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
+ srcRow = SkTAddOffset<const void>(srcRow, srcRowBytes);
+ }
+}
+
+sk_sp<SkImage> SkImage_Raster::onMakeColorSpace(sk_sp<SkColorSpace> target) const {
+ // Force the color type of the new image to be kN32_SkColorType.
+ // (1) This means we lose precision on F16 images. This is necessary while this function is
+ // used to pre-transform inputs to a legacy canvas. Legacy canvases do not handle F16.
+ // (2) kIndex8 and kGray8 must be expanded in order perform a color space transformation.
+ // (3) Seems reasonable to expand k565 and k4444. It's nice to avoid these color types for
+ // clients who opt into color space support.
+ SkImageInfo dstInfo = fBitmap.info().makeColorType(kN32_SkColorType).makeColorSpace(target);
SkBitmap dst;
dst.allocPixels(dstInfo);
SkPixmap src;
- SkAssertResult(fBitmap.peekPixels(&src));
+ SkTLazy<SkBitmap> tmp;
+ if (!fBitmap.peekPixels(&src)) {
+ tmp.init(fBitmap);
+ SkAssertResult(tmp.get()->peekPixels(&src));
+ }
// Treat nullptr srcs as sRGB.
if (!src.colorSpace()) {
src.setColorSpace(SkColorSpace::MakeSRGB());
}
- SkAssertResult(dst.writePixels(src));
+ do_color_xform_non_linear_blending(&dst, src);
dst.setImmutable();
return SkImage::MakeFromBitmap(dst);
}