1// Copyright 2019 Google LLC.
2#ifndef ParagraphBuilderImpl_DEFINED
3#define ParagraphBuilderImpl_DEFINED
4
5#include <memory>
6#include <stack>
7#include <string>
8#include <tuple>
9#include "modules/skparagraph/include/FontCollection.h"
10#include "modules/skparagraph/include/Paragraph.h"
11#include "modules/skparagraph/include/ParagraphBuilder.h"
12#include "modules/skparagraph/include/ParagraphStyle.h"
13#include "modules/skparagraph/include/TextStyle.h"
14
15namespace skia {
16namespace textlayout {
17
18class ParagraphBuilderImpl : public ParagraphBuilder {
19public:
20 ParagraphBuilderImpl(const ParagraphStyle& style, sk_sp<FontCollection> fontCollection);
21
22 ~ParagraphBuilderImpl() override;
23
24 // Push a style to the stack. The corresponding text added with AddText will
25 // use the top-most style.
26 void pushStyle(const TextStyle& style) override;
27
28 // Remove a style from the stack. Useful to apply different styles to chunks
29 // of text such as bolding.
30 // Example:
31 // builder.PushStyle(normal_style);
32 // builder.AddText("Hello this is normal. ");
33 //
34 // builder.PushStyle(bold_style);
35 // builder.AddText("And this is BOLD. ");
36 //
37 // builder.Pop();
38 // builder.AddText(" Back to normal again.");
39 void pop() override;
40
41 TextStyle peekStyle() override;
42
43 // Adds text to the builder. Forms the proper runs to use the upper-most style
44 // on the style_stack.
45 void addText(const std::u16string& text) override;
46
47 // Adds text to the builder, using the top-most style on on the style_stack.
48 void addText(const char* text) override; // Don't use this one - going away soon
49 void addText(const char* text, size_t len) override;
50
51 void addPlaceholder(const PlaceholderStyle& placeholderStyle) override;
52
53 void setParagraphStyle(const ParagraphStyle& style) override;
54
55 // Constructs a SkParagraph object that can be used to layout and paint the text to a SkCanvas.
56 std::unique_ptr<Paragraph> Build() override;
57
58private:
59 void endRunIfNeeded();
60 void addPlaceholder(const PlaceholderStyle& placeholderStyle, bool lastOne);
61
62 SkString fUtf8;
63 std::stack<TextStyle> fTextStyles;
64 SkTArray<Block, true> fStyledBlocks;
65 SkTArray<Placeholder, true> fPlaceholders;
66 sk_sp<FontCollection> fFontCollection;
67 ParagraphStyle fParagraphStyle;
68};
69} // namespace textlayout
70} // namespace skia
71
72#endif // ParagraphBuilderImpl_DEFINED
73