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 "SkGradientShader.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "Sk1DPathEffect.h" 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h" 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPathMeasure.h" 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRandom.h" 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorPriv.h" 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColorFilter.h" 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDither.h" 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic void make_bm(SkBitmap* bm) { 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const SkColor colors[] = { 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_ColorRED, SK_ColorGREEN, 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SK_ColorBLUE, SK_ColorWHITE 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColorTable* ctable = new SkColorTable(colors, 4); 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm->setConfig(SkBitmap::kIndex8_Config, 2, 2); 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm->allocPixels(ctable); 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->unref(); 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *bm->getAddr8(0, 0) = 0; 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *bm->getAddr8(1, 0) = 1; 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *bm->getAddr8(0, 1) = 2; 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *bm->getAddr8(1, 1) = 3; 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm, 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x, SkScalar y, SkPaint* paint) { 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#if 1 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawBitmap(bm, x, y, paint); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkIntToScalar(bm.width()) * 5/4; 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#else 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoCanvasRestore acr(canvas, true); 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(x, y); 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar w = SkIntToScalar(bm.width()); 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar h = SkIntToScalar(bm.height()); 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode, 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kRepeat_TileMode); 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setShader(s)->unref(); 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawRect(SkRect::MakeWH(w, h), *paint); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint->setShader(NULL); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return w * 5/4; 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, SkPaint* p) { 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += draw_bm(c, bm, x, 0, p); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p->setFilterBitmap(true); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += draw_bm(c, bm, x, 0, p); 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p->setDither(true); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return x + draw_bm(c, bm, x, 0, p); 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic const char* gConfigNames[] = { 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "unknown config", 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "A1", 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "A8", 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "Index8", 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "565", 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "4444", 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger "8888" 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) { 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoCanvasRestore acr(canvas, true); 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = 0; 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int scale = 32; 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* name = gConfigNames[bm.config()]; 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8, 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(48), 0); 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale)); 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger x += draw_set(canvas, bm, 0, &paint); 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.reset(); 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAlpha(0x80); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger draw_set(canvas, bm, x, &paint); 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return x * scale / 3; 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass FilterView : public SampleView { 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBM8, fBM4444, fBM16, fBM32; 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger FilterView() { 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger make_bm(&fBM8); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBM8.copyTo(&fBM4444, SkBitmap::kARGB_4444_Config); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBM8.copyTo(&fBM16, SkBitmap::kRGB_565_Config); 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBM8.copyTo(&fBM32, SkBitmap::kARGB_8888_Config); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(0xFFDDDDDD); 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "Filter"); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar x = SkIntToScalar(10); 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar y = SkIntToScalar(10); 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(x, y); 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y = draw_row(canvas, fBM8); 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, y); 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y = draw_row(canvas, fBM4444); 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, y); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger y = draw_row(canvas, fBM16); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, y); 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger draw_row(canvas, fBM32); 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new FilterView; } 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 146