summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/WebCore/platform/graphics/Font.cpp2
-rw-r--r--Source/WebCore/platform/graphics/Font.h1
-rw-r--r--Source/WebCore/platform/graphics/qt/FontQt.cpp66
3 files changed, 67 insertions, 2 deletions
diff --git a/Source/WebCore/platform/graphics/Font.cpp b/Source/WebCore/platform/graphics/Font.cpp
index f58bcc843..4f6570f8a 100644
--- a/Source/WebCore/platform/graphics/Font.cpp
+++ b/Source/WebCore/platform/graphics/Font.cpp
@@ -329,7 +329,7 @@ float Font::width(const TextRun& run, int& charsConsumed, String& glyphName) con
return width(run);
}
-#if !PLATFORM(MAC)
+#if !PLATFORM(MAC) && !PLATFORM(QT)
PassOwnPtr<TextLayout> Font::createLayout(RenderText*, float, bool) const
{
return nullptr;
diff --git a/Source/WebCore/platform/graphics/Font.h b/Source/WebCore/platform/graphics/Font.h
index 08e0ad49a..f2625871f 100644
--- a/Source/WebCore/platform/graphics/Font.h
+++ b/Source/WebCore/platform/graphics/Font.h
@@ -212,6 +212,7 @@ private:
friend struct WidthIterator;
friend class SVGTextRunRenderingContext;
+ friend class TextLayout;
public:
// Useful for debugging the different font rendering code paths.
diff --git a/Source/WebCore/platform/graphics/qt/FontQt.cpp b/Source/WebCore/platform/graphics/qt/FontQt.cpp
index 324fdf05f..3eead7e70 100644
--- a/Source/WebCore/platform/graphics/qt/FontQt.cpp
+++ b/Source/WebCore/platform/graphics/qt/FontQt.cpp
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
+ Copyright (C) 2012, 2014 Digia Plc. and/or its subsidiary(-ies)
Copyright (C) 2008, 2010 Holger Hans Peter Freyther
Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
@@ -31,6 +31,8 @@
#include "GraphicsContext.h"
#include "NotImplemented.h"
#include "Pattern.h"
+#include "RenderBlock.h"
+#include "RenderText.h"
#include "ShadowBlur.h"
#include "TextRun.h"
@@ -62,6 +64,7 @@ static QTextLine setupLayout(QTextLayout* layout, const TextRun& style)
int flags = style.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight;
if (style.expansion())
flags |= Qt::TextJustificationForced;
+ layout->setCacheEnabled(true);
layout->setFlags(flags);
layout->beginLayout();
QTextLine line = layout->createLine();
@@ -168,6 +171,67 @@ static void drawQtGlyphRun(GraphicsContext* context, const QGlyphRun& qtGlyphRun
}
}
+class TextLayout {
+public:
+ static bool isNeeded(RenderText* text, const Font& font)
+ {
+ TextRun run = RenderBlock::constructTextRun(text, font, text, text->style());
+ return font.codePath(run) == Font::Complex;
+ }
+
+ TextLayout(RenderText* text, const Font& font, float xPos)
+ {
+ const TextRun run(constructTextRun(text, font, xPos));
+ const String sanitized = Font::normalizeSpaces(run.characters16(), run.length());
+ const QString string(sanitized);
+ m_layout.setText(string);
+ m_layout.setRawFont(font.rawFont());
+ font.initFormatForTextLayout(&m_layout, run);
+ m_line = setupLayout(&m_layout, run);
+ }
+
+ float width(unsigned from, unsigned len, HashSet<const SimpleFontData*>* fallbackFonts)
+ {
+ Q_UNUSED(fallbackFonts);
+ float x1 = m_line.cursorToX(from);
+ float x2 = m_line.cursorToX(from + len);
+ float width = qAbs(x2 - x1);
+
+ return width;
+ }
+
+private:
+ static TextRun constructTextRun(RenderText* text, const Font& font, float xPos)
+ {
+ TextRun run = RenderBlock::constructTextRun(text, font, text, text->style());
+ run.setCharactersLength(text->textLength());
+ ASSERT(run.charactersLength() >= run.length());
+
+ run.setXPos(xPos);
+ return run;
+ }
+
+ QTextLayout m_layout;
+ QTextLine m_line;
+};
+
+PassOwnPtr<TextLayout> Font::createLayout(RenderText* text, float xPos, bool collapseWhiteSpace) const
+{
+ if (!collapseWhiteSpace || !TextLayout::isNeeded(text, *this))
+ return PassOwnPtr<TextLayout>();
+ return adoptPtr(new TextLayout(text, *this, xPos));
+}
+
+void Font::deleteLayout(TextLayout* layout)
+{
+ delete layout;
+}
+
+float Font::width(TextLayout& layout, unsigned from, unsigned len, HashSet<const SimpleFontData*>* fallbackFonts)
+{
+ return layout.width(from, len, fallbackFonts);
+}
+
void Font::drawComplexText(GraphicsContext* ctx, const TextRun& run, const FloatPoint& point, int from, int to) const
{
String sanitized = Font::normalizeSpaces(run.characters16(), run.length());