int blockMode = 2; // if all else fails
if (colorCount == 4)
{
int curErrVal = INT_MAX;
int curErrIndex = -1;
for( int i = 0; i < pal4Count; i++ )
{
int pal1Err = colorDiff( pal[ pal4C[ i ]], colorLerp( pal[ pal4A[ i ]], pal[ pal4B[ i ]], 0.375 ));
int pal2Err = colorDiff( pal[ pal4D[ i ]], colorLerp( pal[ pal4A[ i ]], pal[ pal4B[ i ]], 0.625 ));
if( pal1Err < pal2Err ) pal1Err = pal2Err;
if( pal1Err < curErrVal )
{
curErrVal = pal1Err;
curErrIndex = i;
}
}
if(( curErrIndex >= 0 ) && ( curErrVal <= ( 2 * colorErr )))
{
lerpable++;
lerpColors[0] = pal[ pal4A[ curErrIndex ]];
lerpColors[1] = pal[ pal4B[ curErrIndex ]];
if( pal4A[ curErrIndex ] != 0 )
{
BYTE a = 0;
BYTE b = pal4A[ curErrIndex ];
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
}
if( pal4B[ curErrIndex ] != 1 )
{
BYTE a = 1;
BYTE b = pal4B[ curErrIndex ];
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
}
pal = lerpColors;
colorCount = 2;
blockMode = 3;
}
else
nonlerpable++;
/*
if (colorEqual(pal[1], colorLerp(pal[0], pal[3], 0.375), 2*colorErr) &&
colorEqual(pal[2], colorLerp(pal[0], pal[3], 0.625), 2*colorErr))
{
lerpable++;
lerpColors[0] = pal[0];
lerpColors[1] = pal[3];
BYTE a = 1;
BYTE b = 3;
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
pal = lerpColors;
colorCount = 2;
blockMode = 3;
} else nonlerpable++;
*/
}
else if (colorCount == 3)
{
int curErrVal = INT_MAX;
int curErrIndex = -1;
for( int i = 0; i < pal3Count; i++ )
{
int palErr = colorDiff( pal[ pal3C[ i ]], colorLerp( pal[ pal3A[ i ]], pal[ pal3B[ i ]], 0.5 ));
if( palErr < curErrVal )
{
curErrVal = palErr;
curErrIndex = i;
}
}
if(( curErrIndex >= 0 ) && ( curErrVal <= ( 2 * colorErr )))
{
lerpable++;
lerpColors[0] = pal[ pal3A[ curErrIndex ]];
lerpColors[1] = pal[ pal3B[ curErrIndex ]];
if( pal3A[ curErrIndex ] != 0 )
{
BYTE a = 0;
BYTE b = pal3A[ curErrIndex ];
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
}
if( pal3B[ curErrIndex ] != 1 )
{
BYTE a = 1;
BYTE b = pal3B[ curErrIndex ];
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
}
pal = lerpColors;
colorCount = colorPadCount = 2;
blockMode = 1;
}
else
{
colorPadCount = 4; // round up, colors are allocated two by two
nonlerpable++;
}
/*
if (colorEqual(pal[1], colorLerp(pal[0], pal[2], 0.5), 2*colorErr))
{
lerpable++;
lerpColors[0] = pal[0];
lerpColors[1] = pal[2];
BYTE a = 1;
BYTE b = 2;
FreeImage_SwapColors(tileQuant.getFIBitmap(), &pal[a], &pal[b], true);
FreeImage_SwapPaletteIndices(tileQuant.getFIBitmap(), &a, &b);
pal = lerpColors;
colorCount = colorPadCount = 2;
blockMode = 1;
}
else
{
colorPadCount = 4; // round up, colors are allocated two by two
nonlerpable++;
}
*/
}
else if (colorCount == 1)
{
colorPadCount = 2; // round up, colors are allocated two by two
} |