SampleTextureDomain.cpp revision b7061176c7f414616fe2e79e832b3e0abe326af6
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SampleCode.h" 9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h" 11869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SkCanvas.h" 1276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com#include "SkDevice.h" 13869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 14869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comnamespace { 15869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comSkBitmap make_bitmap() { 16869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com SkBitmap bm; 1776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com bm.setConfig(SkBitmap::kARGB_8888_Config , 5, 5); 18869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com bm.allocPixels(); 19869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 20869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com for (int y = 0; y < bm.height(); y++) { 21869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com uint32_t* p = bm.getAddr32(0, y); 22869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com for (int x = 0; x < bm.width(); x++) { 23869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK; 24869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 25869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 26869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com bm.unlockPixels(); 27869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com return bm; 28869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com} 29869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com} // unnamed namespace 30869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 31869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comclass TextureDomainView : public SampleView { 32869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com SkBitmap fBM; 33869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 34869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.compublic: 35869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com TextureDomainView(){ 36869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com fBM = make_bitmap(); 37869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 38869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 39869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprotected: 40869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com // overrides from SkEventSink 41869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com virtual bool onQuery(SkEvent* evt) { 42869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com if (SampleCode::TitleQ(*evt)) { 431d32978f7e927cb39da480c3bdce18363967313ajunov@google.com SampleCode::TitleR(evt, "Texture Domain"); 44869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com return true; 45869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 46869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com return this->INHERITED::onQuery(evt); 47869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 48869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 49869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com virtual void onDrawContent(SkCanvas* canvas) { 50869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com SkIRect srcRect; 51869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com SkRect dstRect; 52869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com SkPaint paint; 53869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com paint.setFilterBitmap(true); 5476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com 5576b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // Test that bitmap draws from malloc-backed bitmaps respect 5676b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // the constrained texture domain. 5776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com srcRect.setXYWH(1, 1, 3, 3); 5876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f); 59869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint); 6076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com 6176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // Test that bitmap draws across separate devices also respect 6276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // the constrainted texture domain. 6376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // Note: GPU-backed bitmaps follow a different rendering path 6476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com // when copying from one GPU device to another. 651f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkAutoTUnref<SkBaseDevice> secondDevice(canvas->createCompatibleDevice( 66af951c9bc4cbb6e60b430194fe5127ebe99c53fbreed@google.com SkBitmap::kARGB_8888_Config, 5, 5, true)); 6776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com SkCanvas secondCanvas(secondDevice.get()); 6876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com 6976b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com srcRect.setXYWH(1, 1, 3, 3); 7076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f); 7176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint); 7276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com 7376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com SkBitmap deviceBitmap = secondDevice->accessBitmap(false); 7476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com 7576b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com srcRect.setXYWH(1, 1, 3, 3); 7676b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f); 7776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); 78d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com 79d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com // Test that bitmap blurring using a subrect 80ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com // renders correctly 81d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com srcRect.setXYWH(1, 1, 3, 3); 82d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f); 83d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create( 84d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com SkBlurMaskFilter::kNormal_BlurStyle, 85b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)), 861d32978f7e927cb39da480c3bdce18363967313ajunov@google.com SkBlurMaskFilter::kHighQuality_BlurFlag | 871d32978f7e927cb39da480c3bdce18363967313ajunov@google.com SkBlurMaskFilter::kIgnoreTransform_BlurFlag); 88d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com paint.setMaskFilter(mf)->unref(); 89d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint); 90d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com 919ef2d8382f5238cc54d211e3cc228def7a93b133epoger@google.com // Blur and a rotation + NULL src rect 92d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com // This should not trigger the texture domain code 93d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com // but it will test a code path in SkGpuDevice::drawBitmap 94d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com // that handles blurs with rects transformed to non- 95d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com // orthogonal rects. It also tests the NULL src rect handling 96ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com mf = SkBlurMaskFilter::Create( 971d32978f7e927cb39da480c3bdce18363967313ajunov@google.com SkBlurMaskFilter::kNormal_BlurStyle, 98b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)), 991d32978f7e927cb39da480c3bdce18363967313ajunov@google.com SkBlurMaskFilter::kHighQuality_BlurFlag); 1001d32978f7e927cb39da480c3bdce18363967313ajunov@google.com paint.setMaskFilter(mf)->unref(); 1011d32978f7e927cb39da480c3bdce18363967313ajunov@google.com 102d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f); 103d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com canvas->translate(550, 550); 104d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com canvas->rotate(45); 105d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com canvas->drawBitmapRect(fBM, NULL, dstRect, &paint); 106869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com } 107869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprivate: 108869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com typedef SkView INHERITED; 109869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com}; 110869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 111869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com////////////////////////////////////////////////////////////////////////////// 112869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com 113869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkView* MyFactory() { return new TextureDomainView; } 114869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkViewRegister reg(MyFactory); 115