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

Unified Diff: Source/core/layout/svg/ReferenceFilterBuilder.cpp

Issue 1235293003: Implement filter effects region for reference filters. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fixes per review comments Created 5 years, 5 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
« no previous file with comments | « Source/core/layout/svg/ReferenceFilterBuilder.h ('k') | Source/core/paint/DeprecatedPaintLayer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/layout/svg/ReferenceFilterBuilder.cpp
diff --git a/Source/core/layout/svg/ReferenceFilterBuilder.cpp b/Source/core/layout/svg/ReferenceFilterBuilder.cpp
index c0136065f5807a005d38195331f223781b44453c..71c824757aa28765b89d7546e288de5396ea8209 100644
--- a/Source/core/layout/svg/ReferenceFilterBuilder.cpp
+++ b/Source/core/layout/svg/ReferenceFilterBuilder.cpp
@@ -35,10 +35,13 @@
#include "core/dom/Element.h"
#include "core/dom/ElementTraversal.h"
#include "core/fetch/DocumentResource.h"
+#include "core/layout/LayoutBox.h"
#include "core/layout/svg/LayoutSVGResourceFilter.h"
#include "core/svg/SVGDocumentExtensions.h"
#include "core/svg/SVGFilterPrimitiveStandardAttributes.h"
#include "core/svg/graphics/filters/SVGFilterBuilder.h"
+#include "platform/graphics/filters/ReferenceFilter.h"
+#include "platform/graphics/filters/SourceGraphic.h"
namespace blink {
@@ -87,7 +90,7 @@ static EColorInterpolation colorInterpolationForElement(SVGElement& element, ECo
return parentColorInterpolation;
}
-PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* parentFilter, Element* element, FilterEffect* previousEffect, const ReferenceFilterOperation& filterOperation)
+PassRefPtrWillBeRawPtr<ReferenceFilter> ReferenceFilterBuilder::build(float zoom, Element* element, FilterEffect* previousEffect, const ReferenceFilterOperation& filterOperation)
{
TreeScope* treeScope = &element->treeScope();
@@ -117,6 +120,12 @@ PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* paren
SVGFilterElement& filterElement = toSVGFilterElement(*filter);
+ LayoutRect targetBoundingBox(element->inDocument() ? element->layoutObject()->enclosingBox()->borderBoxRect() : FloatRect());
+ targetBoundingBox.scale(1.0f / zoom);
+ FloatRect filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement>(&filterElement, filterElement.filterUnits()->currentValue()->enumValue(), targetBoundingBox);
+ RefPtrWillBeRawPtr<ReferenceFilter> result(ReferenceFilter::create(targetBoundingBox, filterRegion, zoom));
+ if (!previousEffect)
+ previousEffect = result->sourceGraphic();
RefPtrWillBeRawPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect);
EColorInterpolation filterColorInterpolation = colorInterpolationForElement(filterElement, CI_AUTO);
@@ -126,17 +135,18 @@ PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* paren
continue;
SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element);
- RefPtrWillBeRawPtr<FilterEffect> effect = effectElement->build(builder.get(), parentFilter);
+ RefPtrWillBeRawPtr<FilterEffect> effect = effectElement->build(builder.get(), result.get());
if (!effect)
continue;
effectElement->setStandardAttributes(effect.get());
- effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(effectElement, filterElement.primitiveUnits()->currentValue()->enumValue(), parentFilter->sourceImageRect()));
+ effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(effectElement, filterElement.primitiveUnits()->currentValue()->enumValue(), targetBoundingBox));
EColorInterpolation colorInterpolation = colorInterpolationForElement(*effectElement, filterColorInterpolation);
effect->setOperatingColorSpace(colorInterpolation == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB);
builder->add(AtomicString(effectElement->result()->currentValue()->value()), effect);
}
- return builder->lastEffect();
+ result->setLastEffect(builder->lastEffect());
+ return result.release();
}
} // namespace blink
« no previous file with comments | « Source/core/layout/svg/ReferenceFilterBuilder.h ('k') | Source/core/paint/DeprecatedPaintLayer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698