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