/*
 * Copyright 2020 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkCompressedDataUtils_DEFINED
#define SkCompressedDataUtils_DEFINED

#include "include/core/SkRefCnt.h"
#include "include/core/SkTextureCompressionType.h"
#include "include/private/SkAssert.h"
#include "include/private/SkTArray.h"

#include <cstddef>

class SkBitmap;
class SkData;
struct SkISize;

static constexpr bool SkTextureCompressionTypeIsOpaque(SkTextureCompressionType compression) {
    switch (compression) {
        case SkTextureCompressionType::kNone:            return true;
        case SkTextureCompressionType::kETC2_RGB8_UNORM: return true;
        case SkTextureCompressionType::kBC1_RGB8_UNORM:  return true;
        case SkTextureCompressionType::kBC1_RGBA8_UNORM: return false;
    }

    SkUNREACHABLE;
}

size_t SkCompressedDataSize(SkTextureCompressionType, SkISize baseDimensions,
                            skia_private::TArray<size_t>* individualMipOffsets, bool mipmapped);
size_t SkCompressedBlockSize(SkTextureCompressionType type);

/**
 * Returns the data size for the given SkTextureCompressionType
 */
size_t SkCompressedFormatDataSize(SkTextureCompressionType compressionType,
                                  SkISize dimensions, bool mipmapped);

 /*
  * This method will decompress the bottommost level in 'data' into 'dst'.
  */
bool SkDecompress(sk_sp<SkData> data,
                  SkISize dimensions,
                  SkTextureCompressionType compressionType,
                  SkBitmap* dst);

#endif
