1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker #ifndef Metrics_DEFINED 3*c8dee2aaSAndroid Build Coastguard Worker #define Metrics_DEFINED 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Worker #include <map> 6*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/TextStyle.h" 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker namespace skia { 9*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout { 10*c8dee2aaSAndroid Build Coastguard Worker class StyleMetrics { 11*c8dee2aaSAndroid Build Coastguard Worker public: StyleMetrics(const TextStyle * style)12*c8dee2aaSAndroid Build Coastguard Worker StyleMetrics(const TextStyle* style) : text_style(style) {} 13*c8dee2aaSAndroid Build Coastguard Worker StyleMetrics(const TextStyle * style,SkFontMetrics & metrics)14*c8dee2aaSAndroid Build Coastguard Worker StyleMetrics(const TextStyle* style, SkFontMetrics& metrics) 15*c8dee2aaSAndroid Build Coastguard Worker : text_style(style), font_metrics(metrics) {} 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker const TextStyle* text_style; 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker // SkFontMetrics contains the following metrics: 20*c8dee2aaSAndroid Build Coastguard Worker // 21*c8dee2aaSAndroid Build Coastguard Worker // * Top distance to reserve above baseline 22*c8dee2aaSAndroid Build Coastguard Worker // * Ascent distance to reserve below baseline 23*c8dee2aaSAndroid Build Coastguard Worker // * Descent extent below baseline 24*c8dee2aaSAndroid Build Coastguard Worker // * Bottom extent below baseline 25*c8dee2aaSAndroid Build Coastguard Worker // * Leading distance to add between lines 26*c8dee2aaSAndroid Build Coastguard Worker // * AvgCharWidth average character width 27*c8dee2aaSAndroid Build Coastguard Worker // * MaxCharWidth maximum character width 28*c8dee2aaSAndroid Build Coastguard Worker // * XMin minimum x 29*c8dee2aaSAndroid Build Coastguard Worker // * XMax maximum x 30*c8dee2aaSAndroid Build Coastguard Worker // * XHeight height of lower-case 'x' 31*c8dee2aaSAndroid Build Coastguard Worker // * CapHeight height of an upper-case letter 32*c8dee2aaSAndroid Build Coastguard Worker // * UnderlineThickness underline thickness 33*c8dee2aaSAndroid Build Coastguard Worker // * UnderlinePosition underline position relative to baseline 34*c8dee2aaSAndroid Build Coastguard Worker // * StrikeoutThickness strikeout thickness 35*c8dee2aaSAndroid Build Coastguard Worker // * StrikeoutPosition strikeout position relative to baseline 36*c8dee2aaSAndroid Build Coastguard Worker SkFontMetrics font_metrics; 37*c8dee2aaSAndroid Build Coastguard Worker }; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker class LineMetrics { 40*c8dee2aaSAndroid Build Coastguard Worker public: LineMetrics()41*c8dee2aaSAndroid Build Coastguard Worker LineMetrics() { } 42*c8dee2aaSAndroid Build Coastguard Worker LineMetrics(size_t start,size_t end,size_t end_excluding_whitespace,size_t end_including_newline,bool hard_break)43*c8dee2aaSAndroid Build Coastguard Worker LineMetrics(size_t start, 44*c8dee2aaSAndroid Build Coastguard Worker size_t end, 45*c8dee2aaSAndroid Build Coastguard Worker size_t end_excluding_whitespace, 46*c8dee2aaSAndroid Build Coastguard Worker size_t end_including_newline, 47*c8dee2aaSAndroid Build Coastguard Worker bool hard_break) 48*c8dee2aaSAndroid Build Coastguard Worker : fStartIndex(start) 49*c8dee2aaSAndroid Build Coastguard Worker , fEndIndex(end) 50*c8dee2aaSAndroid Build Coastguard Worker , fEndExcludingWhitespaces(end_excluding_whitespace) 51*c8dee2aaSAndroid Build Coastguard Worker , fEndIncludingNewline(end_including_newline) 52*c8dee2aaSAndroid Build Coastguard Worker , fHardBreak(hard_break) {} 53*c8dee2aaSAndroid Build Coastguard Worker // The following fields are used in the layout process itself. 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker // The indexes in the text buffer the line begins and ends. 56*c8dee2aaSAndroid Build Coastguard Worker size_t fStartIndex = 0; 57*c8dee2aaSAndroid Build Coastguard Worker size_t fEndIndex = 0; 58*c8dee2aaSAndroid Build Coastguard Worker size_t fEndExcludingWhitespaces = 0; 59*c8dee2aaSAndroid Build Coastguard Worker size_t fEndIncludingNewline = 0; 60*c8dee2aaSAndroid Build Coastguard Worker bool fHardBreak = false; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker // The following fields are tracked after or during layout to provide to 63*c8dee2aaSAndroid Build Coastguard Worker // the user as well as for computing bounding boxes. 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker // The final computed ascent and descent for the line. This can be impacted by 66*c8dee2aaSAndroid Build Coastguard Worker // the strut, height, scaling, as well as outlying runs that are very tall. 67*c8dee2aaSAndroid Build Coastguard Worker // 68*c8dee2aaSAndroid Build Coastguard Worker // The top edge is `baseline - ascent` and the bottom edge is `baseline + 69*c8dee2aaSAndroid Build Coastguard Worker // descent`. Ascent and descent are provided as positive numbers. Raw numbers 70*c8dee2aaSAndroid Build Coastguard Worker // for specific runs of text can be obtained in run_metrics_map. These values 71*c8dee2aaSAndroid Build Coastguard Worker // are the cumulative metrics for the entire line. 72*c8dee2aaSAndroid Build Coastguard Worker double fAscent = SK_ScalarMax; 73*c8dee2aaSAndroid Build Coastguard Worker double fDescent = SK_ScalarMin; 74*c8dee2aaSAndroid Build Coastguard Worker double fUnscaledAscent = SK_ScalarMax; 75*c8dee2aaSAndroid Build Coastguard Worker // Total height of the paragraph including the current line. 76*c8dee2aaSAndroid Build Coastguard Worker // 77*c8dee2aaSAndroid Build Coastguard Worker // The height of the current line is `round(ascent + descent)`. 78*c8dee2aaSAndroid Build Coastguard Worker double fHeight = 0.0; 79*c8dee2aaSAndroid Build Coastguard Worker // Width of the line. 80*c8dee2aaSAndroid Build Coastguard Worker double fWidth = 0.0; 81*c8dee2aaSAndroid Build Coastguard Worker // The left edge of the line. The right edge can be obtained with `left + 82*c8dee2aaSAndroid Build Coastguard Worker // width` 83*c8dee2aaSAndroid Build Coastguard Worker double fLeft = 0.0; 84*c8dee2aaSAndroid Build Coastguard Worker // The y position of the baseline for this line from the top of the paragraph. 85*c8dee2aaSAndroid Build Coastguard Worker double fBaseline = 0.0; 86*c8dee2aaSAndroid Build Coastguard Worker // Zero indexed line number 87*c8dee2aaSAndroid Build Coastguard Worker size_t fLineNumber = 0; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker // Mapping between text index ranges and the FontMetrics associated with 90*c8dee2aaSAndroid Build Coastguard Worker // them. The first run will be keyed under start_index. The metrics here 91*c8dee2aaSAndroid Build Coastguard Worker // are before layout and are the base values we calculate from. 92*c8dee2aaSAndroid Build Coastguard Worker std::map<size_t, StyleMetrics> fLineMetrics; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker } // namespace textlayout 96*c8dee2aaSAndroid Build Coastguard Worker } // namespace skia 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker #endif // Metrics_DEFINED 99