diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/rendering/InlineTextBox.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/rendering/InlineTextBox.h')
-rw-r--r-- | Source/WebCore/rendering/InlineTextBox.h | 134 |
1 files changed, 56 insertions, 78 deletions
diff --git a/Source/WebCore/rendering/InlineTextBox.h b/Source/WebCore/rendering/InlineTextBox.h index f8626b8f2..9c4618a16 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 @@ -20,44 +20,34 @@ * */ -#ifndef InlineTextBox_h -#define InlineTextBox_h +#pragma once #include "InlineBox.h" #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); } -}; - class InlineTextBox : public InlineBox { public: explicit InlineTextBox(RenderText& renderer) : InlineBox(renderer) - , m_prevTextBox(0) - , m_nextTextBox(0) - , m_start(0) - , m_len(0) - , m_truncation(cNoTruncation) { setBehavesLikeText(true); } virtual ~InlineTextBox(); - RenderText& renderer() const { return toRenderText(InlineBox::renderer()); } + RenderText& renderer() const { return downcast<RenderText>(InlineBox::renderer()); } const RenderStyle& lineStyle() const { return isFirstLine() ? renderer().firstLineStyle() : renderer().style(); } InlineTextBox* prevTextBox() const { return m_prevTextBox; } @@ -73,21 +63,27 @@ public: void setStart(unsigned start) { m_start = start; } void setLen(unsigned len) { m_len = len; } - void offsetRun(int d) { ASSERT(!isDirty()); m_start += d; } + void offsetRun(int d) { ASSERT(!isDirty()); ASSERT(d > 0 || m_start >= static_cast<unsigned>(-d)); m_start += d; } unsigned short truncation() const { return m_truncation; } - virtual void markDirty(bool dirty = true) override final; + void markDirty(bool dirty = true) 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 override final; - virtual LayoutUnit lineHeight() const override final; + int baselinePosition(FontBaseline) const final; + LayoutUnit lineHeight() const final; bool emphasisMarkExistsAndIsAbove(const RenderStyle&, bool& isAbove) const; @@ -100,9 +96,9 @@ public: virtual void dirtyOwnLineBoxes() { dirtyLineBoxes(); } -#ifndef NDEBUG - virtual void showBox(int = 0) const; - virtual const char* boxName() const; +#if ENABLE(TREE_DEBUGGING) + void showLineBox(bool mark, int depth) const final; + const char* boxName() const final; #endif private: @@ -110,97 +106,79 @@ private: LayoutUnit selectionBottom() const; LayoutUnit selectionHeight() const; - TextRun constructTextRun(const RenderStyle&, const Font&, BufferForAppendingHyphen* = 0) const; - TextRun constructTextRun(const RenderStyle&, const Font&, String, int maximumLength, BufferForAppendingHyphen* = 0) const; + StringView substringToRender(std::optional<unsigned> overridingLength = { }) const; + String hyphenatedStringForTextRun(const RenderStyle&, std::optional<unsigned> alternateLength = { }) const; + TextRun constructTextRun(const RenderStyle&, StringView alternateStringToRender = { }, std::optional<unsigned> alternateLength = { }) const; + TextRun constructTextRun(const RenderStyle&, StringView, unsigned maximumLength) const; public: - virtual FloatRect calculateBoundaries() const { return FloatRect(x(), y(), width(), height()); } + FloatRect calculateBoundaries() const override { return FloatRect(x(), y(), width(), height()); } - virtual LayoutRect localSelectionRect(int startPos, int endPos) const; - bool isSelected(int startPos, int endPos) const; - void selectionStartEnd(int& sPos, int& ePos); + virtual LayoutRect localSelectionRect(unsigned startPos, unsigned endPos) const; + bool isSelected(unsigned startPos, unsigned endPos) const; + std::pair<unsigned, unsigned> selectionStartEnd() const; 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; + void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) override; + bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom, HitTestAction) override; private: - virtual void deleteLine() override final; - virtual void extractLine() override final; - virtual void attachLine() override final; + void deleteLine() final; + void extractLine() final; + void attachLine() final; public: - virtual RenderObject::SelectionState selectionState() override final; + RenderObject::SelectionState selectionState() final; private: - 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; + void clearTruncation() final { m_truncation = cNoTruncation; } + float placeEllipsisBox(bool flowIsLTR, float visibleLeftEdge, float visibleRightEdge, float ellipsisWidth, float &truncatedWidth, bool& foundBox) final; public: - virtual bool isLineBreak() const override final; - - void setExpansion(int newExpansion) - { - m_logicalWidth -= expansion(); - InlineBox::setExpansion(newExpansion); - m_logicalWidth += newExpansion; - } + bool isLineBreak() const final; private: - virtual bool isInlineTextBox() const override final { return true; } + bool isInlineTextBox() const final { return true; } public: - virtual int caretMinOffset() const override final; - virtual int caretMaxOffset() const override final; + int caretMinOffset() const final; + int caretMaxOffset() const final; private: float textPos() const; // returns the x position relative to the left start of the text line. public: virtual int offsetForPosition(float x, bool includePartialGlyphs = true) const; - virtual float positionForOffset(int offset) const; - - // 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); + virtual float positionForOffset(unsigned offset) const; protected: - void paintCompositionBackground(GraphicsContext*, const FloatPoint& boxOrigin, const RenderStyle&, const Font&, int startPos, int endPos); - void paintDocumentMarkers(GraphicsContext*, const FloatPoint& boxOrigin, const RenderStyle&, const Font&, bool background); - void paintCompositionUnderline(GraphicsContext*, const FloatPoint& boxOrigin, const CompositionUnderline&); -#if PLATFORM(MAC) - void paintCustomHighlight(const LayoutPoint&, const AtomicString& type); -#endif + void paintCompositionBackground(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, unsigned startPos, unsigned endPos); + void paintDocumentMarkers(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, bool background); + void paintCompositionUnderline(GraphicsContext&, const FloatPoint& boxOrigin, const CompositionUnderline&); + unsigned clampedOffset(unsigned) const; private: - void paintDecoration(GraphicsContext&, const FloatPoint& boxOrigin, TextDecoration, TextDecorationStyle, const ShadowData*, TextPainter&); - void paintSelection(GraphicsContext*, const FloatPoint& boxOrigin, const RenderStyle&, const Font&, Color textColor); - void paintDocumentMarker(GraphicsContext*, const FloatPoint& boxOrigin, DocumentMarker*, const RenderStyle&, const Font&, bool grammar); - void paintTextMatchMarker(GraphicsContext*, const FloatPoint& boxOrigin, DocumentMarker*, const RenderStyle&, const Font&); - void computeRectForReplacementMarker(DocumentMarker*, const RenderStyle&, const Font&); + 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&, const 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&); - TextRun::ExpansionBehavior expansionBehavior() const - { - return (canHaveLeadingExpansion() ? TextRun::AllowLeadingExpansion : TextRun::ForbidLeadingExpansion) - | (expansion() && nextLeafChild() ? TextRun::AllowTrailingExpansion : TextRun::ForbidTrailingExpansion); - } + 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 + InlineTextBox* m_prevTextBox { nullptr }; // The previous box that also uses our RenderObject + InlineTextBox* m_nextTextBox { nullptr }; // The next box that also uses our RenderObject - int m_start; - unsigned short m_len; + unsigned m_start { 0 }; + unsigned short m_len { 0 }; // 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; + unsigned short m_truncation { cNoTruncation }; }; -INLINE_BOX_OBJECT_TYPE_CASTS(InlineTextBox, isInlineTextBox()) - -void alignSelectionRectToDevicePixels(FloatRect&); - } // namespace WebCore -#endif // InlineTextBox_h +SPECIALIZE_TYPE_TRAITS_INLINE_BOX(InlineTextBox, isInlineTextBox()) |