195b1b3d82d227141647777d83324aa570b530096krajcevski/*
295b1b3d82d227141647777d83324aa570b530096krajcevski * Copyright 2014 Google Inc.
395b1b3d82d227141647777d83324aa570b530096krajcevski *
495b1b3d82d227141647777d83324aa570b530096krajcevski * Use of this source code is governed by a BSD-style license that can be
595b1b3d82d227141647777d83324aa570b530096krajcevski * found in the LICENSE file.
695b1b3d82d227141647777d83324aa570b530096krajcevski */
795b1b3d82d227141647777d83324aa570b530096krajcevski
895b1b3d82d227141647777d83324aa570b530096krajcevski#include "gm.h"
995b1b3d82d227141647777d83324aa570b530096krajcevski
1095b1b3d82d227141647777d83324aa570b530096krajcevski#include "Resources.h"
1195b1b3d82d227141647777d83324aa570b530096krajcevski#include "SkCanvas.h"
1295b1b3d82d227141647777d83324aa570b530096krajcevski#include "SkData.h"
135965c8ae4ee960275da4bc40189bdba85aab8b5ereed#include "SkImageGenerator.h"
1495b1b3d82d227141647777d83324aa570b530096krajcevski#include "SkImageDecoder.h"
1595b1b3d82d227141647777d83324aa570b530096krajcevski#include "SkOSFile.h"
1695b1b3d82d227141647777d83324aa570b530096krajcevski#include "SkTextureCompressor.h"
1795b1b3d82d227141647777d83324aa570b530096krajcevski
1895b1b3d82d227141647777d83324aa570b530096krajcevskistatic const char *kASTCFilenames[] = {
1995b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_128x128_4x4.astc",    // kASTC_4x4_Format
2095b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x128_5x4.astc",    // kASTC_5x4_Format
2195b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x130_5x5.astc",    // kASTC_5x5_Format
2295b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_132x130_6x5.astc",    // kASTC_6x5_Format
2395b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_132x132_6x6.astc",    // kASTC_6x6_Format
2495b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_128x130_8x5.astc",    // kASTC_8x5_Format
2595b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_128x132_8x6.astc",    // kASTC_8x6_Format
2695b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_128x128_8x8.astc",    // kASTC_8x8_Format
2795b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x130_10x5.astc",   // kASTC_10x5_Format
2895b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x132_10x6.astc",   // kASTC_10x6_Format
2995b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x128_10x8.astc",   // kASTC_10x8_Format
3095b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_130x130_10x10.astc",  // kASTC_10x10_Format
3195b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_132x130_12x10.astc",  // kASTC_12x10_Format
3295b1b3d82d227141647777d83324aa570b530096krajcevski    "mandrill_132x132_12x12.astc",  // kASTC_12x12_Format
3395b1b3d82d227141647777d83324aa570b530096krajcevski};
3495b1b3d82d227141647777d83324aa570b530096krajcevski
3595b1b3d82d227141647777d83324aa570b530096krajcevskistatic const int kNumASTCFilenames = SK_ARRAY_COUNT(kASTCFilenames);
3695b1b3d82d227141647777d83324aa570b530096krajcevski
3795b1b3d82d227141647777d83324aa570b530096krajcevskistatic inline const char *get_astc_filename(int idx) {
3895b1b3d82d227141647777d83324aa570b530096krajcevski    if (idx < 0 || kNumASTCFilenames <= idx) {
3995b1b3d82d227141647777d83324aa570b530096krajcevski        return "";
4095b1b3d82d227141647777d83324aa570b530096krajcevski    }
4195b1b3d82d227141647777d83324aa570b530096krajcevski
4295b1b3d82d227141647777d83324aa570b530096krajcevski    return kASTCFilenames[idx];
4395b1b3d82d227141647777d83324aa570b530096krajcevski}
4495b1b3d82d227141647777d83324aa570b530096krajcevski
4595b1b3d82d227141647777d83324aa570b530096krajcevskinamespace skiagm {
4695b1b3d82d227141647777d83324aa570b530096krajcevski
4795b1b3d82d227141647777d83324aa570b530096krajcevski/**
4895b1b3d82d227141647777d83324aa570b530096krajcevski *  Test decoding an image from an ASTC file and then from compressed ASTC data.
4995b1b3d82d227141647777d83324aa570b530096krajcevski */
5095b1b3d82d227141647777d83324aa570b530096krajcevskiclass ASTCBitmapGM : public GM {
5195b1b3d82d227141647777d83324aa570b530096krajcevskipublic:
5295b1b3d82d227141647777d83324aa570b530096krajcevski    ASTCBitmapGM() { }
5395b1b3d82d227141647777d83324aa570b530096krajcevski    virtual ~ASTCBitmapGM() { }
5495b1b3d82d227141647777d83324aa570b530096krajcevski
5595b1b3d82d227141647777d83324aa570b530096krajcevskiprotected:
5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
5795b1b3d82d227141647777d83324aa570b530096krajcevski        return SkString("astcbitmap");
5895b1b3d82d227141647777d83324aa570b530096krajcevski    }
5995b1b3d82d227141647777d83324aa570b530096krajcevski
6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
6195b1b3d82d227141647777d83324aa570b530096krajcevski        return SkISize::Make(kGMDimension, kGMDimension);
6295b1b3d82d227141647777d83324aa570b530096krajcevski    }
6395b1b3d82d227141647777d83324aa570b530096krajcevski
6436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
6595b1b3d82d227141647777d83324aa570b530096krajcevski        for (int j = 0; j < 4; ++j) {
6695b1b3d82d227141647777d83324aa570b530096krajcevski            for (int i = 0; i < 4; ++i) {
6795b1b3d82d227141647777d83324aa570b530096krajcevski                SkString filename = GetResourcePath(get_astc_filename(j*4+i));
6895b1b3d82d227141647777d83324aa570b530096krajcevski                if (filename == GetResourcePath("")) {
6995b1b3d82d227141647777d83324aa570b530096krajcevski                    continue;
7095b1b3d82d227141647777d83324aa570b530096krajcevski                }
7195b1b3d82d227141647777d83324aa570b530096krajcevski
7295b1b3d82d227141647777d83324aa570b530096krajcevski                SkAutoTUnref<SkData> fileData(SkData::NewFromFileName(filename.c_str()));
7395b1b3d82d227141647777d83324aa570b530096krajcevski                if (NULL == fileData) {
7495b1b3d82d227141647777d83324aa570b530096krajcevski                    SkDebugf("Could not open the file. Did you forget to set the resourcePath?\n");
7595b1b3d82d227141647777d83324aa570b530096krajcevski                    return;
7695b1b3d82d227141647777d83324aa570b530096krajcevski                }
7795b1b3d82d227141647777d83324aa570b530096krajcevski
7895b1b3d82d227141647777d83324aa570b530096krajcevski                SkBitmap bm;
795965c8ae4ee960275da4bc40189bdba85aab8b5ereed                if (!SkInstallDiscardablePixelRef(fileData, &bm)) {
8095b1b3d82d227141647777d83324aa570b530096krajcevski                    SkDebugf("Could not install discardable pixel ref.\n");
8195b1b3d82d227141647777d83324aa570b530096krajcevski                    return;
8295b1b3d82d227141647777d83324aa570b530096krajcevski                }
8395b1b3d82d227141647777d83324aa570b530096krajcevski
8495b1b3d82d227141647777d83324aa570b530096krajcevski                const SkScalar bmX = static_cast<SkScalar>(i*kBitmapDimension);
8595b1b3d82d227141647777d83324aa570b530096krajcevski                const SkScalar bmY = static_cast<SkScalar>(j*kBitmapDimension);
8695b1b3d82d227141647777d83324aa570b530096krajcevski                canvas->drawBitmap(bm, bmX, bmY);
8795b1b3d82d227141647777d83324aa570b530096krajcevski            }
8895b1b3d82d227141647777d83324aa570b530096krajcevski        }
8995b1b3d82d227141647777d83324aa570b530096krajcevski    }
9095b1b3d82d227141647777d83324aa570b530096krajcevski
9195b1b3d82d227141647777d83324aa570b530096krajcevskiprivate:
9295b1b3d82d227141647777d83324aa570b530096krajcevski    static const int kGMDimension = 600;
9395b1b3d82d227141647777d83324aa570b530096krajcevski    static const int kBitmapDimension = kGMDimension/4;
9495b1b3d82d227141647777d83324aa570b530096krajcevski
9595b1b3d82d227141647777d83324aa570b530096krajcevski    typedef GM INHERITED;
9695b1b3d82d227141647777d83324aa570b530096krajcevski};
9795b1b3d82d227141647777d83324aa570b530096krajcevski
9895b1b3d82d227141647777d83324aa570b530096krajcevski}  // namespace skiagm
9995b1b3d82d227141647777d83324aa570b530096krajcevski
10095b1b3d82d227141647777d83324aa570b530096krajcevski//////////////////////////////////////////////////////////////////////////////
10195b1b3d82d227141647777d83324aa570b530096krajcevski
10295b1b3d82d227141647777d83324aa570b530096krajcevskiDEF_GM( return SkNEW(skiagm::ASTCBitmapGM); )
103