bool CTexture::loadTexture2D(string a_sPath, bool bGenerateMipMaps) { FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; FIBITMAP* dib(0); fif = FreeImage_GetFileType(a_sPath.c_str(), 0); // Check the file signature and deduce its format if(fif == FIF_UNKNOWN) // If still unknown, try to guess the file format from the file extension fif = FreeImage_GetFIFFromFilename(a_sPath.c_str()); if(fif == FIF_UNKNOWN) // If still unknown, return failure return false; if(FreeImage_FIFSupportsReading(fif)) // Check if the plugin has reading capabilities and load the file dib = FreeImage_Load(fif, a_sPath.c_str()); if(!dib) return false; BYTE* bDataPointer = FreeImage_GetBits(dib); // Retrieve the image data // If somehow one of these failed (they shouldn't), return failure if(bDataPointer == NULL || FreeImage_GetWidth(dib) == 0 || FreeImage_GetHeight(dib) == 0) return false; GLenum format = FreeImage_GetBPP(dib) == 24 ? GL_BGR : FreeImage_GetBPP(dib) == 8 ? GL_LUMINANCE : 0; createFromData(bDataPointer, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), FreeImage_GetBPP(dib), format, bGenerateMipMaps); FreeImage_Unload(dib); sPath = a_sPath; return true; // Success }
TexturePtr TextureFactory::createFromPngFile(const File& file) { PngImage png(file); cross::RenderSystem::ColorFormat color_format = cross::RenderSystem::ColorFormat::RGB; switch (png.color_type_) { case PNG_COLOR_TYPE_RGB: color_format = cross::RenderSystem::ColorFormat::RGB; break; case PNG_COLOR_TYPE_RGBA: color_format = cross::RenderSystem::ColorFormat::RGBA; break; default: T3_PANIC( "unknown color format." ); break; } TexturePtr tex = createFromData( file.name(), png.width_, png.height_, color_format, cross::RenderSystem::TypeFormat::UNSIGNED_BYTE, png.data_ ); return tex; }
bool CTexture::loadTexture2D(std::string sTexturePath, bool bGenerateMipMaps) { FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; FIBITMAP* dib(0); fif = FreeImage_GetFileType(sTexturePath.c_str(), 0); // 检查文件签名,推导其格式 if(fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(sTexturePath.c_str()); // 从扩展名猜测格式 if(fif == FIF_UNKNOWN) return false; //clock_t begin = clock(); if(FreeImage_FIFSupportsReading(fif)) dib = FreeImage_Load(fif, sTexturePath.c_str()); if(!dib) return false; //clock_t end = clock(); //cout << end - begin << endl; GLubyte* bDataPointer = FreeImage_GetBits(dib); if(bDataPointer == NULL || FreeImage_GetWidth(dib) == 0 || FreeImage_GetHeight(dib) == 0) return false; GLenum format = FreeImage_GetBPP(dib) == 24 ? GL_BGR : FreeImage_GetBPP(dib) == 8 ? GL_LUMINANCE : 0; createFromData(bDataPointer, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), FreeImage_GetBPP(dib), format, bGenerateMipMaps); FreeImage_Unload(dib); m_sTexturePath = sTexturePath; return true; }
bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) { _palVaryResourceId = resourceId; Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); if (palResource) { // Load and initialize destination palette createFromData(palResource->data, palResource->size, &_palVaryTargetPalette); return true; } return false; }
bool GfxPalette::kernelSetFromResource(GuiResourceId resourceId, bool force) { Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); Palette palette; if (palResource) { createFromData(palResource->data, palResource->size, &palette); set(&palette, force); return true; } return false; }
int16 GfxPalette::kernelPalVaryChangeTarget(GuiResourceId resourceId) { if (_palVaryResourceId != -1) { Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false); if (palResource) { Palette insertPalette; createFromData(palResource->data, palResource->size, &insertPalette); // insert new palette into target insert(&insertPalette, &_palVaryTargetPalette); // update palette and set on screen palVaryProcess(0, true); } } return kernelPalVaryGetCurrentStep(); }
Texture* Texture::createFromFileData(const unsigned char* in_pData, uint32_t in_size, bool in_generateMipmaps) { Texture* pRet = NULL; std::vector<unsigned char> image; //the raw pixels (holy crap that must be slow) unsigned int w, h; lodepng::State state; auto ret = lodepng::decode(image, w, h, state, in_pData, in_size); assert(!ret); sSize size{w, h}; byte* pData = &(image[0]); ULONG len = size.x * size.y; // Pre multiplied for (ULONG i = 0; i < len; ++i, pData += 4) { pData[0] = pData[0] * pData[3] / 255; pData[1] = pData[1] * pData[3] / 255; pData[2] = pData[2] * pData[3] / 255; } return createFromData(size, &(image[0]), in_generateMipmaps); }
Texture* Texture::createFromFile(const std::string& filename, bool generateMipmaps) { Texture* pRet = NULL; std::vector<unsigned char> image; //the raw pixels (holy crap that must be slow) unsigned int w, h; auto ret = lodepng::decode(image, w, h, filename); assert(!ret); sSize size{w, h}; byte* pData = &(image[0]); ULONG len = size.x * size.y; // Pre multiplied for (ULONG i = 0; i < len; ++i, pData += 4) { pData[0] = pData[0] * pData[3] / 255; pData[1] = pData[1] * pData[3] / 255; pData[2] = pData[2] * pData[3] / 255; } pRet = createFromData(size, &(image[0]), generateMipmaps); pRet->m_name = filename.substr(filename.find_last_of("/\\") + 1); return pRet; }
mxFontObject::mxFontObject(void *buffer) { createFromData(buffer); }