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