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

Side by Side Diff: Source/core/rendering/svg/RenderSVGResourceFilter.cpp

Issue 19097005: Remove one SVG animated type special case from the bindings generator (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix the regressions Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698