• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 Google LLC.
2 #ifndef Decorations_DEFINED
3 #define Decorations_DEFINED
4 
5 #include "include/core/SkPath.h"
6 #include "modules/skparagraph/include/ParagraphPainter.h"
7 #include "modules/skparagraph/include/TextStyle.h"
8 #include "modules/skparagraph/src/TextLine.h"
9 
10 #ifdef ENABLE_TEXT_ENHANCE
11 #include "include/ParagraphStyle.h"
12 #include "SkScalar.h"
13 #endif
14 
15 namespace skia {
16 namespace textlayout {
17 
18 class Decorations {
19     public:
20     void paint(ParagraphPainter* painter, const TextStyle& textStyle, const TextLine::ClipContext& context, SkScalar baseline);
21 #ifdef ENABLE_TEXT_ENHANCE
22     SkScalar calculateThickness(const TextStyle& textStyle, const TextLine::ClipContext& context);
setThickness(SkScalar thickness)23     void setThickness(SkScalar thickness) {
24         fThickness = thickness;
25     }
setDecorationContext(DecorationContext context)26     void setDecorationContext(DecorationContext context) {
27         fDecorationContext = context;
28         setThickness(fDecorationContext.thickness);
29     }
30 
setVerticalAlignment(TextVerticalAlign verticalAlignment)31     void setVerticalAlignment(TextVerticalAlign verticalAlignment) { fVerticalAlignment = verticalAlignment; }
getVerticalAlignment()32     TextVerticalAlign getVerticalAlignment() const { return fVerticalAlignment; }
33 #endif
34 
35     private:
36 #ifdef ENABLE_TEXT_ENHANCE
37     constexpr static float UNDER_LINE_THICKNESS_RATIO = (1.0f / 18.0f);
38     constexpr static float LINE_THROUGH_OFFSET = (-6.0f / 21.0f);
39     constexpr static float LINE_THROUGH_TOP = LINE_THROUGH_OFFSET - 0.5f * UNDER_LINE_THICKNESS_RATIO;
40 
41     void calculateThickness(TextStyle textStyle, std::shared_ptr<RSTypeface> typeface);
42     void updateDecorationPosition(TextDecoration decorationMode, SkScalar baselineShift,
43         const TextLine::ClipContext& context, SkScalar& positionY);
44     void calculatePosition(TextDecoration decoration, SkScalar ascent, const TextStyle& textStyle,
45         SkScalar textBaselineShift, const Run& run);
46     void calculateAvoidanceWaves(const TextStyle& textStyle, SkRect clip);
47     void calculateGaps(const TextLine::ClipContext& context, const SkRect& rect, SkScalar baseline,
48         SkScalar halo, const TextStyle& textStyle);
49 
50     DecorationContext fDecorationContext;
51     RSFontMetrics fFontMetrics;
52     ParagraphPainter::DecorationStyle fDecorStyle;
53     RSPath fPath;
54 #else
55     void calculateThickness(TextStyle textStyle, sk_sp<SkTypeface> typeface);
56     void calculatePosition(TextDecoration decoration, SkScalar ascent);
57     void calculateGaps(const TextLine::ClipContext& context, const SkRect& rect, SkScalar baseline, SkScalar halo);
58     SkFontMetrics fFontMetrics;
59     ParagraphPainter::DecorationStyle fDecorStyle;
60     SkPath fPath;
61 #endif
62 
63     void calculatePaint(const TextStyle& textStyle);
64     void calculateWaves(const TextStyle& textStyle, SkRect clip);
65 
66     SkScalar fThickness;
67     SkScalar fPosition;
68 #ifdef ENABLE_TEXT_ENHANCE
69     TextVerticalAlign fVerticalAlignment{TextVerticalAlign::BASELINE};
70 #endif
71 };
72 }  // namespace textlayout
73 }  // namespace skia
74 #endif
75