OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Adobe Systems Inc. All rights reserved. | 2 * Copyright (C) 2013 Adobe Systems Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * Copyright (C) 2011 Apple Inc. All rights reserved. | 4 * Copyright (C) 2011 Apple Inc. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "core/loader/cache/CachedSVGDocumentReference.h" | 37 #include "core/loader/cache/CachedSVGDocumentReference.h" |
38 #include "core/platform/graphics/filters/FilterEffect.h" | 38 #include "core/platform/graphics/filters/FilterEffect.h" |
39 #include "core/platform/graphics/filters/SourceAlpha.h" | 39 #include "core/platform/graphics/filters/SourceAlpha.h" |
40 #include "core/rendering/svg/RenderSVGResourceFilter.h" | 40 #include "core/rendering/svg/RenderSVGResourceFilter.h" |
41 #include "core/svg/SVGDocumentExtensions.h" | 41 #include "core/svg/SVGDocumentExtensions.h" |
42 #include "core/svg/SVGFilterPrimitiveStandardAttributes.h" | 42 #include "core/svg/SVGFilterPrimitiveStandardAttributes.h" |
43 #include "core/svg/graphics/filters/SVGFilterBuilder.h" | 43 #include "core/svg/graphics/filters/SVGFilterBuilder.h" |
44 | 44 |
45 namespace WebCore { | 45 namespace WebCore { |
46 | 46 |
47 // Returns whether or not the SVGStyledElement object contains a valid color-int
erpolation-filters attribute | 47 // Returns whether or not the SVGElement object contains a valid color-interpola
tion-filters attribute |
48 static bool getSVGStyledElementColorSpace(SVGStyledElement* svgStyledElement, Co
lorSpace& cs) | 48 static bool getSVGElementColorSpace(SVGElement* svgElement, ColorSpace& cs) |
49 { | 49 { |
50 if (!svgStyledElement) | 50 if (!svgElement) |
51 return false; | 51 return false; |
52 | 52 |
53 const RenderObject* renderer = svgStyledElement->renderer(); | 53 const RenderObject* renderer = svgElement->renderer(); |
54 const RenderStyle* style = renderer ? renderer->style() : 0; | 54 const RenderStyle* style = renderer ? renderer->style() : 0; |
55 const SVGRenderStyle* svgStyle = style ? style->svgStyle() : 0; | 55 const SVGRenderStyle* svgStyle = style ? style->svgStyle() : 0; |
56 EColorInterpolation eColorInterpolation = CI_AUTO; | 56 EColorInterpolation eColorInterpolation = CI_AUTO; |
57 if (svgStyle) { | 57 if (svgStyle) { |
58 // If a layout has been performed, then we can use the fast path to get
this attribute | 58 // If a layout has been performed, then we can use the fast path to get
this attribute |
59 eColorInterpolation = svgStyle->colorInterpolationFilters(); | 59 eColorInterpolation = svgStyle->colorInterpolationFilters(); |
60 } else { | 60 } else { |
61 // Otherwise, use the slow path by using string comparison (used by exte
rnal svg files) | 61 // Otherwise, use the slow path by using string comparison (used by exte
rnal svg files) |
62 RefPtr<CSSValue> cssValue = svgStyledElement->getPresentationAttribute( | 62 RefPtr<CSSValue> cssValue = svgElement->getPresentationAttribute( |
63 SVGNames::color_interpolation_filtersAttr.toString()); | 63 SVGNames::color_interpolation_filtersAttr.toString()); |
64 if (cssValue.get() && cssValue->isPrimitiveValue()) { | 64 if (cssValue.get() && cssValue->isPrimitiveValue()) { |
65 const CSSPrimitiveValue& primitiveValue = *((CSSPrimitiveValue*)cssV
alue.get()); | 65 const CSSPrimitiveValue& primitiveValue = *((CSSPrimitiveValue*)cssV
alue.get()); |
66 eColorInterpolation = (EColorInterpolation)primitiveValue; | 66 eColorInterpolation = (EColorInterpolation)primitiveValue; |
67 } else { | 67 } else { |
68 return false; | 68 return false; |
69 } | 69 } |
70 } | 70 } |
71 | 71 |
72 switch (eColorInterpolation) { | 72 switch (eColorInterpolation) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 SVGFilterElement* filterElement = toSVGFilterElement(toSVGElement(filter)); | 118 SVGFilterElement* filterElement = toSVGFilterElement(toSVGElement(filter)); |
119 | 119 |
120 // FIXME: Figure out what to do with SourceAlpha. Right now, we're | 120 // FIXME: Figure out what to do with SourceAlpha. Right now, we're |
121 // using the alpha of the original input layer, which is obviously | 121 // using the alpha of the original input layer, which is obviously |
122 // wrong. We should probably be extracting the alpha from the | 122 // wrong. We should probably be extracting the alpha from the |
123 // previousEffect, but this requires some more processing. | 123 // previousEffect, but this requires some more processing. |
124 // This may need a spec clarification. | 124 // This may need a spec clarification. |
125 RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect,
SourceAlpha::create(parentFilter)); | 125 RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect,
SourceAlpha::create(parentFilter)); |
126 | 126 |
127 ColorSpace filterColorSpace = ColorSpaceDeviceRGB; | 127 ColorSpace filterColorSpace = ColorSpaceDeviceRGB; |
128 bool useFilterColorSpace = getSVGStyledElementColorSpace(filterElement, filt
erColorSpace); | 128 bool useFilterColorSpace = getSVGElementColorSpace(filterElement, filterColo
rSpace); |
129 | 129 |
130 for (Node* node = filterElement->firstChild(); node; node = node->nextSiblin
g()) { | 130 for (Node* node = filterElement->firstChild(); node; node = node->nextSiblin
g()) { |
131 if (!node->isSVGElement()) | 131 if (!node->isSVGElement()) |
132 continue; | 132 continue; |
133 | 133 |
134 SVGElement* element = toSVGElement(node); | 134 SVGElement* element = toSVGElement(node); |
135 if (!element->isFilterEffect()) | 135 if (!element->isFilterEffect()) |
136 continue; | 136 continue; |
137 | 137 |
138 SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFil
terPrimitiveStandardAttributes*>(element); | 138 SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFil
terPrimitiveStandardAttributes*>(element); |
139 | 139 |
140 RefPtr<FilterEffect> effect = effectElement->build(builder.get(), parent
Filter); | 140 RefPtr<FilterEffect> effect = effectElement->build(builder.get(), parent
Filter); |
141 if (!effect) | 141 if (!effect) |
142 continue; | 142 continue; |
143 | 143 |
144 effectElement->setStandardAttributes(effect.get()); | 144 effectElement->setStandardAttributes(effect.get()); |
145 effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilter
PrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnitsCurrent
Value(), parentFilter->sourceImageRect())); | 145 effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilter
PrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnitsCurrent
Value(), parentFilter->sourceImageRect())); |
146 ColorSpace colorSpace = filterColorSpace; | 146 ColorSpace colorSpace = filterColorSpace; |
147 if (useFilterColorSpace || getSVGStyledElementColorSpace(effectElement,
colorSpace)) | 147 if (useFilterColorSpace || getSVGElementColorSpace(effectElement, colorS
pace)) |
148 effect->setOperatingColorSpace(colorSpace); | 148 effect->setOperatingColorSpace(colorSpace); |
149 builder->add(effectElement->resultCurrentValue(), effect); | 149 builder->add(effectElement->resultCurrentValue(), effect); |
150 } | 150 } |
151 return builder->lastEffect(); | 151 return builder->lastEffect(); |
152 } | 152 } |
153 | 153 |
154 } // namespace WebCore | 154 } // namespace WebCore |
OLD | NEW |