mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-04 07:31:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			249 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			249 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
 |