Chromium Code Reviews| 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) 2008 Eric Seidel <eric@webkit.org> | 3 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
| 4 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> | 4 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> |
| 5 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 5 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 // Spec: When the geometry of the applicable element has no width or height and objectBoundingBox is specified, | 78 // Spec: When the geometry of the applicable element has no width or height and objectBoundingBox is specified, |
| 79 // then the given effect (e.g. a gradient or a filter) will be ignored. | 79 // then the given effect (e.g. a gradient or a filter) will be ignored. |
| 80 FloatRect objectBoundingBox = object->objectBoundingBox(); | 80 FloatRect objectBoundingBox = object->objectBoundingBox(); |
| 81 if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && obje ctBoundingBox.isEmpty()) | 81 if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && obje ctBoundingBox.isEmpty()) |
| 82 return false; | 82 return false; |
| 83 | 83 |
| 84 OwnPtr<GradientData>& gradientData = m_gradientMap.add(object, nullptr).stor edValue->value; | 84 OwnPtr<GradientData>& gradientData = m_gradientMap.add(object, nullptr).stor edValue->value; |
| 85 if (!gradientData) | 85 if (!gradientData) |
| 86 gradientData = adoptPtr(new GradientData); | 86 gradientData = adoptPtr(new GradientData); |
| 87 | 87 |
| 88 bool isPaintingText = resourceMode & ApplyToTextMode; | |
| 89 | |
| 90 // Create gradient object | 88 // Create gradient object |
| 91 if (!gradientData->gradient) { | 89 if (!gradientData->gradient) { |
| 92 buildGradient(gradientData.get()); | 90 buildGradient(gradientData.get()); |
| 93 | 91 |
| 94 // We want the text bounding box applied to the gradient space transform now, so the gradient shader can use it. | 92 // We want the text bounding box applied to the gradient space transform now, so the gradient shader can use it. |
| 95 if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && !objectBoundingBox.isEmpty()) { | 93 if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && !objectBoundingBox.isEmpty()) { |
| 96 gradientData->userspaceTransform.translate(objectBoundingBox.x(), ob jectBoundingBox.y()); | 94 gradientData->userspaceTransform.translate(objectBoundingBox.x(), ob jectBoundingBox.y()); |
| 97 gradientData->userspaceTransform.scaleNonUniform(objectBoundingBox.w idth(), objectBoundingBox.height()); | 95 gradientData->userspaceTransform.scaleNonUniform(objectBoundingBox.w idth(), objectBoundingBox.height()); |
| 98 } | 96 } |
| 99 | 97 |
| 100 AffineTransform gradientTransform; | 98 AffineTransform gradientTransform; |
| 101 calculateGradientTransform(gradientTransform); | 99 calculateGradientTransform(gradientTransform); |
| 102 | 100 |
| 103 gradientData->userspaceTransform *= gradientTransform; | 101 gradientData->userspaceTransform *= gradientTransform; |
| 104 if (isPaintingText) { | |
| 105 // Depending on font scaling factor, we may need to rescale the grad ient here since | |
| 106 // text painting removes the scale factor from the context. | |
| 107 AffineTransform additionalTextTransform; | |
| 108 if (shouldTransformOnTextPainting(object, additionalTextTransform)) | |
| 109 gradientData->userspaceTransform *= additionalTextTransform; | |
| 110 } | |
| 111 gradientData->gradient->setGradientSpaceTransform(gradientData->userspac eTransform); | |
| 112 } | 102 } |
| 113 | 103 |
| 114 if (!gradientData->gradient) | 104 if (!gradientData->gradient) |
| 115 return false; | 105 return false; |
| 116 | 106 |
| 107 const SVGRenderStyle* svgStyle = style->svgStyle(); | |
| 108 ASSERT(svgStyle); | |
| 109 | |
| 110 AffineTransform computedGradientSpaceTransform = computeResourceSpaceTransfo rm(object, gradientData->userspaceTransform, svgStyle, resourceMode); | |
|
f(malita)
2014/04/09 16:26:15
Isn't (resourceMode & ApplyToTextMode) invariant f
fs
2014/04/09 16:59:13
It's not invariant ATM - decorations are not paint
f(malita)
2014/04/09 17:46:51
Ugh. I find all that SVGInlineTextBox::m_paintingR
fs
2014/04/10 08:16:41
Agreed. (Good that you took care of it! *removes f
f(malita)
2014/04/10 12:57:48
SGTM.
| |
| 111 gradientData->gradient->setGradientSpaceTransform(computedGradientSpaceTrans form); | |
| 112 | |
| 117 // Draw gradient | 113 // Draw gradient |
| 118 context->save(); | 114 context->save(); |
| 119 | 115 |
| 120 if (isPaintingText) | 116 if (resourceMode & ApplyToTextMode) |
| 121 context->setTextDrawingMode(resourceMode & ApplyToFillMode ? TextModeFil l : TextModeStroke); | 117 context->setTextDrawingMode(resourceMode & ApplyToFillMode ? TextModeFil l : TextModeStroke); |
| 122 | 118 |
| 123 const SVGRenderStyle* svgStyle = style->svgStyle(); | |
| 124 ASSERT(svgStyle); | |
| 125 | |
| 126 if (resourceMode & ApplyToFillMode) { | 119 if (resourceMode & ApplyToFillMode) { |
| 127 context->setAlphaAsFloat(svgStyle->fillOpacity()); | 120 context->setAlphaAsFloat(svgStyle->fillOpacity()); |
| 128 context->setFillGradient(gradientData->gradient); | 121 context->setFillGradient(gradientData->gradient); |
| 129 context->setFillRule(svgStyle->fillRule()); | 122 context->setFillRule(svgStyle->fillRule()); |
| 130 } else if (resourceMode & ApplyToStrokeMode) { | 123 } else if (resourceMode & ApplyToStrokeMode) { |
| 131 if (svgStyle->vectorEffect() == VE_NON_SCALING_STROKE) | |
| 132 gradientData->gradient->setGradientSpaceTransform(transformOnNonScal ingStroke(object, gradientData->userspaceTransform)); | |
| 133 context->setAlphaAsFloat(svgStyle->strokeOpacity()); | 124 context->setAlphaAsFloat(svgStyle->strokeOpacity()); |
| 134 context->setStrokeGradient(gradientData->gradient); | 125 context->setStrokeGradient(gradientData->gradient); |
| 135 SVGRenderSupport::applyStrokeStyleToContext(context, style, object); | 126 SVGRenderSupport::applyStrokeStyleToContext(context, style, object); |
| 136 } | 127 } |
| 137 | 128 |
| 138 return true; | 129 return true; |
| 139 } | 130 } |
| 140 | 131 |
| 141 void RenderSVGResourceGradient::postApplyResource(RenderObject*, GraphicsContext *& context, unsigned short resourceMode, const Path* path, const RenderSVGShape* shape) | 132 void RenderSVGResourceGradient::postApplyResource(RenderObject*, GraphicsContext *& context, unsigned short resourceMode, const Path* path, const RenderSVGShape* shape) |
| 142 { | 133 { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 return SpreadMethodReflect; | 169 return SpreadMethodReflect; |
| 179 case SVGSpreadMethodRepeat: | 170 case SVGSpreadMethodRepeat: |
| 180 return SpreadMethodRepeat; | 171 return SpreadMethodRepeat; |
| 181 } | 172 } |
| 182 | 173 |
| 183 ASSERT_NOT_REACHED(); | 174 ASSERT_NOT_REACHED(); |
| 184 return SpreadMethodPad; | 175 return SpreadMethodPad; |
| 185 } | 176 } |
| 186 | 177 |
| 187 } | 178 } |
| OLD | NEW |