File: TextPainter.h

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (101 lines) | stat: -rw-r--r-- 3,560 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TextPainter_h
#define TextPainter_h

#include "core/rendering/FloatToLayoutUnit.h"
#include "core/rendering/style/RenderStyleConstants.h"
#include "platform/fonts/TextBlob.h"
#include "platform/geometry/FloatPoint.h"
#include "platform/geometry/FloatRect.h"
#include "platform/graphics/Color.h"
#include "platform/transforms/AffineTransform.h"
#include "wtf/text/AtomicString.h"

namespace blink {

class Font;
class GraphicsContext;
class GraphicsContextStateSaver;
class RenderCombineText;
class RenderObject;
class RenderStyle;
class ShadowList;
class TextRun;
struct TextRunPaintInfo;

class TextPainter {
public:
    struct Style;

    TextPainter(GraphicsContext*, const Font&, const TextRun&, const FloatPoint& textOrigin, const FloatRect& textBounds, bool horizontal);
    ~TextPainter();

    void setEmphasisMark(const AtomicString&, TextEmphasisPosition);
    void setCombinedText(RenderCombineText* combinedText) { m_combinedText = combinedText; }

    static void updateGraphicsContext(GraphicsContext*, const Style&, bool horizontal, GraphicsContextStateSaver&);

    void paint(int startOffset, int endOffset, int length, const Style&, TextBlobPtr* cachedTextBlob = 0);

    struct Style {
        Color fillColor;
        Color strokeColor;
        Color emphasisMarkColor;
        float strokeWidth;
        const ShadowList* shadow;

        bool operator==(const Style& other)
        {
            return fillColor == other.fillColor
                && strokeColor == other.strokeColor
                && emphasisMarkColor == other.emphasisMarkColor
                && strokeWidth == other.strokeWidth
                && shadow == other.shadow;
        }
        bool operator!=(const Style& other) { return !(*this == other); }
    };
    static Style textPaintingStyle(RenderObject&, RenderStyle*, bool forceBlackText, bool isPrinting);
    static Style selectionPaintingStyle(RenderObject&, bool haveSelection, bool forceBlackText, bool isPrinting, const Style& textStyle);

    enum RotationDirection { Counterclockwise, Clockwise };
    static AffineTransform rotation(const FloatRectWillBeLayoutRect& boxRect, RotationDirection);

private:
    void updateGraphicsContext(const Style& style, GraphicsContextStateSaver& saver)
    {
        updateGraphicsContext(m_graphicsContext, style, m_horizontal, saver);
    }

    enum PaintInternalStep { PaintText, PaintEmphasisMark };

    template <PaintInternalStep step>
    void paintInternalRun(TextRunPaintInfo&, int from, int to);

    template <PaintInternalStep step>
    void paintInternal(int startOffset, int endOffset, int truncationPoint, TextBlobPtr* cachedTextBlob = 0);

    void paintEmphasisMarkForCombinedText();

    GraphicsContext* m_graphicsContext;
    const Font& m_font;
    const TextRun& m_run;
    FloatPoint m_textOrigin;
    FloatRect m_textBounds;
    bool m_horizontal;
    AtomicString m_emphasisMark;
    int m_emphasisMarkOffset;
    RenderCombineText* m_combinedText;
};

inline AffineTransform TextPainter::rotation(const FloatRectWillBeLayoutRect& boxRect, RotationDirection rotationDirection)
{
    return rotationDirection == Clockwise ? AffineTransform(0, 1, -1, 0, boxRect.x() + boxRect.maxY(), boxRect.maxY() - boxRect.x())
        : AffineTransform(0, -1, 1, 0, boxRect.x() - boxRect.maxY(), boxRect.x() + boxRect.maxY());
}

} // namespace blink

#endif // TextPainter_h