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

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

Issue 1106973004: Cleanup color space resolution for ReferenceFilterBuilder (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Touchup comment. Created 5 years, 8 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 1a569de3ef250d176ce3e1dfe2bfe52919c5f8ce..dc4d3032acb910b6e92bb92c2c72051f936ccd93 100644
--- a/Source/core/layout/svg/ReferenceFilterBuilder.cpp
+++ b/Source/core/layout/svg/ReferenceFilterBuilder.cpp
@@ -67,55 +67,31 @@ void ReferenceFilterBuilder::clearDocumentResourceReference(const FilterOperatio
documentResourceReferences->remove(filterOperation);
}
-// Returns whether or not the SVGElement object contains a valid color-interpolation-filters attribute
-static bool getSVGElementColorSpace(SVGElement* svgElement, ColorSpace& cs)
+// Returns the color-interpolation-filters property of the element.
+static EColorInterpolation colorInterpolationForElement(SVGElement& element, EColorInterpolation parentColorInterpolation)
{
- if (!svgElement)
- return false;
-
- const LayoutObject* layoutObject = svgElement->layoutObject();
- const ComputedStyle* style = layoutObject ? layoutObject->style() : 0;
- const SVGComputedStyle* svgStyle = style ? &style->svgStyle() : 0;
- EColorInterpolation eColorInterpolation = CI_AUTO;
- if (svgStyle) {
- // If a layout has been performed, then we can use the fast path to get this attribute
- eColorInterpolation = svgStyle->colorInterpolationFilters();
- } else if (!svgElement->presentationAttributeStyle()) {
- return false;
- } else {
- // Otherwise, use the slow path by using string comparison (used by external svg files)
- RefPtrWillBeRawPtr<CSSValue> cssValue = svgElement->presentationAttributeStyle()->getPropertyCSSValue(CSSPropertyColorInterpolationFilters);
- if (cssValue.get() && cssValue->isPrimitiveValue()) {
+ if (const LayoutObject* layoutObject = element.layoutObject())
+ return layoutObject->styleRef().svgStyle().colorInterpolationFilters();
+
+ // No layout has been performed, try to determine the property value
+ // "manually" (used by external SVG files.)
+ if (const StylePropertySet* propertySet = element.presentationAttributeStyle()) {
+ RefPtrWillBeRawPtr<CSSValue> cssValue = propertySet->getPropertyCSSValue(CSSPropertyColorInterpolationFilters);
+ if (cssValue && cssValue->isPrimitiveValue()) {
const CSSPrimitiveValue& primitiveValue = *((CSSPrimitiveValue*)cssValue.get());
- eColorInterpolation = (EColorInterpolation)primitiveValue;
- } else {
- return false;
+ return static_cast<EColorInterpolation>(primitiveValue);
}
}
-
- switch (eColorInterpolation) {
- case CI_AUTO:
- case CI_SRGB:
- cs = ColorSpaceDeviceRGB;
- break;
- case CI_LINEARRGB:
- cs = ColorSpaceLinearRGB;
- break;
- default:
- return false;
- }
-
- return true;
+ // 'auto' is the default (per Filter Effects), but since the property is
+ // inherited, propagate the parent's value.
+ return parentColorInterpolation;
}
-PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* parentFilter, LayoutObject* layoutObject, FilterEffect* previousEffect, const ReferenceFilterOperation* filterOperation)
+PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* parentFilter, LayoutObject& layoutObject, FilterEffect* previousEffect, const ReferenceFilterOperation& filterOperation)
{
- if (!layoutObject)
- return nullptr;
-
- TreeScope* treeScope = &layoutObject->node()->treeScope();
+ TreeScope* treeScope = &layoutObject.node()->treeScope();
- if (DocumentResourceReference* documentResourceRef = documentResourceReference(filterOperation)) {
+ if (DocumentResourceReference* documentResourceRef = documentResourceReference(&filterOperation)) {
DocumentResource* cachedSVGDocument = documentResourceRef->document();
// If we have an SVG document, this is an external reference. Otherwise
@@ -127,12 +103,12 @@ PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* paren
if (!treeScope)
return nullptr;
- Element* filter = treeScope->getElementById(filterOperation->fragment());
+ Element* filter = treeScope->getElementById(filterOperation.fragment());
if (!filter) {
// Although we did not find the referenced filter, it might exist later
// in the document.
- treeScope->document().accessSVGExtensions().addPendingResource(filterOperation->fragment(), toElement(layoutObject->node()));
+ treeScope->document().accessSVGExtensions().addPendingResource(filterOperation.fragment(), toElement(layoutObject.node()));
return nullptr;
}
@@ -143,24 +119,21 @@ PassRefPtrWillBeRawPtr<FilterEffect> ReferenceFilterBuilder::build(Filter* paren
RefPtrWillBeRawPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect);
- ColorSpace filterColorSpace = ColorSpaceDeviceRGB;
- bool useFilterColorSpace = getSVGElementColorSpace(&filterElement, filterColorSpace);
+ EColorInterpolation filterColorInterpolation = colorInterpolationForElement(filterElement, CI_AUTO);
for (SVGElement* element = Traversal<SVGElement>::firstChild(filterElement); element; element = Traversal<SVGElement>::nextSibling(*element)) {
if (!element->isFilterEffect())
continue;
SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(element);
-
RefPtrWillBeRawPtr<FilterEffect> effect = effectElement->build(builder.get(), parentFilter);
if (!effect)
continue;
effectElement->setStandardAttributes(effect.get());
effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(effectElement, filterElement.primitiveUnits()->currentValue()->enumValue(), parentFilter->sourceImageRect()));
- ColorSpace colorSpace = filterColorSpace;
- if (useFilterColorSpace || getSVGElementColorSpace(effectElement, colorSpace))
- effect->setOperatingColorSpace(colorSpace);
+ EColorInterpolation colorInterpolation = colorInterpolationForElement(*effectElement, filterColorInterpolation);
+ effect->setOperatingColorSpace(colorInterpolation == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB);
builder->add(AtomicString(effectElement->result()->currentValue()->value()), effect);
}
return builder->lastEffect();
« 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