blob: 8933a8878d9311810358cd3468b52c104ebe0a28 [file] [log] [blame]
// ==========================================================
// FreeImage 3 Test Script
//
// Design and implementation by
// - Hervé Drolon (drolon@infonie.fr)
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================
#include "TestSuite.h"
// Local test functions
// ----------------------------------------------------------
BOOL testClone(const char *lpszPathName) {
FIBITMAP *dib1 = NULL, *dib2 = NULL;
try {
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(lpszPathName);
dib1 = FreeImage_Load(fif, lpszPathName, 0);
if(!dib1) throw(1);
dib2 = FreeImage_Clone(dib1);
if(!dib2) throw(1);
FreeImage_Unload(dib1);
FreeImage_Unload(dib2);
return TRUE;
}
catch(int) {
if(dib1) FreeImage_Unload(dib1);
if(dib2) FreeImage_Unload(dib2);
return FALSE;
}
return FALSE;
}
void testAllocateCloneUnload(const char *lpszPathName) {
printf("testAllocateCloneUnload ...");
BOOL bResult = testClone(lpszPathName);
assert(bResult);
printf("\tOK\n");
}
BOOL testAllocateCloneUnloadType(FREE_IMAGE_TYPE image_type, unsigned width, unsigned height) {
FIBITMAP *image = NULL;
FIBITMAP *clone = NULL;
FIBITMAP *standard = NULL;
unsigned x, y;
try {
// test allocation function
image = FreeImage_AllocateT(image_type, width, height, 8);
if(!image) throw(1);
FREE_IMAGE_TYPE type = FreeImage_GetImageType(image);
if(image_type != type) throw(1);
// test pixel access
switch(image_type) {
case FIT_BITMAP:
if(FreeImage_GetBPP(image) == 8) {
for(y = 0; y < FreeImage_GetHeight(image); y++) {
BYTE *bits = (BYTE *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
}
break;
case FIT_UINT16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
unsigned short *bits = (unsigned short *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_INT16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
short *bits = (short *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_UINT32:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
unsigned long *bits = (unsigned long *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_INT32:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
long *bits = (long *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_FLOAT:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
float *bits = (float *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_DOUBLE:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
double *bits = (double *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_COMPLEX:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FICOMPLEX *bits = (FICOMPLEX *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].r = 128;
bits[x].i = 128;
}
}
break;
case FIT_RGB16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGB16 *bits = (FIRGB16 *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
}
}
break;
case FIT_RGBF:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBF *bits = (FIRGBF *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
}
}
break;
case FIT_RGBA16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBA16 *bits = (FIRGBA16 *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
bits[x].alpha = 128;
}
}
break;
case FIT_RGBAF:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBAF *bits = (FIRGBAF *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
bits[x].alpha = 128;
}
}
break;
}
// test clone function
clone = FreeImage_Clone(image);
if(!clone) throw(1);
if(FreeImage_GetImageType(clone) != image_type) throw(1);
switch(image_type) {
case FIT_BITMAP:
if(FreeImage_GetBPP(clone) == 8) {
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
BYTE *bits = (BYTE *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
}
break;
case FIT_UINT16:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
unsigned short *bits = (unsigned short *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_INT16:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
short *bits = (short *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_UINT32:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
unsigned long *bits = (unsigned long *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_INT32:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
long *bits = (long *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_FLOAT:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
float *bits = (float *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_DOUBLE:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
double *bits = (double *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if(bits[x] != 128)
throw(1);
}
}
break;
case FIT_COMPLEX:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
FICOMPLEX *bits = (FICOMPLEX *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if((bits[x].r != 128) || ((bits[x].r - bits[x].i) != 0))
throw(1);
}
}
break;
case FIT_RGB16:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
FIRGB16 *bits = (FIRGB16 *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if((bits[x].red != 128) || (bits[x].green != 128) || (bits[x].blue != 128))
throw(1);
}
}
break;
case FIT_RGBF:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
FIRGBF *bits = (FIRGBF *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if((bits[x].red != 128) || (bits[x].green != 128) || (bits[x].blue != 128))
throw(1);
}
}
break;
case FIT_RGBA16:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
FIRGBA16 *bits = (FIRGBA16 *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if((bits[x].red != 128) || (bits[x].green != 128) || (bits[x].blue != 128) || (bits[x].alpha != 128))
throw(1);
}
}
break;
case FIT_RGBAF:
for(y = 0; y < FreeImage_GetHeight(clone); y++) {
FIRGBAF *bits = (FIRGBAF *)FreeImage_GetScanLine(clone, y);
for(x = 0; x < FreeImage_GetWidth(clone); x++) {
if((bits[x].red != 128) || (bits[x].green != 128) || (bits[x].blue != 128) || (bits[x].alpha != 128))
throw(1);
}
}
break;
}
// test unload function
FreeImage_Unload(clone);
clone = NULL;
FreeImage_Unload(image);
image = NULL;
} catch(int) {
if(image) FreeImage_Unload(image);
if(clone) FreeImage_Unload(clone);
return FALSE;
}
return TRUE;
}
BOOL testLoadSaveConvertImageType(FIBITMAP *src, FREE_IMAGE_TYPE image_type, unsigned width, unsigned height) {
FIBITMAP *dst = NULL;
FIBITMAP *chk = NULL;
BOOL bResult = TRUE;
try {
// convert to type image_type
dst = FreeImage_ConvertToType(src, image_type);
if(!dst) throw(1);
// save image as TIFF
bResult = FreeImage_Save(FIF_TIFF, dst, "TestImageType.tif", TIFF_DEFAULT);
if(!bResult) throw(1);
// destroy dst
FreeImage_Unload(dst);
dst = NULL;
// load image
dst = FreeImage_Load(FIF_TIFF, "TestImageType.tif", TIFF_DEFAULT);
if(!dst) throw(1);
// convert to standard bitmap (linear scaling)
chk = FreeImage_ConvertToType(dst, FIT_BITMAP, TRUE);
if(!chk) throw(1);
FreeImage_Unload(dst);
dst = NULL;
// save image as TIFF
bResult = FreeImage_Save(FIF_TIFF, chk, "TestImageType.tif", TIFF_DEFAULT);
if(!bResult) throw(1);
FreeImage_Unload(chk);
chk = NULL;
} catch(int) {
if(dst) FreeImage_Unload(dst);
if(chk) FreeImage_Unload(chk);
return FALSE;
}
return TRUE;
}
BOOL testLoadSaveConvertComplexType(FIBITMAP *src, unsigned width, unsigned height, FREE_IMAGE_COLOR_CHANNEL channel) {
FIBITMAP *dst = NULL;
FIBITMAP *chk_double = NULL;
FIBITMAP *chk = NULL;
BOOL bResult = TRUE;
try {
// convert to type FICOMPLEX
dst = FreeImage_ConvertToType(src, FIT_COMPLEX);
if(!dst) throw(1);
// save image as TIFF
bResult = FreeImage_Save(FIF_TIFF, dst, "TestImageType.tif", TIFF_DEFAULT);
if(!bResult) throw(1);
// destroy dst
FreeImage_Unload(dst);
dst = NULL;
// load image
dst = FreeImage_Load(FIF_TIFF, "TestImageType.tif", TIFF_DEFAULT);
if(!dst) throw(1);
// convert to type FIT_DOUBLE
chk_double = FreeImage_GetComplexChannel(dst, channel);
if(!chk_double) throw(1);
FreeImage_Unload(dst);
dst = NULL;
// convert to standard bitmap (linear scaling)
chk = FreeImage_ConvertToType(chk_double, FIT_BITMAP, TRUE);
if(!chk) throw(1);
FreeImage_Unload(chk_double);
chk_double = NULL;
// save image as TIFF
bResult = FreeImage_Save(FIF_TIFF, chk, "TestImageType.tif", TIFF_DEFAULT);
if(!bResult) throw(1);
FreeImage_Unload(chk);
chk = NULL;
} catch(int) {
if(dst) FreeImage_Unload(dst);
if(chk_double) FreeImage_Unload(chk_double);
if(chk) FreeImage_Unload(chk);
return FALSE;
}
return TRUE;
}
// Main test functions
// ----------------------------------------------------------
void testImageType(unsigned width, unsigned height) {
BOOL bResult = FALSE;
printf("testImageType ...");
bResult = testAllocateCloneUnloadType(FIT_BITMAP, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_UINT16, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_INT16, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_UINT32, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_INT32, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_FLOAT, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_DOUBLE, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_COMPLEX, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_RGB16, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_RGBA16, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_RGBF, width, height);
assert(bResult);
bResult = testAllocateCloneUnloadType(FIT_RGBAF, width, height);
assert(bResult);
printf("\tOK\n");
}
void testImageTypeTIFF(unsigned width, unsigned height) {
BOOL bResult = FALSE;
printf("testImageTypeTIFF ...");
// create a test 8-bit image
FIBITMAP *src = createZonePlateImage(width, height, 128);
assert(src != NULL);
// save for further examination
bResult = FreeImage_Save(FIF_PNG, src, "zoneplate.png", PNG_DEFAULT);
assert(bResult);
// test load /save / convert
// -------------------------
bResult = testLoadSaveConvertImageType(src, FIT_BITMAP, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_UINT16, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_INT16, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_UINT32, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_INT32, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_FLOAT, width, height);
assert(bResult);
bResult = testLoadSaveConvertImageType(src, FIT_DOUBLE, width, height);
assert(bResult);
// complex type
bResult = testLoadSaveConvertComplexType(src, width, height, FICC_REAL);
assert(bResult);
bResult = testLoadSaveConvertComplexType(src, width, height, FICC_IMAG);
assert(bResult);
bResult = testLoadSaveConvertComplexType(src, width, height, FICC_MAG);
assert(bResult);
bResult = testLoadSaveConvertComplexType(src, width, height, FICC_PHASE);
assert(bResult);
// free test image
FreeImage_Unload(src);
printf("\tOK\n");
}