1fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com/* 2fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Copyright 2011 Google Inc. 3fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * 4fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Use of this source code is governed by a BSD-style license that can be 5fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * found in the LICENSE file. 6fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com */ 776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@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" 1376f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com#include "SkSurface.h" 144f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 154f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comnamespace skiagm { 1661d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 1761d46a0c50a90378f87c459102e7467ded94225fjunov@google.comstatic void create_bitmap(SkBitmap* bitmap) { 1861d46a0c50a90378f87c459102e7467ded94225fjunov@google.com const int W = 100; 1961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com const int H = 100; 20eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bitmap->allocN32Pixels(W, H); 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() {} 32ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@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 { 40f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(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 } 7561d46a0c50a90378f87c459102e7467ded94225fjunov@google.com } 76ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 7761d46a0c50a90378f87c459102e7467ded94225fjunov@google.comprivate: 784f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com typedef GM INHERITED; 7961d46a0c50a90378f87c459102e7467ded94225fjunov@google.com}; 8061d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 8161d46a0c50a90378f87c459102e7467ded94225fjunov@google.com////////////////////////////////////////////////////////////////////////////// 8261d46a0c50a90378f87c459102e7467ded94225fjunov@google.com 834f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comstatic GM* MyFactory(void*) { return new ExtractBitmapGM; } 844f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.comstatic GMRegistry reg(MyFactory); 854f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com 864f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3ascroggo@google.com} 87