diff options
author | Steve Block <steveblock@google.com> | 2011-05-06 11:45:16 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-12 13:44:10 +0100 |
commit | cad810f21b803229eb11403f9209855525a25d57 (patch) | |
tree | 29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/rendering/InlineTextBox.h | |
parent | 121b0cf4517156d0ac5111caf9830c51b69bae8f (diff) | |
download | external_webkit-cad810f21b803229eb11403f9209855525a25d57.zip external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2 |
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/rendering/InlineTextBox.h')
-rw-r--r-- | Source/WebCore/rendering/InlineTextBox.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/InlineTextBox.h b/Source/WebCore/rendering/InlineTextBox.h new file mode 100644 index 0000000..ee75f06 --- /dev/null +++ b/Source/WebCore/rendering/InlineTextBox.h @@ -0,0 +1,178 @@ +/* + * (C) 1999 Lars Knoll (knoll@kde.org) + * (C) 2000 Dirk Mueller (mueller@kde.org) + * Copyright (C) 2004, 2005, 2006, 2009 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 + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef InlineTextBox_h +#define InlineTextBox_h + +#include "InlineBox.h" +#include "RenderText.h" // so textRenderer() can be inline + +namespace WebCore { + +struct CompositionUnderline; +struct DocumentMarker; + +const unsigned short cNoTruncation = USHRT_MAX; +const unsigned short cFullTruncation = USHRT_MAX - 1; + +// 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: +#ifdef ANDROID_DISABLE_ROUNDING_HACKS + InlineTextBox(RenderObject* obj, bool disableRoundingHacks = false) +#else + InlineTextBox(RenderObject* obj) +#endif + : InlineBox(obj) + , m_prevTextBox(0) + , m_nextTextBox(0) + , m_start(0) + , m_len(0) + , m_truncation(cNoTruncation) +#ifdef ANDROID_DISABLE_ROUNDING_HACKS + , m_disableRoundingHacks(disableRoundingHacks) +#endif + { + } + + InlineTextBox* prevTextBox() const { return m_prevTextBox; } + InlineTextBox* nextTextBox() const { return m_nextTextBox; } + void setNextTextBox(InlineTextBox* n) { m_nextTextBox = n; } + void setPreviousTextBox(InlineTextBox* p) { m_prevTextBox = p; } + + unsigned start() const { return m_start; } + unsigned end() const { return m_len ? m_start + m_len - 1 : m_start; } + unsigned len() const { return m_len; } + + void setStart(unsigned start) { m_start = start; } + void setLen(unsigned len) { m_len = len; } + + void offsetRun(int d) { m_start += d; } + + unsigned short truncation() { return m_truncation; } + + bool hasHyphen() const { return m_hasEllipsisBoxOrHyphen; } + void setHasHyphen(bool hasHyphen) { m_hasEllipsisBoxOrHyphen = hasHyphen; } + static inline bool compareByStart(const InlineTextBox* first, const InlineTextBox* second) { return first->start() < second->start(); } + + virtual int baselinePosition(FontBaseline) const; + virtual int lineHeight() const; + + bool getEmphasisMarkPosition(RenderStyle*, TextEmphasisPosition&) const; + +private: + int selectionTop(); + int selectionBottom(); + int selectionHeight(); + +public: + virtual IntRect calculateBoundaries() const { return IntRect(x(), y(), logicalWidth(), logicalHeight()); } + + virtual IntRect selectionRect(int absx, int absy, int startPos, int endPos); + bool isSelected(int startPos, int endPos) const; + void selectionStartEnd(int& sPos, int& ePos); + +protected: + virtual void paint(PaintInfo&, int tx, int ty); + virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty); + +public: + RenderText* textRenderer() const; + +private: + virtual void deleteLine(RenderArena*); + virtual void extractLine(); + virtual void attachLine(); + +public: + virtual RenderObject::SelectionState selectionState(); + +private: + virtual void clearTruncation() { m_truncation = cNoTruncation; } + virtual int placeEllipsisBox(bool flowIsLTR, int visibleLeftEdge, int visibleRightEdge, int ellipsisWidth, bool& foundBox); + +public: + virtual bool isLineBreak() const; + + void setSpaceAdd(int add) { m_logicalWidth -= m_toAdd; m_toAdd = add; m_logicalWidth += m_toAdd; } + +private: + virtual bool isInlineTextBox() const { return true; } + +public: + virtual int caretMinOffset() const; + virtual int caretMaxOffset() const; + +private: + virtual unsigned caretMaxRenderedOffset() const; + + int textPos() const; // returns the x position relative to the left start of the text line. + +public: + virtual int offsetForPosition(int x, bool includePartialGlyphs = true) const; + virtual int 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); + +private: + 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). +#ifdef ANDROID_DISABLE_ROUNDING_HACKS + bool m_disableRoundingHacks; +#endif + +protected: + void paintCompositionBackground(GraphicsContext*, const IntPoint& boxOrigin, RenderStyle*, const Font&, int startPos, int endPos); + void paintDocumentMarkers(GraphicsContext*, const IntPoint& boxOrigin, RenderStyle*, const Font&, bool background); + void paintCompositionUnderline(GraphicsContext*, const IntPoint& boxOrigin, const CompositionUnderline&); +#if PLATFORM(MAC) + void paintCustomHighlight(int tx, int ty, const AtomicString& type); +#endif + +private: + void paintDecoration(GraphicsContext*, const IntPoint& boxOrigin, int decoration, const ShadowData*); + void paintSelection(GraphicsContext*, const IntPoint& boxOrigin, RenderStyle*, const Font&); + void paintSpellingOrGrammarMarker(GraphicsContext*, const IntPoint& boxOrigin, const DocumentMarker&, RenderStyle*, const Font&, bool grammar); + void paintTextMatchMarker(GraphicsContext*, const IntPoint& boxOrigin, const DocumentMarker&, RenderStyle*, const Font&); + void computeRectForReplacementMarker(const DocumentMarker&, RenderStyle*, const Font&); +}; + +inline RenderText* InlineTextBox::textRenderer() const +{ + return toRenderText(renderer()); +} + +} // namespace WebCore + +#endif // InlineTextBox_h |