xref: /aosp_15_r20/external/skia/modules/skparagraph/include/Metrics.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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