Coverage Report

Created: 2024-05-20 07:14

/src/skia/modules/skparagraph/include/ParagraphBuilder.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2019 Google LLC.
2
#ifndef ParagraphBuilder_DEFINED
3
#define ParagraphBuilder_DEFINED
4
5
#include <memory>
6
#include <stack>
7
#include <string>
8
#include <tuple>
9
#include <vector>
10
#include "modules/skparagraph/include/FontCollection.h"
11
#include "modules/skparagraph/include/Paragraph.h"
12
#include "modules/skparagraph/include/ParagraphStyle.h"
13
#include "modules/skparagraph/include/TextStyle.h"
14
#include "modules/skunicode/include/SkUnicode.h"
15
16
namespace skia {
17
namespace textlayout {
18
19
class ParagraphBuilder {
20
protected:
21
0
    ParagraphBuilder() {}
22
23
public:
24
0
    virtual ~ParagraphBuilder() = default;
25
26
    // Push a style to the stack. The corresponding text added with AddText will
27
    // use the top-most style.
28
    virtual void pushStyle(const TextStyle& style) = 0;
29
30
    // Remove a style from the stack. Useful to apply different styles to chunks
31
    // of text such as bolding.
32
    // Example:
33
    //   builder.PushStyle(normal_style);
34
    //   builder.AddText("Hello this is normal. ");
35
    //
36
    //   builder.PushStyle(bold_style);
37
    //   builder.AddText("And this is BOLD. ");
38
    //
39
    //   builder.Pop();
40
    //   builder.AddText(" Back to normal again.");
41
    virtual void pop() = 0;
42
43
    virtual TextStyle peekStyle() = 0;
44
45
    // Adds UTF16-encoded text to the builder. Forms the proper runs to use the upper-most style
46
    // on the style_stack.
47
    virtual void addText(const std::u16string& text) = 0;
48
49
    // Adds UTF8-encoded text to the builder, using the top-most style on the style_stack.
50
    virtual void addText(const char* text) = 0;
51
    virtual void addText(const char* text, size_t len) = 0;
52
53
    // Pushes the information required to leave an open space, where Flutter may
54
    // draw a custom placeholder into.
55
    // Internally, this method adds a single object replacement character (0xFFFC)
56
    virtual void addPlaceholder(const PlaceholderStyle& placeholderStyle) = 0;
57
58
    // Constructs a SkParagraph object that can be used to layout and paint the text to a SkCanvas.
59
    virtual std::unique_ptr<Paragraph> Build() = 0;
60
61
    virtual SkSpan<char> getText() = 0;
62
    virtual const ParagraphStyle& getParagraphStyle() const = 0;
63
64
#if !defined(SK_DISABLE_LEGACY_CLIENT_UNICODE) && defined(SK_UNICODE_CLIENT_IMPLEMENTATION)
65
    // Mainly, support for "Client" unicode
66
    virtual void setWordsUtf8(std::vector<SkUnicode::Position> wordsUtf8) = 0;
67
    virtual void setWordsUtf16(std::vector<SkUnicode::Position> wordsUtf16) = 0;
68
69
    virtual void setGraphemeBreaksUtf8(std::vector<SkUnicode::Position> graphemesUtf8) = 0;
70
    virtual void setGraphemeBreaksUtf16(std::vector<SkUnicode::Position> graphemesUtf16) = 0;
71
72
    virtual void setLineBreaksUtf8(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf8) = 0;
73
    virtual void setLineBreaksUtf16(std::vector<SkUnicode::LineBreakBefore> lineBreaksUtf16) = 0;
74
75
    virtual std::tuple<std::vector<SkUnicode::Position>,
76
               std::vector<SkUnicode::Position>,
77
               std::vector<SkUnicode::LineBreakBefore>>
78
        getClientICUData() const = 0;
79
80
    virtual void SetUnicode(sk_sp<SkUnicode> unicode) = 0;
81
#endif
82
83
    // Resets this builder to its initial state, discarding any text, styles, placeholders that have
84
    // been added, but keeping the initial ParagraphStyle.
85
    virtual void Reset() = 0;
86
87
    // Just until we fix all the google3 code
88
    static std::unique_ptr<ParagraphBuilder> make(const ParagraphStyle& style,
89
                                                  sk_sp<FontCollection> fontCollection,
90
                                                  sk_sp<SkUnicode> unicode);
91
92
#if !defined(SK_DISABLE_LEGACY_PARAGRAPH_UNICODE)
93
    static std::unique_ptr<ParagraphBuilder> make(const ParagraphStyle& style,
94
                                                  sk_sp<FontCollection> fontCollection);
95
#endif
96
};
97
}  // namespace textlayout
98
}  // namespace skia
99
100
#endif  // ParagraphBuilder_DEFINED