18cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com/* 28cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com * Copyright 2014 Google Inc. 38cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com * 48cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 58cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com * found in the LICENSE file. 68cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com */ 78cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 88cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com#include "gm.h" 9bcbc1788b478b1e54079318ad073e8490aa66faetfarina 10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 118cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com#include "SkCanvas.h" 129c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski#include "SkData.h" 139c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski#include "SkDecodingImageGenerator.h" 148cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com#include "SkImageDecoder.h" 158cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com#include "SkOSFile.h" 168cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 172dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 182dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 192dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#include "etc1.h" 202dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 212dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski/** 222dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * Remove the last row and column of ETC1 blocks, effectively 232dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * making a texture that started as power of two into a texture 242dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * that is no longer power of two... 252dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski */ 262dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskibool slice_etc1_data(void *data, int* width, int* height) { 272dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 282dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski // First, parse the data and get to it... 292dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski etc1_byte *origData = reinterpret_cast<etc1_byte *>(data); 302dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski if (!etc1_pkm_is_valid(origData)) { 312dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return false; 322dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 332dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 342dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int origW = etc1_pkm_get_width(origData); 352dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int origH = etc1_pkm_get_height(origData); 362dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 372dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int blockWidth = (origW + 3) >> 2; 382dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int blockHeight = (origH + 3) >> 2; 392dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 402dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski // Make sure that we have blocks to trim off.. 412dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski if (blockWidth < 2 || blockHeight < 2) { 422dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return false; 432dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 442dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 452dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int newWidth = (blockWidth - 1) << 2; 462dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int newHeight = (blockHeight - 1) << 2; 472dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 482dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski size_t newDataSz = etc1_get_encoded_data_size(newWidth, newHeight) + ETC_PKM_HEADER_SIZE; 492dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkAutoMalloc am(newDataSz); 502dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 512dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski etc1_byte *newData = reinterpret_cast<etc1_byte *>(am.get()); 522dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 532dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski etc1_pkm_format_header(newData, newWidth, newHeight); 542dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski newData += ETC_PKM_HEADER_SIZE; 552dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski origData += ETC_PKM_HEADER_SIZE; 562dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 572dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski for (int j = 0; j < blockHeight - 1; ++j) { 582dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski memcpy(newData, origData, (blockWidth - 1)*ETC1_ENCODED_BLOCK_SIZE); 592dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski origData += blockWidth*ETC1_ENCODED_BLOCK_SIZE; 602dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski newData += (blockWidth - 1)*ETC1_ENCODED_BLOCK_SIZE; 612dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 622dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 632dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski // Stick the data back whence it came 642dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski memcpy(data, am.get(), newDataSz); 652dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski *width = newWidth; 662dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski *height = newHeight; 672dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 682dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return true; 692dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski} 702dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#endif // SK_IGNORE_ETC1_SUPPORT 712dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 728cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.comnamespace skiagm { 738cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 748cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com/** 7599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski * Test decoding an image from a PKM or KTX file and then 768cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com * from compressed ETC1 data. 778cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com */ 788cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.comclass ETC1BitmapGM : public GM { 798cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.compublic: 808cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com ETC1BitmapGM() { } 818cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com virtual ~ETC1BitmapGM() { } 828cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 838cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.comprotected: 848cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com virtual SkString onShortName() SK_OVERRIDE { 8599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkString str = SkString("etc1bitmap_"); 8699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski str.append(this->fileExtension()); 8799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski return str; 888cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com } 898cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 908cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com virtual SkISize onISize() SK_OVERRIDE { 91f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(128, 128); 928cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com } 938cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 9499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual SkString fileExtension() const = 0; 958cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 9699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 978cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com SkBitmap bm; 98bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString resourcePath = GetResourcePath(); 99bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), "mandrill_128."); 10099ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski filename.append(this->fileExtension()); 1019c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski 10204cd368cb41f0dd7bce119f61d0ff29d57e22d17mtklein SkAutoTUnref<SkData> fileData(SkData::NewFromFileName(filename.c_str())); 1039c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski if (NULL == fileData) { 1049c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski SkDebugf("Could not open the file. Did you forget to set the resourcePath?\n"); 1058cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com return; 1068cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com } 1079c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski 1089c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski if (!SkInstallDiscardablePixelRef( 1099c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski SkDecodingImageGenerator::Create( 1109c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski fileData, SkDecodingImageGenerator::Options()), &bm)) { 1119c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski SkDebugf("Could not install discardable pixel ref.\n"); 1129c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski return; 1139c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski } 1149c0e629c64c0fa93ac9bf5c2eaa1821370a6fbe5krajcevski 1158cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com canvas->drawBitmap(bm, 0, 0); 1168cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com } 1178cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 1188cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.comprivate: 1198cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com typedef GM INHERITED; 1208cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com}; 1218cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 12299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski// This class specializes ETC1BitmapGM to load the mandrill_128.pkm file. 12399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiclass ETC1Bitmap_PKM_GM : public ETC1BitmapGM { 12499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskipublic: 12599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski ETC1Bitmap_PKM_GM() : ETC1BitmapGM() { } 12699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual ~ETC1Bitmap_PKM_GM() { } 12799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 12899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiprotected: 12999ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 13099ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual SkString fileExtension() const SK_OVERRIDE { return SkString("pkm"); } 13199ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 13299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiprivate: 13399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski typedef ETC1BitmapGM INHERITED; 13499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski}; 13599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 13699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski// This class specializes ETC1BitmapGM to load the mandrill_128.ktx file. 13799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiclass ETC1Bitmap_KTX_GM : public ETC1BitmapGM { 13899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskipublic: 13999ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski ETC1Bitmap_KTX_GM() : ETC1BitmapGM() { } 14099ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual ~ETC1Bitmap_KTX_GM() { } 14199ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 14299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiprotected: 14399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 14499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski virtual SkString fileExtension() const SK_OVERRIDE { return SkString("ktx"); } 14599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 14699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiprivate: 14799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski typedef ETC1BitmapGM INHERITED; 14899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski}; 14999ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 1502dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 1512dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski/** 1522dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * Test decoding an image from a PKM file and then 1532dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * from non-power-of-two compressed ETC1 data. First slice 1542dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * off a row and column of blocks in order to make it non-power 1552dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski * of two. 1562dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski */ 1572dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskiclass ETC1Bitmap_NPOT_GM : public GM { 1582dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskipublic: 1592dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski ETC1Bitmap_NPOT_GM() { } 1602dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski virtual ~ETC1Bitmap_NPOT_GM() { } 1612dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1622dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskiprotected: 1632dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski virtual SkString onShortName() SK_OVERRIDE { 1642dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return SkString("etc1bitmap_npot"); 1652dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 1662dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1672dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski virtual SkISize onISize() SK_OVERRIDE { 168f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(124, 124); 1692dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 1702dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1712dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 1722dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkBitmap bm; 173bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString resourcePath = GetResourcePath(); 174bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), "mandrill_128.pkm"); 1752dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1762dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkAutoDataUnref fileData(SkData::NewFromFileName(filename.c_str())); 1772dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski if (NULL == fileData) { 1782dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkDebugf("Could not open the file. Did you forget to set the resourcePath?\n"); 1792dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return; 1802dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 1812dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1822dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkAutoMalloc am(fileData->size()); 1832dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski memcpy(am.get(), fileData->data(), fileData->size()); 1842dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1852dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski int width, height; 1862dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski if (!slice_etc1_data(am.get(), &width, &height)) { 1872dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkDebugf("ETC1 Data is poorly formatted.\n"); 1882dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return; 1892dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 1902dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1912dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkASSERT(124 == width); 1922dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkASSERT(124 == height); 1932dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1942dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski size_t dataSz = etc1_get_encoded_data_size(width, height) + ETC_PKM_HEADER_SIZE; 1952dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkAutoDataUnref nonPOTData(SkData::NewWithCopy(am.get(), dataSz)); 1962dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 1972dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski if (!SkInstallDiscardablePixelRef( 1982dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkDecodingImageGenerator::Create( 1992dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski nonPOTData, SkDecodingImageGenerator::Options()), &bm)) { 2002dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski SkDebugf("Could not install discardable pixel ref.\n"); 2012dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski return; 2022dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 2032dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 2042dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski canvas->drawBitmap(bm, 0, 0); 2052dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski } 2062dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 2072dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskiprivate: 2082dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski typedef GM INHERITED; 2092dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski}; 2102dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#endif // SK_IGNORE_ETC1_SUPPORT 2112dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 2128cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com} // namespace skiagm 2138cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 2148cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com////////////////////////////////////////////////////////////////////////////// 2158cf81e0f4fa2a8054ac4cea1e7490028809cb893robertphillips@google.com 21699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiDEF_GM( return SkNEW(skiagm::ETC1Bitmap_PKM_GM); ) 21799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiDEF_GM( return SkNEW(skiagm::ETC1Bitmap_KTX_GM); ) 2182dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski 2192dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 2202dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevskiDEF_GM( return SkNEW(skiagm::ETC1Bitmap_NPOT_GM); ) 2212dc337c3aeca0ba2a8dfc30cbdfd1d5e0bbef396krajcevski#endif // SK_IGNORE_ETC1_SUPPORT 222