aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-09-15 14:10:42 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-09-15 14:10:42 +0000
commited881c2704bc81fe46a68c0cf9e292287313baa6 (patch)
treeb1cc4beed571a83994f7f8100c0cba76183f850c /samplecode
parentebdeeb8a018f2df01e190fd961d68a94f0e0fcb9 (diff)
add neon opts for matrix procs
git-svn-id: http://skia.googlecode.com/svn/trunk@353 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode')
-rw-r--r--samplecode/SampleStrokePath.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
new file mode 100644
index 0000000000..ec0a970e94
--- /dev/null
+++ b/samplecode/SampleStrokePath.cpp
@@ -0,0 +1,125 @@
+#include "SampleCode.h"
+#include "SkCanvas.h"
+#include "SkParsePath.h"
+#include "SkPath.h"
+#include "SkRandom.h"
+#include "SkView.h"
+
+static void scale_to_width(SkPath* path, SkScalar dstWidth) {
+ const SkRect& bounds = path->getBounds();
+ SkScalar scale = dstWidth / bounds.width();
+ SkMatrix matrix;
+
+ matrix.setScale(scale, scale);
+ path->transform(matrix);
+}
+
+static const struct {
+ SkPaint::Style fStyle;
+ SkPaint::Join fJoin;
+ int fStrokeWidth;
+} gRec[] = {
+ { SkPaint::kFill_Style, SkPaint::kMiter_Join, 0 },
+ { SkPaint::kStroke_Style, SkPaint::kMiter_Join, 0 },
+ { SkPaint::kStroke_Style, SkPaint::kMiter_Join, 10 },
+ { SkPaint::kStrokeAndFill_Style, SkPaint::kMiter_Join, 10 },
+};
+
+class StrokePathView : public SkView {
+ SkScalar fWidth;
+ SkPath fPath;
+public:
+ StrokePathView() {
+ fWidth = SkIntToScalar(120);
+
+#if 0
+ const char str[] =
+ "M 0, 3"
+ "C 10, -10, 30, -10, 0, 28"
+ "C -30, -10, -10, -10, 0, 3"
+ "Z";
+ SkParsePath::FromSVGString(str, &fPath);
+#else
+ fPath.addCircle(0, 0, SkIntToScalar(50), SkPath::kCW_Direction);
+ fPath.addCircle(0, SkIntToScalar(-50), SkIntToScalar(30), SkPath::kCW_Direction);
+#endif
+
+ scale_to_width(&fPath, fWidth);
+ const SkRect& bounds = fPath.getBounds();
+ fPath.offset(-bounds.fLeft, -bounds.fTop);
+ }
+
+protected:
+ // overrides from SkEventSink
+ virtual bool onQuery(SkEvent* evt) {
+ if (SampleCode::TitleQ(*evt)) {
+ SampleCode::TitleR(evt, "StrokePath");
+ return true;
+ }
+ return this->INHERITED::onQuery(evt);
+ }
+
+ void drawBG(SkCanvas* canvas) {
+ canvas->drawColor(0xFFDDDDDD);
+ }
+
+ SkRandom rand;
+
+ void drawSet(SkCanvas* canvas, SkPaint* paint) {
+ SkAutoCanvasRestore acr(canvas, true);
+
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) {
+ paint->setStyle(gRec[i].fStyle);
+ paint->setStrokeJoin(gRec[i].fJoin);
+ paint->setStrokeWidth(SkIntToScalar(gRec[i].fStrokeWidth));
+ canvas->drawPath(fPath, *paint);
+ canvas->translate(fWidth * 5 / 4, 0);
+ }
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ drawBG(canvas);
+ canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
+
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setColor(SK_ColorBLUE);
+
+#if 1
+ SkPath p;
+ float r = rand.nextUScalar1() + 0.5f;
+ SkScalar x = 0, y = 0;
+ p.moveTo(x, y);
+#if 0
+ p.cubicTo(x-75*r, y+75*r, x-40*r, y+125*r, x, y+85*r);
+ p.cubicTo(x+40*r, y+125*r, x+75*r, y+75*r, x, y);
+#else
+ p.cubicTo(x+75*r, y+75*r, x+40*r, y+125*r, x, y+85*r);
+ p.cubicTo(x-40*r, y+125*r, x-75*r, y+75*r, x, y);
+#endif
+ p.close();
+ fPath = p;
+ fPath.offset(100, 0);
+#endif
+
+ fPath.setFillType(SkPath::kWinding_FillType);
+ drawSet(canvas, &paint);
+
+ canvas->translate(0, fPath.getBounds().height() * 5 / 4);
+ fPath.setFillType(SkPath::kEvenOdd_FillType);
+ drawSet(canvas, &paint);
+ }
+
+ virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
+ this->inval(NULL);
+ return this->INHERITED::onFindClickHandler(x, y);
+ }
+private:
+ typedef SkView INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new StrokePathView; }
+static SkViewRegister reg(MyFactory);
+