| Index: Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| diff --git a/Source/core/layout/svg/SVGTextLayoutEngine.cpp b/Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| index eab2a631a6e15504e399ccd3b760afb0e77346d1..7dfb40dab2b50a2d5488e0f898ff820b3e736d9d 100644
|
| --- a/Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| +++ b/Source/core/layout/svg/SVGTextLayoutEngine.cpp
|
| @@ -22,6 +22,7 @@
|
|
|
| #include "core/layout/svg/LayoutSVGInlineText.h"
|
| #include "core/layout/svg/LayoutSVGTextPath.h"
|
| +#include "core/layout/svg/SVGTextChunkBuilder.h"
|
| #include "core/layout/svg/SVGTextLayoutEngineBaseline.h"
|
| #include "core/layout/svg/SVGTextLayoutEngineSpacing.h"
|
| #include "core/layout/svg/line/SVGInlineTextBox.h"
|
| @@ -29,9 +30,6 @@
|
| #include "core/svg/SVGLengthContext.h"
|
| #include "core/svg/SVGTextContentElement.h"
|
|
|
| -// Set to a value > 0 to dump the text fragments
|
| -#define DUMP_TEXT_FRAGMENTS 0
|
| -
|
| namespace blink {
|
|
|
| SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layoutAttributes)
|
| @@ -182,8 +180,9 @@ void SVGTextLayoutEngine::beginTextPathLayout(LayoutObject* object, SVGTextLayou
|
| float totalLength = 0;
|
| unsigned totalCharacters = 0;
|
|
|
| - lineLayout.m_chunkLayoutBuilder.buildTextChunks(lineLayout.m_lineLayoutBoxes);
|
| - const Vector<SVGTextChunk>& textChunks = lineLayout.m_chunkLayoutBuilder.textChunks();
|
| + SVGTextChunkBuilder textPathChunkLayoutBuilder;
|
| + textPathChunkLayoutBuilder.buildTextChunks(lineLayout.m_lineLayoutBoxes);
|
| + const Vector<SVGTextChunk>& textChunks = textPathChunkLayoutBuilder.textChunks();
|
|
|
| unsigned size = textChunks.size();
|
| for (unsigned i = 0; i < size; ++i) {
|
| @@ -259,78 +258,22 @@ void SVGTextLayoutEngine::layoutInlineTextBox(SVGInlineTextBox* textBox)
|
| m_lineLayoutBoxes.append(textBox);
|
| }
|
|
|
| -#if DUMP_TEXT_FRAGMENTS > 0
|
| -static inline void dumpTextBoxes(Vector<SVGInlineTextBox*>& boxes)
|
| -{
|
| - unsigned boxCount = boxes.size();
|
| - fprintf(stderr, "Dumping all text fragments in text sub tree, %i boxes\n", boxCount);
|
| -
|
| - for (unsigned boxPosition = 0; boxPosition < boxCount; ++boxPosition) {
|
| - SVGInlineTextBox* textBox = boxes.at(boxPosition);
|
| - Vector<SVGTextFragment>& fragments = textBox->textFragments();
|
| - fprintf(stderr, "-> Box %i: Dumping text fragments for SVGInlineTextBox, textBox=%p, textLayoutObject=%p\n", boxPosition, textBox, textBox->textLayoutObject());
|
| - fprintf(stderr, " textBox properties, start=%i, len=%i, box direction=%i\n", textBox->start(), textBox->len(), textBox->direction());
|
| - fprintf(stderr, " textLayoutObject properties, textLength=%i\n", textBox->textLayoutObject()->textLength());
|
| -
|
| - String characters = textBox->textLayoutObject()->text();
|
| -
|
| - unsigned fragmentCount = fragments.size();
|
| - for (unsigned i = 0; i < fragmentCount; ++i) {
|
| - SVGTextFragment& fragment = fragments.at(i);
|
| - String fragmentString = characters.substring(fragment.characterOffset, fragment.length);
|
| - fprintf(stderr, " -> Fragment %i, x=%lf, y=%lf, width=%lf, height=%lf, characterOffset=%i, length=%i, characters='%s'\n",
|
| - i, fragment.x, fragment.y, fragment.width, fragment.height, fragment.characterOffset, fragment.length, fragmentString.utf8().data());
|
| - }
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -void SVGTextLayoutEngine::finalizeTransformMatrices(Vector<SVGInlineTextBox*>& boxes)
|
| -{
|
| - unsigned boxCount = boxes.size();
|
| - if (!boxCount)
|
| - return;
|
| -
|
| - for (unsigned boxPosition = 0; boxPosition < boxCount; ++boxPosition) {
|
| - SVGInlineTextBox* textBox = boxes.at(boxPosition);
|
| - AffineTransform textBoxTransformation = m_chunkLayoutBuilder.transformationForTextBox(textBox);
|
| - if (textBoxTransformation.isIdentity())
|
| - continue;
|
| -
|
| - Vector<SVGTextFragment>& fragments = textBox->textFragments();
|
| - unsigned fragmentCount = fragments.size();
|
| - for (unsigned i = 0; i < fragmentCount; ++i) {
|
| - ASSERT(fragments[i].lengthAdjustTransform.isIdentity());
|
| - fragments[i].lengthAdjustTransform = textBoxTransformation;
|
| - }
|
| - }
|
| -
|
| - boxes.clear();
|
| -}
|
| -
|
| void SVGTextLayoutEngine::finishLayout()
|
| {
|
| // After all text fragments are stored in their correpsonding SVGInlineTextBoxes, we can layout individual text chunks.
|
| // Chunk layouting is only performed for line layout boxes, not for path layout, where it has already been done.
|
| - m_chunkLayoutBuilder.layoutTextChunks(m_lineLayoutBoxes);
|
| + SVGTextChunkBuilder chunkLayoutBuilder;
|
| + chunkLayoutBuilder.layoutTextChunks(m_lineLayoutBoxes);
|
|
|
| // Finalize transform matrices, after the chunk layout corrections have been applied, and all fragment x/y positions are finalized.
|
| if (!m_lineLayoutBoxes.isEmpty()) {
|
| -#if DUMP_TEXT_FRAGMENTS > 0
|
| - fprintf(stderr, "Line layout: ");
|
| - dumpTextBoxes(m_lineLayoutBoxes);
|
| -#endif
|
| -
|
| - finalizeTransformMatrices(m_lineLayoutBoxes);
|
| + chunkLayoutBuilder.finalizeTransformMatrices(m_lineLayoutBoxes);
|
| + m_lineLayoutBoxes.clear();
|
| }
|
|
|
| if (!m_pathLayoutBoxes.isEmpty()) {
|
| -#if DUMP_TEXT_FRAGMENTS > 0
|
| - fprintf(stderr, "Path layout: ");
|
| - dumpTextBoxes(m_pathLayoutBoxes);
|
| -#endif
|
| -
|
| - finalizeTransformMatrices(m_pathLayoutBoxes);
|
| + chunkLayoutBuilder.finalizeTransformMatrices(m_pathLayoutBoxes);
|
| + m_pathLayoutBoxes.clear();
|
| }
|
| }
|
|
|
|
|