Index: third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp b/third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp |
index 5776e8ef8e06c20e9626c15a366925f30437b14d..f6ec538e69f8a1a51d7a18a1a382d82bab78994c 100644 |
--- a/third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/filters/SkiaImageFilterBuilder.cpp |
@@ -44,6 +44,26 @@ |
namespace blink { |
namespace SkiaImageFilterBuilder { |
+namespace { |
+ |
+void populateSourceGraphicImageFilters(FilterEffect* sourceGraphic, sk_sp<SkImageFilter> input, ColorSpace inputColorSpace) |
+{ |
+ // Prepopulate SourceGraphic with two image filters: one with a null image |
+ // filter, and the other with a colorspace conversion filter. |
+ // We don't know what color space the interior nodes will request, so we |
+ // have to initialize SourceGraphic with both options. |
+ // Since we know SourceGraphic is always PM-valid, we also use these for |
+ // the PM-validated options. |
+ sk_sp<SkImageFilter> deviceFilter = transformColorSpace(input, inputColorSpace, ColorSpaceDeviceRGB); |
+ sk_sp<SkImageFilter> linearFilter = transformColorSpace(input, inputColorSpace, ColorSpaceLinearRGB); |
+ sourceGraphic->setImageFilter(ColorSpaceDeviceRGB, false, deviceFilter); |
+ sourceGraphic->setImageFilter(ColorSpaceLinearRGB, false, linearFilter); |
+ sourceGraphic->setImageFilter(ColorSpaceDeviceRGB, true, deviceFilter); |
+ sourceGraphic->setImageFilter(ColorSpaceLinearRGB, true, linearFilter); |
+} |
+ |
+} // namespace |
+ |
sk_sp<SkImageFilter> build(FilterEffect* effect, ColorSpace colorSpace, bool destinationRequiresValidPreMultipliedPixels) |
{ |
if (!effect) |
@@ -72,6 +92,14 @@ sk_sp<SkImageFilter> transformColorSpace(sk_sp<SkImageFilter> input, ColorSpace |
return SkColorFilterImageFilter::Make(std::move(colorFilter), std::move(input)); |
} |
+void buildSourceGraphic(FilterEffect* sourceGraphic, sk_sp<SkPicture> picture) |
+{ |
+ ASSERT(picture); |
+ SkRect cullRect = picture->cullRect(); |
+ sk_sp<SkImageFilter> filter = SkPictureImageFilter::Make(std::move(picture), cullRect); |
+ populateSourceGraphicImageFilters(sourceGraphic, std::move(filter), sourceGraphic->operatingColorSpace()); |
+} |
+ |
void buildFilterOperations(const FilterOperations& operations, CompositorFilterOperations* filters) |
{ |
ColorSpace currentColorSpace = ColorSpaceDeviceRGB; |
@@ -82,21 +110,9 @@ void buildFilterOperations(const FilterOperations& operations, CompositorFilterO |
case FilterOperation::REFERENCE: { |
Filter* referenceFilter = toReferenceFilterOperation(op).getFilter(); |
if (referenceFilter && referenceFilter->lastEffect()) { |
- FilterEffect* filterEffect = referenceFilter->lastEffect(); |
- // Prepopulate SourceGraphic with two image filters: one with a null image |
- // filter, and the other with a colorspace conversion filter. |
- // We don't know what color space the interior nodes will request, so we have to |
- // initialize SourceGraphic with both options. |
- // Since we know SourceGraphic is always PM-valid, we also use |
- // these for the PM-validated options. |
- sk_sp<SkImageFilter> deviceFilter = transformColorSpace(nullptr, currentColorSpace, ColorSpaceDeviceRGB); |
- sk_sp<SkImageFilter> linearFilter = transformColorSpace(nullptr, currentColorSpace, ColorSpaceLinearRGB); |
- FilterEffect* sourceGraphic = referenceFilter->getSourceGraphic(); |
- sourceGraphic->setImageFilter(ColorSpaceDeviceRGB, false, deviceFilter); |
- sourceGraphic->setImageFilter(ColorSpaceLinearRGB, false, linearFilter); |
- sourceGraphic->setImageFilter(ColorSpaceDeviceRGB, true, deviceFilter); |
- sourceGraphic->setImageFilter(ColorSpaceLinearRGB, true, linearFilter); |
+ populateSourceGraphicImageFilters(referenceFilter->getSourceGraphic(), nullptr, currentColorSpace); |
+ FilterEffect* filterEffect = referenceFilter->lastEffect(); |
currentColorSpace = filterEffect->operatingColorSpace(); |
filterEffect->determineFilterPrimitiveSubregion(MapRectForward); |
filters->appendReferenceFilter(SkiaImageFilterBuilder::build(filterEffect, currentColorSpace)); |