11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h"
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDevice.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPaint.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkBitmap createBitmap(int n) {
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap bitmap;
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bitmap.allocPixels();
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bitmap.eraseColor(0);
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas canvas(bitmap);
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRect r;
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPaint paint;
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setAntiAlias(true);
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setColor(SK_ColorRED);
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    canvas.drawOval(r, paint);
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setColor(SK_ColorBLUE);
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setStrokeWidth(SkIntToScalar(n)/15);
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setStyle(SkPaint::kStroke_Style);
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return bitmap;
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass MipMapView : public SampleView {
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap fBitmap;
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum {
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        N = 64
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    MipMapView() {
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fBitmap = createBitmap(N);
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fWidth = N;
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "MipMaps");
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawN(SkCanvas* canvas, const SkBitmap& bitmap) {
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoCanvasRestore acr(canvas, true);
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int i = N; i > 1; i >>= 1) {
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawBitmap(bitmap, 0, 0, NULL);
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->translate(SkIntToScalar(N + 8), 0);
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void drawN2(SkCanvas* canvas, const SkBitmap& bitmap) {
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkBitmap bg;
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bg.setConfig(SkBitmap::kARGB_8888_Config, N, N);
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bg.allocPixels();
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkAutoCanvasRestore acr(canvas, true);
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int i = 0; i < 6; i++) {
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            bg.eraseColor(0);
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SkCanvas c(bg);
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            c.scale(SK_Scalar1 / (1 << i), SK_Scalar1 / (1 << i));
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            c.drawBitmap(bitmap, 0, 0, NULL);
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->save();
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->scale(SkIntToScalar(1 << i), SkIntToScalar(1 << i));
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->drawBitmap(bg, 0, 0, NULL);
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->restore();
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->translate(SkIntToScalar(N + 8), 0);
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->scale(1.00000001f, 0.9999999f);
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        drawN2(canvas, fBitmap);
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(0, SkIntToScalar(N + 8));
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkBitmap bitmap(fBitmap);
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        bitmap.buildMipMap();
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        drawN2(canvas, bitmap);
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkScalar time = SampleCode::GetAnimScalar(SkIntToScalar(1)/4,
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                  SkIntToScalar(2));
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (time >= SK_Scalar1) {
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            time = SkIntToScalar(2) - time;
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fWidth = 8 + SkScalarRound(N * time);
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRect dst;
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dst.set(0, 0, SkIntToScalar(fWidth), SkIntToScalar(fWidth));
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setFilterBitmap(true);
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(true);
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(0, SkIntToScalar(N + 8));
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(fBitmap, NULL, dst, NULL);
1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(N + 8), 0);
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(fBitmap, NULL, dst, &paint);
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(-SkIntToScalar(N + 8), SkIntToScalar(N + 8));
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(bitmap, NULL, dst, NULL);
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(N + 8), 0);
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(bitmap, NULL, dst, &paint);
1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkShader* s = SkShader::CreateBitmapShader(bitmap,
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   SkShader::kRepeat_TileMode,
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                                                   SkShader::kRepeat_TileMode);
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setShader(s)->unref();
1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkMatrix m;
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        m.setScale(SkIntToScalar(fWidth) / N,
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                   SkIntToScalar(fWidth) / N);
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        s->setLocalMatrix(m);
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRect r;
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        r.set(0, 0, SkIntToScalar(4*N), SkIntToScalar(5*N/2));
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        r.offset(SkIntToScalar(N + 12), -SkIntToScalar(N + 4));
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawRect(r, paint);
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->inval(NULL);
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int fWidth;
1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SampleView INHERITED;
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new MipMapView; }
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
151