| 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);
|
| }
|
|
|
|
|