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