123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * 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 "EtcColorFloatRGBA.h"
- #include "EtcErrorMetric.h"
- #include <assert.h>
- #include <float.h>
- namespace Etc
- {
- class Block4x4;
- // abstract base class for specific encodings
- class Block4x4Encoding
- {
- public:
- static const unsigned int ROWS = 4;
- static const unsigned int COLUMNS = 4;
- static const unsigned int PIXELS = ROWS * COLUMNS;
- static const float LUMA_WEIGHT;
- static const float CHROMA_BLUE_WEIGHT;
- typedef enum
- {
- MODE_UNKNOWN,
- //
- MODE_ETC1,
- MODE_T,
- MODE_H,
- MODE_PLANAR,
- MODE_R11,
- MODE_RG11,
- //
- MODES
- } Mode;
- Block4x4Encoding(void);
- //virtual ~Block4x4Encoding(void) =0;
- virtual ~Block4x4Encoding(void) {}
- virtual void InitFromSource(Block4x4 *a_pblockParent,
- ColorFloatRGBA *a_pafrgbaSource,
- unsigned char *a_paucEncodingBits, ErrorMetric a_errormetric) = 0;
- virtual void InitFromEncodingBits(Block4x4 *a_pblockParent,
- unsigned char *a_paucEncodingBits,
- ColorFloatRGBA *a_pafrgbaSource,
- ErrorMetric a_errormetric) = 0;
- // perform an iteration of the encoding
- // the first iteration must generate a complete, valid (if poor) encoding
- virtual void PerformIteration(float a_fEffort) = 0;
- void CalcBlockError(void);
- inline float GetError(void)
- {
- assert(m_fError >= 0.0f);
- return m_fError;
- }
- inline ColorFloatRGBA * GetDecodedColors(void)
- {
- return m_afrgbaDecodedColors;
- }
- inline float * GetDecodedAlphas(void)
- {
- return m_afDecodedAlphas;
- }
- virtual void SetEncodingBits(void) = 0;
- virtual bool GetFlip(void) = 0;
- virtual bool IsDifferential(void) = 0;
- virtual bool HasSeverelyBentDifferentialColors(void) const = 0;
- inline Mode GetMode(void)
- {
- return m_mode;
- }
- inline bool IsDone(void)
- {
- return m_boolDone;
- }
- inline void SetDoneIfPerfect()
- {
- if (GetError() == 0.0f)
- {
- m_boolDone = true;
- }
- }
- float CalcPixelError(ColorFloatRGBA a_frgbaDecodedColor, float a_fDecodedAlpha,
- ColorFloatRGBA a_frgbaSourcePixel);
- protected:
- void Init(Block4x4 *a_pblockParent,
- ColorFloatRGBA *a_pafrgbaSource,
- ErrorMetric a_errormetric);
- Block4x4 *m_pblockParent;
- ColorFloatRGBA *m_pafrgbaSource;
- bool m_boolBorderPixels; // if block has any border pixels
- ColorFloatRGBA m_afrgbaDecodedColors[PIXELS]; // decoded RGB components, ignore Alpha
- float m_afDecodedAlphas[PIXELS]; // decoded alpha component
- float m_fError; // error for RGBA relative to m_pafrgbaSource
- // intermediate encoding
- Mode m_mode;
- unsigned int m_uiEncodingIterations;
- bool m_boolDone; // all iterations have been done
- ErrorMetric m_errormetric;
- private:
- };
- } // namespace Etc
|