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