• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
createBitmap(int n)15 static 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 
38 class MipMapView : public SampleView {
39     SkBitmap fBitmap;
40     enum {
41         N = 64
42     };
43 public:
MipMapView()44     MipMapView() {
45         fBitmap = createBitmap(N);
46 
47         fWidth = N;
48     }
49 
50 protected:
51     // overrides from SkEventSink
onQuery(SkEvent * evt)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 
drawN(SkCanvas * canvas,const SkBitmap & bitmap)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 
drawN2(SkCanvas * canvas,const SkBitmap & bitmap)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 
onDrawContent(SkCanvas * canvas)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 
140 private:
141     int fWidth;
142 
143     typedef SampleView INHERITED;
144 };
145 
146 //////////////////////////////////////////////////////////////////////////////
147 
MyFactory()148 static SkView* MyFactory() { return new MipMapView; }
149 static SkViewRegister reg(MyFactory);
150 
151