diff options
Diffstat (limited to 'thirdparty/etc2comp/EtcBlock4x4Encoding.cpp')
-rw-r--r-- | thirdparty/etc2comp/EtcBlock4x4Encoding.cpp | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/thirdparty/etc2comp/EtcBlock4x4Encoding.cpp b/thirdparty/etc2comp/EtcBlock4x4Encoding.cpp deleted file mode 100644 index 7a9e68c4cf..0000000000 --- a/thirdparty/etc2comp/EtcBlock4x4Encoding.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* - * 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. - */ - -/* -EtcBlock4x4Encoding.cpp - -Block4x4Encoding is the abstract base class for the different encoders. Each encoder targets a -particular file format (e.g. ETC1, RGB8, RGBA8, R11) - -*/ - -#include "EtcConfig.h" -#include "EtcBlock4x4Encoding.h" - -#include "EtcBlock4x4EncodingBits.h" -#include "EtcBlock4x4.h" - -#include <stdio.h> -#include <string.h> -#include <assert.h> - -namespace Etc -{ - // ---------------------------------------------------------------------------------------------------- - // - const float Block4x4Encoding::LUMA_WEIGHT = 3.0f; - const float Block4x4Encoding::CHROMA_BLUE_WEIGHT = 0.5f; - - // ---------------------------------------------------------------------------------------------------- - // - Block4x4Encoding::Block4x4Encoding(void) - { - - m_pblockParent = nullptr; - - m_pafrgbaSource = nullptr; - - m_boolBorderPixels = false; - - m_fError = -1.0f; - - m_mode = MODE_UNKNOWN; - - m_uiEncodingIterations = 0; - m_boolDone = false; - - for (unsigned int uiPixel = 0; uiPixel < PIXELS; uiPixel++) - { - m_afrgbaDecodedColors[uiPixel] = ColorFloatRGBA(-1.0f, -1.0f, -1.0f, -1.0f); - m_afDecodedAlphas[uiPixel] = -1.0f; - } - - } - - // ---------------------------------------------------------------------------------------------------- - // initialize the generic encoding for a 4x4 block - // a_pblockParent points to the block associated with this encoding - // a_errormetric is used to choose the best encoding - // init the decoded pixels to -1 to mark them as undefined - // init the error to -1 to mark it as undefined - // - void Block4x4Encoding::Init(Block4x4 *a_pblockParent, - ColorFloatRGBA *a_pafrgbaSource, - ErrorMetric a_errormetric) - { - - m_pblockParent = a_pblockParent; - - m_pafrgbaSource = a_pafrgbaSource; - - m_boolBorderPixels = m_pblockParent->HasBorderPixels(); - - m_fError = -1.0f; - - m_uiEncodingIterations = 0; - - m_errormetric = a_errormetric; - - for (unsigned int uiPixel = 0; uiPixel < PIXELS; uiPixel++) - { - m_afrgbaDecodedColors[uiPixel] = ColorFloatRGBA(-1.0f, -1.0f, -1.0f, -1.0f); - m_afDecodedAlphas[uiPixel] = -1.0f; - } - - } - - // ---------------------------------------------------------------------------------------------------- - // calculate the error for the block by summing the pixel errors - // - void Block4x4Encoding::CalcBlockError(void) - { - m_fError = 0.0f; - - for (unsigned int uiPixel = 0; uiPixel < PIXELS; uiPixel++) - { - m_fError += CalcPixelError(m_afrgbaDecodedColors[uiPixel], m_afDecodedAlphas[uiPixel], - m_pafrgbaSource[uiPixel]); - } - - } - - // ---------------------------------------------------------------------------------------------------- - // calculate the error between the source pixel and the decoded pixel - // the error amount is base on the error metric - // - float Block4x4Encoding::CalcPixelError(ColorFloatRGBA a_frgbaDecodedColor, float a_fDecodedAlpha, - ColorFloatRGBA a_frgbaSourcePixel) - { - - // if a border pixel - if (isnan(a_frgbaSourcePixel.fA)) - { - return 0.0f; - } - - if (m_errormetric == ErrorMetric::RGBA) - { - assert(a_fDecodedAlpha >= 0.0f); - - float fDRed = (a_fDecodedAlpha * a_frgbaDecodedColor.fR) - - (a_frgbaSourcePixel.fA * a_frgbaSourcePixel.fR); - float fDGreen = (a_fDecodedAlpha * a_frgbaDecodedColor.fG) - - (a_frgbaSourcePixel.fA * a_frgbaSourcePixel.fG); - float fDBlue = (a_fDecodedAlpha * a_frgbaDecodedColor.fB) - - (a_frgbaSourcePixel.fA * a_frgbaSourcePixel.fB); - - float fDAlpha = a_fDecodedAlpha - a_frgbaSourcePixel.fA; - - return fDRed*fDRed + fDGreen*fDGreen + fDBlue*fDBlue + fDAlpha*fDAlpha; - } - else if (m_errormetric == ErrorMetric::RGBX) - { - assert(a_fDecodedAlpha >= 0.0f); - - float fDRed = a_frgbaDecodedColor.fR - a_frgbaSourcePixel.fR; - float fDGreen = a_frgbaDecodedColor.fG - a_frgbaSourcePixel.fG; - float fDBlue = a_frgbaDecodedColor.fB - a_frgbaSourcePixel.fB; - float fDAlpha = a_fDecodedAlpha - a_frgbaSourcePixel.fA; - - return fDRed*fDRed + fDGreen*fDGreen + fDBlue*fDBlue + fDAlpha*fDAlpha; - } - else if (m_errormetric == ErrorMetric::REC709) - { - assert(a_fDecodedAlpha >= 0.0f); - - float fLuma1 = a_frgbaSourcePixel.fR*0.2126f + a_frgbaSourcePixel.fG*0.7152f + a_frgbaSourcePixel.fB*0.0722f; - float fChromaR1 = 0.5f * ((a_frgbaSourcePixel.fR - fLuma1) * (1.0f / (1.0f - 0.2126f))); - float fChromaB1 = 0.5f * ((a_frgbaSourcePixel.fB - fLuma1) * (1.0f / (1.0f - 0.0722f))); - - float fLuma2 = a_frgbaDecodedColor.fR*0.2126f + - a_frgbaDecodedColor.fG*0.7152f + - a_frgbaDecodedColor.fB*0.0722f; - float fChromaR2 = 0.5f * ((a_frgbaDecodedColor.fR - fLuma2) * (1.0f / (1.0f - 0.2126f))); - float fChromaB2 = 0.5f * ((a_frgbaDecodedColor.fB - fLuma2) * (1.0f / (1.0f - 0.0722f))); - - float fDeltaL = a_frgbaSourcePixel.fA * fLuma1 - a_fDecodedAlpha * fLuma2; - float fDeltaCr = a_frgbaSourcePixel.fA * fChromaR1 - a_fDecodedAlpha * fChromaR2; - float fDeltaCb = a_frgbaSourcePixel.fA * fChromaB1 - a_fDecodedAlpha * fChromaB2; - - float fDAlpha = a_fDecodedAlpha - a_frgbaSourcePixel.fA; - - // Favor Luma accuracy over Chroma, and Red over Blue - return LUMA_WEIGHT*fDeltaL*fDeltaL + - fDeltaCr*fDeltaCr + - CHROMA_BLUE_WEIGHT*fDeltaCb*fDeltaCb + - fDAlpha*fDAlpha; - #if 0 - float fDRed = a_frgbaDecodedPixel.fR - a_frgbaSourcePixel.fR; - float fDGreen = a_frgbaDecodedPixel.fG - a_frgbaSourcePixel.fG; - float fDBlue = a_frgbaDecodedPixel.fB - a_frgbaSourcePixel.fB; - return 2.0f * 3.0f * fDeltaL * fDeltaL + fDRed*fDRed + fDGreen*fDGreen + fDBlue*fDBlue; -#endif - } - else if (m_errormetric == ErrorMetric::NORMALXYZ) - { - float fDecodedX = 2.0f * a_frgbaDecodedColor.fR - 1.0f; - float fDecodedY = 2.0f * a_frgbaDecodedColor.fG - 1.0f; - float fDecodedZ = 2.0f * a_frgbaDecodedColor.fB - 1.0f; - - float fDecodedLength = sqrtf(fDecodedX*fDecodedX + fDecodedY*fDecodedY + fDecodedZ*fDecodedZ); - - if (fDecodedLength < 0.5f) - { - return 1.0f; - } - else if (fDecodedLength == 0.0f) - { - fDecodedX = 1.0f; - fDecodedY = 0.0f; - fDecodedZ = 0.0f; - } - else - { - fDecodedX /= fDecodedLength; - fDecodedY /= fDecodedLength; - fDecodedZ /= fDecodedLength; - } - - float fSourceX = 2.0f * a_frgbaSourcePixel.fR - 1.0f; - float fSourceY = 2.0f * a_frgbaSourcePixel.fG - 1.0f; - float fSourceZ = 2.0f * a_frgbaSourcePixel.fB - 1.0f; - - float fSourceLength = sqrtf(fSourceX*fSourceX + fSourceY*fSourceY + fSourceZ*fSourceZ); - - if (fSourceLength == 0.0f) - { - fSourceX = 1.0f; - fSourceY = 0.0f; - fSourceZ = 0.0f; - } - else - { - fSourceX /= fSourceLength; - fSourceY /= fSourceLength; - fSourceZ /= fSourceLength; - } - - float fDotProduct = fSourceX*fDecodedX + fSourceY*fDecodedY + fSourceZ*fDecodedZ; - float fNormalizedDotProduct = 1.0f - 0.5f * (fDotProduct + 1.0f); - float fDotProductError = fNormalizedDotProduct * fNormalizedDotProduct; - - float fLength2 = fDecodedX*fDecodedX + fDecodedY*fDecodedY + fDecodedZ*fDecodedZ; - float fLength2Error = fabsf(1.0f - fLength2); - - float fDeltaW = a_frgbaDecodedColor.fA - a_frgbaSourcePixel.fA; - float fErrorW = fDeltaW * fDeltaW; - - return fDotProductError + fLength2Error + fErrorW; - } - else // ErrorMetric::NUMERIC - { - assert(a_fDecodedAlpha >= 0.0f); - - float fDX = a_frgbaDecodedColor.fR - a_frgbaSourcePixel.fR; - float fDY = a_frgbaDecodedColor.fG - a_frgbaSourcePixel.fG; - float fDZ = a_frgbaDecodedColor.fB - a_frgbaSourcePixel.fB; - float fDW = a_frgbaDecodedColor.fA - a_frgbaSourcePixel.fA; - - return fDX*fDX + fDY*fDY + fDZ*fDZ + fDW*fDW; - } - - } - - // ---------------------------------------------------------------------------------------------------- - // - -} // namespace Etc - |