Compute fast inverse wavelet transform of all 4 subbands of given level and stores result in LL subband of level - 1.
{
ASSERT(srcLevel > 0 && srcLevel <
m_nLevels);
const int destLevel = srcLevel - 1;
const UINT32 width = destBand->
GetWidth();
UINT32 row0, row1, row2, row3, i, k, origin = 0;
if (!destBand->
AllocMemory())
return InsufficientMemory;
#ifdef __PGFROISUPPORT__
const UINT32 srcLeft = (m_ROIs.ROIisSupported()) ? m_ROIs.Left(srcLevel) : 0;
const UINT32 srcTop = (m_ROIs.ROIisSupported()) ? m_ROIs.Top(srcLevel) : 0;
UINT32 destWidth = destBand->BufferWidth();
PGFRect destROI = (m_ROIs.ROIisSupported()) ? m_ROIs.GetROI(destLevel) :
PGFRect(0, 0, width, height);
UINT32 destHeight = destROI.
Height();
origin++;
destWidth--;
}
origin += destWidth;
destHeight--;
}
UINT32 left = destROI.
left >> 1;
UINT32 top = destROI.
top >> 1;
left -= srcLeft;
top -= srcTop;
}
#else
PGFRect destROI(0, 0, width, height);
const UINT32 destWidth = width;
const UINT32 destHeight = height;
}
#endif
row0 = origin; row1 = row0 + destWidth;
for (k=0; k < destWidth; k++) {
ASSERT(row0 < destBand->
m_size);
ASSERT(row1 < destBand->
m_size);
dest[row0] -= ((dest[row1] +
c1) >> 1);
row0++; row1++;
}
row2 = row1; row1 = row0; row0 = row0 - destWidth; row3 = row2 + destWidth;
for (i=destROI.
top + 2; i < destROI.
bottom - 1; i += 2) {
for (k=0; k < destWidth; k++) {
ASSERT(row0 < destBand->
m_size);
ASSERT(row1 < destBand->
m_size);
ASSERT(row2 < destBand->
m_size);
ASSERT(row3 < destBand->
m_size);
dest[row2] -= ((dest[row1] + dest[row3] +
c2) >> 2);
dest[row1] += ((dest[row0] + dest[row2] +
c1) >> 1);
row0++; row1++; row2++; row3++;
}
row0 = row1; row1 = row2; row2 = row3; row3 += destWidth;
}
if (destHeight & 1) {
for (k=0; k < destWidth; k++) {
ASSERT(row0 < destBand->
m_size);
ASSERT(row1 < destBand->
m_size);
ASSERT(row2 < destBand->
m_size);
dest[row2] -= ((dest[row1] +
c1) >> 1);
dest[row1] += ((dest[row0] + dest[row2] +
c1) >> 1);
row0++; row1++; row2++;
}
} else {
for (k=0; k < destWidth; k++) {
ASSERT(row0 < destBand->
m_size);
ASSERT(row1 < destBand->
m_size);
dest[row1] += dest[row0];
row0++; row1++;
}
}
} else {
row0 = origin; row1 = row0 + destWidth;
for (k=0; k < destHeight; k += 2) {
row0 += destWidth << 1; row1 += destWidth << 1;
}
if (destHeight & 1) {
}
}
}
*w = destWidth;
*h = destHeight;
*data = dest;
return NoError;
}