/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SampleCode.h" #include "SkCanvas.h" #include "SkPaint.h" #include "SkPicture.h" #include "SkStream.h" #include "SkView.h" #define DO_AA true #include "SkRectShape.h" #include "SkGroupShape.h" static SkRect make_rect(int l, int t, int r, int b) { SkRect rect; rect.set(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b)); return rect; } static SkShape* make_shape0(bool red) { SkRectShape* s = new SkRectShape; s->setRect(make_rect(10, 10, 90, 90)); if (red) { s->paint().setColor(SK_ColorRED); } s->paint().setAntiAlias(DO_AA); return s; } static SkShape* make_shape1() { SkRectShape* s = new SkRectShape; s->setOval(make_rect(10, 10, 90, 90)); s->paint().setColor(SK_ColorBLUE); s->paint().setAntiAlias(DO_AA); return s; } static SkShape* make_shape2() { SkRectShape* s = new SkRectShape; s->setRRect(make_rect(10, 10, 90, 90), SkIntToScalar(20), SkIntToScalar(20)); s->paint().setColor(SK_ColorGREEN); s->paint().setAntiAlias(DO_AA); return s; } /////////////////////////////////////////////////////////////////////////////// class ShapesView : public SampleView { SkGroupShape fGroup; SkMatrixRef* fMatrixRefs[4]; public: ShapesView() { SkMatrix m; fGroup.appendShape(make_shape0(false))->unref(); m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50)); m.postTranslate(0, SkIntToScalar(120)); fGroup.appendShape(make_shape0(true), m)->unref(); m.setTranslate(SkIntToScalar(120), 0); fGroup.appendShape(make_shape1(), m)->unref(); m.postTranslate(0, SkIntToScalar(120)); fGroup.appendShape(make_shape2(), m)->unref(); for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) { SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i)); } this->setBGColor(0xFFDDDDDD); } virtual ~ShapesView() { for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) { SkSafeUnref(fMatrixRefs[i]); } } protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { if (SampleCode::TitleQ(*evt)) { SampleCode::TitleR(evt, "Shapes"); return true; } return this->INHERITED::onQuery(evt); } void drawpicture(SkCanvas* canvas, SkPicture& pict) { #if 0 SkDynamicMemoryWStream ostream; pict.serialize(&ostream); SkMemoryStream istream(ostream.getStream(), ostream.getOffset()); SkPicture* newPict = new SkPicture(&istream); canvas->drawPicture(*newPict); newPict->unref(); #else canvas->drawPicture(pict); #endif } virtual void onDrawContent(SkCanvas* canvas) { SkScalar angle = SampleCode::GetAnimScalar(SkIntToScalar(180), SkIntToScalar(360)); SkMatrix saveM = *fMatrixRefs[3]; SkScalar c = SkIntToScalar(50); fMatrixRefs[3]->preRotate(angle, c, c); const SkScalar dx = 350; const SkScalar dy = 500; const int N = 1; for (int v = -N; v <= N; v++) { for (int h = -N; h <= N; h++) { SkAutoCanvasRestore acr(canvas, true); canvas->translate(h * dx, v * dy); SkMatrix matrix; SkGroupShape* gs = new SkGroupShape; SkAutoUnref aur(gs); gs->appendShape(&fGroup); matrix.setScale(-SK_Scalar1, SK_Scalar1); matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240)); gs->appendShape(&fGroup, matrix); matrix.setTranslate(SkIntToScalar(240), 0); matrix.preScale(SK_Scalar1*2, SK_Scalar1*2); gs->appendShape(&fGroup, matrix); #if 1 SkPicture* pict = new SkPicture; SkCanvas* cv = pict->beginRecording(1000, 1000); cv->scale(SK_ScalarHalf, SK_ScalarHalf); gs->draw(cv); cv->translate(SkIntToScalar(680), SkIntToScalar(480)); cv->scale(-SK_Scalar1, SK_Scalar1); gs->draw(cv); pict->endRecording(); drawpicture(canvas, *pict); pict->unref(); #endif }} *fMatrixRefs[3] = saveM; this->inval(NULL); } private: typedef SampleView INHERITED; }; /////////////////////////////////////////////////////////////////////////////// static SkView* MyFactory() { return new ShapesView; } static SkViewRegister reg(MyFactory);