blob: 863bfd7052f7ce6629d8715c7a9f8dddd05ec743 [file] [log] [blame]
// 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 <array>
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> 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<SkScalar, 4> 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<SkTextBlob>& blob, SkScalar x, SkScalar y, const SkPaintOrID& paint) {
SkASSERT(std::holds_alternative<SkPaint>(paint));
fCanvas->drawTextBlob(blob, x, y, std::get<SkPaint>(paint));
}
void CanvasParagraphPainter::drawTextShadow(const sk_sp<SkTextBlob>& blob, SkScalar x, SkScalar y, SkColor color, SkScalar blurSigma) {
SkPaint paint;
paint.setColor(color);
if (blurSigma != 0.0) {
sk_sp<SkMaskFilter> 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<SkPaint>(paint));
fCanvas->drawRect(rect, std::get<SkPaint>(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