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