コード例 #1
0
ファイル: MFreeImageLoader.cpp プロジェクト: UPO33/Maratis-4
bool M_saveImage(const char * filename, void * data)
{
	if(! filename)
		return false;
		
	if(! data)
		return false;
		
		
	// format
	FREE_IMAGE_FORMAT format = FreeImage_GetFIFFromFilename(filename);
	if(format == FIF_UNKNOWN)
	{
		printf("Error freeImage: unknow image format %s\n", filename);
		return false;
	}
		
		
	// image
	MImage * image = (MImage *)data;
	if(! image->getData())
		return false;
	
	unsigned int width = image->getWidth();
	unsigned int height = image->getHeight();
	unsigned int components = image->getComponents();
	unsigned int yStep = width*components;
	
	FIBITMAP * dib = NULL;
	if(image->getDataType() == M_UBYTE)
	{
		dib = FreeImage_AllocateT(FIT_BITMAP, width, height, components*8);
		if(dib)
		{
			unsigned char * srcBits = (unsigned char *)image->getData();
			for(unsigned int y=0; y<height; y++)
			{
				BYTE * bits = FreeImage_GetScanLine(dib, y);
				memcpy(bits, srcBits, yStep*sizeof(char));
				srcBits += yStep;
			}
			
			if(components == 3 || components == 4)
				SwapRedBlue32(dib);
		}
	}
	else if(image->getDataType() == M_FLOAT)
	{
		switch(image->getComponents())
		{
		case 1:
			dib = FreeImage_AllocateT(FIT_FLOAT, image->getWidth(), image->getHeight(), 32);
			break;
		case 3:
			dib = FreeImage_AllocateT(FIT_RGBF, image->getWidth(), image->getHeight(), 3*32);
			break;
		case 4:
			dib = FreeImage_AllocateT(FIT_RGBAF, image->getWidth(), image->getHeight(), 4*32);
			break;
		}
		
		if(dib)
		{
			float * srcBits = (float *)image->getData();
			for(unsigned int y=0; y<height; y++)
			{
				BYTE * bits = FreeImage_GetScanLine(dib, y);
				memcpy(bits, srcBits, yStep*sizeof(float));
				srcBits += yStep;
			}
		}
	}
	
	
	if(dib)
	{
		// flip
		FreeImage_FlipVertical(dib);

		// save
		if(FreeImage_Save(format, dib, filename, PNG_Z_BEST_SPEED))
		{
			FreeImage_Unload(dib);
			return true;
		}
	}
	
		
	return false;
}