1 // Copyright 2019 Google LLC.
2
3 #include "include/core/SkBlurTypes.h"
4 #include "include/core/SkMaskFilter.h"
5 #include "include/effects/SkDashPathEffect.h"
6 #include "include/effects/SkDiscretePathEffect.h"
7 #include "modules/skparagraph/src/ParagraphPainterImpl.h"
8
9 #include <array>
10
11 namespace skia {
12 namespace textlayout {
13
DashPathEffect(SkScalar onLength,SkScalar offLength)14 ParagraphPainter::DashPathEffect::DashPathEffect(SkScalar onLength, SkScalar offLength)
15 : fOnLength(onLength), fOffLength(offLength) {}
16
DecorationStyle()17 ParagraphPainter::DecorationStyle::DecorationStyle()
18 : ParagraphPainter::DecorationStyle(SK_ColorTRANSPARENT, 0, std::nullopt) {}
19
DecorationStyle(SkColor color,SkScalar strokeWidth,std::optional<DashPathEffect> dashPathEffect)20 ParagraphPainter::DecorationStyle::DecorationStyle(
21 SkColor color, SkScalar strokeWidth,
22 std::optional<DashPathEffect> dashPathEffect)
23 : fColor(color), fStrokeWidth(strokeWidth), fDashPathEffect(dashPathEffect) {
24 fPaint.setStyle(SkPaint::kStroke_Style);
25 fPaint.setAntiAlias(true);
26 fPaint.setColor(fColor);
27 fPaint.setStrokeWidth(fStrokeWidth);
28
29 if (fDashPathEffect) {
30 const std::array<SkScalar, 4> intervals =
31 {fDashPathEffect->fOnLength, fDashPathEffect->fOffLength,
32 fDashPathEffect->fOnLength, fDashPathEffect->fOffLength};
33 fPaint.setPathEffect(SkPathEffect::MakeCompose(
34 SkDashPathEffect::Make(intervals.data(), intervals.size(), 0.0f),
35 SkDiscretePathEffect::Make(0, 0)));
36 }
37 }
38
CanvasParagraphPainter(SkCanvas * canvas)39 CanvasParagraphPainter::CanvasParagraphPainter(SkCanvas* canvas)
40 : fCanvas(canvas) {}
41
42
43 #ifndef ENABLE_TEXT_ENHANCE
drawTextBlob(const sk_sp<SkTextBlob> & blob,SkScalar x,SkScalar y,const SkPaintOrID & paint)44 void CanvasParagraphPainter::drawTextBlob(const sk_sp<SkTextBlob>& blob, SkScalar x, SkScalar y, const SkPaintOrID& paint) {
45 SkASSERT(std::holds_alternative<SkPaint>(paint));
46 fCanvas->drawTextBlob(blob, x, y, std::get<SkPaint>(paint));
47 }
48
drawTextShadow(const sk_sp<SkTextBlob> & blob,SkScalar x,SkScalar y,SkColor color,SkScalar blurSigma)49 void CanvasParagraphPainter::drawTextShadow(const sk_sp<SkTextBlob>& blob, SkScalar x, SkScalar y, SkColor color, SkScalar blurSigma) {
50 SkPaint paint;
51 paint.setColor(color);
52 if (blurSigma != 0.0) {
53 sk_sp<SkMaskFilter> filter = SkMaskFilter::MakeBlur(
54 kNormal_SkBlurStyle, blurSigma, false);
55 paint.setMaskFilter(filter);
56 }
57 fCanvas->drawTextBlob(blob, x, y, paint);
58 }
59 #endif
60
drawRect(const SkRect & rect,const SkPaintOrID & paint)61 void CanvasParagraphPainter::drawRect(const SkRect& rect, const SkPaintOrID& paint) {
62 SkASSERT(std::holds_alternative<SkPaint>(paint));
63 fCanvas->drawRect(rect, std::get<SkPaint>(paint));
64 }
65
66 #ifdef ENABLE_TEXT_ENHANCE
drawRRect(const SkRRect & rrect,const SkColor color)67 void CanvasParagraphPainter::drawRRect(const SkRRect& rrect, const SkColor color) {
68 SkPaint paint;
69 paint.setColor(color);
70 paint.setAntiAlias(false);
71 fCanvas->drawRRect(rrect, paint);
72 }
73 #endif
74
drawFilledRect(const SkRect & rect,const DecorationStyle & decorStyle)75 void CanvasParagraphPainter::drawFilledRect(const SkRect& rect, const DecorationStyle& decorStyle) {
76 SkPaint p(decorStyle.skPaint());
77 p.setStroke(false);
78 fCanvas->drawRect(rect, p);
79 }
80
81 #ifndef ENABLE_TEXT_ENHANCE
drawPath(const SkPath & path,const DecorationStyle & decorStyle)82 void CanvasParagraphPainter::drawPath(const SkPath& path, const DecorationStyle& decorStyle) {
83 fCanvas->drawPath(path, decorStyle.skPaint());
84 }
85 #endif
86
drawLine(SkScalar x0,SkScalar y0,SkScalar x1,SkScalar y1,const DecorationStyle & decorStyle)87 void CanvasParagraphPainter::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const DecorationStyle& decorStyle) {
88 fCanvas->drawLine(x0, y0, x1, y1, decorStyle.skPaint());
89 }
90
clipRect(const SkRect & rect)91 void CanvasParagraphPainter::clipRect(const SkRect& rect) {
92 fCanvas->clipRect(rect);
93 }
94
translate(SkScalar dx,SkScalar dy)95 void CanvasParagraphPainter::translate(SkScalar dx, SkScalar dy) {
96 fCanvas->translate(dx, dy);
97 }
98
save()99 void CanvasParagraphPainter::save() {
100 fCanvas->save();
101 }
102
restore()103 void CanvasParagraphPainter::restore() {
104 fCanvas->restore();
105 }
106
107 } // namespace textlayout
108 } // namespace skia
109