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