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