Index: Source/core/rendering/svg/SVGRenderingContext.cpp |
diff --git a/Source/core/rendering/svg/SVGRenderingContext.cpp b/Source/core/rendering/svg/SVGRenderingContext.cpp |
index 7928a7c09d6d11841b27bf1b2514909e2762c535..6329cf0fa699c08a9df15da794f123393b244147 100644 |
--- a/Source/core/rendering/svg/SVGRenderingContext.cpp |
+++ b/Source/core/rendering/svg/SVGRenderingContext.cpp |
@@ -203,12 +203,17 @@ float SVGRenderingContext::calculateScreenFontSizeScalingFactor(const RenderObje |
ASSERT(renderer); |
AffineTransform ctm; |
- calculateTransformationToOutermostCoordinateSystem(renderer, ctm); |
+ // FIXME: calculateDeviceSpaceTransformation() queries layer compositing state - which is not |
+ // supported during layout. Hence, the result may not include all CSS transforms. |
+ calculateDeviceSpaceTransformation(renderer, ctm); |
return narrowPrecisionToFloat(sqrt((pow(ctm.xScale(), 2) + pow(ctm.yScale(), 2)) / 2)); |
} |
-void SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(const RenderObject* renderer, AffineTransform& absoluteTransform) |
+void SVGRenderingContext::calculateDeviceSpaceTransformation(const RenderObject* renderer, AffineTransform& absoluteTransform) |
{ |
+ // FIXME: trying to compute a device space transform at record time is wrong. All clients |
+ // should be updated to avoid relying on this information, and the method should be removed. |
+ |
ASSERT(renderer); |
// We're about to possibly clear renderer, so save the deviceScaleFactor now. |
float deviceScaleFactor = renderer->document().frameHost()->deviceScaleFactor(); |
@@ -224,18 +229,18 @@ void SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(con |
// Continue walking up the layer tree, accumulating CSS transforms. |
RenderLayer* layer = renderer ? renderer->enclosingLayer() : 0; |
- while (layer) { |
- if (TransformationMatrix* layerTransform = layer->transform()) |
- absoluteTransform = layerTransform->toAffineTransform() * absoluteTransform; |
- |
+ while (layer && layer->isAllowedToQueryCompositingState()) { |
// We can stop at compositing layers, to match the backing resolution. |
// FIXME: should we be computing the transform to the nearest composited layer, |
// or the nearest composited layer that does not paint into its ancestor? |
// I think this is the nearest composited ancestor since we will inherit its |
// transforms in the composited layer tree. |
- if (layer->hasCompositedLayerMapping()) |
+ if (layer->compositingState() != NotComposited) |
break; |
+ if (TransformationMatrix* layerTransform = layer->transform()) |
+ absoluteTransform = layerTransform->toAffineTransform() * absoluteTransform; |
+ |
layer = layer->parent(); |
} |