diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkColorSpaceXformCanvas.cpp | 4 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 13 | ||||
-rw-r--r-- | src/image/SkImage_Base.h | 12 | ||||
-rw-r--r-- | src/image/SkImage_Generator.cpp | 18 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 20 |
5 files changed, 61 insertions, 6 deletions
diff --git a/src/core/SkColorSpaceXformCanvas.cpp b/src/core/SkColorSpaceXformCanvas.cpp index 89c81e5462..ac93e3a1ee 100644 --- a/src/core/SkColorSpaceXformCanvas.cpp +++ b/src/core/SkColorSpaceXformCanvas.cpp @@ -8,6 +8,7 @@ #include "SkColorFilter.h" #include "SkColorSpaceXform.h" #include "SkColorSpaceXformCanvas.h" +#include "SkImage_Base.h" #include "SkMakeUnique.h" #include "SkNoDrawCanvas.h" #include "SkSurface.h" @@ -72,8 +73,7 @@ public: } sk_sp<const SkImage> xform(const SkImage* img) const { - // TODO: for real - return sk_ref_sp(img); + return as_IB(img)->makeColorSpace(fTargetCS); } void onDrawPaint(const SkPaint& paint) override { diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index d76276be1f..2513e844d1 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -312,6 +312,19 @@ bool SkImage::isAlphaOnly() const { return as_IB(this)->onImageInfo().colorType() == kAlpha_8_SkColorType; } +sk_sp<SkImage> SkImage_Base::makeColorSpace(sk_sp<SkColorSpace> target) const { + SkColorSpaceTransferFn fn; + if (!target || !target->isNumericalTransferFn(&fn)) { + return nullptr; + } + + if (SkColorSpace::Equals(this->colorSpace(), target.get())) { + return sk_ref_sp(const_cast<SkImage_Base*>(this)); + } + + return this->onMakeColorSpace(std::move(target)); +} + ////////////////////////////////////////////////////////////////////////////////////// #if !SK_SUPPORT_GPU diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index e08d7610f7..284af0d1a6 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -81,14 +81,18 @@ public: fAddedToCache.store(true); } - virtual sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) { - // TODO: Implement this. - return sk_ref_sp(this); - } + // Transforms image into the input color space. + sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const; virtual bool onPinAsTexture(GrContext*) const { return false; } virtual void onUnpinAsTexture(GrContext*) const {} +protected: + virtual sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const { + // TODO: Make this pure virtual. + return sk_ref_sp(const_cast<SkImage_Base*>(this)); + } + private: // Set true by caches when they cache content that's derived from the current pixels. mutable SkAtomic<bool> fAddedToCache; diff --git a/src/image/SkImage_Generator.cpp b/src/image/SkImage_Generator.cpp index ae3f9f83f4..fb80767999 100644 --- a/src/image/SkImage_Generator.cpp +++ b/src/image/SkImage_Generator.cpp @@ -40,6 +40,7 @@ public: GrTexture* asTextureRef(GrContext*, const GrSamplerParams&, SkColorSpace*, sk_sp<SkColorSpace>*, SkScalar scaleAdjust[2]) const override; bool onIsLazyGenerated() const override { return true; } + sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const override; private: mutable SkImageCacherator fCache; @@ -115,6 +116,23 @@ sk_sp<SkImage> SkImage_Generator::onMakeSubset(const SkIRect& subset) const { return validator ? sk_sp<SkImage>(new SkImage_Generator(&validator)) : nullptr; } +sk_sp<SkImage> SkImage_Generator::onMakeColorSpace(sk_sp<SkColorSpace> target) const { + SkBitmap dst; + SkImageInfo dstInfo = fCache.info().makeColorSpace(target); + if (kIndex_8_SkColorType == dstInfo.colorType() || + kGray_8_SkColorType == dstInfo.colorType()) { + dstInfo = dstInfo.makeColorType(kN32_SkColorType); + } + dst.allocPixels(dstInfo); + + if (!fCache.directGeneratePixels(dstInfo, dst.getPixels(), dst.rowBytes(), 0, 0)) { + return nullptr; + } + + dst.setImmutable(); + return SkImage::MakeFromBitmap(dst); +} + sk_sp<SkImage> SkImage::MakeFromGenerator(std::unique_ptr<SkImageGenerator> generator, const SkIRect* subset) { SkImageCacherator::Validator validator( diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 220cc01b11..782093e27b 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -120,6 +120,8 @@ public: return fBitmap.pixelRef() && fBitmap.pixelRef()->isLazyGenerated(); } + sk_sp<SkImage> onMakeColorSpace(sk_sp<SkColorSpace>) const override; + #if SK_SUPPORT_GPU sk_sp<GrTexture> refPinnedTexture(uint32_t* uniqueID) const override; bool onPinAsTexture(GrContext*) const override; @@ -365,3 +367,21 @@ bool SkImage_Raster::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) c } return this->INHERITED::onAsLegacyBitmap(bitmap, mode); } + +sk_sp<SkImage> SkImage_Raster::onMakeColorSpace(sk_sp<SkColorSpace> target) const { + SkBitmap dst; + SkImageInfo dstInfo = fBitmap.info().makeColorSpace(target); + if (kIndex_8_SkColorType == dstInfo.colorType() || + kGray_8_SkColorType == dstInfo.colorType()) + { + dstInfo = dstInfo.makeColorType(kN32_SkColorType); + } + dst.allocPixels(dstInfo); + + SkPixmap src; + SkAssertResult(this->onPeekPixels(&src)); + + SkAssertResult(dst.writePixels(src)); + dst.setImmutable(); + return SkImage::MakeFromBitmap(dst); +} |