aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Raster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/image/SkImage_Raster.cpp')
-rw-r--r--src/image/SkImage_Raster.cpp62
1 files changed, 8 insertions, 54 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 88847551d1..1c3c515a60 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -112,7 +112,8 @@ public:
SkASSERT(bitmapMayBeMutable || fBitmap.isImmutable());
}
- sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const override;
+ sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>, SkColorType,
+ SkTransferFunctionBehavior) const override;
#if SK_SUPPORT_GPU
sk_sp<GrTextureProxy> refPinnedTextureProxy(uint32_t* uniqueID) const override;
@@ -342,69 +343,22 @@ bool SkImage_Raster::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) c
///////////////////////////////////////////////////////////////////////////////
-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);
+sk_sp<SkImage> SkImage_Raster::onMakeColorSpace(sk_sp<SkColorSpace> target,
+ SkColorType targetColorType,
+ SkTransferFunctionBehavior premulBehavior) const {
+ SkImageInfo dstInfo = fBitmap.info().makeColorType(targetColorType).makeColorSpace(target);
SkBitmap dst;
dst.allocPixels(dstInfo);
SkPixmap src;
- SkTLazy<SkBitmap> tmp;
- if (!fBitmap.peekPixels(&src)) {
- tmp.init(fBitmap);
- SkAssertResult(tmp.get()->peekPixels(&src));
- }
+ SkAssertResult(fBitmap.peekPixels(&src));
// Treat nullptr srcs as sRGB.
if (!src.colorSpace()) {
src.setColorSpace(SkColorSpace::MakeSRGB());
}
- do_color_xform_non_linear_blending(&dst, src);
+ SkAssertResult(dst.writePixels(src));
dst.setImmutable();
return SkImage::MakeFromBitmap(dst);
}