Esempio n. 1
0
BOOL fipImage::convertTo16Bits565() {
	if(_dib) {
		FIBITMAP *dib16_565 = FreeImage_ConvertTo16Bits565(_dib);
		return replace(dib16_565);
	}
	return FALSE;
}
/**
 * Helper to encapsulate Bpp conversion using FreeImage, taking into consideration color type. Creates a new bitmap if needed. Can return the same one.
 * @param pHandle		FIBITMAP as defined by the Freeimage library.
 * @param pNewBpp		the new bpp that the supplied FIBITMAP is to be coverted to.
 */
FIBITMAP* FreeImageHelper::convertBpp(FIBITMAP* pHandle, int pNewBpp) {	
	//Convert the bit depth
	FIBITMAP *converted = NULL;
	
	//Convert Bpp only if needed
	if (pNewBpp != static_cast<int>(FreeImage_GetBPP(pHandle))) {
		//Transform bpp to the pixel format
		switch (pNewBpp) {
			case (4):
				converted = FreeImage_ConvertTo4Bits(pHandle);
				break;
			case (8):
				converted = FreeImage_ConvertTo8Bits(pHandle);
				break;
			case(16):
				converted = FreeImage_ConvertTo16Bits565(pHandle);  //There's option of 16Bits555. But leaves unused bits. Chosen 565 because it's most common
				break;
			case(24):
			   converted = FreeImage_ConvertTo24Bits(pHandle);    
			    break;
			case(32): {
			    converted = FreeImage_ConvertTo32Bits (pHandle); 
				}
			    break;
			default:
				converted = NULL;
				break;
		}
	} else {
		//No change, just set 'converted' handle to current one
		converted = pHandle;
	}

	return converted;
}
/**
 * Helper to encapsulate color conversion using FreeImage, taking into consideration bpp and original color type.
 * @param pHandle		FIBITMAP as defined by the Freeimage library.
 * @param pNewFormat		IndieLib colorformat to convert to.
 */
FIBITMAP* FreeImageHelper::convertColorFormat(FIBITMAP* pHandle, int pNewFormat) {
	int colorFormat = FreeImageHelper::calculateINDFormat(pHandle);
	if (colorFormat == pNewFormat) return pHandle;

	FIBITMAP* converted (NULL);

	//TODO: Simplified version only accepts pNewFormat as IND_RGB or IND_RGBA
	//Expand it to convert to any format needed
	if (pNewFormat != IND_RGB && pNewFormat != IND_RGBA) return NULL;
		
	//Check target format
	switch (pNewFormat) {
		case IND_LUMINANCE:
			//TODO
			break;

		case IND_COLOUR_INDEX: 			
			break;
		case IND_RGB:
			if (IND_COLOUR_INDEX == colorFormat) {
				converted = FreeImage_ConvertTo16Bits565(pHandle);
			} else {
				converted = FreeImage_ConvertTo24Bits(pHandle);
			}

			break;

		case IND_RGBA:
			if (IND_COLOUR_INDEX == colorFormat) {
				converted = FreeImage_ConvertTo24Bits(pHandle);
			} else {
				converted = FreeImage_ConvertTo32Bits(pHandle);
			}
			
			break;

		default:
			g_debug->header("INCORRECT TEXTURE COLOR FORMAT SPECIFIED TO CONVERT TO", 2);
			break;
	}

	return converted;
}
Esempio n. 4
0
void poImage::setNumChannels(uint c) {
	if(isValid() && FreeImage_GetBPP(bitmap) != c*8) {
		FIBITMAP *dst = NULL;
		switch(c) {
			case 1:	
				dst = FreeImage_ConvertTo8Bits(bitmap); 
				break;
			case 2:	
				dst = FreeImage_ConvertTo16Bits565(bitmap); 
				break;
			case 3:	
				dst = FreeImage_ConvertTo24Bits(bitmap); 
				break;
			case 4:	
				dst = FreeImage_ConvertTo32Bits(bitmap); 
				break;
		}
		FreeImage_Unload(bitmap);
		bitmap = dst;
	}
}
int main(int argc, char *argv[])
{
	GtkWidget *window, *imagebox;
	GdkVisual *visual;
	GdkImage *image;
	FIBITMAP *dib;
	int y;

	// initialize the FreeImage library
	FreeImage_Initialise();

	dib = FreeImage_Load(FIF_PNG, "freeimage.png", PNG_DEFAULT);

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	gtk_signal_connect(GTK_OBJECT(window), "destroy",
				GTK_SIGNAL_FUNC(destroy), NULL);

	visual = gdk_visual_get_system();

	image = gdk_image_new(GDK_IMAGE_NORMAL,visual,
		FreeImage_GetWidth(dib),FreeImage_GetHeight(dib));

	g_print("picture: %d bpp\n"
		"system:  %d bpp   byteorder: %d\n"
		"  redbits: %d   greenbits: %d   bluebits: %d\n"
		"image:   %d bpp   %d bytes/pixel\n",
		FreeImage_GetBPP(dib),
		visual->depth,visual->byte_order,
		visual->red_prec,visual->green_prec,visual->blue_prec,
		image->depth,image->bpp );

	if (FreeImage_GetBPP(dib) != (image->bpp << 3)) {
		FIBITMAP *ptr;

		switch (image->bpp) {
			case 1:
				ptr = FreeImage_ConvertTo8Bits(dib);
				break;

			case 2:
				if (image->depth == 15) {
					ptr = FreeImage_ConvertTo16Bits555(dib);
				} else {
					ptr = FreeImage_ConvertTo16Bits565(dib);
				}

				break;
			case 3:
				ptr = FreeImage_ConvertTo24Bits(dib);
				break;

			default:
			case 4:
				ptr = FreeImage_ConvertTo32Bits(dib);
				break;
		}

		FreeImage_Unload(dib);
		dib = ptr;
	}

//makes it upside down :(
//	memcpy(image->mem, FreeImage_GetBits(dib), image->bpl * image->height);

	BYTE *ptr = FreeImage_GetBits(dib);

	for (y = 0; y < image->height; y++) {
		memcpy(image->mem + (y * image->bpl),
			ptr + ((image->height - y - 1) * image->bpl),
			image->bpl);
	}

	FreeImage_Unload(dib);

	imagebox = gtk_image_new(image, NULL);
	gtk_container_add(GTK_CONTAINER(window), imagebox);

	gtk_widget_show(imagebox);
	gtk_widget_show(window);

	gtk_main();

	// release the FreeImage library
	FreeImage_DeInitialise();

	return 0;
}