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