mirror of
https://github.com/godotengine/godot.git
synced 2024-12-27 11:24:59 +08:00
250 lines
6.1 KiB
C++
250 lines
6.1 KiB
C++
|
/*
|
||
|
* Copyright 2015 The Etc2Comp Authors.
|
||
|
*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
//#include "Etc.h"
|
||
|
#include "EtcColorFloatRGBA.h"
|
||
|
#include "EtcBlock4x4EncodingBits.h"
|
||
|
#include "EtcErrorMetric.h"
|
||
|
|
||
|
|
||
|
namespace Etc
|
||
|
{
|
||
|
class Block4x4;
|
||
|
class EncoderSpec;
|
||
|
class SortedBlockList;
|
||
|
|
||
|
class Image
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//the differnt warning and errors that can come up during encoding
|
||
|
enum EncodingStatus
|
||
|
{
|
||
|
SUCCESS = 0,
|
||
|
//
|
||
|
WARNING_THRESHOLD = 1 << 0,
|
||
|
//
|
||
|
WARNING_EFFORT_OUT_OF_RANGE = 1 << 1,
|
||
|
WARNING_JOBS_OUT_OF_RANGE = 1 << 2,
|
||
|
WARNING_SOME_NON_OPAQUE_PIXELS = 1 << 3,//just for opaque formats, etc1, rgb8, r11, rg11
|
||
|
WARNING_ALL_OPAQUE_PIXELS = 1 << 4,
|
||
|
WARNING_ALL_TRANSPARENT_PIXELS = 1 << 5,
|
||
|
WARNING_SOME_TRANSLUCENT_PIXELS = 1 << 6,//just for rgb8A1
|
||
|
WARNING_SOME_RGBA_NOT_0_TO_1 = 1 << 7,
|
||
|
WARNING_SOME_BLUE_VALUES_ARE_NOT_ZERO = 1 << 8,
|
||
|
WARNING_SOME_GREEN_VALUES_ARE_NOT_ZERO = 1 << 9,
|
||
|
//
|
||
|
ERROR_THRESHOLD = 1 << 16,
|
||
|
//
|
||
|
ERROR_UNKNOWN_FORMAT = 1 << 17,
|
||
|
ERROR_UNKNOWN_ERROR_METRIC = 1 << 18,
|
||
|
ERROR_ZERO_WIDTH_OR_HEIGHT = 1 << 19,
|
||
|
//
|
||
|
};
|
||
|
|
||
|
enum class Format
|
||
|
{
|
||
|
UNKNOWN,
|
||
|
//
|
||
|
ETC1,
|
||
|
//
|
||
|
// ETC2 formats
|
||
|
RGB8,
|
||
|
SRGB8,
|
||
|
RGBA8,
|
||
|
SRGBA8,
|
||
|
R11,
|
||
|
SIGNED_R11,
|
||
|
RG11,
|
||
|
SIGNED_RG11,
|
||
|
RGB8A1,
|
||
|
SRGB8A1,
|
||
|
//
|
||
|
FORMATS,
|
||
|
//
|
||
|
DEFAULT = SRGB8
|
||
|
};
|
||
|
|
||
|
// constructor using source image
|
||
|
Image(float *a_pafSourceRGBA, unsigned int a_uiSourceWidth,
|
||
|
unsigned int a_uiSourceHeight,
|
||
|
ErrorMetric a_errormetric);
|
||
|
|
||
|
// constructor using encoding bits
|
||
|
Image(Format a_format,
|
||
|
unsigned int a_uiSourceWidth, unsigned int a_uiSourceHeight,
|
||
|
unsigned char *a_paucEncidingBits, unsigned int a_uiEncodingBitsBytes,
|
||
|
Image *a_pimageSource,
|
||
|
ErrorMetric a_errormetric);
|
||
|
|
||
|
~Image(void);
|
||
|
|
||
|
EncodingStatus Encode(Format a_format, ErrorMetric a_errormetric, float a_fEffort,
|
||
|
unsigned int a_uiJobs, unsigned int a_uiMaxJobs);
|
||
|
|
||
|
inline void AddToEncodingStatus(EncodingStatus a_encStatus)
|
||
|
{
|
||
|
m_encodingStatus = (EncodingStatus)((unsigned int)m_encodingStatus | (unsigned int)a_encStatus);
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetSourceWidth(void)
|
||
|
{
|
||
|
return m_uiSourceWidth;
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetSourceHeight(void)
|
||
|
{
|
||
|
return m_uiSourceHeight;
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetExtendedWidth(void)
|
||
|
{
|
||
|
return m_uiExtendedWidth;
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetExtendedHeight(void)
|
||
|
{
|
||
|
return m_uiExtendedHeight;
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetNumberOfBlocks()
|
||
|
{
|
||
|
return m_uiBlockColumns * m_uiBlockRows;
|
||
|
}
|
||
|
|
||
|
inline Block4x4 * GetBlocks()
|
||
|
{
|
||
|
return m_pablock;
|
||
|
}
|
||
|
|
||
|
inline unsigned char * GetEncodingBits(void)
|
||
|
{
|
||
|
return m_paucEncodingBits;
|
||
|
}
|
||
|
|
||
|
inline unsigned int GetEncodingBitsBytes(void)
|
||
|
{
|
||
|
return m_uiEncodingBitsBytes;
|
||
|
}
|
||
|
|
||
|
inline int GetEncodingTimeMs(void)
|
||
|
{
|
||
|
return m_iEncodeTime_ms;
|
||
|
}
|
||
|
|
||
|
float GetError(void);
|
||
|
|
||
|
inline ColorFloatRGBA * GetSourcePixel(unsigned int a_uiH, unsigned int a_uiV)
|
||
|
{
|
||
|
if (a_uiH >= m_uiSourceWidth || a_uiV >= m_uiSourceHeight)
|
||
|
{
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
return &m_pafrgbaSource[a_uiV*m_uiSourceWidth + a_uiH];
|
||
|
}
|
||
|
|
||
|
inline Format GetFormat(void)
|
||
|
{
|
||
|
return m_format;
|
||
|
}
|
||
|
|
||
|
static Block4x4EncodingBits::Format DetermineEncodingBitsFormat(Format a_format);
|
||
|
|
||
|
inline static unsigned short CalcExtendedDimension(unsigned short a_ushOriginalDimension)
|
||
|
{
|
||
|
return (unsigned short)((a_ushOriginalDimension + 3) & ~3);
|
||
|
}
|
||
|
|
||
|
inline ErrorMetric GetErrorMetric(void)
|
||
|
{
|
||
|
return m_errormetric;
|
||
|
}
|
||
|
|
||
|
static const char * EncodingFormatToString(Image::Format a_format);
|
||
|
const char * EncodingFormatToString(void);
|
||
|
//used to get basic information about the image data
|
||
|
int m_iNumOpaquePixels;
|
||
|
int m_iNumTranslucentPixels;
|
||
|
int m_iNumTransparentPixels;
|
||
|
|
||
|
ColorFloatRGBA m_numColorValues;
|
||
|
ColorFloatRGBA m_numOutOfRangeValues;
|
||
|
|
||
|
bool m_bVerboseOutput;
|
||
|
private:
|
||
|
//add a warning or error to check for while encoding
|
||
|
inline void TrackEncodingWarning(EncodingStatus a_encStatus)
|
||
|
{
|
||
|
m_warningsToCapture = (EncodingStatus)((unsigned int)m_warningsToCapture | (unsigned int)a_encStatus);
|
||
|
}
|
||
|
|
||
|
//report the warning if it is something we care about for this encoding
|
||
|
inline void AddToEncodingStatusIfSignfigant(EncodingStatus a_encStatus)
|
||
|
{
|
||
|
if ((EncodingStatus)((unsigned int)m_warningsToCapture & (unsigned int)a_encStatus) == a_encStatus)
|
||
|
{
|
||
|
AddToEncodingStatus(a_encStatus);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Image(void);
|
||
|
void FindEncodingWarningTypesForCurFormat();
|
||
|
void FindAndSetEncodingWarnings();
|
||
|
|
||
|
void InitBlocksAndBlockSorter(void);
|
||
|
|
||
|
void RunFirstPass(unsigned int a_uiMultithreadingOffset,
|
||
|
unsigned int a_uiMultithreadingStride);
|
||
|
|
||
|
void SetEncodingBits(unsigned int a_uiMultithreadingOffset,
|
||
|
unsigned int a_uiMultithreadingStride);
|
||
|
|
||
|
unsigned int IterateThroughWorstBlocks(unsigned int a_uiMaxBlocks,
|
||
|
unsigned int a_uiMultithreadingOffset,
|
||
|
unsigned int a_uiMultithreadingStride);
|
||
|
|
||
|
// inputs
|
||
|
ColorFloatRGBA *m_pafrgbaSource;
|
||
|
unsigned int m_uiSourceWidth;
|
||
|
unsigned int m_uiSourceHeight;
|
||
|
unsigned int m_uiExtendedWidth;
|
||
|
unsigned int m_uiExtendedHeight;
|
||
|
unsigned int m_uiBlockColumns;
|
||
|
unsigned int m_uiBlockRows;
|
||
|
// intermediate data
|
||
|
Block4x4 *m_pablock;
|
||
|
// encoding
|
||
|
Format m_format;
|
||
|
Block4x4EncodingBits::Format m_encodingbitsformat;
|
||
|
unsigned int m_uiEncodingBitsBytes; // for entire image
|
||
|
unsigned char *m_paucEncodingBits;
|
||
|
ErrorMetric m_errormetric;
|
||
|
float m_fEffort;
|
||
|
// stats
|
||
|
int m_iEncodeTime_ms;
|
||
|
|
||
|
SortedBlockList *m_psortedblocklist;
|
||
|
//this will hold any warning or errors that happen during encoding
|
||
|
EncodingStatus m_encodingStatus;
|
||
|
//these will be the warnings we are tracking
|
||
|
EncodingStatus m_warningsToCapture;
|
||
|
};
|
||
|
|
||
|
} // namespace Etc
|