You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/ImageProcessing/Code/Source/Compressors/CryTextureSquisher/CryTextureSquisher.h

133 lines
4.5 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#pragma once
namespace ImageProcessing
{
class CryTextureSquisher
{
public:
enum EBufferType
{
eBufferType_uint8, // native support: BC1-5/7,CTX1
eBufferType_sint8, // native support: BC4-5
eBufferType_uint16, // native support: BC1-7,CTX1
eBufferType_sint16, // native support: BC4-6
eBufferType_ufloat, // native support: BC1-7,CTX1
eBufferType_sfloat, // native support: BC4-6
};
enum EQualityProfile
{
eQualityProfile_Low = 0,// as-fast-as-possible
eQualityProfile_Medium, // not so bad (nightly builds)
eQualityProfile_High, // relative good (weekly builds)
eQualityProfile_Best, // as-best-as-possible (final build for release)
eQualityProfile_Num
};
enum ECodingPreset
{
eCompressorPreset_BC1U = 0,
eCompressorPreset_BC2U,
eCompressorPreset_BC3U,
eCompressorPreset_BC4U, // r-channel from RGBA
eCompressorPreset_BC5U, // rg-channels from RGBA
eCompressorPreset_BC6UH,
eCompressorPreset_BC7U,
eCompressorPreset_BC4S, // r-channel from RGBA
eCompressorPreset_BC5S, // rg-channels from RGBA
// normal vectors -> unit metric
eCompressorPreset_BC1Un,
eCompressorPreset_BC2Un,
eCompressorPreset_BC3Un,
eCompressorPreset_BC4Un, // z-channel from XYZD
eCompressorPreset_BC5Un, // xy-channels from XYZD, xyz must be a valid unit-vector
eCompressorPreset_BC6UHn,
eCompressorPreset_BC7Un,
eCompressorPreset_BC4Sn, // z-channel from XYZD
eCompressorPreset_BC5Sn, // xy-channels from XYZD, xyz must be a valid unit-vector
// transparency -> weighted alpha
eCompressorPreset_BC1Ua,
eCompressorPreset_BC2Ut,
eCompressorPreset_BC3Ut,
eCompressorPreset_BC4Ua, // a-channel from RGBA
eCompressorPreset_BC7Ut,
eCompressorPreset_BC4Sa, // a-channel from RGBA
// grey-scale -> 12+ bits of precision
eCompressorPreset_BC7Ug,
// special ones
eCompressorPreset_CTX1U, // rg-channels from RGBA
eCompressorPreset_CTX1Un, // xy-channels from XYZD, xyz must be a valid unit-vector
eCompressorPreset_Num
};
struct CompressorParameters
{
// source's parameters
EBufferType srcType;
const void* srcBuffer;
unsigned int width;
unsigned int height;
unsigned int pitch;
// coding preset
ECodingPreset preset;
EQualityProfile quality;
// either if "srgb==1" or if "rgbweights!=uniform"
bool perceptual;
float weights[4];
void* userPtr;
int userInt;
void(*userOutputFunction)(const CompressorParameters& compress, const void* compressedData, unsigned int compressedSize, unsigned int oy, unsigned int ox);
};
struct DecompressorParameters
{
// destination's parameters
EBufferType dstType;
void* dstBuffer;
unsigned int width;
unsigned int height;
unsigned int pitch;
// coding preset
ECodingPreset preset;
void* userPtr;
int userInt;
void(*userInputFunction)(const DecompressorParameters& decompress, void* compressedData, unsigned int compressedSize, unsigned int oy, unsigned int ox);
};
public:
static void Compress(const CompressorParameters& compress);
static void Decompress(const DecompressorParameters& decompress);
};
} //namespace ImageProcessing