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

Unified Diff: Source/core/rendering/svg/SVGRenderSupport.cpp

Issue 652243002: Hoist paint-server transform adaption out of preparePaintServer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/svg/RenderSVGResourceSolidColor.cpp ('k') | Source/platform/graphics/Pattern.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/svg/SVGRenderSupport.cpp
diff --git a/Source/core/rendering/svg/SVGRenderSupport.cpp b/Source/core/rendering/svg/SVGRenderSupport.cpp
index 7885d93525a2426e2f26e57cc7244c0825d91283..de7b101960b0d6b5a5b4a06f50949a0998ccafcf 100644
--- a/Source/core/rendering/svg/SVGRenderSupport.cpp
+++ b/Source/core/rendering/svg/SVGRenderSupport.cpp
@@ -39,6 +39,7 @@
#include "core/rendering/svg/RenderSVGShape.h"
#include "core/rendering/svg/RenderSVGText.h"
#include "core/rendering/svg/RenderSVGViewportContainer.h"
+#include "core/rendering/svg/SVGRenderingContext.h"
#include "core/rendering/svg/SVGResources.h"
#include "core/rendering/svg/SVGResourcesCache.h"
#include "core/svg/SVGElement.h"
@@ -394,6 +395,50 @@ void SVGRenderSupport::applyStrokeStyleToStrokeData(StrokeData* strokeData, cons
strokeData->setLineDash(dashArray, svgStyle.strokeDashOffset()->value(lengthContext));
}
+static bool shouldTransformOnTextPainting(RenderObject& renderer, AffineTransform& resourceTransform)
fs 2014/10/14 13:49:17 Will remove these three functions in the next CL.
pdr. 2014/10/14 23:38:48 SGTM. Nit: The crazy comment below (... "Cmp. Ren
+{
+ // This method should only be called for RenderObjects that deal with text rendering. Cmp. RenderObject.h's is*() methods.
+ ASSERT(renderer.isSVGText() || renderer.isSVGTextPath() || renderer.isSVGInline());
+
+ // In text drawing, the scaling part of the graphics context CTM is removed, compare SVGInlineTextBox::paintTextWithShadows.
+ // So, we use that scaling factor here, too, and then push it down to pattern or gradient space
+ // in order to keep the pattern or gradient correctly scaled.
+ float scalingFactor = SVGRenderingContext::calculateScreenFontSizeScalingFactor(&renderer);
+ if (scalingFactor == 1)
+ return false;
+ resourceTransform.scale(scalingFactor);
+ return true;
+}
+
+static AffineTransform transformOnNonScalingStroke(RenderObject& renderer, const AffineTransform& resourceTransform)
+{
+ ASSERT(renderer.isSVGShape());
+ SVGGraphicsElement* element = toSVGGraphicsElement(renderer.node());
+ AffineTransform transform = element->getScreenCTM(SVGGraphicsElement::DisallowStyleUpdate);
+ transform *= resourceTransform;
+ return transform;
+}
+
+static AffineTransform computeResourceSpaceTransform(RenderObject& renderer, const SVGRenderStyle& svgStyle, RenderSVGResourceModeFlags resourceModeFlags)
+{
+ AffineTransform computedSpaceTransform;
+ if (resourceModeFlags & ApplyToTextMode) {
+ // Depending on the font scaling factor, we may need to apply an
+ // additional transform (scale-factor) to the paintserver, since text
+ // painting removes the scale factor from the context. (See
+ // SVGInlineTextBoxPainter::paintTextWithShadows.)
+ AffineTransform additionalTextTransformation;
+ if (shouldTransformOnTextPainting(renderer, additionalTextTransformation))
+ computedSpaceTransform = additionalTextTransformation;
+ }
+ if (resourceModeFlags & ApplyToStrokeMode) {
+ // Non-scaling stroke needs to reset the transform back to the host transform.
+ if (renderer.isSVGShape() && svgStyle.vectorEffect() == VE_NON_SCALING_STROKE)
+ computedSpaceTransform = transformOnNonScalingStroke(renderer, computedSpaceTransform);
+ }
+ return computedSpaceTransform;
+}
+
bool SVGRenderSupport::updateGraphicsContext(GraphicsContextStateSaver& stateSaver, RenderStyle* style, RenderObject& renderer, unsigned resourceModeFlags)
{
ASSERT(style);
@@ -410,13 +455,17 @@ bool SVGRenderSupport::updateGraphicsContext(GraphicsContextStateSaver& stateSav
return true;
}
- SVGPaintServer paintServer = SVGPaintServer::requestForRenderer(renderer, style, resourceModeFlags);
+ SVGPaintServer paintServer = SVGPaintServer::requestForRenderer(renderer, style, resourceMode);
if (!paintServer.isValid())
return false;
- paintServer.apply(*context, resourceMode, &stateSaver);
const SVGRenderStyle& svgStyle = style->svgStyle();
+ if (paintServer.isTransformDependent())
+ paintServer.prependTransform(computeResourceSpaceTransform(renderer, svgStyle, resourceModeFlags));
+
+ paintServer.apply(*context, resourceMode, &stateSaver);
+
if (resourceMode == ApplyToFillMode) {
context->setAlphaAsFloat(svgStyle.fillOpacity());
context->setFillRule(svgStyle.fillRule());
« no previous file with comments | « Source/core/rendering/svg/RenderSVGResourceSolidColor.cpp ('k') | Source/platform/graphics/Pattern.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698