Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strFwdTransform.c view on Meta::CPAN
d = *pd;
/** butterflies **/
d += a;
c -= b;
a -= (t1 = d >> 1);
b += (t2 = c >> 1);
/** rotate pi/4 **/
a += (b * 3 + 4) >> 3;
b -= (a * 3 + 2) >> 2;
a += (b * 3 + 6) >> 3;
/** butterflies **/
b -= t2;
a += t1;
c += b;
d -= a;
*pa = a;
*pb = b;
*pc = c;
*pd = d;
}
/** Kron(Rotate(pi/8), [1 1; 1 -1]/sqrt(2)) **/
/** [a b c d] => [D C A B] **/
Void fwdOdd(PixelI *pa, PixelI *pb, PixelI *pc, PixelI *pd)
{
PixelI a, b, c, d;
a = *pa;
b = *pb;
c = *pc;
d = *pd;
/** butterflies **/
b -= c;
a += d;
c += (b + 1) >> 1;
d = ((a + 1) >> 1) - d;
/** rotate pi/8 **/
ROTATE2(a, b);
ROTATE2(c, d);
/** butterflies **/
d += (b) >> 1;
c -= (a + 1) >> 1;
b -= d;
a += c;
*pa = a;
*pb = b;
*pc = c;
*pd = d;
}
/*************************************************************************
Top-level function to tranform possible part of a macroblock
*************************************************************************/
Void transformMacroblock(CWMImageStrCodec * pSC)
{
OVERLAP olOverlap = pSC->WMISCP.olOverlap;
COLORFORMAT cfColorFormat = pSC->m_param.cfColorFormat;
Bool left = (pSC->cColumn == 0), right = (pSC->cColumn == pSC->cmbWidth);
Bool top = (pSC->cRow == 0), bottom = (pSC->cRow == pSC->cmbHeight);
Bool leftORright = (left || right), topORbottom = (top || bottom);
Bool topORleft = (left || top);// rightORbottom = (right || bottom);
Bool leftAdjacentColumn = (pSC->cColumn == 1), rightAdjacentColumn = (pSC->cColumn == pSC->cmbWidth - 1);
// Bool topAdjacentRow = (pSC->cRow == 1), bottomAdjacentRow = (pSC->cRow == pSC->cmbHeight - 1);
PixelI * p = NULL;// * pt = NULL;
Int i, j;
Int iNumChromaFullPlanes = (Int)((YUV_420 == cfColorFormat || YUV_422 == cfColorFormat) ?
1 : pSC->m_param.cNumChannels);
#define mbX pSC->mbX
#define mbY pSC->mbY
#define tileX pSC->tileX
#define tileY pSC->tileY
#define bVertTileBoundary pSC->bVertTileBoundary
#define bHoriTileBoundary pSC->bHoriTileBoundary
#define bOneMBLeftVertTB pSC->bOneMBLeftVertTB
#define bOneMBRightVertTB pSC->bOneMBRightVertTB
#define iPredBefore pSC->iPredBefore
#define iPredAfter pSC->iPredAfter
if (pSC->WMISCP.bUseHardTileBoundaries) {
//Add tile location information
if (pSC->cColumn == 0) {
bVertTileBoundary = FALSE;
tileY = 0;
}
bOneMBLeftVertTB = bOneMBRightVertTB = FALSE;
if(tileY > 0 && tileY <= pSC->WMISCP.cNumOfSliceMinus1H && (pSC->cColumn - 1) == pSC->WMISCP.uiTileY[tileY])
bOneMBRightVertTB = TRUE;
if(tileY < pSC->WMISCP.cNumOfSliceMinus1H && pSC->cColumn == pSC->WMISCP.uiTileY[tileY + 1]) {
bVertTileBoundary = TRUE;
tileY++;
}
else
bVertTileBoundary = FALSE;
if(tileY < pSC->WMISCP.cNumOfSliceMinus1H && (pSC->cColumn + 1) == pSC->WMISCP.uiTileY[tileY + 1])
bOneMBLeftVertTB = TRUE;
if (pSC->cRow == 0) {
bHoriTileBoundary = FALSE;
tileX = 0;
}
else if(mbY != pSC->cRow && tileX < pSC->WMISCP.cNumOfSliceMinus1V && pSC->cRow == pSC->WMISCP.uiTileX[tileX + 1]) {
bHoriTileBoundary = TRUE;
tileX++;
}
else if(mbY != pSC->cRow)
bHoriTileBoundary = FALSE;
}
else {
bVertTileBoundary = FALSE;
bHoriTileBoundary = FALSE;
bOneMBLeftVertTB = FALSE;
bOneMBRightVertTB = FALSE;
}
( run in 1.212 second using v1.01-cache-2.11-cpan-0bd6704ced7 )