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