Coverage Report

Created: 2024-05-20 07:14

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