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