satdump/plugins/xrit_support/DecompWT/CWBlock.cpp

890 lines
19 KiB
C++
Raw Permalink Normal View History

/*
* Copyright 2011-2019, European Organisation for the Exploitation of Meteorological Satellites (EUMETSAT)
*
* 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.
*/
//:Ignore
//////////////////////////////////////////////////////////////////////////
//
// FileName: CWBlock.cpp
//
// Date Created: 07/05/1999
//
// Author: Youssef Ouaghli
//
// Description: CWBlock class definition.
//
// Last Modified: $Dmae: 1999/05/21 12:53:00 $
//
// RCS Id: $Id: CWBlock.cpp,v 1.6 1999/05/21 12:53:00 xne Exp $
//
// $Rma: CWBlock.cpp,v $
// Revision 1.6 1999/05/21 12:53:00 xne
// Introduced checks wrt the size of the blocks on which the S+P iterations
// are to be performed.
// Removed UpdateDC and the corresponding inverse methods.
//
// Revision 1.5 1999/05/18 12:17:38 xne
// Removed some #ifdef _DEBUG around Asserts since the impact on performances
// is minimal
//
// Revision 1.4 1999/05/10 12:04:59 youag
// Testing if AC interval rescaling is needed before calling the function
//
// Revision 1.3 1999/05/10 11:40:02 youag
// Cleaning code from unused member functions
//
// Revision 1.2 1999/05/07 14:42:03 youag
// Tuning performance for ALPHA
//
// Revision 1.1 1999/05/07 14:10:22 youag
// Reduce number of inline functions in order to promote code expansion of
// important inline functions
//
//
//////////////////////////////////////////////////////////////////////////
//:End Ignore
#include <math.h>
#include "CWBlock.h"
namespace COMP
{
void CWBlock::St1DH_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = *pL++;
pL -= sd2;
for (n = sd2; n; n--)
{
const int c1 = *--pB;
const int c0 = *--pB;
*--pL = (c0 + c1) >> 1;
*--pH = c0 - c1;
}
}
else
{
if (sd2 == 1)
{
const int c1 = *--pH;
const int c0 = *--pL;
*pL = (c0 + c1) >> 1;
*pH = c0 - c1;
}
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::St1DV_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = (*pL++)[i_I];
pL -= sd2;
for (n = sd2; n; n--)
{
const int c1 = *--pB;
const int c0 = *--pB;
(*--pL)[i_I] = (c0 + c1) >> 1;
(*--pH)[i_I] = c0 - c1;
}
}
else
{
if (sd2 == 1)
{
const int c1 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I];
(*pL)[i_I] = (c0 + c1) >> 1;
(*pH)[i_I] = c0 - c1;
}
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::St1DH_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
unsigned int n;
for (n = sd2; n; n--)
{
const int h0 = *--pH;
const int c0 = *--pL + ((h0 + 1) >> 1);
*--pB = c0 - h0;
*--pB = c0;
}
for (n = i_S; n; n--)
*pL++ = *pB++;
}
else
{
if (sd2 == 1)
{
const int h0 = *--pH;
const int c0 = *--pL + ((h0 + 1) >> 1);
*pH = c0 - h0;
*pL = c0;
}
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::St1DV_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
unsigned int n;
for (n = sd2; n; n--)
{
const int h0 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I] + ((h0 + 1) >> 1);
*--pB = c0 - h0;
*--pB = c0;
}
for (n = i_S; n; n--)
(*pL++)[i_I] = *pB++;
}
else
{
if (sd2 == 1)
{
const int h0 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I] + ((h0 + 1) >> 1);
(*pH)[i_I] = c0 - h0;
(*pL)[i_I] = c0;
}
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptA1DH_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = *pL++;
pL -= sd2;
int c1 = *--pB;
int c0 = *--pB;
int l1 = *--pL = (c0 + c1) >> 1;
int h0 = c0 - c1;
c1 = *--pB;
c0 = *--pB;
int l0 = *--pL = (c0 + c1) >> 1;
int dl0 = l0 - l1;
*--pH = h0 - ((dl0 + 2) >> 2);
h0 = c0 - c1;
for (n = sd2 - 2; n; n--)
{
c1 = *--pB;
c0 = *--pB;
l1 = l0;
l0 = *--pL = (c0 + c1) >> 1;
const int dl1 = dl0;
dl0 = l0 - l1;
*--pH = h0 - ((dl0 + dl1 + 2) >> 2);
h0 = c0 - c1;
}
*--pH = h0 - ((dl0 + 2) >> 2);
}
else if (sd2 == 1)
{
const int c1 = *--pH;
const int c0 = *--pL;
*pL = (c0 + c1) >> 1;
*pH = c0 - c1;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptA1DV_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = (*pL++)[i_I];
pL -= sd2;
int c1 = *--pB;
int c0 = *--pB;
int l1 = (*--pL)[i_I] = (c0 + c1) >> 1;
int h0 = c0 - c1;
c1 = *--pB;
c0 = *--pB;
int l0 = (*--pL)[i_I] = (c0 + c1) >> 1;
int dl0 = l0 - l1;
(*--pH)[i_I] = h0 - ((dl0 + 2) >> 2);
h0 = c0 - c1;
for (n = sd2 - 2; n; n--)
{
c1 = *--pB;
c0 = *--pB;
l1 = l0;
l0 = (*--pL)[i_I] = (c0 + c1) >> 1;
const int dl1 = dl0;
dl0 = l0 - l1;
(*--pH)[i_I] = h0 - ((dl0 + dl1 + 2) >> 2);
h0 = c0 - c1;
}
(*--pH)[i_I] = h0 - ((dl0 + 2) >> 2);
}
else if (sd2 == 1)
{
const int c1 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I];
(*pL)[i_I] = (c0 + c1) >> 1;
(*pH)[i_I] = c0 - c1;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptA1DH_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
int l1 = *--pL;
int l0 = *--pL;
int dl0 = l0 - l1;
int h1 = *--pH + ((dl0 + 2) >> 2);
int c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
unsigned int n;
for (n = sd2 - 2; n; n--)
{
l1 = l0;
l0 = *--pL;
const int dl1 = dl0;
dl0 = l0 - l1;
h1 = *--pH + ((dl0 + dl1 + 2) >> 2);
c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
}
h1 = *--pH + ((dl0 + 2) >> 2);
c0 = l0 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
for (n = i_S; n; n--)
*pL++ = *pB++;
}
else if (sd2 == 1)
{
const int h0 = *--pH;
const int c0 = *--pL + ((h0 + 1) >> 1);
*pL = c0;
*pH = c0 - h0;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptA1DV_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
int l1 = (*--pL)[i_I];
int l0 = (*--pL)[i_I];
int dl0 = l0 - l1;
int h1 = (*--pH)[i_I] + ((dl0 + 2) >> 2);
int c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
unsigned int n;
for (n = sd2 - 2; n; n--)
{
l1 = l0;
l0 = (*--pL)[i_I];
const int dl1 = dl0;
dl0 = l0 - l1;
h1 = (*--pH)[i_I] + ((dl0 + dl1 + 2) >> 2);
c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
}
h1 = (*--pH)[i_I] + ((dl0 + 2) >> 2);
c0 = l0 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
for (n = i_S; n; n--)
(*pL++)[i_I] = *pB++;
}
else if (sd2 == 1)
{
const int h0 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I] + ((h0 + 1) >> 1);
(*pL)[i_I] = c0;
(*pH)[i_I] = c0 - h0;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptB1DH_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = *pL++;
pL -= sd2;
int c1 = *--pB;
int c0 = *--pB;
int l1 = *--pL = (c0 + c1) >> 1;
int h1 = c0 - c1;
c1 = *--pB;
c0 = *--pB;
int l0 = *--pL = (c0 + c1) >> 1;
int h0 = c0 - c1;
int dl0 = l0 - l1;
*--pH = h1 - ((dl0 + 2) >> 2);
for (n = sd2 - 2; n; n--)
{
c1 = *--pB;
c0 = *--pB;
l1 = l0;
l0 = *--pL = (c0 + c1) >> 1;
const int dl1 = dl0;
dl0 = l0 - l1;
*--pH = h0 - ((((dl0 + dl1 - h1) << 1) + dl1 + 4) >> 3);
h1 = h0;
h0 = c0 - c1;
}
*--pH = h0 - ((dl0 + 2) >> 2);
}
else if (sd2 == 1)
{
const int c1 = *--pH;
const int c0 = *--pL;
*pL = (c0 + c1) >> 1;
*pH = c0 - c1;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptB1DV_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[0];
pL -= sd2;
unsigned int n;
for (n = i_S; n; n--)
*pB++ = (*pL++)[i_I];
pL -= sd2;
int c1 = *--pB;
int c0 = *--pB;
int l1 = (*--pL)[i_I] = (c0 + c1) >> 1;
int h1 = c0 - c1;
c1 = *--pB;
c0 = *--pB;
int l0 = (*--pL)[i_I] = (c0 + c1) >> 1;
int h0 = c0 - c1;
int dl0 = l0 - l1;
(*--pH)[i_I] = h1 - ((dl0 + 2) >> 2);
for (n = sd2 - 2; n; n--)
{
c1 = *--pB;
c0 = *--pB;
l1 = l0;
l0 = (*--pL)[i_I] = (c0 + c1) >> 1;
const int dl1 = dl0;
dl0 = l0 - l1;
(*--pH)[i_I] = h0 - ((((dl0 + dl1 - h1) << 1) + dl1 + 4) >> 3);
h1 = h0;
h0 = c0 - c1;
}
(*--pH)[i_I] = h0 - ((dl0 + 2) >> 2);
}
else if (sd2 == 1)
{
const int c1 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I];
(*pL)[i_I] = (c0 + c1) >> 1;
(*pH)[i_I] = c0 - c1;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptB1DH_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
int l1 = *--pL;
int l0 = *--pL;
int dl0 = l0 - l1;
int h1 = *--pH + ((dl0 + 2) >> 2);
int c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
unsigned int n;
for (n = sd2 - 2; n; n--)
{
l1 = l0;
l0 = *--pL;
const int dl1 = dl0;
dl0 = l0 - l1;
h1 = *--pH + ((((dl0 + dl1 - h1) << 1) + dl1 + 4) >> 3);
c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
}
h1 = *--pH + ((dl0 + 2) >> 2);
c0 = l0 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
for (n = i_S; n; n--)
*pL++ = *pB++;
}
else if (sd2 == 1)
{
const int h0 = *--pH;
const int c0 = *--pL + ((h0 + 1) >> 1);
*pL = c0;
*pH = c0 - h0;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptB1DV_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
if (sd2 > 1)
{
int *pB = &m_Tmp[i_S];
int l1 = (*--pL)[i_I];
int l0 = (*--pL)[i_I];
int dl0 = l0 - l1;
int h1 = (*--pH)[i_I] + ((dl0 + 2) >> 2);
int c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
unsigned int n;
for (n = sd2 - 2; n; n--)
{
l1 = l0;
l0 = (*--pL)[i_I];
const int dl1 = dl0;
dl0 = l0 - l1;
h1 = (*--pH)[i_I] + ((((dl0 + dl1 - h1) << 1) + dl1 + 4) >> 3);
c0 = l1 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
}
h1 = (*--pH)[i_I] + ((dl0 + 2) >> 2);
c0 = l0 + ((h1 + 1) >> 1);
*--pB = c0 - h1;
*--pB = c0;
for (n = i_S; n; n--)
(*pL++)[i_I] = *pB++;
}
else if (sd2 == 1)
{
const int h0 = (*--pH)[i_I];
const int c0 = (*--pL)[i_I] + ((h0 + 1) >> 1);
(*pL)[i_I] = c0;
(*pH)[i_I] = c0 - h0;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptC1DH_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
if (i_S > 2)
{
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I];
int *pH = pL + sd2;
int l0 = *pL++;
int l1 = *pL++;
int dl2 = l0 - l1;
*pH++ -= (dl2 + 2) >> 2;
if (sd2 > 2)
{
l0 = l1;
l1 = *pL++;
int dl1 = dl2;
dl2 = l0 - l1;
*pH -= (((dl1 + dl2 - pH[1]) << 1) + dl2 + 4) >> 3;
pH++;
for (unsigned int n = sd2 - 3; n; n--)
{
l0 = l1;
l1 = *pL++;
const int dl0 = dl1;
dl1 = dl2;
dl2 = l0 - l1;
*pH -= (-dl0 + ((((dl1 + (dl2 << 1) - pH[1]) << 1) - pH[1]) << 1) + 8) >> 4;
pH++;
}
}
*pH++ -= (dl2 + 2) >> 2;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptC1DV_Fwd(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
if (i_S > 2)
{
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[0];
int **pH = pL + sd2;
int l0 = (*pL++)[i_I];
int l1 = (*pL++)[i_I];
int dl2 = l0 - l1;
(*pH++)[i_I] -= (dl2 + 2) >> 2;
if (sd2 > 2)
{
l0 = l1;
l1 = (*pL++)[i_I];
int dl1 = dl2;
dl2 = l0 - l1;
(*pH)[i_I] -= (((dl1 + dl2 - pH[1][i_I]) << 1) + dl2 + 4) >> 3;
pH++;
for (unsigned int n = sd2 - 3; n; n--)
{
l0 = l1;
l1 = (*pL++)[i_I];
const int dl0 = dl1;
dl1 = dl2;
dl2 = l0 - l1;
(*pH)[i_I] -= (-dl0 + ((((dl1 + (dl2 << 1) - pH[1][i_I]) << 1) - pH[1][i_I]) << 1) + 8) >> 4;
pH++;
}
}
(*pH++)[i_I] -= (dl2 + 2) >> 2;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptC1DH_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
if (i_S > 2)
{
const unsigned int sd2 = i_S >> 1;
int *pL = m_Data[i_I] + sd2;
int *pH = pL + sd2;
int l1 = *--pL;
int l0 = *--pL;
int dl0 = l0 - l1;
*--pH += (dl0 + 2) >> 2;
if (sd2 > 2)
{
l1 = l0;
l0 = *--pL;
int dl1 = dl0;
dl0 = l0 - l1;
for (unsigned int n = sd2 - 3; n; n--)
{
l1 = l0;
l0 = *--pL;
const int dl2 = dl1;
dl1 = dl0;
dl0 = l0 - l1;
pH--;
*pH += (-dl0 + ((((dl1 + (dl2 << 1) - pH[1]) << 1) - pH[1]) << 1) + 8) >> 4;
}
pH--;
*pH += (((dl0 + dl1 - pH[1]) << 1) + dl1 + 4) >> 3;
}
*--pH += (dl0 + 2) >> 2;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::SptC1DV_Inv(const unsigned int i_I, const unsigned int i_S)
{
COMP_TRYTHIS_SPEED
if (i_S > 2)
{
const unsigned int sd2 = i_S >> 1;
int **pL = &m_Data[sd2];
int **pH = pL + sd2;
int l1 = (*--pL)[i_I];
int l0 = (*--pL)[i_I];
int dl0 = l0 - l1;
(*--pH)[i_I] += (dl0 + 2) >> 2;
if (sd2 > 2)
{
l1 = l0;
l0 = (*--pL)[i_I];
int dl1 = dl0;
dl0 = l0 - l1;
for (unsigned int n = sd2 - 3; n; n--)
{
l1 = l0;
l0 = (*--pL)[i_I];
const int dl2 = dl1;
dl1 = dl0;
dl0 = l0 - l1;
pH--;
(*pH)[i_I] += (-dl0 + ((((dl1 + (dl2 << 1) - pH[1][i_I]) << 1) - pH[1][i_I]) << 1) + 8) >> 4;
}
pH--;
(*pH)[i_I] += (((dl0 + dl1 - pH[1][i_I]) << 1) + dl1 + 4) >> 3;
}
(*--pH)[i_I] += (dl0 + 2) >> 2;
}
COMP_CATCHTHIS_SPEED
}
void CWBlock::Resize(const unsigned int i_W, const unsigned int i_H)
{
COMP_TRYTHIS
if (m_W != i_W || m_H != i_H)
{
m_W = i_W;
m_H = i_H;
m_Data.clear();
m_Buffer.clear();
m_Tmp.clear();
m_Size = (unsigned long)m_W * m_H;
if (m_Size)
{
m_Data = std::vector<int *>(m_H, NULL);
m_Buffer = std::vector<int>(m_Size, 0);
for (unsigned int i = 0; i < m_H; i++)
m_Data[i] = &m_Buffer[i * m_W];
m_Tmp = std::vector<int>(m_W > m_H ? m_W : m_H, 0);
}
}
COMP_CATCHTHIS
}
void CWBlock::GetAndPad(CImage &i_Img,
const unsigned int i_X, const unsigned int i_Y,
const unsigned int i_W, const unsigned int i_H)
{
COMP_TRYTHIS
Assert(i_W <= m_W && i_H <= m_H, Util::CParamException());
int *p = &m_Buffer[0];
unsigned int i, y;
for (i = 0, y = i_Y; i < i_H; i++, y++)
{
const unsigned short *pI = i_Img.GetP()[y] + i_X;
unsigned int j;
for (j = 0; j < i_W; j++)
*p++ = *pI++;
if (j < m_W)
for (int c = p[-1]; j < m_W; j++)
*p++ = c;
}
for (; i < m_H; i++)
memcpy((char *)m_Data[i], (char *)m_Data[i - 1], sizeof(int) * m_W);
COMP_CATCHTHIS
}
void CWBlock::Put(CImage &o_Img,
const unsigned int i_X, const unsigned int i_Y,
const unsigned int i_W, const unsigned int i_H)
{
COMP_TRYTHIS
Assert(i_W <= m_W && i_H <= m_H, Util::CParamException());
const int maxCoef = (1L << o_Img.GetNB()) - 1;
for (unsigned int i = 0, y = i_Y; i < i_H; i++, y++)
{
const int *p = m_Data[i];
unsigned short *pO = o_Img.GetP()[y] + i_X;
for (unsigned int j = i_W; j; j--)
{
const int c = *p++;
*pO++ = c < 0 ? 0 : c > maxCoef ? maxCoef
: c;
}
}
COMP_CATCHTHIS
}
void CWBlock::IterateSt(const bool i_Forward, const unsigned int i_NbIte)
{
COMP_TRYTHIS
if (i_Forward)
for (unsigned int ite = 0; ite < i_NbIte; ite++)
St2D(true, m_W >> ite, m_H >> ite);
else
for (unsigned int ite = i_NbIte; ite > 0; ite--)
St2D(false, m_W >> (ite - 1), m_H >> (ite - 1));
COMP_CATCHTHIS
}
void CWBlock::IterateSptA(const bool i_Forward, const unsigned int i_NbIte)
{
COMP_TRYTHIS
if (i_Forward)
for (unsigned int ite = 0; ite < i_NbIte; ite++)
SptA2D(true, m_W >> ite, m_H >> ite);
else
for (unsigned int ite = i_NbIte; ite; ite--)
SptA2D(false, m_W >> (ite - 1), m_H >> (ite - 1));
COMP_CATCHTHIS
}
void CWBlock::IterateSptB(const bool i_Forward, const unsigned int i_NbIte)
{
COMP_TRYTHIS
if (i_Forward)
for (unsigned int ite = 0; ite < i_NbIte; ite++)
SptB2D(true, m_W >> ite, m_H >> ite);
else
for (unsigned int ite = i_NbIte; ite; ite--)
SptB2D(false, m_W >> (ite - 1), m_H >> (ite - 1));
COMP_CATCHTHIS
}
void CWBlock::IterateSptC(const bool i_Forward, const unsigned int i_NbIte)
{
COMP_TRYTHIS
if (i_Forward)
for (unsigned int ite = 0; ite < i_NbIte; ite++)
SptC2D(true, m_W >> ite, m_H >> ite);
else
for (unsigned int ite = i_NbIte; ite > 0; ite--)
SptC2D(false, m_W >> (ite - 1), m_H >> (ite - 1));
COMP_CATCHTHIS
}
int CWBlock::GetMaxCoef(void)
const
{
COMP_TRYTHIS
int maxC = 0L;
int minC = 0L;
const int *p = &m_Buffer[0];
for (unsigned long i = m_Size; i; i--)
{
const int c = *p++;
if (c > maxC)
maxC = c;
else if (c < minC)
minC = c;
}
if (maxC < -minC)
maxC = -minC;
return maxC;
COMP_CATCHTHIS
}
int CWBlock::GetQuadrantMaxCoef(const unsigned int i_X, const unsigned int i_Y,
const unsigned int i_W, const unsigned int i_H)
const
{
COMP_TRYTHIS_SPEED
Assert((i_X + i_W) <= m_W && (i_Y + i_H) <= m_H, Util::CParamException());
const unsigned int endY = i_Y + i_H;
int maxC = 0L;
int minC = 0L;
for (unsigned int i = i_Y; i < endY; i++)
{
const int *p = m_Data[i] + i_X;
for (unsigned int j = i_W; j; j--)
{
const int c = *p++;
if (c > maxC)
maxC = c;
else if (c < minC)
minC = c;
}
}
if (maxC < -minC)
maxC = -minC;
return maxC;
COMP_CATCHTHIS_SPEED
}
} // end namespace