diff options
author | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-09-15 14:10:42 +0000 |
---|---|---|
committer | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-09-15 14:10:42 +0000 |
commit | ed881c2704bc81fe46a68c0cf9e292287313baa6 (patch) | |
tree | b1cc4beed571a83994f7f8100c0cba76183f850c /samplecode | |
parent | ebdeeb8a018f2df01e190fd961d68a94f0e0fcb9 (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.cpp | 125 |
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); + |