1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9
10#include "Resources.h"
11#include "SkCanvas.h"
12#include "SkData.h"
13#include "SkDecodingImageGenerator.h"
14#include "SkDiscardableMemoryPool.h"
15#include "SkDiscardablePixelRef.h"
16#include "SkImageDecoder.h"
17#include "SkImageGeneratorPriv.h"
18#include "SkOSFile.h"
19#include "SkStream.h"
20
21namespace skiagm {
22
23/**
24 *  Draw a PNG created by SkBitmapFactory.
25 */
26class FactoryGM : public GM {
27public:
28    FactoryGM() {}
29
30protected:
31    virtual void onOnceBeforeDraw() SK_OVERRIDE {
32        SkString resourcePath = GetResourcePath();
33        // Copyright-free file from http://openclipart.org/detail/29213/paper-plane-by-ddoo
34        SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), "plane.png");
35        SkAutoDataUnref data(SkData::NewFromFileName(filename.c_str()));
36        if (NULL != data.get()) {
37            // Create a cache which will boot the pixels out anytime the
38            // bitmap is unlocked.
39            SkAutoTUnref<SkDiscardableMemoryPool> pool(
40                SkDiscardableMemoryPool::Create(1));
41            SkAssertResult(SkInstallDiscardablePixelRef(
42                SkDecodingImageGenerator::Create(
43                    data, SkDecodingImageGenerator::Options()),
44                &fBitmap, pool));
45        }
46    }
47
48    virtual SkString onShortName() {
49        return SkString("factory");
50    }
51
52    virtual SkISize onISize() {
53        return SkISize::Make(640, 480);
54    }
55
56    virtual void onDraw(SkCanvas* canvas) {
57        canvas->drawBitmap(fBitmap, 0, 0);
58    }
59
60    // Skip cross process pipe due to https://code.google.com/p/skia/issues/detail?id=1520
61    virtual uint32_t onGetFlags() const {
62        return INHERITED::onGetFlags() | kSkipPipeCrossProcess_Flag;
63    }
64
65private:
66    SkBitmap fBitmap;
67
68    typedef GM INHERITED;
69};
70
71//////////////////////////////////////////////////////////////////////////////
72
73static GM* MyFactory(void*) { return new FactoryGM; }
74static GMRegistry reg(MyFactory);
75
76}  // namespace skiagm
77