/* * Copyright 2012 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 "SkBitmapFactory.h" #include "SkCanvas.h" #include "SkData.h" #include "SkImageDecoder.h" #include "SkLruImageCache.h" #include "SkStream.h" namespace skiagm { /** * Draw a PNG created by SkBitmapFactory. */ class FactoryGM : public GM { public: FactoryGM() {} protected: virtual void onOnceBeforeDraw() SK_OVERRIDE { SkString filename(INHERITED::gResourcePath); if (!filename.endsWith("/") && !filename.endsWith("\\")) { filename.append("/"); } // Copyright-free file from http://openclipart.org/detail/29213/paper-plane-by-ddoo filename.append("plane.png"); SkAutoTUnref stream(SkStream::NewFromFile(filename.c_str())); if (NULL != stream.get()) { stream->rewind(); size_t length = stream->getLength(); void* buffer = sk_malloc_throw(length); stream->read(buffer, length); SkAutoDataUnref data(SkData::NewFromMalloc(buffer, length)); SkBitmapFactory factory(&SkImageDecoder::DecodeMemoryToTarget); // Create a cache which will boot the pixels out anytime the // bitmap is unlocked. SkAutoTUnref cache(SkNEW_ARGS(SkLruImageCache, (1))); factory.setImageCache(cache); factory.installPixelRef(data, &fBitmap); } } virtual SkString onShortName() { return SkString("factory"); } virtual SkISize onISize() { return make_isize(640, 480); } virtual void onDraw(SkCanvas* canvas) { canvas->drawBitmap(fBitmap, 0, 0); } private: SkBitmap fBitmap; typedef GM INHERITED; }; ////////////////////////////////////////////////////////////////////////////// static GM* MyFactory(void*) { return new FactoryGM; } static GMRegistry reg(MyFactory); }