// Copyright 2019 Google LLC. #include "include/core/SkBlurTypes.h" #include "include/core/SkMaskFilter.h" #include "include/effects/SkDashPathEffect.h" #include "include/effects/SkDiscretePathEffect.h" #include "modules/skparagraph/src/ParagraphPainterImpl.h" #include namespace skia { namespace textlayout { ParagraphPainter::DashPathEffect::DashPathEffect(SkScalar onLength, SkScalar offLength) : fOnLength(onLength), fOffLength(offLength) {} ParagraphPainter::DecorationStyle::DecorationStyle() : ParagraphPainter::DecorationStyle(SK_ColorTRANSPARENT, 0, std::nullopt) {} ParagraphPainter::DecorationStyle::DecorationStyle( SkColor color, SkScalar strokeWidth, std::optional dashPathEffect) : fColor(color), fStrokeWidth(strokeWidth), fDashPathEffect(dashPathEffect) { fPaint.setStyle(SkPaint::kStroke_Style); fPaint.setAntiAlias(true); fPaint.setColor(fColor); fPaint.setStrokeWidth(fStrokeWidth); if (fDashPathEffect) { const std::array intervals = {fDashPathEffect->fOnLength, fDashPathEffect->fOffLength, fDashPathEffect->fOnLength, fDashPathEffect->fOffLength}; fPaint.setPathEffect(SkPathEffect::MakeCompose( SkDashPathEffect::Make(intervals.data(), intervals.size(), 0.0f), SkDiscretePathEffect::Make(0, 0))); } } CanvasParagraphPainter::CanvasParagraphPainter(SkCanvas* canvas) : fCanvas(canvas) {} void CanvasParagraphPainter::drawTextBlob(const sk_sp& blob, SkScalar x, SkScalar y, const SkPaintOrID& paint) { SkASSERT(std::holds_alternative(paint)); fCanvas->drawTextBlob(blob, x, y, std::get(paint)); } void CanvasParagraphPainter::drawTextShadow(const sk_sp& blob, SkScalar x, SkScalar y, SkColor color, SkScalar blurSigma) { SkPaint paint; paint.setColor(color); if (blurSigma != 0.0) { sk_sp filter = SkMaskFilter::MakeBlur( kNormal_SkBlurStyle, blurSigma, false); paint.setMaskFilter(filter); } fCanvas->drawTextBlob(blob, x, y, paint); } void CanvasParagraphPainter::drawRect(const SkRect& rect, const SkPaintOrID& paint) { SkASSERT(std::holds_alternative(paint)); fCanvas->drawRect(rect, std::get(paint)); } void CanvasParagraphPainter::drawFilledRect(const SkRect& rect, const DecorationStyle& decorStyle) { SkPaint p(decorStyle.skPaint()); p.setStroke(false); fCanvas->drawRect(rect, p); } void CanvasParagraphPainter::drawPath(const SkPath& path, const DecorationStyle& decorStyle) { fCanvas->drawPath(path, decorStyle.skPaint()); } void CanvasParagraphPainter::drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const DecorationStyle& decorStyle) { fCanvas->drawLine(x0, y0, x1, y1, decorStyle.skPaint()); } void CanvasParagraphPainter::clipRect(const SkRect& rect) { fCanvas->clipRect(rect); } void CanvasParagraphPainter::translate(SkScalar dx, SkScalar dy) { fCanvas->translate(dx, dy); } void CanvasParagraphPainter::save() { fCanvas->save(); } void CanvasParagraphPainter::restore() { fCanvas->restore(); } } // namespace textlayout } // namespace skia