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