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