37 const char *
const extensions[] = {
"png",
"bmp",
"jpeg",
"jpg",
nullptr };
38 int i = 0;
const char *szExt;
39 while ((szExt = extensions[i++]))
46 return Load(hGroup,szFilename,fOwnPal,fNoErrIfNotFound,iFlags);
60 const char *
const extensions[] = {
"png",
"bmp",
"jpeg",
"jpg",
nullptr };
61 int i = 0;
const char *szExt;
62 while ((szExt = extensions[i++]))
71 if (!pGroup)
return false;
73 return Load(*pGroup,szFilename,fOwnPal,fNoErrIfNotFound,iFlags);
82 int32_t extpos;
int scale;
83 if (((extpos =
SCharLastPos(
'.', strBasename)) > -1) && (sscanf(strBasename+extpos+1,
"%d", &scale) == 1))
92 const size_t base_length = std::strlen(strBasename);
97 std::string wildcard(strBasename);
99 wildcard += strExtension;
101 if (hGroup.
FindEntry(wildcard.c_str(), scaled_name))
106 if (sscanf(scaled_name + base_length + 1,
"%d", &scale) == 1)
107 if (scale > max_scale)
110 ScaleToSet = max_scale;
111 strFilename.
Copy(scaled_name);
112 szFilename = strFilename.
getData();
140 return ReadPNG(hGroup, iFlags);
145 return ReadBMP(hGroup, iFlags);
163 if (!fSuccess)
return false;
167 if (!
Lock())
return false;
175 if (!
texture->Lock())
return false;
178 for (
int iY = 0; iY < maxY; ++iY)
180 #ifndef __BIG_ENDIAN__
181 if (png.
iClrType == PNG_COLOR_TYPE_RGB_ALPHA)
186 memcpy (pPix, png.
GetRow(iY), maxX *
sizeof(*pPix));
188 while (iX--) {
if (((
BYTE *)pPix)[3] == 0x00) *pPix = 0x00000000; ++pPix; }
194 for (
int iX = 0; iX < maxX; ++iX)
196 uint32_t dwCol = png.
GetPix(iX, iY);
198 if (dwCol>>24 == 0x00) dwCol=0x00000000;
242 struct jpeg_error_mgr
pub;
248 static void my_error_exit (j_common_ptr cinfo)
254 (*cinfo->err->output_message) (cinfo);
258 static void my_output_message (j_common_ptr cinfo)
260 char buffer[JMSG_LENGTH_MAX];
261 (*cinfo->err->format_message) (cinfo, buffer);
262 LogF(
"libjpeg: %s", buffer);
264 static void jpeg_noop (j_decompress_ptr cinfo) {}
265 static const unsigned char end_of_input = JPEG_EOI;
266 static boolean fill_input_buffer (j_decompress_ptr cinfo)
269 cinfo->src->next_input_byte = &end_of_input;
270 cinfo->src->bytes_in_buffer = 1;
271 return (
boolean)
true;
273 static void skip_input_data (j_decompress_ptr cinfo,
long num_bytes)
275 cinfo->src->next_input_byte += num_bytes;
276 cinfo->src->bytes_in_buffer -= num_bytes;
277 if (cinfo->src->bytes_in_buffer <= 0)
279 cinfo->src->next_input_byte = &end_of_input;
280 cinfo->src->bytes_in_buffer = 1;
288 unsigned char *pData=
new unsigned char[size];
290 hGroup.
Read(pData, size);
292 struct jpeg_decompress_struct cinfo;
297 cinfo.err = jpeg_std_error(&jerr.
pub);
298 jerr.
pub.error_exit = my_error_exit;
299 jerr.
pub.output_message = my_output_message;
304 jpeg_destroy_decompress(&cinfo);
308 jpeg_create_decompress(&cinfo);
311 jpeg_source_mgr blub;
313 blub.next_input_byte = pData;
314 blub.bytes_in_buffer = size;
315 blub.init_source = jpeg_noop;
316 blub.fill_input_buffer = fill_input_buffer;
317 blub.skip_input_data = skip_input_data;
318 blub.resync_to_restart = jpeg_resync_to_restart;
319 blub.term_source = jpeg_noop;
322 jpeg_read_header(&cinfo, (
boolean)
true);
325 cinfo.out_color_space = JCS_RGB;
326 jpeg_start_decompress(&cinfo);
329 if (!
Create(cinfo.output_width, cinfo.output_height, iFlags))
return false;
331 row_stride = cinfo.output_width * cinfo.output_components;
333 buffer = (*cinfo.mem->alloc_sarray)
334 ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
336 if (!
Lock())
return false;
337 while (cinfo.output_scanline < cinfo.output_height)
340 jpeg_read_scanlines(&cinfo, buffer, 1);
342 for (
unsigned int i = 0; i < cinfo.output_width; ++i)
344 const unsigned char *
const start = buffer[0] + i * cinfo.output_components;
345 const uint32_t c =
C4RGB(*start, *(start + 1), *(start + 2));
346 SetPixDw(i, cinfo.output_scanline - 1, c);
352 jpeg_finish_decompress(&cinfo);
353 jpeg_destroy_decompress(&cinfo);
const char * C4Group_GetTempPath()
const char * LoadResStr(const char *id)
bool LogF(const char *strMessage,...)
struct my_error_mgr * my_error_ptr
struct jpeg_error_mgr pub
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
int SCharLastPos(char cTarget, const char *szInStr)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
char * GetExtension(char *szFilename)
void MakeTempFilename(char *szFilename)
char * GetFilename(char *szPath)
void EnforceExtension(char *szFilename, const char *szExtension)
void RemoveExtension(char *szFilename)
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
bool AccessEntry(const char *wildcard, size_t *size=nullptr, char *filename=nullptr, bool needs_to_be_a_group=false)
StdStrBuf GetFullName() const
bool Move(const char *filename, const char *entry_name)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
C4Group * FindEntry(const char *szWildcard, int32_t *pPriority=nullptr, int32_t *pID=nullptr)
bool SetPixDw(int iX, int iY, DWORD dwCol)
bool Load(C4Group &hGroup, const char *szFilename, bool fOwnPal, bool fNoErrIfNotFound, int iFlags)
std::unique_ptr< C4TexRef > texture
bool LoadAny(C4Group &hGroup, const char *szFilename, bool fOwnPal, bool fNoErrIfNotFound, int iFlags)
bool ReadBMP(CStdStream &hGroup, int iFlags)
bool Read(CStdStream &hGroup, const char *extension, int iFlags)
bool Create(int iWdt, int iHgt, int iFlags=0)
bool ReadJPEG(CStdStream &hGroup, int iFlags)
bool ReadPNG(CStdStream &hGroup, int iFlags)
bool SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha=true, bool fSaveOverlayOnly=false)
uint32_t * GetRow(int iY)
bool Load(BYTE *pFile, int iSize)
DWORD GetPix(int iX, int iY)
virtual bool Read(void *pBuffer, size_t iSize)=0
virtual size_t AccessedEntrySize() const =0
const char * getData() const