aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkColorSpaceXformCanvas.cpp4
-rw-r--r--src/image/SkImage.cpp13
-rw-r--r--src/image/SkImage_Base.h12
-rw-r--r--src/image/SkImage_Generator.cpp18
-rw-r--r--src/image/SkImage_Raster.cpp20
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);
+}