OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 111 |
112 // Compute pattern space transformation. | 112 // Compute pattern space transformation. |
113 const IntSize tileImageSize = tileImage->size(); | 113 const IntSize tileImageSize = tileImage->size(); |
114 patternData->transform.translate(tileBoundaries.x(), tileBoundaries.y()); | 114 patternData->transform.translate(tileBoundaries.x(), tileBoundaries.y()); |
115 patternData->transform.scale(tileBoundaries.width() / tileImageSize.width(),
tileBoundaries.height() / tileImageSize.height()); | 115 patternData->transform.scale(tileBoundaries.width() / tileImageSize.width(),
tileBoundaries.height() / tileImageSize.height()); |
116 | 116 |
117 AffineTransform patternTransform = m_attributes.patternTransform(); | 117 AffineTransform patternTransform = m_attributes.patternTransform(); |
118 if (!patternTransform.isIdentity()) | 118 if (!patternTransform.isIdentity()) |
119 patternData->transform = patternTransform * patternData->transform; | 119 patternData->transform = patternTransform * patternData->transform; |
120 | 120 |
121 // Account for text drawing resetting the context to non-scaled, see SVGInli
neTextBox::paintTextWithShadows. | |
122 if (resourceMode & ApplyToTextMode) { | |
123 AffineTransform additionalTextTransformation; | |
124 if (shouldTransformOnTextPainting(object, additionalTextTransformation)) | |
125 patternData->transform *= additionalTextTransformation; | |
126 } | |
127 patternData->pattern->setPatternSpaceTransform(patternData->transform); | |
128 | |
129 // Various calls above may trigger invalidations in some fringe cases (Image
Buffer allocation | 121 // Various calls above may trigger invalidations in some fringe cases (Image
Buffer allocation |
130 // failures in the SVG image cache for example). To avoid having our Pattern
Data deleted by | 122 // failures in the SVG image cache for example). To avoid having our Pattern
Data deleted by |
131 // removeAllClientsFromCache(), we only make it visible in the cache at the
very end. | 123 // removeAllClientsFromCache(), we only make it visible in the cache at the
very end. |
132 return m_patternMap.set(object, patternData.release()).storedValue->value.ge
t(); | 124 return m_patternMap.set(object, patternData.release()).storedValue->value.ge
t(); |
133 } | 125 } |
134 | 126 |
135 bool RenderSVGResourcePattern::applyResource(RenderObject* object, RenderStyle*
style, GraphicsContext*& context, unsigned short resourceMode) | 127 bool RenderSVGResourcePattern::applyResource(RenderObject* object, RenderStyle*
style, GraphicsContext*& context, unsigned short resourceMode) |
136 { | 128 { |
137 ASSERT(object); | 129 ASSERT(object); |
138 ASSERT(style); | 130 ASSERT(style); |
139 ASSERT(context); | 131 ASSERT(context); |
140 ASSERT(resourceMode != ApplyToDefaultMode); | 132 ASSERT(resourceMode != ApplyToDefaultMode); |
141 | 133 |
142 clearInvalidationMask(); | 134 clearInvalidationMask(); |
143 | 135 |
144 // Spec: When the geometry of the applicable element has no width or height
and objectBoundingBox is specified, | 136 // Spec: When the geometry of the applicable element has no width or height
and objectBoundingBox is specified, |
145 // then the given effect (e.g. a gradient or a filter) will be ignored. | 137 // then the given effect (e.g. a gradient or a filter) will be ignored. |
146 FloatRect objectBoundingBox = object->objectBoundingBox(); | 138 FloatRect objectBoundingBox = object->objectBoundingBox(); |
147 if (m_attributes.patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDIN
GBOX && objectBoundingBox.isEmpty()) | 139 if (m_attributes.patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDIN
GBOX && objectBoundingBox.isEmpty()) |
148 return false; | 140 return false; |
149 | 141 |
150 PatternData* patternData = buildPattern(object, resourceMode); | 142 PatternData* patternData = buildPattern(object, resourceMode); |
151 if (!patternData) | 143 if (!patternData) |
152 return false; | 144 return false; |
153 | 145 |
| 146 const SVGRenderStyle* svgStyle = style->svgStyle(); |
| 147 ASSERT(svgStyle); |
| 148 |
| 149 AffineTransform computedPatternSpaceTransform = computeResourceSpaceTransfor
m(object, patternData->transform, svgStyle, resourceMode); |
| 150 patternData->pattern->setPatternSpaceTransform(computedPatternSpaceTransform
); |
| 151 |
154 // Draw pattern | 152 // Draw pattern |
155 context->save(); | 153 context->save(); |
156 | 154 |
157 const SVGRenderStyle* svgStyle = style->svgStyle(); | |
158 ASSERT(svgStyle); | |
159 | |
160 if (resourceMode & ApplyToFillMode) { | 155 if (resourceMode & ApplyToFillMode) { |
161 context->setAlphaAsFloat(svgStyle->fillOpacity()); | 156 context->setAlphaAsFloat(svgStyle->fillOpacity()); |
162 context->setFillPattern(patternData->pattern); | 157 context->setFillPattern(patternData->pattern); |
163 context->setFillRule(svgStyle->fillRule()); | 158 context->setFillRule(svgStyle->fillRule()); |
164 } else if (resourceMode & ApplyToStrokeMode) { | 159 } else if (resourceMode & ApplyToStrokeMode) { |
165 if (svgStyle->vectorEffect() == VE_NON_SCALING_STROKE) | |
166 patternData->pattern->setPatternSpaceTransform(transformOnNonScaling
Stroke(object, patternData->transform)); | |
167 context->setAlphaAsFloat(svgStyle->strokeOpacity()); | 160 context->setAlphaAsFloat(svgStyle->strokeOpacity()); |
168 context->setStrokePattern(patternData->pattern); | 161 context->setStrokePattern(patternData->pattern); |
169 SVGRenderSupport::applyStrokeStyleToContext(context, style, object); | 162 SVGRenderSupport::applyStrokeStyleToContext(context, style, object); |
170 } | 163 } |
171 | 164 |
172 if (resourceMode & ApplyToTextMode) { | 165 if (resourceMode & ApplyToTextMode) { |
173 if (resourceMode & ApplyToFillMode) | 166 if (resourceMode & ApplyToFillMode) |
174 context->setTextDrawingMode(TextModeFill); | 167 context->setTextDrawingMode(TextModeFill); |
175 else if (resourceMode & ApplyToStrokeMode) | 168 else if (resourceMode & ApplyToStrokeMode) |
176 context->setTextDrawingMode(TextModeStroke); | 169 context->setTextDrawingMode(TextModeStroke); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 continue; | 264 continue; |
272 if (element->renderer()->needsLayout()) | 265 if (element->renderer()->needsLayout()) |
273 return nullptr; | 266 return nullptr; |
274 SVGRenderingContext::renderSubtree(tileImage->context(), element->render
er(), contentTransformation); | 267 SVGRenderingContext::renderSubtree(tileImage->context(), element->render
er(), contentTransformation); |
275 } | 268 } |
276 | 269 |
277 return tileImage.release(); | 270 return tileImage.release(); |
278 } | 271 } |
279 | 272 |
280 } | 273 } |
OLD | NEW |