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