diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebCore/rendering/InlineTextBox.h | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebCore/rendering/InlineTextBox.h')
-rw-r--r-- | Source/WebCore/rendering/InlineTextBox.h | 173 |
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 |