#ifndef _TCUASTCUTIL_HPP
#define _TCUASTCUTIL_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief ASTC Utilities.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tcuCompressedTexture.hpp"

#include <vector>

namespace tcu
{
namespace astc
{

enum BlockTestType
{
	BLOCK_TEST_TYPE_VOID_EXTENT_LDR = 0,
	BLOCK_TEST_TYPE_VOID_EXTENT_HDR,
	BLOCK_TEST_TYPE_WEIGHT_GRID,
	BLOCK_TEST_TYPE_WEIGHT_ISE,
	BLOCK_TEST_TYPE_CEMS,
	BLOCK_TEST_TYPE_PARTITION_SEED,
	BLOCK_TEST_TYPE_ENDPOINT_VALUE_LDR,
	BLOCK_TEST_TYPE_ENDPOINT_VALUE_HDR_NO_15,
	BLOCK_TEST_TYPE_ENDPOINT_VALUE_HDR_15,
	BLOCK_TEST_TYPE_ENDPOINT_ISE,
	BLOCK_TEST_TYPE_CCS,
	BLOCK_TEST_TYPE_RANDOM,

	BLOCK_TEST_TYPE_LAST
};

enum
{
	BLOCK_SIZE_BYTES = 128/8,
};

const char*		getBlockTestTypeName			(BlockTestType testType);
const char*		getBlockTestTypeDescription		(BlockTestType testType);
bool			isBlockTestTypeHDROnly			(BlockTestType testType);
Vec4			getBlockTestTypeColorScale		(BlockTestType testType);
Vec4			getBlockTestTypeColorBias		(BlockTestType testType);

void			generateBlockCaseTestData		(std::vector<deUint8>& dst, CompressedTexFormat format, BlockTestType testType);

void			generateRandomBlocks			(deUint8* dst, size_t numBlocks, CompressedTexFormat format, deUint32 seed);
void			generateRandomValidBlocks		(deUint8* dst, size_t numBlocks, CompressedTexFormat format, TexDecompressionParams::AstcMode mode, deUint32 seed);

void			generateDefaultVoidExtentBlocks	(deUint8* dst, size_t numBlocks);
void			generateDefaultNormalBlocks		(deUint8* dst, size_t numBlocks, int blockWidth, int blockHeight);

bool			isValidBlock					(const deUint8* data, CompressedTexFormat format, TexDecompressionParams::AstcMode mode);

void			decompress						(const PixelBufferAccess& dst, const deUint8* data, CompressedTexFormat format, TexDecompressionParams::AstcMode mode);

} // astc
} // tcu

#endif // _TCUASTCUTIL_HPP
