extractbitmap.cpp revision 6ea165dd8fcd31e0fa56f43de4eadd022151c2aa
1fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com 2fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com/* 3fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Copyright 2011 Google Inc. 4fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * 5fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Use of this source code is governed by a BSD-style license that can be 6fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * found in the LICENSE file. 7fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com */ 84f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com#include "gm.h" 94f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com#include "SkBitmap.h" 1061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com#include "SkCanvas.h" 1161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com#include "SkDevice.h" 124f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com#include "SkString.h" 134f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 144f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comnamespace skiagm { 1561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 1661d46a0c50a90378f87c459102e7467ded94225fjunov@google.comstatic void create_bitmap(SkBitmap* bitmap) { 1761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com const int W = 100; 1861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com const int H = 100; 1961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com bitmap->setConfig(SkBitmap::kARGB_8888_Config, W, H); 2061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com bitmap->allocPixels(); 2161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 2261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkCanvas canvas(*bitmap); 2361d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas.drawColor(SK_ColorRED); 2461d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkPaint paint; 2561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com paint.setColor(SK_ColorBLUE); 2661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas.drawCircle(SkIntToScalar(W)/2, SkIntToScalar(H)/2, SkIntToScalar(W)/2, paint); 2761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com} 2861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 294f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comclass ExtractBitmapGM : public GM { 3061d46a0c50a90378f87c459102e7467ded94225fjunov@google.compublic: 314f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com ExtractBitmapGM() {} 3261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 3361d46a0c50a90378f87c459102e7467ded94225fjunov@google.comprotected: 3461d46a0c50a90378f87c459102e7467ded94225fjunov@google.com // overrides from SkEventSink 354f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 364f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com return SkString("extractbitmap"); 3761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com } 384f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 394f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com virtual SkISize onISize() SK_OVERRIDE { 404f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com return make_isize(600, 600); 414f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com } 424f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 434f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 4461d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkBitmap bitmap; 4561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com create_bitmap(&bitmap); 4661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com int x = bitmap.width() / 2; 4761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com int y = bitmap.height() / 2; 4861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 4961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 5061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 5161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas->drawBitmap(bitmap, 0, 0); 526ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com 536ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com { 546ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // Do some subset drawing. This will test that an SkGPipe properly 556ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // handles the case where bitmaps share a pixelref 566ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // Draw the bottom right fourth of the bitmap over the top left 576ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com SkBitmap subset; 586ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com bitmap.extractSubset(&subset, SkIRect::MakeXYWH(x, y, x, y)); 596ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->drawBitmap(subset, 0, 0); 606ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // Draw the top left corner over the bottom right 616ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com bitmap.extractSubset(&subset, SkIRect::MakeWH(x, y)); 626ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->drawBitmap(subset, SkIntToScalar(x), SkIntToScalar(y)); 636ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // Draw a subset which has the same height and pixelref offset but a 646ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // different width 656ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com bitmap.extractSubset(&subset, SkIRect::MakeWH(x, bitmap.height())); 666ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com SkAutoCanvasRestore autoRestore(canvas, true); 676ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->translate(0, SkIntToScalar(bitmap.height() + 20)); 686ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->drawBitmap(subset, 0, 0); 696ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // Now draw a subet which has the same width and pixelref offset but 706ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com // a different height 716ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com bitmap.extractSubset(&subset, SkIRect::MakeWH(bitmap.height(), y)); 726ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->translate(0, SkIntToScalar(bitmap.height() + 20)); 736ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com canvas->drawBitmap(subset, 0, 0); 746ea165dd8fcd31e0fa56f43de4eadd022151c2aascroggo@google.com } 75aae9e27fcc7d644e7bb633199509f90997ec6ecfscroggo@google.com/* 7661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com // Now do the same but with a device bitmap as source image 7761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkRefPtr<SkDevice> primaryDevice(canvas->getDevice()); 7861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice( 7961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkBitmap::kARGB_8888_Config, bitmap.width(), 8061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com bitmap.height(), true)); 8161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com secondDevice->unref(); 8261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkCanvas secondCanvas(secondDevice.get()); 8361d46a0c50a90378f87c459102e7467ded94225fjunov@google.com secondCanvas.writePixels(bitmap, 0, 0); 8461d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 8561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkBitmap deviceBitmap = secondDevice->accessBitmap(false); 8661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkBitmap deviceSubset; 8761d46a0c50a90378f87c459102e7467ded94225fjunov@google.com deviceBitmap.extractSubset(&deviceSubset, 8861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com SkIRect::MakeXYWH(x, y, x, y)); 8961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 9061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas->translate(SkIntToScalar(120), SkIntToScalar(0)); 9161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 9261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas->drawBitmap(deviceBitmap, 0, 0); 9361d46a0c50a90378f87c459102e7467ded94225fjunov@google.com canvas->drawBitmap(deviceSubset, 0, 0); 94aae9e27fcc7d644e7bb633199509f90997ec6ecfscroggo@google.com*/ 9561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com } 9661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 9761d46a0c50a90378f87c459102e7467ded94225fjunov@google.comprivate: 984f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com typedef GM INHERITED; 9961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com}; 10061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 10161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com////////////////////////////////////////////////////////////////////////////// 10261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 1034f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comstatic GM* MyFactory(void*) { return new ExtractBitmapGM; } 1044f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comstatic GMRegistry reg(MyFactory); 1054f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 1064f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com} 107