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 "SkColorPriv.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h" 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkBitmap make_bitmap() { 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap bm; 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const int N = 1; 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColorTable* ctable = new SkColorTable(N); 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPMColor* c = ctable->lockColors(); 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int i = 0; i < N; i++) { 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger c[i] = SkPackARGB32(0x80, 0x80, 0, 0); 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->unlockColors(true); 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.setConfig(SkBitmap::kIndex8_Config, 1, 1); 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.allocPixels(ctable); 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->unref(); 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.lockPixels(); 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int y = 0; y < bm.height(); y++) { 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint8_t* p = bm.getAddr8(0, y); 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int x = 0; x < bm.width(); x++) { 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p[x] = 0; 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.unlockPixels(); 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return bm; 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass TinyBitmapView : public SampleView { 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBM; 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger TinyBitmapView() { 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBM = make_bitmap(); 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(0xFFDDDDDD); 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "TinyBitmap"); 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) { 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkAutoLockPixels alp(*bm); // needed for ctable 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm->setIsOpaque(isOpaque); 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColorTable* ctable = bm->getColorTable(); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (ctable) { 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ctable->setIsOpaque(isOpaque); 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader* s = SkShader::CreateBitmapShader(fBM, SkShader::kRepeat_TileMode, 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkShader::kMirror_TileMode); 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setShader(s)->unref(); 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPaint(paint); 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SkView INHERITED; 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new TinyBitmapView; } 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 84