summaryrefslogtreecommitdiff
path: root/thirdparty/etc2comp/EtcImage.h
diff options
context:
space:
mode:
authorFerenc Arn <tagcup@yahoo.com>2017-04-26 10:49:08 -0500
committerFerenc Arn <tagcup@yahoo.com>2017-05-31 18:59:00 -0500
commit6a9c990da72a737fa95d9e97d53f835706aea7c3 (patch)
tree0f5c1d36279bef5d0d5c84fc1d3fb24256b65ba8 /thirdparty/etc2comp/EtcImage.h
parentbd26fa7bf2bf02f9ef17ad4ef3a93ffed3ffcf56 (diff)
Add ETC1/ETC2 compression support though etc2comp.
Remove rg-etc1 code. Also updated travis to use ubuntu 14.04. Fixes #8457.
Diffstat (limited to 'thirdparty/etc2comp/EtcImage.h')
-rw-r--r--thirdparty/etc2comp/EtcImage.h249
1 files changed, 249 insertions, 0 deletions
diff --git a/thirdparty/etc2comp/EtcImage.h b/thirdparty/etc2comp/EtcImage.h
new file mode 100644
index 0000000000..bd807ac32e
--- /dev/null
+++ b/thirdparty/etc2comp/EtcImage.h
@@ -0,0 +1,249 @@
+/*
+ * 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