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