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