blob: 368292ca91dabd29907045ccbd15dd4f66377287 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkPathUtils.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathEffect.h"
#include "include/core/SkStrokeRec.h"
#include "src/core/SkMatrixPriv.h"
namespace skpathutils {
bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst) {
return skpathutils::FillPathWithPaint(src, paint, dst, nullptr, 1);
}
bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst,
const SkRect* cullRect, SkScalar resScale) {
return skpathutils::FillPathWithPaint(src, paint, dst, cullRect,
SkMatrix::Scale(resScale, resScale));
}
bool FillPathWithPaint(const SkPath& src, const SkPaint& paint, SkPath* dst,
const SkRect* cullRect, const SkMatrix& ctm) {
if (!src.isFinite()) {
dst->reset();
return false;
}
const SkScalar resScale = SkMatrixPriv::ComputeResScaleForStroking(ctm);
SkStrokeRec rec(paint, resScale);
#if defined(SK_BUILD_FOR_FUZZER)
// Prevent lines with small widths from timing out.
if (rec.getStyle() == SkStrokeRec::Style::kStroke_Style && rec.getWidth() < 0.001) {
return false;
}
#endif
const SkPath* srcPtr = &src;
SkPath tmpPath;
SkPathEffect* pe = paint.getPathEffect();
if (pe && pe->filterPath(&tmpPath, src, &rec, cullRect, ctm)) {
srcPtr = &tmpPath;
}
if (!rec.applyToPath(dst, *srcPtr)) {
if (srcPtr == &tmpPath) {
// If path's were copy-on-write, this trick would not be needed.
// As it is, we want to save making a deep-copy from tmpPath -> dst
// since we know we're just going to delete tmpPath when we return,
// so the swap saves that copy.
dst->swap(tmpPath);
} else {
*dst = *srcPtr;
}
}
if (!dst->isFinite()) {
dst->reset();
return false;
}
return !rec.isHairlineStyle();
}
} // namespace skpathutils
SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst,
const SkRect *cullRect, SkScalar resScale) {
return skpathutils::FillPathWithPaint(src, paint, dst, cullRect, resScale);
}
SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst,
const SkRect *cullRect, const SkMatrix &ctm) {
return skpathutils::FillPathWithPaint(src, paint, dst, cullRect, ctm);
}
SK_API bool FillPathWithPaint(const SkPath &src, const SkPaint &paint, SkPath *dst) {
return skpathutils::FillPathWithPaint(src, paint, dst);
}