Index: third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp |
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp |
index 1811efaa92538549f59d1b44e7d9e8497b5bc6d9..25b768fa770307f9c5c3c5c72f2353e3ddbb3212 100644 |
--- a/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp |
+++ b/third_party/WebKit/Source/core/layout/svg/SVGLayoutSupport.cpp |
@@ -37,6 +37,7 @@ |
#include "core/layout/svg/LayoutSVGViewportContainer.h" |
#include "core/layout/svg/SVGResources.h" |
#include "core/layout/svg/SVGResourcesCache.h" |
+#include "core/page/Page.h" |
#include "core/paint/PaintLayer.h" |
#include "core/svg/SVGElement.h" |
#include "platform/geometry/TransformState.h" |
@@ -519,7 +520,7 @@ SubtreeContentTransformScope::~SubtreeContentTransformScope() { |
m_savedContentTransformation.copyTransformTo(s_currentContentTransformation); |
} |
-float SVGLayoutSupport::calculateScreenFontSizeScalingFactor( |
+AffineTransform SVGLayoutSupport::deprecatedCalculateTransformToLayer( |
const LayoutObject* layoutObject) { |
AffineTransform transform; |
while (layoutObject) { |
@@ -528,10 +529,43 @@ float SVGLayoutSupport::calculateScreenFontSizeScalingFactor( |
break; |
layoutObject = layoutObject->parent(); |
} |
- transform.multiply( |
- SubtreeContentTransformScope::currentContentTransformation()); |
- return clampTo<float>( |
- sqrt((transform.xScaleSquared() + transform.yScaleSquared()) / 2)); |
+ |
+ // Continue walking up the layer tree, accumulating CSS transforms. |
+ // FIXME: this queries layer compositing state - which is not |
+ // supported during layout. Hence, the result may not include all CSS |
+ // transforms. |
+ PaintLayer* layer = layoutObject ? layoutObject->enclosingLayer() : 0; |
+ 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->compositingState() != NotComposited) |
+ break; |
+ |
+ if (TransformationMatrix* layerTransform = layer->transform()) |
+ transform = layerTransform->toAffineTransform() * transform; |
+ |
+ layer = layer->parent(); |
+ } |
+ |
+ return transform; |
+} |
+ |
+float SVGLayoutSupport::calculateScreenFontSizeScalingFactor( |
+ const LayoutObject* layoutObject) { |
+ DCHECK(layoutObject); |
+ |
+ // 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. |
+ AffineTransform ctm = |
+ deprecatedCalculateTransformToLayer(layoutObject) * |
+ SubtreeContentTransformScope::currentContentTransformation(); |
+ ctm.scale(layoutObject->document().page()->deviceScaleFactorDeprecated()); |
+ |
+ return clampTo<float>(sqrt((ctm.xScaleSquared() + ctm.yScaleSquared()) / 2)); |
} |
static inline bool compareCandidateDistance(const SearchCandidate& r1, |