1 #include "SampleCode.h" 2 #include "SkView.h" 3 #include "SkCanvas.h" 4 #include "SkDevice.h" 5 #include "SkPaint.h" 6 #include "SkShader.h" 7 8 static SkBitmap createBitmap(int n) { 9 SkBitmap bitmap; 10 bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n); 11 bitmap.allocPixels(); 12 bitmap.eraseColor(0); 13 14 SkCanvas canvas(bitmap); 15 SkRect r; 16 r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n)); 17 SkPaint paint; 18 paint.setAntiAlias(true); 19 20 paint.setColor(SK_ColorRED); 21 canvas.drawOval(r, paint); 22 paint.setColor(SK_ColorBLUE); 23 paint.setStrokeWidth(SkIntToScalar(n)/15); 24 paint.setStyle(SkPaint::kStroke_Style); 25 canvas.drawLine(0, 0, r.fRight, r.fBottom, paint); 26 canvas.drawLine(0, r.fBottom, r.fRight, 0, paint); 27 28 return bitmap; 29 } 30 31 class MipMapView : public SampleView { 32 SkBitmap fBitmap; 33 enum { 34 N = 64 35 }; 36 public: 37 MipMapView() { 38 fBitmap = createBitmap(N); 39 40 fWidth = N; 41 } 42 43 protected: 44 // overrides from SkEventSink 45 virtual bool onQuery(SkEvent* evt) { 46 if (SampleCode::TitleQ(*evt)) { 47 SampleCode::TitleR(evt, "MipMaps"); 48 return true; 49 } 50 return this->INHERITED::onQuery(evt); 51 } 52 53 void drawN(SkCanvas* canvas, const SkBitmap& bitmap) { 54 SkAutoCanvasRestore acr(canvas, true); 55 for (int i = N; i > 1; i >>= 1) { 56 canvas->drawBitmap(bitmap, 0, 0, NULL); 57 canvas->translate(SkIntToScalar(N + 8), 0); 58 canvas->scale(SK_ScalarHalf, SK_ScalarHalf); 59 } 60 } 61 62 void drawN2(SkCanvas* canvas, const SkBitmap& bitmap) { 63 SkBitmap bg; 64 bg.setConfig(SkBitmap::kARGB_8888_Config, N, N); 65 bg.allocPixels(); 66 67 SkAutoCanvasRestore acr(canvas, true); 68 for (int i = 0; i < 6; i++) { 69 bg.eraseColor(0); 70 SkCanvas c(bg); 71 c.scale(SK_Scalar1 / (1 << i), SK_Scalar1 / (1 << i)); 72 c.drawBitmap(bitmap, 0, 0, NULL); 73 74 canvas->save(); 75 canvas->scale(SkIntToScalar(1 << i), SkIntToScalar(1 << i)); 76 canvas->drawBitmap(bg, 0, 0, NULL); 77 canvas->restore(); 78 canvas->translate(SkIntToScalar(N + 8), 0); 79 } 80 } 81 82 virtual void onDrawContent(SkCanvas* canvas) { 83 canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 84 85 canvas->scale(1.00000001f, 0.9999999f); 86 87 drawN2(canvas, fBitmap); 88 89 canvas->translate(0, SkIntToScalar(N + 8)); 90 SkBitmap bitmap(fBitmap); 91 bitmap.buildMipMap(); 92 drawN2(canvas, bitmap); 93 94 SkScalar time = SampleCode::GetAnimScalar(SkIntToScalar(1)/4, 95 SkIntToScalar(2)); 96 if (time >= SK_Scalar1) { 97 time = SkIntToScalar(2) - time; 98 } 99 fWidth = 8 + SkScalarRound(N * time); 100 101 SkRect dst; 102 dst.set(0, 0, SkIntToScalar(fWidth), SkIntToScalar(fWidth)); 103 104 SkPaint paint; 105 paint.setFilterBitmap(true); 106 paint.setAntiAlias(true); 107 108 canvas->translate(0, SkIntToScalar(N + 8)); 109 canvas->drawBitmapRect(fBitmap, NULL, dst, NULL); 110 canvas->translate(SkIntToScalar(N + 8), 0); 111 canvas->drawBitmapRect(fBitmap, NULL, dst, &paint); 112 canvas->translate(-SkIntToScalar(N + 8), SkIntToScalar(N + 8)); 113 canvas->drawBitmapRect(bitmap, NULL, dst, NULL); 114 canvas->translate(SkIntToScalar(N + 8), 0); 115 canvas->drawBitmapRect(bitmap, NULL, dst, &paint); 116 117 SkShader* s = SkShader::CreateBitmapShader(bitmap, 118 SkShader::kRepeat_TileMode, 119 SkShader::kRepeat_TileMode); 120 paint.setShader(s)->unref(); 121 SkMatrix m; 122 m.setScale(SkIntToScalar(fWidth) / N, 123 SkIntToScalar(fWidth) / N); 124 s->setLocalMatrix(m); 125 SkRect r; 126 r.set(0, 0, SkIntToScalar(4*N), SkIntToScalar(5*N/2)); 127 r.offset(SkIntToScalar(N + 12), -SkIntToScalar(N + 4)); 128 canvas->drawRect(r, paint); 129 130 this->inval(NULL); 131 } 132 133 private: 134 int fWidth; 135 136 typedef SampleView INHERITED; 137 }; 138 139 ////////////////////////////////////////////////////////////////////////////// 140 141 static SkView* MyFactory() { return new MipMapView; } 142 static SkViewRegister reg(MyFactory); 143 144