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