Chromium Code Reviews| Index: src/core/SkSpecialImage.cpp |
| diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp |
| index 240d46921947e450a8f6592ac75c060e6fffb340..010bd1844f57be2ec5f6af91ccb195760dfeea5b 100644 |
| --- a/src/core/SkSpecialImage.cpp |
| +++ b/src/core/SkSpecialImage.cpp |
| @@ -52,11 +52,14 @@ 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, |
|
robertphillips
2016/09/23 14:11:28
Do we need the default parameter here ?
|
| + SkAlphaType at = kPremul_SkAlphaType) const = 0; |
| private: |
| typedef SkSpecialImage INHERITED; |
| @@ -151,12 +154,15 @@ 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 +258,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 +299,18 @@ 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 = kPremul_SkAlphaType) 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 +414,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 +460,14 @@ 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 = kPremul_SkAlphaType) 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); |
| } |