Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImageToolkit/ClassicRotate.cpp view on Meta::CPAN
else {
// Perform last rotation
FIBITMAP *dst = Rotate45(image, dAngle, bkcolor);
if(src != image) {
// Middle image was required, free it now.
FreeImage_Unload(image);
}
return dst;
}
}
// ==========================================================
FIBITMAP *DLL_CALLCONV
FreeImage_Rotate(FIBITMAP *dib, double angle, const void *bkcolor) {
if(!FreeImage_HasPixels(dib)) return NULL;
if(0 == angle) {
return FreeImage_Clone(dib);
}
// DIB are stored upside down ...
angle *= -1;
try {
unsigned bpp = FreeImage_GetBPP(dib);
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
switch(image_type) {
case FIT_BITMAP:
if(bpp == 1) {
// only rotate for integer multiples of 90 degree
if(fmod(angle, 90) != 0)
return NULL;
// perform the rotation
FIBITMAP *dst = RotateAny(dib, angle, bkcolor);
if(!dst) throw(1);
// build a greyscale palette
RGBQUAD *dst_pal = FreeImage_GetPalette(dst);
if(FreeImage_GetColorType(dib) == FIC_MINISBLACK) {
dst_pal[0].rgbRed = dst_pal[0].rgbGreen = dst_pal[0].rgbBlue = 0;
dst_pal[1].rgbRed = dst_pal[1].rgbGreen = dst_pal[1].rgbBlue = 255;
} else {
dst_pal[0].rgbRed = dst_pal[0].rgbGreen = dst_pal[0].rgbBlue = 255;
dst_pal[1].rgbRed = dst_pal[1].rgbGreen = dst_pal[1].rgbBlue = 0;
}
// copy metadata from src to dst
FreeImage_CloneMetadata(dst, dib);
return dst;
}
else if((bpp == 8) || (bpp == 24) || (bpp == 32)) {
FIBITMAP *dst = RotateAny(dib, angle, bkcolor);
if(!dst) throw(1);
if(bpp == 8) {
// copy original palette to rotated bitmap
RGBQUAD *src_pal = FreeImage_GetPalette(dib);
RGBQUAD *dst_pal = FreeImage_GetPalette(dst);
memcpy(&dst_pal[0], &src_pal[0], 256 * sizeof(RGBQUAD));
// copy transparency table
FreeImage_SetTransparencyTable(dst, FreeImage_GetTransparencyTable(dib), FreeImage_GetTransparencyCount(dib));
// copy background color
RGBQUAD bkcolor;
if( FreeImage_GetBackgroundColor(dib, &bkcolor) ) {
FreeImage_SetBackgroundColor(dst, &bkcolor);
}
}
// copy metadata from src to dst
FreeImage_CloneMetadata(dst, dib);
return dst;
}
break;
case FIT_UINT16:
case FIT_RGB16:
case FIT_RGBA16:
case FIT_FLOAT:
case FIT_RGBF:
case FIT_RGBAF:
{
FIBITMAP *dst = RotateAny(dib, angle, bkcolor);
if(!dst) throw(1);
// copy metadata from src to dst
FreeImage_CloneMetadata(dst, dib);
return dst;
}
break;
}
} catch(int) {
return NULL;
}
return NULL;
}
( run in 0.803 second using v1.01-cache-2.11-cpan-5623c5533a1 )