1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef TextPainter_h
6#define TextPainter_h
7
8#include "core/rendering/style/RenderStyleConstants.h"
9#include "platform/fonts/TextBlob.h"
10#include "platform/geometry/FloatPoint.h"
11#include "platform/geometry/FloatRect.h"
12#include "platform/graphics/Color.h"
13#include "wtf/text/AtomicString.h"
14
15namespace blink {
16
17class Font;
18class GraphicsContext;
19class GraphicsContextStateSaver;
20class RenderCombineText;
21class RenderObject;
22class RenderStyle;
23class ShadowList;
24class TextRun;
25struct TextRunPaintInfo;
26
27class TextPainter {
28public:
29    struct Style;
30
31    TextPainter(GraphicsContext*, const Font&, const TextRun&, const FloatPoint& textOrigin, const FloatRect& textBounds, bool horizontal);
32    ~TextPainter();
33
34    void setEmphasisMark(const AtomicString&, TextEmphasisPosition);
35    void setCombinedText(RenderCombineText* combinedText) { m_combinedText = combinedText; }
36
37    static void updateGraphicsContext(GraphicsContext*, const Style&, bool horizontal, GraphicsContextStateSaver&);
38
39    void paint(int startOffset, int endOffset, int length, const Style&, TextBlobPtr* cachedTextBlob = 0);
40
41    struct Style {
42        Color fillColor;
43        Color strokeColor;
44        Color emphasisMarkColor;
45        float strokeWidth;
46        const ShadowList* shadow;
47
48        bool operator==(const Style& other)
49        {
50            return fillColor == other.fillColor
51                && strokeColor == other.strokeColor
52                && emphasisMarkColor == other.emphasisMarkColor
53                && strokeWidth == other.strokeWidth
54                && shadow == other.shadow;
55        }
56        bool operator!=(const Style& other) { return !(*this == other); }
57    };
58    static Style textPaintingStyle(RenderObject&, RenderStyle*, bool forceBlackText, bool isPrinting);
59    static Style selectionPaintingStyle(RenderObject&, bool haveSelection, bool forceBlackText, bool isPrinting, const Style& textStyle);
60
61private:
62    void updateGraphicsContext(const Style& style, GraphicsContextStateSaver& saver)
63    {
64        updateGraphicsContext(m_graphicsContext, style, m_horizontal, saver);
65    }
66
67    enum PaintInternalStep { PaintText, PaintEmphasisMark };
68
69    template <PaintInternalStep step>
70    void paintInternalRun(TextRunPaintInfo&, int from, int to, TextBlobPtr* cachedTextBlob = 0);
71
72    template <PaintInternalStep step>
73    void paintInternal(int startOffset, int endOffset, int truncationPoint, TextBlobPtr* cachedTextBlob = 0);
74
75    void paintEmphasisMarkForCombinedText();
76
77    GraphicsContext* m_graphicsContext;
78    const Font& m_font;
79    const TextRun& m_run;
80    FloatPoint m_textOrigin;
81    FloatRect m_textBounds;
82    bool m_horizontal;
83    AtomicString m_emphasisMark;
84    int m_emphasisMarkOffset;
85    RenderCombineText* m_combinedText;
86};
87
88} // namespace blink
89
90#endif // TextPainter_h
91