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 "SkCanvas.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDevice.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkBlurMaskFilter.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergernamespace { 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkBitmap make_bitmap() { 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap bm; 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.setConfig(SkBitmap::kARGB_8888_Config , 5, 5); 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.allocPixels(); 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int y = 0; y < bm.height(); y++) { 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger uint32_t* p = bm.getAddr32(0, y); 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int x = 0; x < bm.width(); x++) { 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK; 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger bm.unlockPixels(); 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return bm; 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} // unnamed namespace 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass TextureDomainView : public SampleView { 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap fBM; 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger TextureDomainView(){ 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger fBM = make_bitmap(); 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleCode::TitleR(evt, "Texture Domain"); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIRect srcRect; 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect dstRect; 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setFilterBitmap(true); 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // Test that bitmap draws from malloc-backed bitmaps respect 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // the constrained texture domain. 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger srcRect.setXYWH(1, 1, 3, 3); 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f); 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint); 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // Test that bitmap draws across separate devices also respect 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // the constrainted texture domain. 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // Note: GPU-backed bitmaps follow a different rendering path 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // when copying from one GPU device to another. 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRefPtr<SkDevice> primaryDevice(canvas->getDevice()); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice( 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBitmap::kARGB_8888_Config, 5, 5, true)); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger secondDevice->unref(); 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkCanvas secondCanvas(secondDevice.get()); 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger srcRect.setXYWH(1, 1, 3, 3); 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f); 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint); 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkBitmap deviceBitmap = secondDevice->accessBitmap(false); 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger srcRect.setXYWH(1, 1, 3, 3); 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f); 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Test that bitmap blurring using a subrect 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // renders correctly 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger srcRect.setXYWH(1, 1, 3, 3); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkMaskFilter* mf = SkBlurMaskFilter::Create( 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 5, 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlurMaskFilter::kNormal_BlurStyle, 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlurMaskFilter::kHighQuality_BlurFlag | 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlurMaskFilter::kIgnoreTransform_BlurFlag); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setMaskFilter(mf)->unref(); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Blur and a rotation + NULL src rect 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // This should not trigger the texture domain code 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // but it will test a code path in SkGpuDevice::drawBitmap 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // that handles blurs with rects transformed to non- 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // orthogonal rects. It also tests the NULL src rect handling 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger mf = SkBlurMaskFilter::Create( 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 5, 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlurMaskFilter::kNormal_BlurStyle, 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBlurMaskFilter::kHighQuality_BlurFlag); 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setMaskFilter(mf)->unref(); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(550, 550); 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->rotate(45); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawBitmapRect(fBM, NULL, dstRect, &paint); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SkView INHERITED; 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new TextureDomainView; } 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 117