1/*
2 * Copyright 2014 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 "SkImageDecoder.h"
15#include "SkOSFile.h"
16#include "SkTextureCompressor.h"
17
18static const char *kASTCFilenames[] = {
19    "mandrill_128x128_4x4.astc",    // kASTC_4x4_Format
20    "mandrill_130x128_5x4.astc",    // kASTC_5x4_Format
21    "mandrill_130x130_5x5.astc",    // kASTC_5x5_Format
22    "mandrill_132x130_6x5.astc",    // kASTC_6x5_Format
23    "mandrill_132x132_6x6.astc",    // kASTC_6x6_Format
24    "mandrill_128x130_8x5.astc",    // kASTC_8x5_Format
25    "mandrill_128x132_8x6.astc",    // kASTC_8x6_Format
26    "mandrill_128x128_8x8.astc",    // kASTC_8x8_Format
27    "mandrill_130x130_10x5.astc",   // kASTC_10x5_Format
28    "mandrill_130x132_10x6.astc",   // kASTC_10x6_Format
29    "mandrill_130x128_10x8.astc",   // kASTC_10x8_Format
30    "mandrill_130x130_10x10.astc",  // kASTC_10x10_Format
31    "mandrill_132x130_12x10.astc",  // kASTC_12x10_Format
32    "mandrill_132x132_12x12.astc",  // kASTC_12x12_Format
33};
34
35static const int kNumASTCFilenames = SK_ARRAY_COUNT(kASTCFilenames);
36
37static inline const char *get_astc_filename(int idx) {
38    if (idx < 0 || kNumASTCFilenames <= idx) {
39        return "";
40    }
41
42    return kASTCFilenames[idx];
43}
44
45namespace skiagm {
46
47/**
48 *  Test decoding an image from an ASTC file and then from compressed ASTC data.
49 */
50class ASTCBitmapGM : public GM {
51public:
52    ASTCBitmapGM() { }
53    virtual ~ASTCBitmapGM() { }
54
55protected:
56    virtual SkString onShortName() SK_OVERRIDE {
57        return SkString("astcbitmap");
58    }
59
60    virtual SkISize onISize() SK_OVERRIDE {
61        return SkISize::Make(kGMDimension, kGMDimension);
62    }
63
64    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
65        for (int j = 0; j < 4; ++j) {
66            for (int i = 0; i < 4; ++i) {
67                SkString filename = GetResourcePath(get_astc_filename(j*4+i));
68                if (filename == GetResourcePath("")) {
69                    continue;
70                }
71
72                SkAutoTUnref<SkData> fileData(SkData::NewFromFileName(filename.c_str()));
73                if (NULL == fileData) {
74                    SkDebugf("Could not open the file. Did you forget to set the resourcePath?\n");
75                    return;
76                }
77
78                SkBitmap bm;
79                if (!SkInstallDiscardablePixelRef(
80                        SkDecodingImageGenerator::Create(
81                            fileData, SkDecodingImageGenerator::Options()), &bm)) {
82                    SkDebugf("Could not install discardable pixel ref.\n");
83                    return;
84                }
85
86                const SkScalar bmX = static_cast<SkScalar>(i*kBitmapDimension);
87                const SkScalar bmY = static_cast<SkScalar>(j*kBitmapDimension);
88                canvas->drawBitmap(bm, bmX, bmY);
89            }
90        }
91    }
92
93private:
94    static const int kGMDimension = 600;
95    static const int kBitmapDimension = kGMDimension/4;
96
97    typedef GM INHERITED;
98};
99
100}  // namespace skiagm
101
102//////////////////////////////////////////////////////////////////////////////
103
104DEF_GM( return SkNEW(skiagm::ASTCBitmapGM); )
105