• 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 OHOS_SUPPORT
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     SkScalar calculateThickness(const TextStyle& textStyle, const TextLine::ClipContext& context);
setThickness(SkScalar thickness)22     void setThickness(SkScalar thickness)
23     {
24         fThickness = thickness;
25     }
setDecorationContext(DecorationContext context)26     void setDecorationContext(DecorationContext context)
27     {
28         fDecorationContext = context;
29         setThickness(fDecorationContext.thickness);
30     }
31 #ifdef OHOS_SUPPORT
setVerticalAlignment(TextVerticalAlign verticalAlignment)32     void setVerticalAlignment(TextVerticalAlign verticalAlignment) { fVerticalAlignment = verticalAlignment; }
getVerticalAlignment()33     TextVerticalAlign getVerticalAlignment() const { return fVerticalAlignment; }
34 #endif
35 
36     private:
37 #ifdef OHOS_SUPPORT
38     constexpr static float UNDER_LINE_THICKNESS_RATIO = (1.0f / 18.0f);
39     constexpr static float LINE_THROUGH_OFFSET = (-6.0f / 21.0f);
40     constexpr static float LINE_THROUGH_TOP = LINE_THROUGH_OFFSET - 0.5f * UNDER_LINE_THICKNESS_RATIO;
41 #endif
42 
43 #ifndef USE_SKIA_TXT
44     void calculateThickness(TextStyle textStyle, sk_sp<SkTypeface> typeface);
45 #else
46     void calculateThickness(TextStyle textStyle, std::shared_ptr<RSTypeface> typeface);
47 #endif
48 #ifdef OHOS_SUPPORT
49     void updateDecorationPosition(TextDecoration decorationMode, SkScalar baselineShift,
50         const TextLine::ClipContext& context, SkScalar& positionY);
51     void calculatePosition(TextDecoration decoration, SkScalar ascent, const TextStyle& textStyle,
52         SkScalar textBaselineShift, const Run& run);
53 #else
54     void calculatePosition(TextDecoration decoration, SkScalar ascent, const TextDecorationStyle textDecorationStyle,
55         SkScalar textBaselineShift);
56 #endif
57     void calculatePaint(const TextStyle& textStyle);
58     void calculateWaves(const TextStyle& textStyle, SkRect clip);
59     void calculateAvoidanceWaves(const TextStyle& textStyle, SkRect clip);
60     void calculateGaps(const TextLine::ClipContext& context, const SkRect& rect, SkScalar baseline,
61         SkScalar halo, const TextStyle& textStyle);
62 
63     SkScalar fThickness;
64     SkScalar fPosition;
65     DecorationContext fDecorationContext;
66 
67 #ifndef USE_SKIA_TXT
68     SkFontMetrics fFontMetrics;
69     ParagraphPainter::DecorationStyle fDecorStyle;
70     SkPath fPath;
71 #else
72     RSFontMetrics fFontMetrics;
73     ParagraphPainter::DecorationStyle fDecorStyle;
74     RSPath fPath;
75 #endif
76 #ifdef OHOS_SUPPORT
77     TextVerticalAlign fVerticalAlignment{TextVerticalAlign::BASELINE};
78 #endif
79 };
80 }  // namespace textlayout
81 }  // namespace skia
82 #endif
83