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