Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h |
| diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h b/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h |
| index b3ff267d7fbcac3914b9707fba8effaeca5362f6..ebd5fd2f68e693743f7af8638240b49b6318d702 100644 |
| --- a/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h |
| +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextFragment.h |
| @@ -33,10 +33,13 @@ struct SVGTextFragment { |
| , metricsListOffset(0) |
| , length(0) |
| , isTextOnPath(false) |
| + , isVertical(false) |
| , x(0) |
| , y(0) |
| , width(0) |
| , height(0) |
| + , lengthAdjustScale(1) |
| + , lengthAdjustBias(0) |
| { |
| } |
| @@ -88,8 +91,9 @@ struct SVGTextFragment { |
| // The first laid out character starts at LayoutSVGInlineText::characters() + characterOffset. |
| unsigned characterOffset; |
| unsigned metricsListOffset; |
| - unsigned length : 31; |
| + unsigned length : 30; |
| unsigned isTextOnPath : 1; |
| + unsigned isVertical : 1; |
| float x; |
| float y; |
| @@ -108,7 +112,8 @@ struct SVGTextFragment { |
| AffineTransform transform; |
| // Contains lengthAdjust related transformations, which are not allowd to influence the SVGTextQuery code. |
| - AffineTransform lengthAdjustTransform; |
| + float lengthAdjustScale; |
| + float lengthAdjustBias; |
| private: |
| AffineTransform buildNormalFragmentTransform() const |
| @@ -118,7 +123,7 @@ private: |
| return buildTransformForTextOnLine(); |
| } |
| - bool affectedByTextLength() const { return lengthAdjustTransform.a() != 1 || lengthAdjustTransform.d() != 1; } |
| + bool affectedByTextLength() const { return lengthAdjustScale != 1; } |
| void transformAroundOrigin(AffineTransform& result) const |
| { |
| @@ -130,22 +135,42 @@ private: |
| AffineTransform buildTransformForTextOnPath() const |
| { |
| - // For text-on-path layout, multiply the transform with the lengthAdjustTransform before orienting the resulting transform. |
| - AffineTransform result = !affectedByTextLength() ? transform : transform * lengthAdjustTransform; |
| + // For text-on-path layout, multiply the transform with the |
| + // lengthAdjustTransform before orienting the resulting transform. |
| + // T(x,y) * M(transform) [ * M(lengthAdjust) ] * T(-x,-y) |
|
pdr.
2016/01/04 21:54:13
Supernit: The brackets around * M(lengthAdjust) ]
fs
2016/01/07 10:24:51
Removed [].
|
| + AffineTransform result = !affectedByTextLength() ? transform : transform * lengthAdjustTransform(); |
| if (!result.isIdentity()) |
| transformAroundOrigin(result); |
| return result; |
| } |
| + AffineTransform lengthAdjustTransform() const |
| + { |
| + AffineTransform result; |
| + if (!affectedByTextLength()) |
| + return result; |
| + // Load a transform assuming horizontal direction, then swap if vertical. |
| + result.setMatrix(lengthAdjustScale, 0, 0, 1, lengthAdjustBias, 0); |
| + if (isVertical) { |
| + result.setD(result.a()); |
| + result.setA(1); |
| + result.setF(result.e()); |
| + result.setE(0); |
| + } |
| + return result; |
| + } |
| + |
| AffineTransform buildTransformForTextOnLine() const |
| { |
| - // For text-on-line layout, orient the transform first, then multiply the lengthAdjustTransform with the oriented transform. |
| + // For text-on-line layout, orient the transform first, then multiply |
| + // the lengthAdjustTransform with the oriented transform. |
| + // [ M(lengthAdjust) * ] T(x,y) * M(transform) * T(-x,-y) |
| if (transform.isIdentity()) |
| - return lengthAdjustTransform; |
| + return lengthAdjustTransform(); |
| AffineTransform result = transform; |
| transformAroundOrigin(result); |
| - result.preMultiply(lengthAdjustTransform); |
| + result.preMultiply(lengthAdjustTransform()); |
| return result; |
| } |
| }; |