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 namespace skia { 11 namespace textlayout { 12 13 class Decorations { 14 public: 15 void paint(ParagraphPainter* painter, const TextStyle& textStyle, const TextLine::ClipContext& context, SkScalar baseline); 16 SkScalar calculateThickness(const TextStyle& textStyle, const TextLine::ClipContext& context); setThickness(SkScalar thickness)17 void setThickness(SkScalar thickness) 18 { 19 fThickness = thickness; 20 } setDecorationContext(DecorationContext context)21 void setDecorationContext(DecorationContext context) 22 { 23 fDecorationContext = context; 24 setThickness(fDecorationContext.thickness); 25 } 26 27 private: 28 #ifdef OHOS_SUPPORT 29 constexpr static float UNDER_LINE_THICKNESS_RATIO = (1.0f / 18.0f); 30 constexpr static float LINE_THROUGH_OFFSET = (-6.0f / 21.0f); 31 constexpr static float LINE_THROUGH_TOP = LINE_THROUGH_OFFSET - 0.5f * UNDER_LINE_THICKNESS_RATIO; 32 #endif 33 34 #ifndef USE_SKIA_TXT 35 void calculateThickness(TextStyle textStyle, sk_sp<SkTypeface> typeface); 36 #else 37 void calculateThickness(TextStyle textStyle, std::shared_ptr<RSTypeface> typeface); 38 #endif 39 #ifdef OHOS_SUPPORT 40 void calculatePosition(TextDecoration decoration, SkScalar ascent, const TextDecorationStyle textDecorationStyle, 41 SkScalar textBaselineShift, const SkScalar& fontSize); 42 #else 43 void calculatePosition(TextDecoration decoration, SkScalar ascent, const TextDecorationStyle textDecorationStyle, 44 SkScalar textBaselineShift); 45 #endif 46 void calculatePaint(const TextStyle& textStyle); 47 void calculateWaves(const TextStyle& textStyle, SkRect clip); 48 void calculateAvoidanceWaves(const TextStyle& textStyle, SkRect clip); 49 void calculateGaps(const TextLine::ClipContext& context, const SkRect& rect, SkScalar baseline, 50 SkScalar halo, const TextStyle& textStyle); 51 52 SkScalar fThickness; 53 SkScalar fPosition; 54 DecorationContext fDecorationContext; 55 56 #ifndef USE_SKIA_TXT 57 SkFontMetrics fFontMetrics; 58 ParagraphPainter::DecorationStyle fDecorStyle; 59 SkPath fPath; 60 #else 61 RSFontMetrics fFontMetrics; 62 ParagraphPainter::DecorationStyle fDecorStyle; 63 RSPath fPath; 64 #endif 65 }; 66 } // namespace textlayout 67 } // namespace skia 68 #endif 69