1ae614409e4cff083c070face78cc349153d0b932krajcevski/* 2ae614409e4cff083c070face78cc349153d0b932krajcevski * Copyright 2014 Google Inc. 3ae614409e4cff083c070face78cc349153d0b932krajcevski * 4ae614409e4cff083c070face78cc349153d0b932krajcevski * Use of this source code is governed by a BSD-style license that can be 5ae614409e4cff083c070face78cc349153d0b932krajcevski * found in the LICENSE file. 6ae614409e4cff083c070face78cc349153d0b932krajcevski */ 7ae614409e4cff083c070face78cc349153d0b932krajcevski 8ae614409e4cff083c070face78cc349153d0b932krajcevski#include "SkTextureCompressor.h" 9b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski#include "SkTextureCompressor_ASTC.h" 106c354881b63935626a0700366937530d38b8b1e8krajcevski#include "SkTextureCompressor_LATC.h" 11b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski#include "SkTextureCompressor_R11EAC.h" 12ae614409e4cff083c070face78cc349153d0b932krajcevski 13ae614409e4cff083c070face78cc349153d0b932krajcevski#include "SkBitmap.h" 14b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevski#include "SkBitmapProcShader.h" 15ae614409e4cff083c070face78cc349153d0b932krajcevski#include "SkData.h" 16ae614409e4cff083c070face78cc349153d0b932krajcevski#include "SkEndian.h" 17ae614409e4cff083c070face78cc349153d0b932krajcevski 18630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski#include "SkTextureCompression_opts.h" 19630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski 20e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 21e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski# include "etc1.h" 22e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#endif 23e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski 24e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski// Convert ETC1 functions to our function signatures 25e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevskistatic bool compress_etc1_565(uint8_t* dst, const uint8_t* src, 26e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski int width, int height, int rowBytes) { 27e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 28e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski return 0 == etc1_encode_image(src, width, height, 2, rowBytes, dst); 29e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#else 30e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski return false; 31e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#endif 32e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski} 33e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski 34ae614409e4cff083c070face78cc349153d0b932krajcevski//////////////////////////////////////////////////////////////////////////////// 35ae614409e4cff083c070face78cc349153d0b932krajcevski 36ae614409e4cff083c070face78cc349153d0b932krajcevskinamespace SkTextureCompressor { 37ae614409e4cff083c070face78cc349153d0b932krajcevski 384ad76e35111585f4da662d54943f23792dd1e0aekrajcevskivoid GetBlockDimensions(Format format, int* dimX, int* dimY, bool matchSpec) { 3925a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski if (NULL == dimX || NULL == dimY) { 4025a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski return; 4125a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski } 4225a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski 434ad76e35111585f4da662d54943f23792dd1e0aekrajcevski if (!matchSpec && SkTextureCompressorGetPlatformDims(format, dimX, dimY)) { 4425a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski return; 4525a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski } 4625a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski 474ad76e35111585f4da662d54943f23792dd1e0aekrajcevski // No specialized arguments, return the dimensions as they are in the spec. 4895b1b3d82d227141647777d83324aa570b530096krajcevski static const struct FormatDimensions { 4995b1b3d82d227141647777d83324aa570b530096krajcevski const int fBlockSizeX; 5095b1b3d82d227141647777d83324aa570b530096krajcevski const int fBlockSizeY; 5195b1b3d82d227141647777d83324aa570b530096krajcevski } kFormatDimensions[kFormatCnt] = { 5295b1b3d82d227141647777d83324aa570b530096krajcevski { 4, 4 }, // kLATC_Format 5395b1b3d82d227141647777d83324aa570b530096krajcevski { 4, 4 }, // kR11_EAC_Format 5495b1b3d82d227141647777d83324aa570b530096krajcevski { 4, 4 }, // kETC1_Format 5595b1b3d82d227141647777d83324aa570b530096krajcevski { 4, 4 }, // kASTC_4x4_Format 5695b1b3d82d227141647777d83324aa570b530096krajcevski { 5, 4 }, // kASTC_5x4_Format 5795b1b3d82d227141647777d83324aa570b530096krajcevski { 5, 5 }, // kASTC_5x5_Format 5895b1b3d82d227141647777d83324aa570b530096krajcevski { 6, 5 }, // kASTC_6x5_Format 5995b1b3d82d227141647777d83324aa570b530096krajcevski { 6, 6 }, // kASTC_6x6_Format 6095b1b3d82d227141647777d83324aa570b530096krajcevski { 8, 5 }, // kASTC_8x5_Format 6195b1b3d82d227141647777d83324aa570b530096krajcevski { 8, 6 }, // kASTC_8x6_Format 6295b1b3d82d227141647777d83324aa570b530096krajcevski { 8, 8 }, // kASTC_8x8_Format 6395b1b3d82d227141647777d83324aa570b530096krajcevski { 10, 5 }, // kASTC_10x5_Format 6495b1b3d82d227141647777d83324aa570b530096krajcevski { 10, 6 }, // kASTC_10x6_Format 6595b1b3d82d227141647777d83324aa570b530096krajcevski { 10, 8 }, // kASTC_10x8_Format 6695b1b3d82d227141647777d83324aa570b530096krajcevski { 10, 10 }, // kASTC_10x10_Format 6795b1b3d82d227141647777d83324aa570b530096krajcevski { 12, 10 }, // kASTC_12x10_Format 6895b1b3d82d227141647777d83324aa570b530096krajcevski { 12, 12 }, // kASTC_12x12_Format 6995b1b3d82d227141647777d83324aa570b530096krajcevski }; 7095b1b3d82d227141647777d83324aa570b530096krajcevski 7195b1b3d82d227141647777d83324aa570b530096krajcevski *dimX = kFormatDimensions[format].fBlockSizeX; 7295b1b3d82d227141647777d83324aa570b530096krajcevski *dimY = kFormatDimensions[format].fBlockSizeY; 7325a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski} 7425a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski 756c354881b63935626a0700366937530d38b8b1e8krajcevskiint GetCompressedDataSize(Format fmt, int width, int height) { 7625a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski int dimX, dimY; 774ad76e35111585f4da662d54943f23792dd1e0aekrajcevski GetBlockDimensions(fmt, &dimX, &dimY, true); 784ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 79b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski int encodedBlockSize = 0; 80b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski 81eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski switch (fmt) { 821459be5ae3b1c959451427ab7d148322662ae6f7krajcevski // These formats are 64 bits per 4x4 block. 8350495571df39ac3300c113ae5b0f607a8d7e59dakrajcevski case kLATC_Format: 84e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski case kR11_EAC_Format: 85e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski case kETC1_Format: 86b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski encodedBlockSize = 8; 87b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski break; 886c354881b63935626a0700366937530d38b8b1e8krajcevski 8995b1b3d82d227141647777d83324aa570b530096krajcevski // This format is 128 bits. 9095b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_4x4_Format: 9195b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_5x4_Format: 9295b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_5x5_Format: 9395b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_6x5_Format: 9495b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_6x6_Format: 9595b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x5_Format: 9695b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x6_Format: 9795b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x8_Format: 9895b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x5_Format: 9995b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x6_Format: 10095b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x8_Format: 10195b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x10_Format: 10295b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_12x10_Format: 103b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski case kASTC_12x12_Format: 104b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski encodedBlockSize = 16; 105b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski break; 106eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski 107eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski default: 108eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski SkFAIL("Unknown compressed format!"); 1096c354881b63935626a0700366937530d38b8b1e8krajcevski return -1; 110eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski } 111b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski 11225a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski if(((width % dimX) == 0) && ((height % dimY) == 0)) { 11325a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski const int blocksX = width / dimX; 11425a67bcb7ac70d3077e91126c4b8924a53557a38krajcevski const int blocksY = height / dimY; 115b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski 116b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski return blocksX * blocksY * encodedBlockSize; 117b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski } 118b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski 119b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski return -1; 120eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski} 121ae614409e4cff083c070face78cc349153d0b932krajcevski 122eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevskibool CompressBufferToFormat(uint8_t* dst, const uint8_t* src, SkColorType srcColorType, 123630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski int width, int height, int rowBytes, Format format, bool opt) { 124630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski CompressionProc proc = NULL; 125630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski if (opt) { 126630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski proc = SkTextureCompressorGetPlatformProc(srcColorType, format); 127630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski } 128eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski 129630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski if (NULL == proc) { 130630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski switch (srcColorType) { 131630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski case kAlpha_8_SkColorType: 132630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski { 133630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski switch (format) { 134630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski case kLATC_Format: 1356c354881b63935626a0700366937530d38b8b1e8krajcevski proc = CompressA8ToLATC; 136630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski break; 137630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski case kR11_EAC_Format: 1386c354881b63935626a0700366937530d38b8b1e8krajcevski proc = CompressA8ToR11EAC; 139630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski break; 140b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski case kASTC_12x12_Format: 141b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski proc = CompressA8To12x12ASTC; 142b2ef181ed614d1a5772367a8cd7ab77aa015ae29krajcevski break; 143630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski default: 144630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski // Do nothing... 145630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski break; 146630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski } 147630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski } 148630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski break; 149ae614409e4cff083c070face78cc349153d0b932krajcevski 150e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski case kRGB_565_SkColorType: 151e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski { 152e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski switch (format) { 153e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski case kETC1_Format: 154e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski proc = compress_etc1_565; 155e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski break; 156e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski default: 157e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski // Do nothing... 158e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski break; 159e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski } 160e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski } 161e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski break; 162e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski 163630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski default: 164630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski // Do nothing... 165630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski break; 166630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski } 167630598cbb87edda47aa26bc7b7f93865b34cd8dekrajcevski } 1681459be5ae3b1c959451427ab7d148322662ae6f7krajcevski 16949f085dddff10473b6ebf832a974288300224e60bsalomon if (proc) { 170eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski return proc(dst, src, width, height, rowBytes); 171eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski } 172eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski 173eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski return false; 174eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski} 175eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski 17633a30503d76fdd989358cedd78445ba96bb809ddreedSkData* CompressBitmapToFormat(const SkBitmap &bitmap, Format format) { 177eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski SkAutoLockPixels alp(bitmap); 178eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski 1796c354881b63935626a0700366937530d38b8b1e8krajcevski int compressedDataSize = GetCompressedDataSize(format, bitmap.width(), bitmap.height()); 1806c354881b63935626a0700366937530d38b8b1e8krajcevski if (compressedDataSize < 0) { 1816c354881b63935626a0700366937530d38b8b1e8krajcevski return NULL; 1826c354881b63935626a0700366937530d38b8b1e8krajcevski } 1836c354881b63935626a0700366937530d38b8b1e8krajcevski 184eecc35f988662f4fa82693ad36e908d637a7d3c1krajcevski const uint8_t* src = reinterpret_cast<const uint8_t*>(bitmap.getPixels()); 18533a30503d76fdd989358cedd78445ba96bb809ddreed SkData* dst = SkData::NewUninitialized(compressedDataSize); 1866c354881b63935626a0700366937530d38b8b1e8krajcevski 18733a30503d76fdd989358cedd78445ba96bb809ddreed if (!CompressBufferToFormat((uint8_t*)dst->writable_data(), src, bitmap.colorType(), 18833a30503d76fdd989358cedd78445ba96bb809ddreed bitmap.width(), bitmap.height(), bitmap.rowBytes(), format)) { 18933a30503d76fdd989358cedd78445ba96bb809ddreed dst->unref(); 19033a30503d76fdd989358cedd78445ba96bb809ddreed dst = NULL; 191ae614409e4cff083c070face78cc349153d0b932krajcevski } 19233a30503d76fdd989358cedd78445ba96bb809ddreed return dst; 193ae614409e4cff083c070face78cc349153d0b932krajcevski} 194ae614409e4cff083c070face78cc349153d0b932krajcevski 195b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevskiSkBlitter* CreateBlitterForFormat(int width, int height, void* compressedBuffer, 196b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevski SkTBlitterAllocator *allocator, Format format) { 1976c354881b63935626a0700366937530d38b8b1e8krajcevski switch(format) { 1986c354881b63935626a0700366937530d38b8b1e8krajcevski case kLATC_Format: 199b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevski return CreateLATCBlitter(width, height, compressedBuffer, allocator); 200ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski 2016c354881b63935626a0700366937530d38b8b1e8krajcevski case kR11_EAC_Format: 202b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevski return CreateR11EACBlitter(width, height, compressedBuffer, allocator); 203ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski 20410a350c32826d10349bc3647e83d623259805b62krajcevski case kASTC_12x12_Format: 205b8ccc2f6d258a8466f79fc418e9e0a55aeaf58cekrajcevski return CreateASTCBlitter(width, height, compressedBuffer, allocator); 20610a350c32826d10349bc3647e83d623259805b62krajcevski 2076c354881b63935626a0700366937530d38b8b1e8krajcevski default: 2086c354881b63935626a0700366937530d38b8b1e8krajcevski return NULL; 209ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski } 210ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski 2116c354881b63935626a0700366937530d38b8b1e8krajcevski return NULL; 212ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski} 213ad1df153a16b7723d2d4afd13627919fc3ee87cekrajcevski 2144ad76e35111585f4da662d54943f23792dd1e0aekrajcevskibool DecompressBufferFromFormat(uint8_t* dst, int dstRowBytes, const uint8_t* src, 2154ad76e35111585f4da662d54943f23792dd1e0aekrajcevski int width, int height, Format format) { 2164ad76e35111585f4da662d54943f23792dd1e0aekrajcevski int dimX, dimY; 2174ad76e35111585f4da662d54943f23792dd1e0aekrajcevski GetBlockDimensions(format, &dimX, &dimY, true); 2184ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 2194ad76e35111585f4da662d54943f23792dd1e0aekrajcevski if (width < 0 || ((width % dimX) != 0) || height < 0 || ((height % dimY) != 0)) { 2204ad76e35111585f4da662d54943f23792dd1e0aekrajcevski return false; 2214ad76e35111585f4da662d54943f23792dd1e0aekrajcevski } 2224ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 2234ad76e35111585f4da662d54943f23792dd1e0aekrajcevski switch(format) { 2244ad76e35111585f4da662d54943f23792dd1e0aekrajcevski case kLATC_Format: 2254ad76e35111585f4da662d54943f23792dd1e0aekrajcevski DecompressLATC(dst, dstRowBytes, src, width, height); 2264ad76e35111585f4da662d54943f23792dd1e0aekrajcevski return true; 2274ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 2284ad76e35111585f4da662d54943f23792dd1e0aekrajcevski case kR11_EAC_Format: 2294ad76e35111585f4da662d54943f23792dd1e0aekrajcevski DecompressR11EAC(dst, dstRowBytes, src, width, height); 2304ad76e35111585f4da662d54943f23792dd1e0aekrajcevski return true; 2314ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 232e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#ifndef SK_IGNORE_ETC1_SUPPORT 233e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski case kETC1_Format: 234e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski return 0 == etc1_decode_image(src, dst, width, height, 3, dstRowBytes); 235e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski#endif 23695b1b3d82d227141647777d83324aa570b530096krajcevski 23795b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_4x4_Format: 23895b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_5x4_Format: 23995b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_5x5_Format: 24095b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_6x5_Format: 24195b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_6x6_Format: 24295b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x5_Format: 24395b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x6_Format: 24495b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_8x8_Format: 24595b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x5_Format: 24695b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x6_Format: 24795b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x8_Format: 24895b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_10x10_Format: 24995b1b3d82d227141647777d83324aa570b530096krajcevski case kASTC_12x10_Format: 2504ad76e35111585f4da662d54943f23792dd1e0aekrajcevski case kASTC_12x12_Format: 25195b1b3d82d227141647777d83324aa570b530096krajcevski DecompressASTC(dst, dstRowBytes, src, width, height, dimX, dimY); 25295b1b3d82d227141647777d83324aa570b530096krajcevski return true; 253e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski 254e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski default: 255e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski // Do nothing... 256e90c900ed7b2be3d0f9c7134d7fcd5f820b0464ckrajcevski break; 2574ad76e35111585f4da662d54943f23792dd1e0aekrajcevski } 2584ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 2594ad76e35111585f4da662d54943f23792dd1e0aekrajcevski return false; 2604ad76e35111585f4da662d54943f23792dd1e0aekrajcevski} 2614ad76e35111585f4da662d54943f23792dd1e0aekrajcevski 262ae614409e4cff083c070face78cc349153d0b932krajcevski} // namespace SkTextureCompressor 263