bool M_saveImage(const char * filename, void * data, unsigned int quality) { DevILInit(); ILuint ImgId = 0; ilGenImages(1, &ImgId); // bind this image name. ilBindImage(ImgId); MImage * image = (MImage *)data; unsigned int width = image->getWidth(); unsigned int height = image->getHeight(); unsigned int components = image->getComponents(); if(components == 3) ilTexImage(width, height, 1, 3, IL_RGB, IL_UNSIGNED_BYTE, image->getData()); else if(components == 4) ilTexImage(width, height, 1, 4, IL_RGBA, IL_UNSIGNED_BYTE, image->getData()); iluFlipImage(); if(quality < 100) ilSetInteger(IL_JPG_QUALITY, quality); ilEnable(IL_FILE_OVERWRITE); ilSaveImage(filename); ilDeleteImages(1, &ImgId); DevILShutDown(); return true; }
void MTextureRef::update(void) { M_PROFILE_SCOPE(MTextureRef::update); MEngine * engine = MEngine::getInstance(); MRenderingContext * render = engine->getRenderingContext(); MImage image; if(engine->getImageLoader()->loadData(getFilename(), &image)) { if(m_textureId == 0) render->createTexture(&m_textureId); m_components = image.getComponents(); m_width = image.getWidth(); m_height = image.getHeight(); // send texture image render->bindTexture(m_textureId); render->sendTextureImage(&image, isMipmapEnabled(), 1, 0); } }
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; }