15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2011 Google Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gm.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkBitmap.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkDevice.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "SkString.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkSurface.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace skiagm {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void create_bitmap(SkBitmap* bitmap) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int W = 100;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int H = 100;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bitmap->allocN32Pixels(W, H);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkCanvas canvas(*bitmap);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas.drawColor(SK_ColorRED);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPaint paint;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    paint.setColor(SK_ColorBLUE);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas.drawCircle(SkIntToScalar(W)/2, SkIntToScalar(H)/2, SkIntToScalar(W)/2, paint);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtractBitmapGM : public GM {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtractBitmapGM() {}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // overrides from SkEventSink
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkString onShortName() SK_OVERRIDE {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkString("extractbitmap");
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkISize onISize() SK_OVERRIDE {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkISize::Make(600, 600);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkBitmap bitmap;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        create_bitmap(&bitmap);
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        int x = bitmap.width() / 2;
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        int y = bitmap.height() / 2;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        canvas->drawBitmap(bitmap, 0, 0);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Do some subset drawing. This will test that an SkGPipe properly
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // handles the case where bitmaps share a pixelref
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Draw the bottom right fourth of the bitmap over the top left
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkBitmap subset;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bitmap.extractSubset(&subset, SkIRect::MakeXYWH(x, y, x, y));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            canvas->drawBitmap(subset, 0, 0);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Draw the top left corner over the bottom right
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bitmap.extractSubset(&subset, SkIRect::MakeWH(x, y));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            canvas->drawBitmap(subset, SkIntToScalar(x), SkIntToScalar(y));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // Draw a subset which has the same height and pixelref offset but a
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // different width
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bitmap.extractSubset(&subset, SkIRect::MakeWH(x, bitmap.height()));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            SkAutoCanvasRestore autoRestore(canvas, true);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            canvas->translate(0, SkIntToScalar(bitmap.height() + 20));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            canvas->drawBitmap(subset, 0, 0);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Now draw a subet which has the same width and pixelref offset but
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            // a different height
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bitmap.extractSubset(&subset, SkIRect::MakeWH(bitmap.height(), y));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            canvas->translate(0, SkIntToScalar(bitmap.height() + 20));
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            canvas->drawBitmap(subset, 0, 0);
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef GM INHERITED;
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GM* MyFactory(void*) { return new ExtractBitmapGM; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GMRegistry reg(MyFactory);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)