Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1709)

Unified Diff: Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp

Issue 14793008: Extract the SVG Filter Reference implementation out of the FilterEffectRenderer into its own type (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix copyrights Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp
diff --git a/Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp b/Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp
index 30350d4b1590fd664ebf5bb8b6a7b49c8e121251..2b30900b669104c3f6f7ef9e295011c6292a65ae 100644
--- a/Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp
+++ b/Source/core/platform/graphics/filters/SkiaImageFilterBuilder.cpp
@@ -34,6 +34,7 @@
#include "core/platform/graphics/filters/DropShadowImageFilter.h"
#include "core/platform/graphics/filters/FilterEffect.h"
#include "core/platform/graphics/filters/FilterOperations.h"
+#include "core/platform/graphics/filters/SourceGraphic.h"
namespace {
@@ -218,11 +219,25 @@ SkImageFilter* SkiaImageFilterBuilder::build(const FilterOperations& operations)
const FilterOperation& op = *operations.at(i);
switch (op.getOperationType()) {
case FilterOperation::REFERENCE: {
- FilterEffect* filterEffect = static_cast<const ReferenceFilterOperation*>(&op)->filterEffect();
- // FIXME: hook up parent filter to image source
- if (filterEffect)
+ const ReferenceFilterOperation* referenceFilterOperation = static_cast<const ReferenceFilterOperation*>(&op);
+ ReferenceFilter* referenceFilter = referenceFilterOperation->filter();
+ if (referenceFilter && referenceFilter->lastEffect()) {
+ FilterEffect* filterEffect = referenceFilter->lastEffect();
+ // Link SourceGraphic to the previous filter in the chain.
+ // We don't know what color space the interior nodes will request, so we have to populate the map with both options.
+ // (Only one of these will actually have a color transform on it.)
+ FilterColorSpacePair deviceKey(referenceFilter->sourceGraphic(), ColorSpaceDeviceRGB);
+ FilterColorSpacePair linearKey(referenceFilter->sourceGraphic(), ColorSpaceLinearRGB);
+ m_map.set(deviceKey, transformColorSpace(filter, currentColorSpace, ColorSpaceDeviceRGB));
+ m_map.set(linearKey, transformColorSpace(filter, currentColorSpace, ColorSpaceLinearRGB));
+
currentColorSpace = filterEffect->operatingColorSpace();
- filter.reset(SkiaImageFilterBuilder::build(filterEffect, currentColorSpace));
+ filter.reset(SkiaImageFilterBuilder::build(filterEffect, currentColorSpace));
+ // We might have no reference to the SourceGraphic's Skia filter now, so make
+ // sure we don't keep it in the map anymore.
+ m_map.remove(deviceKey);
+ m_map.remove(linearKey);
+ }
break;
}
case FilterOperation::GRAYSCALE: {
« no previous file with comments | « Source/core/platform/graphics/filters/ReferenceFilter.cpp ('k') | Source/core/rendering/FilterEffectRenderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698