OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 , m_textPathSpacing(0) | 47 , m_textPathSpacing(0) |
48 , m_textPathScaling(1) | 48 , m_textPathScaling(1) |
49 { | 49 { |
50 ASSERT(!m_layoutAttributes.isEmpty()); | 50 ASSERT(!m_layoutAttributes.isEmpty()); |
51 } | 51 } |
52 | 52 |
53 SVGTextLayoutEngine::~SVGTextLayoutEngine() = default; | 53 SVGTextLayoutEngine::~SVGTextLayoutEngine() = default; |
54 | 54 |
55 bool SVGTextLayoutEngine::setCurrentTextPosition(const SVGCharacterData& data) | 55 bool SVGTextLayoutEngine::setCurrentTextPosition(const SVGCharacterData& data) |
56 { | 56 { |
57 bool hasX = !SVGTextLayoutAttributes::isEmptyValue(data.x); | 57 bool hasX = data.hasX(); |
58 if (hasX) | 58 if (hasX) |
59 m_textPosition.setX(data.x); | 59 m_textPosition.setX(data.x); |
60 | 60 |
61 bool hasY = !SVGTextLayoutAttributes::isEmptyValue(data.y); | 61 bool hasY = data.hasY(); |
62 if (hasY) | 62 if (hasY) |
63 m_textPosition.setY(data.y); | 63 m_textPosition.setY(data.y); |
64 | 64 |
65 // If there's an absolute x/y position available, it marks the beginning of | 65 // If there's an absolute x/y position available, it marks the beginning of |
66 // a new position along the path. | 66 // a new position along the path. |
67 if (m_inPathLayout) { | 67 if (m_inPathLayout) { |
68 // TODO(fs): If a new chunk (== absolute position) is defined while in | 68 // TODO(fs): If a new chunk (== absolute position) is defined while in |
69 // path layout mode, alignment should be based on that chunk and not | 69 // path layout mode, alignment should be based on that chunk and not |
70 // the path as a whole. (Re: the addition of m_textPathStartOffset | 70 // the path as a whole. (Re: the addition of m_textPathStartOffset |
71 // below.) | 71 // below.) |
(...skipping 14 matching lines...) Expand all Loading... |
86 // here, but that requires a bit more untangling yet. | 86 // here, but that requires a bit more untangling yet. |
87 if (m_isVerticalText) | 87 if (m_isVerticalText) |
88 m_textPosition.setY(m_textPosition.y() + glyphAdvance); | 88 m_textPosition.setY(m_textPosition.y() + glyphAdvance); |
89 else | 89 else |
90 m_textPosition.setX(m_textPosition.x() + glyphAdvance); | 90 m_textPosition.setX(m_textPosition.x() + glyphAdvance); |
91 } | 91 } |
92 | 92 |
93 bool SVGTextLayoutEngine::applyRelativePositionAdjustmentsIfNeeded(const SVGChar
acterData& data) | 93 bool SVGTextLayoutEngine::applyRelativePositionAdjustmentsIfNeeded(const SVGChar
acterData& data) |
94 { | 94 { |
95 FloatPoint delta; | 95 FloatPoint delta; |
96 bool hasDx = !SVGTextLayoutAttributes::isEmptyValue(data.dx); | 96 bool hasDx = data.hasDx(); |
97 if (hasDx) | 97 if (hasDx) |
98 delta.setX(data.dx); | 98 delta.setX(data.dx); |
99 | 99 |
100 bool hasDy = !SVGTextLayoutAttributes::isEmptyValue(data.dy); | 100 bool hasDy = data.hasDy(); |
101 if (hasDy) | 101 if (hasDy) |
102 delta.setY(data.dy); | 102 delta.setY(data.dy); |
103 | 103 |
104 // Apply dx/dy value adjustments to current text position, if needed. | 104 // Apply dx/dy value adjustments to current text position, if needed. |
105 m_textPosition.moveBy(delta); | 105 m_textPosition.moveBy(delta); |
106 | 106 |
107 if (m_inPathLayout) { | 107 if (m_inPathLayout) { |
108 if (m_isVerticalText) | 108 if (m_isVerticalText) |
109 delta = delta.transposedPoint(); | 109 delta = delta.transposedPoint(); |
110 | 110 |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 m_textPosition = position; | 442 m_textPosition = position; |
443 | 443 |
444 // For vertical text on path, the actual angle has to be rotated 90
degrees anti-clockwise, not the orientation angle! | 444 // For vertical text on path, the actual angle has to be rotated 90
degrees anti-clockwise, not the orientation angle! |
445 if (m_isVerticalText) | 445 if (m_isVerticalText) |
446 angle -= 90; | 446 angle -= 90; |
447 } else { | 447 } else { |
448 position = m_textPosition; | 448 position = m_textPosition; |
449 position += baselineShift; | 449 position += baselineShift; |
450 } | 450 } |
451 | 451 |
452 if (!SVGTextLayoutAttributes::isEmptyValue(data.rotate)) | 452 if (data.hasRotate()) |
453 angle += data.rotate; | 453 angle += data.rotate; |
454 | 454 |
455 // Determine whether we have to start a new fragment. | 455 // Determine whether we have to start a new fragment. |
456 bool shouldStartNewFragment = needsFragmentPerGlyph || hasRelativePositi
on | 456 bool shouldStartNewFragment = needsFragmentPerGlyph || hasRelativePositi
on |
457 || angle || angle != lastAngle || applySpacingToNextCharacter; | 457 || angle || angle != lastAngle || applySpacingToNextCharacter; |
458 | 458 |
459 // If we already started a fragment, close it now. | 459 // If we already started a fragment, close it now. |
460 if (didStartTextFragment && shouldStartNewFragment) { | 460 if (didStartTextFragment && shouldStartNewFragment) { |
461 applySpacingToNextCharacter = false; | 461 applySpacingToNextCharacter = false; |
462 recordTextFragment(textBox); | 462 recordTextFragment(textBox); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 } | 504 } |
505 | 505 |
506 if (!didStartTextFragment) | 506 if (!didStartTextFragment) |
507 return; | 507 return; |
508 | 508 |
509 // Close last open fragment, if needed. | 509 // Close last open fragment, if needed. |
510 recordTextFragment(textBox); | 510 recordTextFragment(textBox); |
511 } | 511 } |
512 | 512 |
513 } // namespace blink | 513 } // namespace blink |
OLD | NEW |