From 8b5752443f34680d26a73bb6e1e72a8d7cf0f320 Mon Sep 17 00:00:00 2001 From: reed Date: Wed, 17 Dec 2014 01:47:32 -0800 Subject: add arcto patheffect BUG=skia: TBR= Review URL: https://codereview.chromium.org/813513003 --- src/effects/SkArcToPathEffect.cpp | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/effects/SkArcToPathEffect.cpp (limited to 'src/effects/SkArcToPathEffect.cpp') diff --git a/src/effects/SkArcToPathEffect.cpp b/src/effects/SkArcToPathEffect.cpp new file mode 100644 index 0000000000..79398b3b82 --- /dev/null +++ b/src/effects/SkArcToPathEffect.cpp @@ -0,0 +1,70 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkArcToPathEffect.h" +#include "SkPath.h" +#include "SkPoint.h" +#include "SkReadBuffer.h" +#include "SkWriteBuffer.h" + +SkArcToPathEffect::SkArcToPathEffect(SkScalar radius) : fRadius(radius) {} + +bool SkArcToPathEffect::filterPath(SkPath* dst, const SkPath& src, + SkStrokeRec*, const SkRect*) const { + SkPath::Iter iter(src, false); + SkPath::Verb verb; + SkPoint pts[4]; + + SkPoint lastCorner = { 0, 0 }; // avoid warning + SkPath::Verb prevVerb = SkPath::kMove_Verb; + + for (;;) { + switch (verb = iter.next(pts, false)) { + case SkPath::kMove_Verb: + if (SkPath::kLine_Verb == prevVerb) { + dst->lineTo(lastCorner); + } + dst->moveTo(pts[0]); + break; + case SkPath::kLine_Verb: + if (prevVerb == SkPath::kLine_Verb) { + dst->arcTo(pts[0], pts[1], fRadius); + } + lastCorner = pts[1]; + break; + case SkPath::kQuad_Verb: + dst->quadTo(pts[1], pts[2]); + lastCorner = pts[2]; + break; + case SkPath::kConic_Verb: + dst->conicTo(pts[1], pts[2], iter.conicWeight()); + lastCorner = pts[2]; + break; + case SkPath::kCubic_Verb: + dst->cubicTo(pts[1], pts[2], pts[3]); + lastCorner = pts[3]; + break; + case SkPath::kClose_Verb: + dst->lineTo(lastCorner); + break; + case SkPath::kDone_Verb: + dst->lineTo(lastCorner); + goto DONE; + } + prevVerb = verb; + } +DONE: + return true; +} + +SkFlattenable* SkArcToPathEffect::CreateProc(SkReadBuffer& buffer) { + return SkArcToPathEffect::Create(buffer.readScalar()); +} + +void SkArcToPathEffect::flatten(SkWriteBuffer& buffer) const { + buffer.writeScalar(fRadius); +} -- cgit v1.2.3