164 lines
5.0 KiB
C++
164 lines
5.0 KiB
C++
// ==========================================================
|
|
// 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
|
|
// ----------------------------------------------------------
|
|
|
|
static void testBasicWrapper(BOOL copySource, BYTE *bits, FREE_IMAGE_TYPE type, int width, int height, int pitch, unsigned bpp) {
|
|
FIBITMAP *src = NULL;
|
|
FIBITMAP *clone = NULL;
|
|
FIBITMAP *dst = NULL;
|
|
|
|
// allocate a wrapper
|
|
src = FreeImage_ConvertFromRawBitsEx(copySource, bits, type, width, height, pitch, bpp, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE);
|
|
assert(src != NULL);
|
|
|
|
// test clone
|
|
clone = FreeImage_Clone(src);
|
|
assert(clone != NULL);
|
|
|
|
// test in-place processing
|
|
FreeImage_Invert(src);
|
|
|
|
// test processing
|
|
dst = FreeImage_ConvertToFloat(src);
|
|
assert(dst != NULL);
|
|
|
|
FreeImage_Unload(dst);
|
|
FreeImage_Unload(clone);
|
|
|
|
// unload the wrapper
|
|
FreeImage_Unload(src);
|
|
}
|
|
|
|
static void testViewport(FIBITMAP *dib) {
|
|
FIBITMAP *src = NULL;
|
|
|
|
// define a viewport as [vp_x, vp_y, vp_width, vp_height]
|
|
// (assume the image is larger than the viewport)
|
|
int vp_width = 300;
|
|
int vp_height = 200;
|
|
int vp_x = FreeImage_GetWidth(dib) / 2 - vp_width / 2;
|
|
int vp_y = FreeImage_GetHeight(dib) / 2 - vp_height / 2;
|
|
|
|
// point the viewport data
|
|
unsigned bytes_per_pixel = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib);
|
|
BYTE *data = FreeImage_GetBits(dib) + vp_y * FreeImage_GetPitch(dib) + vp_x * bytes_per_pixel;
|
|
|
|
// wrap a section (no copy)
|
|
src = FreeImage_ConvertFromRawBitsEx(FALSE/*copySource*/, data, FIT_BITMAP, vp_width, vp_height, FreeImage_GetPitch(dib), FreeImage_GetBPP(dib), FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
|
|
|
|
// save the section (note that the image is inverted due to previous processing)
|
|
FreeImage_Save(FIF_PNG, src, "viewport.png");
|
|
|
|
// unload the wrapper
|
|
FreeImage_Unload(src);
|
|
}
|
|
|
|
// Main test functions
|
|
// ----------------------------------------------------------
|
|
|
|
void testWrappedBuffer(const char *lpszPathName, int flags) {
|
|
FIBITMAP *dib = NULL;
|
|
|
|
// simulate a user provided buffer
|
|
// -------------------------------
|
|
|
|
// load the dib
|
|
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(lpszPathName);
|
|
dib = FreeImage_Load(fif, lpszPathName, flags);
|
|
assert(dib != NULL);
|
|
|
|
// get data info
|
|
FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib);
|
|
unsigned width = FreeImage_GetWidth(dib);
|
|
unsigned height = FreeImage_GetHeight(dib);
|
|
unsigned pitch = FreeImage_GetPitch(dib);
|
|
unsigned bpp = FreeImage_GetBPP(dib);
|
|
BYTE *bits = FreeImage_GetBits(dib);
|
|
|
|
// test wrapped buffer manipulations
|
|
// -------------------------------
|
|
|
|
testBasicWrapper(TRUE /*copySource*/, bits, type, width, height, pitch, bpp);
|
|
|
|
testBasicWrapper(FALSE /*copySource*/, bits, type, width, height, pitch, bpp);
|
|
|
|
// test another use-case : viewport
|
|
testViewport(dib);
|
|
|
|
// unload the user provided buffer
|
|
// -------------------------------
|
|
FreeImage_Unload(dib);
|
|
}
|
|
|
|
void testCreateView(const char *lpszPathName, int flags) {
|
|
FIBITMAP *dib = NULL;
|
|
FIBITMAP *view = NULL;
|
|
|
|
// test working with views
|
|
// -------------------------------
|
|
|
|
// load the dib
|
|
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(lpszPathName);
|
|
dib = FreeImage_Load(fif, lpszPathName, flags);
|
|
assert(dib != NULL);
|
|
|
|
// get data info
|
|
FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib);
|
|
assert(type == FIT_BITMAP);
|
|
|
|
unsigned width = FreeImage_GetWidth(dib);
|
|
unsigned height = FreeImage_GetHeight(dib);
|
|
unsigned pitch = FreeImage_GetPitch(dib);
|
|
unsigned bpp = FreeImage_GetBPP(dib);
|
|
|
|
// create a view around the center of the image
|
|
int cx = width / 2;
|
|
int cy = height / 2;
|
|
int ext_x = width / 4;
|
|
int ext_y = height / 4;
|
|
|
|
unsigned left = cx - ext_x;
|
|
unsigned right = cx + ext_x;
|
|
unsigned top = cy - ext_y;
|
|
unsigned bottom = cy + ext_y;
|
|
// make pitch odd
|
|
if ((right - left) % 2 == 0) {
|
|
right++;
|
|
}
|
|
|
|
view = FreeImage_CreateView(dib, left, top, right, bottom);
|
|
assert(FreeImage_GetPitch(view) == pitch);
|
|
assert(FreeImage_GetBPP(view) == bpp);
|
|
|
|
// save as BMP - check correct pitch handling
|
|
FreeImage_Save(FIF_BMP, view, "test_view.bmp", 0);
|
|
|
|
// no longer needed
|
|
FreeImage_Unload(view);
|
|
|
|
FreeImage_Unload(dib);
|
|
}
|