1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Copyright 2014 Google Inc.
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Use of this source code is governed by a BSD-style license that can be
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * found in the LICENSE file.
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "gm.h"
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "Resources.h"
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkCanvas.h"
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkData.h"
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkDecodingImageGenerator.h"
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkImageDecoder.h"
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkOSFile.h"
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include "SkTextureCompressor.h"
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesstatic const char *kASTCFilenames[] = {
198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    "mandrill_128x128_4x4.astc",    // kASTC_4x4_Format
208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    "mandrill_130x128_5x4.astc",    // kASTC_5x4_Format
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_130x130_5x5.astc",    // kASTC_5x5_Format
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_132x130_6x5.astc",    // kASTC_6x5_Format
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_132x132_6x6.astc",    // kASTC_6x6_Format
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_128x130_8x5.astc",    // kASTC_8x5_Format
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_128x132_8x6.astc",    // kASTC_8x6_Format
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_128x128_8x8.astc",    // kASTC_8x8_Format
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_130x130_10x5.astc",   // kASTC_10x5_Format
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_130x132_10x6.astc",   // kASTC_10x6_Format
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_130x128_10x8.astc",   // kASTC_10x8_Format
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_130x130_10x10.astc",  // kASTC_10x10_Format
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_132x130_12x10.astc",  // kASTC_12x10_Format
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    "mandrill_132x132_12x12.astc",  // kASTC_12x12_Format
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes};
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesstatic const int kNumASTCFilenames = SK_ARRAY_COUNT(kASTCFilenames);
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesstatic inline const char *get_astc_filename(int idx) {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    if (idx < 0 || kNumASTCFilenames <= idx) {
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return "";
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    return kASTCFilenames[idx];
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesnamespace skiagm {
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Test decoding an image from an ASTC file and then from compressed ASTC data.
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesclass ASTCBitmapGM : public GM {
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic:
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ASTCBitmapGM() { }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    virtual ~ASTCBitmapGM() { }
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesprotected:
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    virtual SkString onShortName() SK_OVERRIDE {
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return SkString("astcbitmap");
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    virtual SkISize onISize() SK_OVERRIDE {
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return SkISize::Make(kGMDimension, kGMDimension);
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
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