summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/InlineTextBox.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/InlineTextBox.h')
-rw-r--r--Source/WebCore/rendering/InlineTextBox.h173
1 files changed, 69 insertions, 104 deletions
diff --git a/Source/WebCore/rendering/InlineTextBox.h b/Source/WebCore/rendering/InlineTextBox.h
index a1c9d930b..53b848fc0 100644
--- a/Source/WebCore/rendering/InlineTextBox.h
+++ b/Source/WebCore/rendering/InlineTextBox.h
@@ -1,7 +1,7 @@
/*
* (C) 1999 Lars Knoll (knoll@kde.org)
* (C) 2000 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011, 2014 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -24,40 +24,37 @@
#define InlineTextBox_h
#include "InlineBox.h"
-#include "RenderText.h" // so textRenderer() can be inline
+#include "RenderText.h"
#include "TextRun.h"
-#include <wtf/text/StringBuilder.h>
namespace WebCore {
struct CompositionUnderline;
-class DocumentMarker;
+class RenderCombineText;
+class RenderedDocumentMarker;
+class TextPainter;
+struct TextPaintStyle;
const unsigned short cNoTruncation = USHRT_MAX;
const unsigned short cFullTruncation = USHRT_MAX - 1;
-class BufferForAppendingHyphen : public StringBuilder {
-public:
- BufferForAppendingHyphen() { reserveCapacity(256); }
-};
-
-// Helper functions shared by InlineTextBox / SVGRootInlineBox
-void updateGraphicsContext(GraphicsContext*, const Color& fillColor, const Color& strokeColor, float strokeThickness, ColorSpace);
-Color correctedTextColor(Color textColor, Color backgroundColor);
-
class InlineTextBox : public InlineBox {
public:
- InlineTextBox(RenderObject* obj)
- : InlineBox(obj)
- , m_prevTextBox(0)
- , m_nextTextBox(0)
+ explicit InlineTextBox(RenderText& renderer)
+ : InlineBox(renderer)
+ , m_prevTextBox(nullptr)
+ , m_nextTextBox(nullptr)
, m_start(0)
, m_len(0)
, m_truncation(cNoTruncation)
{
+ setBehavesLikeText(true);
}
- virtual void destroy(RenderArena*) FINAL;
+ virtual ~InlineTextBox();
+
+ RenderText& renderer() const { return downcast<RenderText>(InlineBox::renderer()); }
+ const RenderStyle& lineStyle() const { return isFirstLine() ? renderer().firstLineStyle() : renderer().style(); }
InlineTextBox* prevTextBox() const { return m_prevTextBox; }
InlineTextBox* nextTextBox() const { return m_nextTextBox; }
@@ -74,21 +71,27 @@ public:
void offsetRun(int d) { ASSERT(!isDirty()); m_start += d; }
- unsigned short truncation() { return m_truncation; }
+ unsigned short truncation() const { return m_truncation; }
- virtual void markDirty(bool dirty = true) OVERRIDE FINAL;
+ virtual void markDirty(bool dirty = true) override final;
using InlineBox::hasHyphen;
using InlineBox::setHasHyphen;
using InlineBox::canHaveLeadingExpansion;
using InlineBox::setCanHaveLeadingExpansion;
+ using InlineBox::canHaveTrailingExpansion;
+ using InlineBox::setCanHaveTrailingExpansion;
+ using InlineBox::forceTrailingExpansion;
+ using InlineBox::setForceTrailingExpansion;
+ using InlineBox::forceLeadingExpansion;
+ using InlineBox::setForceLeadingExpansion;
static inline bool compareByStart(const InlineTextBox* first, const InlineTextBox* second) { return first->start() < second->start(); }
- virtual int baselinePosition(FontBaseline) const FINAL;
- virtual LayoutUnit lineHeight() const FINAL;
+ virtual int baselinePosition(FontBaseline) const override final;
+ virtual LayoutUnit lineHeight() const override final;
- bool getEmphasisMarkPosition(RenderStyle*, TextEmphasisPosition&) const;
+ bool emphasisMarkExistsAndIsAbove(const RenderStyle&, bool& isAbove) const;
LayoutRect logicalOverflowRect() const;
void setLogicalOverflowRect(const LayoutRect&);
@@ -97,61 +100,53 @@ public:
LayoutUnit logicalLeftVisualOverflow() const { return logicalOverflowRect().x(); }
LayoutUnit logicalRightVisualOverflow() const { return logicalOverflowRect().maxX(); }
-#ifndef NDEBUG
- virtual void showBox(int = 0) const;
- virtual const char* boxName() const;
+ virtual void dirtyOwnLineBoxes() { dirtyLineBoxes(); }
+
+#if ENABLE(TREE_DEBUGGING)
+ virtual void showLineBox(bool mark, int depth) const override final;
+ virtual const char* boxName() const override final;
#endif
private:
- LayoutUnit selectionTop();
- LayoutUnit selectionBottom();
- LayoutUnit selectionHeight();
+ LayoutUnit selectionTop() const;
+ LayoutUnit selectionBottom() const;
+ LayoutUnit selectionHeight() const;
- TextRun constructTextRun(RenderStyle*, const Font&, BufferForAppendingHyphen* = 0) const;
- TextRun constructTextRun(RenderStyle*, const Font&, String, int maximumLength, BufferForAppendingHyphen* = 0) const;
+ TextRun constructTextRun(const RenderStyle&, const FontCascade&, String* hyphenatedStringBuffer = nullptr) const;
+ TextRun constructTextRun(const RenderStyle&, const FontCascade&, String, unsigned maximumLength, String* hyphenatedStringBuffer = nullptr) const;
public:
- virtual FloatRect calculateBoundaries() const { return FloatRect(x(), y(), width(), height()); }
+ virtual FloatRect calculateBoundaries() const override { return FloatRect(x(), y(), width(), height()); }
- virtual LayoutRect localSelectionRect(int startPos, int endPos);
+ virtual LayoutRect localSelectionRect(int startPos, int endPos) const;
bool isSelected(int startPos, int endPos) const;
void selectionStartEnd(int& sPos, int& ePos);
protected:
- virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom);
- virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE;
-
-public:
- RenderText* textRenderer() const;
+ virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) override;
+ virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom, HitTestAction) override;
private:
- virtual void deleteLine(RenderArena*) FINAL;
- virtual void extractLine() FINAL;
- virtual void attachLine() FINAL;
+ virtual void deleteLine() override final;
+ virtual void extractLine() override final;
+ virtual void attachLine() override final;
public:
- virtual RenderObject::SelectionState selectionState() FINAL;
+ virtual RenderObject::SelectionState selectionState() override final;
private:
- virtual void clearTruncation() FINAL { m_truncation = cNoTruncation; }
- virtual float placeEllipsisBox(bool flowIsLTR, float visibleLeftEdge, float visibleRightEdge, float ellipsisWidth, float &truncatedWidth, bool& foundBox) OVERRIDE FINAL;
+ virtual void clearTruncation() override final { m_truncation = cNoTruncation; }
+ virtual float placeEllipsisBox(bool flowIsLTR, float visibleLeftEdge, float visibleRightEdge, float ellipsisWidth, float &truncatedWidth, bool& foundBox) override final;
public:
- virtual bool isLineBreak() const FINAL;
-
- void setExpansion(int newExpansion)
- {
- m_logicalWidth -= expansion();
- InlineBox::setExpansion(newExpansion);
- m_logicalWidth += newExpansion;
- }
+ virtual bool isLineBreak() const override final;
private:
- virtual bool isInlineTextBox() const FINAL { return true; }
+ virtual bool isInlineTextBox() const override final { return true; }
public:
- virtual int caretMinOffset() const FINAL;
- virtual int caretMaxOffset() const FINAL;
+ virtual int caretMinOffset() const override final;
+ virtual int caretMaxOffset() const override final;
private:
float textPos() const; // returns the x position relative to the left start of the text line.
@@ -160,65 +155,35 @@ public:
virtual int offsetForPosition(float x, bool includePartialGlyphs = true) const;
virtual float positionForOffset(int offset) const;
- bool containsCaretOffset(int offset) const; // false for offset after line break
-
- // Needs to be public, so the static paintTextWithShadows() function can use it.
- static FloatSize applyShadowToGraphicsContext(GraphicsContext*, const ShadowData*, const FloatRect& textRect, bool stroked, bool opaque, bool horizontal);
+protected:
+ void paintCompositionBackground(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, int startPos, int endPos);
+ void paintDocumentMarkers(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, bool background);
+ void paintCompositionUnderline(GraphicsContext&, const FloatPoint& boxOrigin, const CompositionUnderline&);
private:
+ void paintDecoration(GraphicsContext&, const FontCascade&, RenderCombineText*, const TextRun&, const FloatPoint& textOrigin, const FloatRect& boxRect,
+ TextDecoration, TextPaintStyle, const ShadowData*);
+ void paintSelection(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, Color textColor);
+ void paintDocumentMarker(GraphicsContext&, const FloatPoint& boxOrigin, RenderedDocumentMarker&, const RenderStyle&, const FontCascade&, bool grammar);
+ void paintTextMatchMarker(GraphicsContext&, const FloatPoint& boxOrigin, RenderedDocumentMarker&, const RenderStyle&, const FontCascade&);
+
+ ExpansionBehavior expansionBehavior() const;
+
+ void behavesLikeText() const = delete;
+
InlineTextBox* m_prevTextBox; // The previous box that also uses our RenderObject
InlineTextBox* m_nextTextBox; // The next box that also uses our RenderObject
int m_start;
unsigned short m_len;
- unsigned short m_truncation; // Where to truncate when text overflow is applied. We use special constants to
- // denote no truncation (the whole run paints) and full truncation (nothing paints at all).
-
-protected:
- void paintCompositionBackground(GraphicsContext*, const FloatPoint& boxOrigin, RenderStyle*, const Font&, int startPos, int endPos);
- void paintDocumentMarkers(GraphicsContext*, const FloatPoint& boxOrigin, RenderStyle*, const Font&, bool background);
- void paintCompositionUnderline(GraphicsContext*, const FloatPoint& boxOrigin, const CompositionUnderline&);
-#if PLATFORM(MAC)
- void paintCustomHighlight(const LayoutPoint&, const AtomicString& type);
-#endif
-
-private:
- void paintDecoration(GraphicsContext*, const FloatPoint& boxOrigin, TextDecoration, TextDecorationStyle, const ShadowData*);
- void paintSelection(GraphicsContext*, const FloatPoint& boxOrigin, RenderStyle*, const Font&, Color textColor);
- void paintDocumentMarker(GraphicsContext*, const FloatPoint& boxOrigin, DocumentMarker*, RenderStyle*, const Font&, bool grammar);
- void paintTextMatchMarker(GraphicsContext*, const FloatPoint& boxOrigin, DocumentMarker*, RenderStyle*, const Font&);
- void computeRectForReplacementMarker(DocumentMarker*, RenderStyle*, const Font&);
-
- TextRun::ExpansionBehavior expansionBehavior() const
- {
- return (canHaveLeadingExpansion() ? TextRun::AllowLeadingExpansion : TextRun::ForbidLeadingExpansion)
- | (expansion() && nextLeafChild() ? TextRun::AllowTrailingExpansion : TextRun::ForbidTrailingExpansion);
- }
+ // Where to truncate when text overflow is applied. We use special constants to
+ // denote no truncation (the whole run paints) and full truncation (nothing paints at all).
+ unsigned short m_truncation;
};
-inline InlineTextBox* toInlineTextBox(InlineBox* inlineBox)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!inlineBox || inlineBox->isInlineTextBox());
- return static_cast<InlineTextBox*>(inlineBox);
-}
-
-inline const InlineTextBox* toInlineTextBox(const InlineBox* inlineBox)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!inlineBox || inlineBox->isInlineTextBox());
- return static_cast<const InlineTextBox*>(inlineBox);
-}
-
-// This will catch anyone doing an unnecessary cast.
-void toInlineTextBox(const InlineTextBox*);
-
-inline RenderText* InlineTextBox::textRenderer() const
-{
- return toRenderText(renderer());
-}
-
-void alignSelectionRectToDevicePixels(FloatRect&);
-
} // namespace WebCore
+SPECIALIZE_TYPE_TRAITS_INLINE_BOX(InlineTextBox, isInlineTextBox())
+
#endif // InlineTextBox_h