bool CBaseTexture::LoadFromFileInMem(unsigned char* buffer, size_t size, const std::string& mimeType, unsigned int maxWidth, unsigned int maxHeight) { if (!buffer || !size) return false; //ImageLib is sooo sloow for jpegs. Try our own decoder first. If it fails, fall back to ImageLib. if (mimeType == "image/jpeg") { CJpegIO jpegfile; if (jpegfile.Read(buffer, size, maxWidth, maxHeight)) { if (jpegfile.Width() > 0 && jpegfile.Height() > 0) { Allocate(jpegfile.Width(), jpegfile.Height(), XB_FMT_A8R8G8B8); if (jpegfile.Decode(m_pixels, GetPitch(), XB_FMT_A8R8G8B8)) { m_hasAlpha=false; ClampToEdge(); return true; } } } } DllImageLib dll; if (!dll.Load()) return false; ImageInfo image; memset(&image, 0, sizeof(image)); unsigned int width = maxWidth ? std::min(maxWidth, g_Windowing.GetMaxTextureSize()) : g_Windowing.GetMaxTextureSize(); unsigned int height = maxHeight ? std::min(maxHeight, g_Windowing.GetMaxTextureSize()) : g_Windowing.GetMaxTextureSize(); CStdString ext = mimeType; int nPos = ext.Find('/'); if (nPos > -1) ext.Delete(0, nPos + 1); if(!dll.LoadImageFromMemory(buffer, size, ext.c_str(), width, height, &image)) { CLog::Log(LOGERROR, "Texture manager unable to load image from memory"); return false; } LoadFromImage(image); dll.ReleaseImage(&image); return true; }