diff options
author | 2012-07-02 13:35:09 +0000 | |
---|---|---|
committer | 2012-07-02 13:35:09 +0000 | |
commit | 4f1f6bf0505b80e14c2f3d7299d4ae565fdd1e3a (patch) | |
tree | cc68e896b04ef1cd29f4e587fe26ebd299ccfc22 /gm/extractbitmap.cpp | |
parent | 366f1c6a09f63c76e78145cb08028f66062f31fd (diff) |
Properly handle extracted bitmaps in cross process/shared addr space SkGPipe.
Use the pixel ref which we have already copied and the appropriate pixel ref
offset.
Turn SampleDrawBitmap into a GM to test this functionality.
Review URL: https://codereview.appspot.com/6348059
git-svn-id: http://skia.googlecode.com/svn/trunk@4417 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/extractbitmap.cpp')
-rw-r--r-- | gm/extractbitmap.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/gm/extractbitmap.cpp b/gm/extractbitmap.cpp new file mode 100644 index 0000000000..5002f1b22a --- /dev/null +++ b/gm/extractbitmap.cpp @@ -0,0 +1,86 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "gm.h" +#include "SkBitmap.h" +#include "SkCanvas.h" +#include "SkDevice.h" +#include "SkString.h" + +namespace skiagm { + +static void create_bitmap(SkBitmap* bitmap) { + const int W = 100; + const int H = 100; + bitmap->setConfig(SkBitmap::kARGB_8888_Config, W, H); + bitmap->allocPixels(); + + SkCanvas canvas(*bitmap); + canvas.drawColor(SK_ColorRED); + SkPaint paint; + paint.setColor(SK_ColorBLUE); + canvas.drawCircle(SkIntToScalar(W)/2, SkIntToScalar(H)/2, SkIntToScalar(W)/2, paint); +} + +class ExtractBitmapGM : public GM { +public: + ExtractBitmapGM() {} + +protected: + // overrides from SkEventSink + virtual SkString onShortName() SK_OVERRIDE { + return SkString("extractbitmap"); + } + + virtual SkISize onISize() SK_OVERRIDE { + return make_isize(600, 600); + } + + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + SkBitmap bitmap; + create_bitmap(&bitmap); + int x = bitmap.width() / 2; + int y = bitmap.height() / 2; + SkBitmap subset; + bitmap.extractSubset(&subset, SkIRect::MakeXYWH(x, y, x, y)); + + canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); + + canvas->drawBitmap(bitmap, 0, 0); + canvas->drawBitmap(subset, 0, 0); + + // Now do the same but with a device bitmap as source image + SkRefPtr<SkDevice> primaryDevice(canvas->getDevice()); + SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice( + SkBitmap::kARGB_8888_Config, bitmap.width(), + bitmap.height(), true)); + secondDevice->unref(); + SkCanvas secondCanvas(secondDevice.get()); + secondCanvas.writePixels(bitmap, 0, 0); + + SkBitmap deviceBitmap = secondDevice->accessBitmap(false); + SkBitmap deviceSubset; + deviceBitmap.extractSubset(&deviceSubset, + SkIRect::MakeXYWH(x, y, x, y)); + + canvas->translate(SkIntToScalar(120), SkIntToScalar(0)); + + canvas->drawBitmap(deviceBitmap, 0, 0); + canvas->drawBitmap(deviceSubset, 0, 0); + + } + +private: + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory(void*) { return new ExtractBitmapGM; } +static GMRegistry reg(MyFactory); + +} |