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