xref: /aosp_15_r20/external/skia/modules/skparagraph/include/Paragraph.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker #ifndef Paragraph_DEFINED
3*c8dee2aaSAndroid Build Coastguard Worker #define Paragraph_DEFINED
4*c8dee2aaSAndroid Build Coastguard Worker 
5*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
6*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/FontCollection.h"
7*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/Metrics.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/ParagraphStyle.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/TextStyle.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include <unordered_set>
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas;
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker namespace skia {
15*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout {
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker class ParagraphPainter;
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker class Paragraph {
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker public:
22*c8dee2aaSAndroid Build Coastguard Worker     Paragraph(ParagraphStyle style, sk_sp<FontCollection> fonts);
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker     virtual ~Paragraph() = default;
25*c8dee2aaSAndroid Build Coastguard Worker 
getMaxWidth()26*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getMaxWidth() { return fWidth; }
27*c8dee2aaSAndroid Build Coastguard Worker 
getHeight()28*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getHeight() { return fHeight; }
29*c8dee2aaSAndroid Build Coastguard Worker 
getMinIntrinsicWidth()30*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getMinIntrinsicWidth() { return fMinIntrinsicWidth; }
31*c8dee2aaSAndroid Build Coastguard Worker 
getMaxIntrinsicWidth()32*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getMaxIntrinsicWidth() { return fMaxIntrinsicWidth; }
33*c8dee2aaSAndroid Build Coastguard Worker 
getAlphabeticBaseline()34*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getAlphabeticBaseline() { return fAlphabeticBaseline; }
35*c8dee2aaSAndroid Build Coastguard Worker 
getIdeographicBaseline()36*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getIdeographicBaseline() { return fIdeographicBaseline; }
37*c8dee2aaSAndroid Build Coastguard Worker 
getLongestLine()38*c8dee2aaSAndroid Build Coastguard Worker     SkScalar getLongestLine() { return fLongestLine; }
39*c8dee2aaSAndroid Build Coastguard Worker 
didExceedMaxLines()40*c8dee2aaSAndroid Build Coastguard Worker     bool didExceedMaxLines() { return fExceededMaxLines; }
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     virtual void layout(SkScalar width) = 0;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     virtual void paint(SkCanvas* canvas, SkScalar x, SkScalar y) = 0;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     virtual void paint(ParagraphPainter* painter, SkScalar x, SkScalar y) = 0;
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker     // Returns a vector of bounding boxes that enclose all text between
49*c8dee2aaSAndroid Build Coastguard Worker     // start and end glyph indexes, including start and excluding end
50*c8dee2aaSAndroid Build Coastguard Worker     virtual std::vector<TextBox> getRectsForRange(unsigned start,
51*c8dee2aaSAndroid Build Coastguard Worker                                                   unsigned end,
52*c8dee2aaSAndroid Build Coastguard Worker                                                   RectHeightStyle rectHeightStyle,
53*c8dee2aaSAndroid Build Coastguard Worker                                                   RectWidthStyle rectWidthStyle) = 0;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     virtual std::vector<TextBox> getRectsForPlaceholders() = 0;
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     // Returns the index of the glyph that corresponds to the provided coordinate,
58*c8dee2aaSAndroid Build Coastguard Worker     // with the top left corner as the origin, and +y direction as down
59*c8dee2aaSAndroid Build Coastguard Worker     virtual PositionWithAffinity getGlyphPositionAtCoordinate(SkScalar dx, SkScalar dy) = 0;
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker     // Finds the first and last glyphs that define a word containing
62*c8dee2aaSAndroid Build Coastguard Worker     // the glyph at index offset
63*c8dee2aaSAndroid Build Coastguard Worker     virtual SkRange<size_t> getWordBoundary(unsigned offset) = 0;
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     virtual void getLineMetrics(std::vector<LineMetrics>&) = 0;
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     virtual size_t lineNumber() = 0;
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     virtual void markDirty() = 0;
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     // This function will return the number of unresolved glyphs or
72*c8dee2aaSAndroid Build Coastguard Worker     // -1 if not applicable (has not been shaped yet - valid case)
73*c8dee2aaSAndroid Build Coastguard Worker     virtual int32_t unresolvedGlyphs() = 0;
74*c8dee2aaSAndroid Build Coastguard Worker     virtual std::unordered_set<SkUnichar> unresolvedCodepoints() = 0;
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     // Experimental API that allows fast way to update some of "immutable" paragraph attributes
77*c8dee2aaSAndroid Build Coastguard Worker     // but not the text itself
78*c8dee2aaSAndroid Build Coastguard Worker     virtual void updateTextAlign(TextAlign textAlign) = 0;
79*c8dee2aaSAndroid Build Coastguard Worker     virtual void updateFontSize(size_t from, size_t to, SkScalar fontSize) = 0;
80*c8dee2aaSAndroid Build Coastguard Worker     virtual void updateForegroundPaint(size_t from, size_t to, SkPaint paint) = 0;
81*c8dee2aaSAndroid Build Coastguard Worker     virtual void updateBackgroundPaint(size_t from, size_t to, SkPaint paint) = 0;
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker     enum VisitorFlags {
84*c8dee2aaSAndroid Build Coastguard Worker         kWhiteSpace_VisitorFlag = 1 << 0,
85*c8dee2aaSAndroid Build Coastguard Worker     };
86*c8dee2aaSAndroid Build Coastguard Worker     struct VisitorInfo {
87*c8dee2aaSAndroid Build Coastguard Worker         const SkFont&   font;
88*c8dee2aaSAndroid Build Coastguard Worker         SkPoint         origin;
89*c8dee2aaSAndroid Build Coastguard Worker         SkScalar        advanceX;
90*c8dee2aaSAndroid Build Coastguard Worker         int             count;
91*c8dee2aaSAndroid Build Coastguard Worker         const uint16_t* glyphs;     // count values
92*c8dee2aaSAndroid Build Coastguard Worker         const SkPoint*  positions;  // count values
93*c8dee2aaSAndroid Build Coastguard Worker         const uint32_t* utf8Starts; // count+1 values
94*c8dee2aaSAndroid Build Coastguard Worker         unsigned        flags;
95*c8dee2aaSAndroid Build Coastguard Worker     };
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     // lineNumber begins at 0. If info is null, this signals the end of that line.
98*c8dee2aaSAndroid Build Coastguard Worker     using Visitor = std::function<void(int lineNumber, const VisitorInfo*)>;
99*c8dee2aaSAndroid Build Coastguard Worker     virtual void visit(const Visitor&) = 0;
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     struct ExtendedVisitorInfo {
102*c8dee2aaSAndroid Build Coastguard Worker         const SkFont&   font;
103*c8dee2aaSAndroid Build Coastguard Worker         SkPoint         origin;
104*c8dee2aaSAndroid Build Coastguard Worker         SkSize          advance;
105*c8dee2aaSAndroid Build Coastguard Worker         int             count;
106*c8dee2aaSAndroid Build Coastguard Worker         const uint16_t* glyphs;     // count values
107*c8dee2aaSAndroid Build Coastguard Worker         SkPoint*        positions;  // count values
108*c8dee2aaSAndroid Build Coastguard Worker         const SkRect*   bounds;     // count values
109*c8dee2aaSAndroid Build Coastguard Worker         const uint32_t* utf8Starts; // count+1 values
110*c8dee2aaSAndroid Build Coastguard Worker         unsigned        flags;
111*c8dee2aaSAndroid Build Coastguard Worker     };
112*c8dee2aaSAndroid Build Coastguard Worker     using ExtendedVisitor = std::function<void(int lineNumber, const ExtendedVisitorInfo*)>;
113*c8dee2aaSAndroid Build Coastguard Worker     virtual void extendedVisit(const ExtendedVisitor&) = 0;
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     /* Returns path for a given line
116*c8dee2aaSAndroid Build Coastguard Worker      *
117*c8dee2aaSAndroid Build Coastguard Worker      * @param lineNumber  a line number
118*c8dee2aaSAndroid Build Coastguard Worker      * @param dest        a resulting path
119*c8dee2aaSAndroid Build Coastguard Worker      * @return            a number glyphs that could not be converted to path
120*c8dee2aaSAndroid Build Coastguard Worker      */
121*c8dee2aaSAndroid Build Coastguard Worker     virtual int getPath(int lineNumber, SkPath* dest) = 0;
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     /* Returns path for a text blob
124*c8dee2aaSAndroid Build Coastguard Worker      *
125*c8dee2aaSAndroid Build Coastguard Worker      * @param textBlob    a text blob
126*c8dee2aaSAndroid Build Coastguard Worker      * @return            a path
127*c8dee2aaSAndroid Build Coastguard Worker      */
128*c8dee2aaSAndroid Build Coastguard Worker     static SkPath GetPath(SkTextBlob* textBlob);
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker     /* Checks if a given text blob contains
131*c8dee2aaSAndroid Build Coastguard Worker      * glyph with emoji
132*c8dee2aaSAndroid Build Coastguard Worker      *
133*c8dee2aaSAndroid Build Coastguard Worker      * @param textBlob    a text blob
134*c8dee2aaSAndroid Build Coastguard Worker      * @return            true if there is such a glyph
135*c8dee2aaSAndroid Build Coastguard Worker      */
136*c8dee2aaSAndroid Build Coastguard Worker     virtual bool containsEmoji(SkTextBlob* textBlob) = 0;
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker     /* Checks if a given text blob contains colored font or bitmap
139*c8dee2aaSAndroid Build Coastguard Worker      *
140*c8dee2aaSAndroid Build Coastguard Worker      * @param textBlob    a text blob
141*c8dee2aaSAndroid Build Coastguard Worker      * @return            true if there is such a glyph
142*c8dee2aaSAndroid Build Coastguard Worker      */
143*c8dee2aaSAndroid Build Coastguard Worker     virtual bool containsColorFontOrBitmap(SkTextBlob* textBlob) = 0;
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     // Editing API
146*c8dee2aaSAndroid Build Coastguard Worker 
147*c8dee2aaSAndroid Build Coastguard Worker     /* Finds the line number of the line that contains the given UTF-8 index.
148*c8dee2aaSAndroid Build Coastguard Worker     *
149*c8dee2aaSAndroid Build Coastguard Worker     * @param index         a UTF-8 TextIndex into the paragraph
150*c8dee2aaSAndroid Build Coastguard Worker     * @return              the line number the glyph that corresponds to the
151*c8dee2aaSAndroid Build Coastguard Worker     *                      given codeUnitIndex is in, or -1 if the codeUnitIndex
152*c8dee2aaSAndroid Build Coastguard Worker     *                      is out of bounds, or when the glyph is truncated or
153*c8dee2aaSAndroid Build Coastguard Worker     *                      ellipsized away.
154*c8dee2aaSAndroid Build Coastguard Worker     */
155*c8dee2aaSAndroid Build Coastguard Worker     virtual int getLineNumberAt(TextIndex codeUnitIndex) const = 0;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     /* Finds the line number of the line that contains the given UTF-16 index.
158*c8dee2aaSAndroid Build Coastguard Worker     *
159*c8dee2aaSAndroid Build Coastguard Worker     * @param index         a UTF-16 offset into the paragraph
160*c8dee2aaSAndroid Build Coastguard Worker     * @return              the line number the glyph that corresponds to the
161*c8dee2aaSAndroid Build Coastguard Worker     *                      given codeUnitIndex is in, or -1 if the codeUnitIndex
162*c8dee2aaSAndroid Build Coastguard Worker     *                      is out of bounds, or when the glyph is truncated or
163*c8dee2aaSAndroid Build Coastguard Worker     *                      ellipsized away.
164*c8dee2aaSAndroid Build Coastguard Worker     */
165*c8dee2aaSAndroid Build Coastguard Worker     virtual int getLineNumberAtUTF16Offset(size_t codeUnitIndex) = 0;
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     /* Returns line metrics info for the line
168*c8dee2aaSAndroid Build Coastguard Worker      *
169*c8dee2aaSAndroid Build Coastguard Worker      * @param lineNumber    a line number
170*c8dee2aaSAndroid Build Coastguard Worker      * @param lineMetrics   an address to return the info (in case of null just skipped)
171*c8dee2aaSAndroid Build Coastguard Worker      * @return              true if the line is found; false if not
172*c8dee2aaSAndroid Build Coastguard Worker      */
173*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getLineMetricsAt(int lineNumber, LineMetrics* lineMetrics) const = 0;
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     /* Returns the visible text on the line (excluding a possible ellipsis)
176*c8dee2aaSAndroid Build Coastguard Worker      *
177*c8dee2aaSAndroid Build Coastguard Worker      * @param lineNumber    a line number
178*c8dee2aaSAndroid Build Coastguard Worker      * @param includeSpaces indicates if the whitespaces should be included
179*c8dee2aaSAndroid Build Coastguard Worker      * @return              the range of the text that is shown in the line
180*c8dee2aaSAndroid Build Coastguard Worker      */
181*c8dee2aaSAndroid Build Coastguard Worker     virtual TextRange getActualTextRange(int lineNumber, bool includeSpaces) const = 0;
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker     struct GlyphClusterInfo {
184*c8dee2aaSAndroid Build Coastguard Worker         SkRect fBounds;
185*c8dee2aaSAndroid Build Coastguard Worker         TextRange fClusterTextRange;
186*c8dee2aaSAndroid Build Coastguard Worker         TextDirection fGlyphClusterPosition;
187*c8dee2aaSAndroid Build Coastguard Worker     };
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     /** Finds a glyph cluster for text index
190*c8dee2aaSAndroid Build Coastguard Worker      *
191*c8dee2aaSAndroid Build Coastguard Worker      * @param codeUnitIndex   a text index
192*c8dee2aaSAndroid Build Coastguard Worker      * @param glyphInfo       a glyph cluster info filled if not null
193*c8dee2aaSAndroid Build Coastguard Worker      * @return                true if glyph cluster was found; false if not
194*c8dee2aaSAndroid Build Coastguard Worker      */
195*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getGlyphClusterAt(TextIndex codeUnitIndex, GlyphClusterInfo* glyphInfo) = 0;
196*c8dee2aaSAndroid Build Coastguard Worker 
197*c8dee2aaSAndroid Build Coastguard Worker     /** Finds the closest glyph cluster for a visual text position
198*c8dee2aaSAndroid Build Coastguard Worker      *
199*c8dee2aaSAndroid Build Coastguard Worker      * @param dx              x coordinate
200*c8dee2aaSAndroid Build Coastguard Worker      * @param dy              y coordinate
201*c8dee2aaSAndroid Build Coastguard Worker      * @param glyphInfo       a glyph cluster info filled if not null
202*c8dee2aaSAndroid Build Coastguard Worker      * @return                true if glyph cluster was found; false if not
203*c8dee2aaSAndroid Build Coastguard Worker      *                        (which usually means the paragraph is empty)
204*c8dee2aaSAndroid Build Coastguard Worker      */
205*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getClosestGlyphClusterAt(SkScalar dx,
206*c8dee2aaSAndroid Build Coastguard Worker                                           SkScalar dy,
207*c8dee2aaSAndroid Build Coastguard Worker                                           GlyphClusterInfo* glyphInfo) = 0;
208*c8dee2aaSAndroid Build Coastguard Worker 
209*c8dee2aaSAndroid Build Coastguard Worker     // The glyph and grapheme cluster information assoicated with a unicode
210*c8dee2aaSAndroid Build Coastguard Worker     // codepoint in the paragraph.
211*c8dee2aaSAndroid Build Coastguard Worker     struct GlyphInfo {
212*c8dee2aaSAndroid Build Coastguard Worker         SkRect fGraphemeLayoutBounds;
213*c8dee2aaSAndroid Build Coastguard Worker         TextRange fGraphemeClusterTextRange;
214*c8dee2aaSAndroid Build Coastguard Worker         TextDirection fDirection;
215*c8dee2aaSAndroid Build Coastguard Worker         bool fIsEllipsis;
216*c8dee2aaSAndroid Build Coastguard Worker     };
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     /** Retrives the information associated with the glyph located at the given
219*c8dee2aaSAndroid Build Coastguard Worker      *  codeUnitIndex.
220*c8dee2aaSAndroid Build Coastguard Worker      *
221*c8dee2aaSAndroid Build Coastguard Worker      * @param codeUnitIndex   a UTF-16 offset into the paragraph
222*c8dee2aaSAndroid Build Coastguard Worker      * @param glyphInfo       an optional GlyphInfo struct to hold the
223*c8dee2aaSAndroid Build Coastguard Worker      *                        information associated with the glyph found at the
224*c8dee2aaSAndroid Build Coastguard Worker      *                        given index
225*c8dee2aaSAndroid Build Coastguard Worker      * @return                false only if the offset is out of bounds
226*c8dee2aaSAndroid Build Coastguard Worker      */
227*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getGlyphInfoAtUTF16Offset(size_t codeUnitIndex, GlyphInfo* glyphInfo) = 0;
228*c8dee2aaSAndroid Build Coastguard Worker 
229*c8dee2aaSAndroid Build Coastguard Worker     /** Finds the information associated with the closest glyph to the given
230*c8dee2aaSAndroid Build Coastguard Worker      *  paragraph coordinates.
231*c8dee2aaSAndroid Build Coastguard Worker      *
232*c8dee2aaSAndroid Build Coastguard Worker      * @param dx              x coordinate
233*c8dee2aaSAndroid Build Coastguard Worker      * @param dy              y coordinate
234*c8dee2aaSAndroid Build Coastguard Worker      * @param glyphInfo       an optional GlyphInfo struct to hold the
235*c8dee2aaSAndroid Build Coastguard Worker      *                        information associated with the glyph found. The
236*c8dee2aaSAndroid Build Coastguard Worker      *                        text indices and text ranges are described using
237*c8dee2aaSAndroid Build Coastguard Worker      *                        UTF-16 offsets
238*c8dee2aaSAndroid Build Coastguard Worker      * @return                true if a graphme cluster was found; false if not
239*c8dee2aaSAndroid Build Coastguard Worker      *                        (which usually means the paragraph is empty)
240*c8dee2aaSAndroid Build Coastguard Worker      */
241*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getClosestUTF16GlyphInfoAt(SkScalar dx, SkScalar dy, GlyphInfo* glyphInfo) = 0;
242*c8dee2aaSAndroid Build Coastguard Worker 
243*c8dee2aaSAndroid Build Coastguard Worker     struct FontInfo {
FontInfoFontInfo244*c8dee2aaSAndroid Build Coastguard Worker         FontInfo(const SkFont& font, const TextRange textRange)
245*c8dee2aaSAndroid Build Coastguard Worker                 : fFont(font), fTextRange(textRange) {}
246*c8dee2aaSAndroid Build Coastguard Worker         virtual ~FontInfo() = default;
247*c8dee2aaSAndroid Build Coastguard Worker         FontInfo(const FontInfo& ) = default;
248*c8dee2aaSAndroid Build Coastguard Worker         SkFont fFont;
249*c8dee2aaSAndroid Build Coastguard Worker         TextRange fTextRange;
250*c8dee2aaSAndroid Build Coastguard Worker     };
251*c8dee2aaSAndroid Build Coastguard Worker 
252*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the font that is used to shape the text at the position
253*c8dee2aaSAndroid Build Coastguard Worker      *
254*c8dee2aaSAndroid Build Coastguard Worker      * @param codeUnitIndex   text index
255*c8dee2aaSAndroid Build Coastguard Worker      * @return                font info or an empty font info if the text is not found
256*c8dee2aaSAndroid Build Coastguard Worker      */
257*c8dee2aaSAndroid Build Coastguard Worker     virtual SkFont getFontAt(TextIndex codeUnitIndex) const = 0;
258*c8dee2aaSAndroid Build Coastguard Worker 
259*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the font used to shape the text at the given UTF-16 offset.
260*c8dee2aaSAndroid Build Coastguard Worker      *
261*c8dee2aaSAndroid Build Coastguard Worker      * @param codeUnitIndex   a UTF-16 offset in the paragraph
262*c8dee2aaSAndroid Build Coastguard Worker      * @return                font info or an empty font info if the text is not found
263*c8dee2aaSAndroid Build Coastguard Worker      */
264*c8dee2aaSAndroid Build Coastguard Worker     virtual SkFont getFontAtUTF16Offset(size_t codeUnitIndex) = 0;
265*c8dee2aaSAndroid Build Coastguard Worker 
266*c8dee2aaSAndroid Build Coastguard Worker     /** Returns the information about all the fonts used to shape the paragraph text
267*c8dee2aaSAndroid Build Coastguard Worker      *
268*c8dee2aaSAndroid Build Coastguard Worker      * @return                a list of fonts and text ranges
269*c8dee2aaSAndroid Build Coastguard Worker      */
270*c8dee2aaSAndroid Build Coastguard Worker     virtual std::vector<FontInfo> getFonts() const = 0;
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker protected:
273*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<FontCollection> fFontCollection;
274*c8dee2aaSAndroid Build Coastguard Worker     ParagraphStyle fParagraphStyle;
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker     // Things for Flutter
277*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fAlphabeticBaseline;
278*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fIdeographicBaseline;
279*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fHeight;
280*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fWidth;
281*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fMaxIntrinsicWidth;
282*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fMinIntrinsicWidth;
283*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fLongestLine;
284*c8dee2aaSAndroid Build Coastguard Worker     bool fExceededMaxLines;
285*c8dee2aaSAndroid Build Coastguard Worker };
286*c8dee2aaSAndroid Build Coastguard Worker }  // namespace textlayout
287*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skia
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker #endif  // Paragraph_DEFINED
290