Index: src/core/SkSpecialImage.cpp |
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp |
index 240d46921947e450a8f6592ac75c060e6fffb340..5d62c6bc62326cd56c532ad6836efa92eba18c68 100644 |
--- a/src/core/SkSpecialImage.cpp |
+++ b/src/core/SkSpecialImage.cpp |
@@ -52,11 +52,13 @@ public: |
virtual sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const = 0; |
- virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const = 0; |
+ virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const = 0; |
virtual sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const = 0; |
- virtual sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const = 0; |
+ virtual sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const = 0; |
private: |
typedef SkSpecialImage INHERITED; |
@@ -151,12 +153,14 @@ sk_sp<GrTexture> SkSpecialImage::asTextureRef(GrContext* context) const { |
} |
#endif |
-sk_sp<SkSpecialSurface> SkSpecialImage::makeSurface(const SkImageInfo& info) const { |
- return as_SIB(this)->onMakeSurface(info); |
+sk_sp<SkSpecialSurface> SkSpecialImage::makeSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const { |
+ return as_SIB(this)->onMakeSurface(outProps, size, at); |
} |
-sk_sp<SkSurface> SkSpecialImage::makeTightSurface(const SkImageInfo& info) const { |
- return as_SIB(this)->onMakeTightSurface(info); |
+sk_sp<SkSurface> SkSpecialImage::makeTightSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const { |
+ return as_SIB(this)->onMakeTightSurface(outProps, size, at); |
} |
sk_sp<SkSpecialImage> SkSpecialImage::makeSubset(const SkIRect& subset) const { |
@@ -252,7 +256,22 @@ public: |
} |
#endif |
- sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const override { |
+// TODO: The raster implementations of image filters all currently assume that the pixels are |
+// legacy N32. Until they actually check the format and operate on sRGB or F16 data appropriately, |
+// we can't enable this. (They will continue to produce incorrect results, but less-so). |
+#define RASTER_IMAGE_FILTERS_SUPPORT_SRGB_AND_F16 0 |
+ |
+ sk_sp<SkSpecialSurface> onMakeSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const override { |
+#if RASTER_IMAGE_FILTERS_SUPPORT_SRGB_AND_F16 |
+ SkColorSpace* colorSpace = outProps.colorSpace(); |
+#else |
+ SkColorSpace* colorSpace = nullptr; |
+#endif |
+ SkColorType colorType = colorSpace && colorSpace->gammaIsLinear() |
+ ? kRGBA_F16_SkColorType : kN32_SkColorType; |
+ SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, at, |
+ sk_ref_sp(colorSpace)); |
return SkSpecialSurface::MakeRaster(info, nullptr); |
} |
@@ -278,7 +297,17 @@ public: |
return SkImage::MakeFromBitmap(subsetBM); |
} |
- sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override { |
+ sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const override { |
+#if RASTER_IMAGE_FILTERS_SUPPORT_SRGB_AND_F16 |
+ SkColorSpace* colorSpace = outProps.colorSpace(); |
+#else |
+ SkColorSpace* colorSpace = nullptr; |
+#endif |
+ SkColorType colorType = colorSpace && colorSpace->gammaIsLinear() |
+ ? kRGBA_F16_SkColorType : kN32_SkColorType; |
+ SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, at, |
+ sk_ref_sp(colorSpace)); |
return SkSurface::MakeRaster(info); |
} |
@@ -382,16 +411,16 @@ public: |
return fColorSpace.get(); |
} |
- sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const override { |
+ sk_sp<SkSpecialSurface> onMakeSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const override { |
if (!fTexture->getContext()) { |
return nullptr; |
} |
- GrPixelConfig config = SkImageInfo2GrPixelConfig(info, *fTexture->getContext()->caps()); |
- |
- return SkSpecialSurface::MakeRenderTarget(fTexture->getContext(), |
- info.width(), info.height(), |
- config, sk_ref_sp(info.colorSpace())); |
+ SkColorSpace* colorSpace = outProps.colorSpace(); |
+ return SkSpecialSurface::MakeRenderTarget( |
+ fTexture->getContext(), size.width(), size.height(), |
+ GrRenderableConfigForColorSpace(colorSpace), sk_ref_sp(colorSpace)); |
} |
sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
@@ -428,7 +457,13 @@ public: |
fAlphaType, subTx.get(), fColorSpace, SkBudgeted::kYes); |
} |
- sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override { |
+ sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps, |
+ const SkISize& size, SkAlphaType at) const override { |
+ SkColorSpace* colorSpace = outProps.colorSpace(); |
+ SkColorType colorType = colorSpace && colorSpace->gammaIsLinear() |
+ ? kRGBA_F16_SkColorType : kRGBA_8888_SkColorType; |
+ SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, at, |
+ sk_ref_sp(colorSpace)); |
return SkSurface::MakeRenderTarget(fTexture->getContext(), SkBudgeted::kYes, info); |
} |