1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "SampleCode.h" 9 #include "SkCanvas.h" 10 #include "SkPaint.h" 11 #include "SkPicture.h" 12 #include "SkStream.h" 13 #include "SkView.h" 14 15 #define DO_AA true 16 17 #include "SkRectShape.h" 18 #include "SkGroupShape.h" 19 20 static SkRect make_rect(int l, int t, int r, int b) { 21 SkRect rect; 22 rect.set(SkIntToScalar(l), SkIntToScalar(t), 23 SkIntToScalar(r), SkIntToScalar(b)); 24 return rect; 25 } 26 27 static SkShape* make_shape0(bool red) { 28 SkRectShape* s = new SkRectShape; 29 s->setRect(make_rect(10, 10, 90, 90)); 30 if (red) { 31 s->paint().setColor(SK_ColorRED); 32 } 33 s->paint().setAntiAlias(DO_AA); 34 return s; 35 } 36 37 static SkShape* make_shape1() { 38 SkRectShape* s = new SkRectShape; 39 s->setOval(make_rect(10, 10, 90, 90)); 40 s->paint().setColor(SK_ColorBLUE); 41 s->paint().setAntiAlias(DO_AA); 42 return s; 43 } 44 45 static SkShape* make_shape2() { 46 SkRectShape* s = new SkRectShape; 47 s->setRRect(make_rect(10, 10, 90, 90), 48 SkIntToScalar(20), SkIntToScalar(20)); 49 s->paint().setColor(SK_ColorGREEN); 50 s->paint().setAntiAlias(DO_AA); 51 return s; 52 } 53 54 /////////////////////////////////////////////////////////////////////////////// 55 56 class ShapesView : public SampleView { 57 SkGroupShape fGroup; 58 SkMatrixRef* fMatrixRefs[4]; 59 public: 60 ShapesView() { 61 SkMatrix m; 62 fGroup.appendShape(make_shape0(false))->unref(); 63 m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50)); 64 m.postTranslate(0, SkIntToScalar(120)); 65 fGroup.appendShape(make_shape0(true), m)->unref(); 66 67 m.setTranslate(SkIntToScalar(120), 0); 68 fGroup.appendShape(make_shape1(), m)->unref(); 69 m.postTranslate(0, SkIntToScalar(120)); 70 fGroup.appendShape(make_shape2(), m)->unref(); 71 72 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) { 73 SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i)); 74 } 75 76 this->setBGColor(0xFFDDDDDD); 77 } 78 79 virtual ~ShapesView() { 80 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) { 81 SkSafeUnref(fMatrixRefs[i]); 82 } 83 } 84 85 protected: 86 // overrides from SkEventSink 87 virtual bool onQuery(SkEvent* evt) { 88 if (SampleCode::TitleQ(*evt)) { 89 SampleCode::TitleR(evt, "Shapes"); 90 return true; 91 } 92 return this->INHERITED::onQuery(evt); 93 } 94 95 void drawpicture(SkCanvas* canvas, SkPicture& pict) { 96 #if 0 97 SkDynamicMemoryWStream ostream; 98 pict.serialize(&ostream); 99 100 SkMemoryStream istream(ostream.getStream(), ostream.getOffset()); 101 SkPicture* newPict = new SkPicture(&istream); 102 canvas->drawPicture(*newPict); 103 newPict->unref(); 104 #else 105 canvas->drawPicture(pict); 106 #endif 107 } 108 109 virtual void onDrawContent(SkCanvas* canvas) { 110 SkScalar angle = SampleCode::GetAnimScalar(SkIntToScalar(180), 111 SkIntToScalar(360)); 112 113 SkMatrix saveM = *fMatrixRefs[3]; 114 SkScalar c = SkIntToScalar(50); 115 fMatrixRefs[3]->preRotate(angle, c, c); 116 117 const SkScalar dx = 350; 118 const SkScalar dy = 500; 119 const int N = 1; 120 for (int v = -N; v <= N; v++) { 121 for (int h = -N; h <= N; h++) { 122 SkAutoCanvasRestore acr(canvas, true); 123 canvas->translate(h * dx, v * dy); 124 125 SkMatrix matrix; 126 127 SkGroupShape* gs = new SkGroupShape; 128 SkAutoUnref aur(gs); 129 gs->appendShape(&fGroup); 130 matrix.setScale(-SK_Scalar1, SK_Scalar1); 131 matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240)); 132 gs->appendShape(&fGroup, matrix); 133 matrix.setTranslate(SkIntToScalar(240), 0); 134 matrix.preScale(SK_Scalar1*2, SK_Scalar1*2); 135 gs->appendShape(&fGroup, matrix); 136 137 #if 1 138 SkPicture* pict = new SkPicture; 139 SkCanvas* cv = pict->beginRecording(1000, 1000); 140 cv->scale(SK_ScalarHalf, SK_ScalarHalf); 141 gs->draw(cv); 142 cv->translate(SkIntToScalar(680), SkIntToScalar(480)); 143 cv->scale(-SK_Scalar1, SK_Scalar1); 144 gs->draw(cv); 145 pict->endRecording(); 146 147 drawpicture(canvas, *pict); 148 pict->unref(); 149 #endif 150 151 }} 152 153 *fMatrixRefs[3] = saveM; 154 this->inval(NULL); 155 } 156 157 private: 158 typedef SampleView INHERITED; 159 }; 160 161 /////////////////////////////////////////////////////////////////////////////// 162 163 static SkView* MyFactory() { return new ShapesView; } 164 static SkViewRegister reg(MyFactory); 165 166