aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkArcToPathEffect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/SkArcToPathEffect.cpp')
-rw-r--r--src/effects/SkArcToPathEffect.cpp70
1 files changed, 70 insertions, 0 deletions
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);
+}