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; }