diff options
author | 2017-05-04 12:40:30 +0000 | |
---|---|---|
committer | 2017-05-04 12:40:41 +0000 | |
commit | b59a9da7eba4ea5f3101b87deae3d67395c58a7e (patch) | |
tree | e7a147109af134bcfadfb454ed8df71213e9fa27 /src/image/SkImage_Raster.cpp | |
parent | 64dbb89efc9daba9f62b4a385354a77aaa54861e (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.cpp | 62 |
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); } |