OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> |
5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 continue; | 93 continue; |
94 | 94 |
95 SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFil
terPrimitiveStandardAttributes*>(element); | 95 SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFil
terPrimitiveStandardAttributes*>(element); |
96 RefPtr<FilterEffect> effect = effectElement->build(builder.get(), filter
); | 96 RefPtr<FilterEffect> effect = effectElement->build(builder.get(), filter
); |
97 if (!effect) { | 97 if (!effect) { |
98 builder->clearEffects(); | 98 builder->clearEffects(); |
99 return 0; | 99 return 0; |
100 } | 100 } |
101 builder->appendEffectToEffectReferences(effect, effectElement->renderer(
)); | 101 builder->appendEffectToEffectReferences(effect, effectElement->renderer(
)); |
102 effectElement->setStandardAttributes(effect.get()); | 102 effectElement->setStandardAttributes(effect.get()); |
103 effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilter
PrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnits(), tar
getBoundingBox)); | 103 effect->setEffectBoundaries(SVGLengthContext::resolveRectangle<SVGFilter
PrimitiveStandardAttributes>(effectElement, filterElement->primitiveUnitsCurrent
Value(), targetBoundingBox)); |
104 effect->setOperatingColorSpace( | 104 effect->setOperatingColorSpace( |
105 effectElement->renderer()->style()->svgStyle()->colorInterpolationFi
lters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB); | 105 effectElement->renderer()->style()->svgStyle()->colorInterpolationFi
lters() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB); |
106 builder->add(effectElement->result(), effect); | 106 builder->add(effectElement->resultCurrentValue(), effect); |
107 } | 107 } |
108 return builder.release(); | 108 return builder.release(); |
109 } | 109 } |
110 | 110 |
111 bool RenderSVGResourceFilter::fitsInMaximumImageSize(const FloatSize& size, Floa
tSize& scale) | 111 bool RenderSVGResourceFilter::fitsInMaximumImageSize(const FloatSize& size, Floa
tSize& scale) |
112 { | 112 { |
113 bool matchesFilterSize = true; | 113 bool matchesFilterSize = true; |
114 if (size.width() > kMaxFilterSize) { | 114 if (size.width() > kMaxFilterSize) { |
115 scale.setWidth(scale.width() * kMaxFilterSize / size.width()); | 115 scale.setWidth(scale.width() * kMaxFilterSize / size.width()); |
116 matchesFilterSize = false; | 116 matchesFilterSize = false; |
(...skipping 16 matching lines...) Expand all Loading... |
133 FilterData* filterData = m_filter.get(object); | 133 FilterData* filterData = m_filter.get(object); |
134 if (filterData->state == FilterData::PaintingSource || filterData->state
== FilterData::Applying) | 134 if (filterData->state == FilterData::PaintingSource || filterData->state
== FilterData::Applying) |
135 filterData->state = FilterData::CycleDetected; | 135 filterData->state = FilterData::CycleDetected; |
136 return false; // Already built, or we're in a cycle, or we're marked for
removal. Regardless, just do nothing more now. | 136 return false; // Already built, or we're in a cycle, or we're marked for
removal. Regardless, just do nothing more now. |
137 } | 137 } |
138 | 138 |
139 OwnPtr<FilterData> filterData(adoptPtr(new FilterData)); | 139 OwnPtr<FilterData> filterData(adoptPtr(new FilterData)); |
140 FloatRect targetBoundingBox = object->objectBoundingBox(); | 140 FloatRect targetBoundingBox = object->objectBoundingBox(); |
141 | 141 |
142 SVGFilterElement* filterElement = static_cast<SVGFilterElement*>(node()); | 142 SVGFilterElement* filterElement = static_cast<SVGFilterElement*>(node()); |
143 filterData->boundaries = SVGLengthContext::resolveRectangle<SVGFilterElement
>(filterElement, filterElement->filterUnits(), targetBoundingBox); | 143 filterData->boundaries = SVGLengthContext::resolveRectangle<SVGFilterElement
>(filterElement, filterElement->filterUnitsCurrentValue(), targetBoundingBox); |
144 if (filterData->boundaries.isEmpty()) | 144 if (filterData->boundaries.isEmpty()) |
145 return false; | 145 return false; |
146 | 146 |
147 // Determine absolute transformation matrix for filter. | 147 // Determine absolute transformation matrix for filter. |
148 AffineTransform absoluteTransform; | 148 AffineTransform absoluteTransform; |
149 SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(obje
ct, absoluteTransform); | 149 SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(obje
ct, absoluteTransform); |
150 if (!absoluteTransform.isInvertible()) | 150 if (!absoluteTransform.isInvertible()) |
151 return false; | 151 return false; |
152 | 152 |
153 // Eliminate shear of the absolute transformation matrix, to be able to prod
uce unsheared tile images for feTile. | 153 // Eliminate shear of the absolute transformation matrix, to be able to prod
uce unsheared tile images for feTile. |
154 filterData->shearFreeAbsoluteTransform = AffineTransform(absoluteTransform.x
Scale(), 0, 0, absoluteTransform.yScale(), 0, 0); | 154 filterData->shearFreeAbsoluteTransform = AffineTransform(absoluteTransform.x
Scale(), 0, 0, absoluteTransform.yScale(), 0, 0); |
155 | 155 |
156 // Determine absolute boundaries of the filter and the drawing region. | 156 // Determine absolute boundaries of the filter and the drawing region. |
157 FloatRect absoluteFilterBoundaries = filterData->shearFreeAbsoluteTransform.
mapRect(filterData->boundaries); | 157 FloatRect absoluteFilterBoundaries = filterData->shearFreeAbsoluteTransform.
mapRect(filterData->boundaries); |
158 filterData->drawingRegion = object->strokeBoundingBox(); | 158 filterData->drawingRegion = object->strokeBoundingBox(); |
159 filterData->drawingRegion.intersect(filterData->boundaries); | 159 filterData->drawingRegion.intersect(filterData->boundaries); |
160 FloatRect absoluteDrawingRegion = filterData->shearFreeAbsoluteTransform.map
Rect(filterData->drawingRegion); | 160 FloatRect absoluteDrawingRegion = filterData->shearFreeAbsoluteTransform.map
Rect(filterData->drawingRegion); |
161 | 161 |
162 // Create the SVGFilter object. | 162 // Create the SVGFilter object. |
163 bool primitiveBoundingBoxMode = filterElement->primitiveUnits() == SVGUnitTy
pes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; | 163 bool primitiveBoundingBoxMode = filterElement->primitiveUnitsCurrentValue()
== SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; |
164 filterData->filter = SVGFilter::create(filterData->shearFreeAbsoluteTransfor
m, absoluteDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBo
undingBoxMode); | 164 filterData->filter = SVGFilter::create(filterData->shearFreeAbsoluteTransfor
m, absoluteDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBo
undingBoxMode); |
165 | 165 |
166 // Create all relevant filter primitives. | 166 // Create all relevant filter primitives. |
167 filterData->builder = buildPrimitives(filterData->filter.get()); | 167 filterData->builder = buildPrimitives(filterData->filter.get()); |
168 if (!filterData->builder) | 168 if (!filterData->builder) |
169 return false; | 169 return false; |
170 | 170 |
171 // Calculate the scale factor for the use of filterRes. | 171 // Calculate the scale factor for the use of filterRes. |
172 // Also see http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion | 172 // Also see http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion |
173 FloatSize scale(1, 1); | 173 FloatSize scale(1, 1); |
174 if (filterElement->hasAttribute(SVGNames::filterResAttr)) { | 174 if (filterElement->hasAttribute(SVGNames::filterResAttr)) { |
175 scale.setWidth(filterElement->filterResX() / absoluteFilterBoundaries.wi
dth()); | 175 scale.setWidth(filterElement->filterResXCurrentValue() / absoluteFilterB
oundaries.width()); |
176 scale.setHeight(filterElement->filterResY() / absoluteFilterBoundaries.h
eight()); | 176 scale.setHeight(filterElement->filterResYCurrentValue() / absoluteFilter
Boundaries.height()); |
177 } | 177 } |
178 | 178 |
179 if (scale.isEmpty()) | 179 if (scale.isEmpty()) |
180 return false; | 180 return false; |
181 | 181 |
182 // Determine scale factor for filter. The size of intermediate ImageBuffers
shouldn't be bigger than kMaxFilterSize. | 182 // Determine scale factor for filter. The size of intermediate ImageBuffers
shouldn't be bigger than kMaxFilterSize. |
183 FloatRect tempSourceRect = absoluteDrawingRegion; | 183 FloatRect tempSourceRect = absoluteDrawingRegion; |
184 tempSourceRect.scale(scale.width(), scale.height()); | 184 tempSourceRect.scale(scale.width(), scale.height()); |
185 fitsInMaximumImageSize(tempSourceRect.size(), scale); | 185 fitsInMaximumImageSize(tempSourceRect.size(), scale); |
186 | 186 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 | 305 |
306 context->concatCTM(filterData->shearFreeAbsoluteTransform); | 306 context->concatCTM(filterData->shearFreeAbsoluteTransform); |
307 } | 307 } |
308 } | 308 } |
309 filterData->sourceGraphicBuffer.clear(); | 309 filterData->sourceGraphicBuffer.clear(); |
310 } | 310 } |
311 | 311 |
312 FloatRect RenderSVGResourceFilter::resourceBoundingBox(RenderObject* object) | 312 FloatRect RenderSVGResourceFilter::resourceBoundingBox(RenderObject* object) |
313 { | 313 { |
314 if (SVGFilterElement* element = static_cast<SVGFilterElement*>(node())) | 314 if (SVGFilterElement* element = static_cast<SVGFilterElement*>(node())) |
315 return SVGLengthContext::resolveRectangle<SVGFilterElement>(element, ele
ment->filterUnits(), object->objectBoundingBox()); | 315 return SVGLengthContext::resolveRectangle<SVGFilterElement>(element, ele
ment->filterUnitsCurrentValue(), object->objectBoundingBox()); |
316 | 316 |
317 return FloatRect(); | 317 return FloatRect(); |
318 } | 318 } |
319 | 319 |
320 void RenderSVGResourceFilter::primitiveAttributeChanged(RenderObject* object, co
nst QualifiedName& attribute) | 320 void RenderSVGResourceFilter::primitiveAttributeChanged(RenderObject* object, co
nst QualifiedName& attribute) |
321 { | 321 { |
322 HashMap<RenderObject*, FilterData*>::iterator it = m_filter.begin(); | 322 HashMap<RenderObject*, FilterData*>::iterator it = m_filter.begin(); |
323 HashMap<RenderObject*, FilterData*>::iterator end = m_filter.end(); | 323 HashMap<RenderObject*, FilterData*>::iterator end = m_filter.end(); |
324 SVGFilterPrimitiveStandardAttributes* primitve = static_cast<SVGFilterPrimit
iveStandardAttributes*>(object->node()); | 324 SVGFilterPrimitiveStandardAttributes* primitve = static_cast<SVGFilterPrimit
iveStandardAttributes*>(object->node()); |
325 | 325 |
(...skipping 18 matching lines...) Expand all Loading... |
344 markAllClientLayersForInvalidation(); | 344 markAllClientLayersForInvalidation(); |
345 } | 345 } |
346 | 346 |
347 FloatRect RenderSVGResourceFilter::drawingRegion(RenderObject* object) const | 347 FloatRect RenderSVGResourceFilter::drawingRegion(RenderObject* object) const |
348 { | 348 { |
349 FilterData* filterData = m_filter.get(object); | 349 FilterData* filterData = m_filter.get(object); |
350 return filterData ? filterData->drawingRegion : FloatRect(); | 350 return filterData ? filterData->drawingRegion : FloatRect(); |
351 } | 351 } |
352 | 352 |
353 } | 353 } |
OLD | NEW |