aboutsummaryrefslogtreecommitdiff
path: root/lib/gdi
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2007-12-13 02:33:45 +0000
committerFelix Domke <tmbinc@elitedvb.net>2007-12-13 02:33:45 +0000
commit1e9bbad0b92212ecf3d80186c2000d2f68f28fdb (patch)
tree2161b425b7ab21cd9dd8d9e528388110909c06f5 /lib/gdi
parent8eec1849afbd482b7712cc000f7978731e3074ba (diff)
downloadenigma2-1e9bbad0b92212ecf3d80186c2000d2f68f28fdb.tar.gz
enigma2-1e9bbad0b92212ecf3d80186c2000d2f68f28fdb.zip
fix loadJPG
Diffstat (limited to 'lib/gdi')
-rw-r--r--lib/gdi/epng.cpp20
-rw-r--r--lib/gdi/epng.h2
2 files changed, 14 insertions, 8 deletions
diff --git a/lib/gdi/epng.cpp b/lib/gdi/epng.cpp
index 4666cdf3..46b3a9b5 100644
--- a/lib/gdi/epng.cpp
+++ b/lib/gdi/epng.cpp
@@ -140,14 +140,14 @@ my_error_exit (j_common_ptr cinfo)
longjmp(myerr->setjmp_buffer, 1);
}
-int loadJPG(ePtr<gPixmap> &result, const char *filename, gPixmap *alpha)
+int loadJPG(ePtr<gPixmap> &result, const char *filename, ePtr<gPixmap> alpha)
{
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
FILE *infile;
JSAMPARRAY buffer;
int row_stride;
- infile = fopen(filename, "r");
+ infile = fopen(filename, "rb");
result = 0;
if (alpha)
@@ -172,6 +172,10 @@ int loadJPG(ePtr<gPixmap> &result, const char *filename, gPixmap *alpha)
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
(void) jpeg_read_header(&cinfo, TRUE);
+ cinfo.out_color_space = JCS_RGB;
+ cinfo.scale_denom = 1;
+
+ (void) jpeg_start_decompress(&cinfo);
int grayscale = cinfo.output_components == 1;
@@ -191,16 +195,16 @@ int loadJPG(ePtr<gPixmap> &result, const char *filename, gPixmap *alpha)
result = new gPixmap(eSize(cinfo.output_width, cinfo.output_height), grayscale ? 8 : 32);
- (void) jpeg_start_decompress(&cinfo);
row_stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
while (cinfo.output_scanline < cinfo.output_height) {
+ int y = cinfo.output_scanline;
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
- unsigned char *dst = ((unsigned char*)result->surface->data) + result->surface->stride * cinfo.output_scanline;
+ unsigned char *dst = ((unsigned char*)result->surface->data) + result->surface->stride * y;
unsigned char *src = (unsigned char*)buffer[0];
- unsigned char *palpha = alpha ? ((unsigned char*)alpha->surface->data + alpha->surface->stride * cinfo.output_scanline) : 0;
+ unsigned char *palpha = alpha ? ((unsigned char*)alpha->surface->data + alpha->surface->stride * y) : 0;
if (grayscale)
- memcpy(dst, src, row_stride);
+ memcpy(dst, src, cinfo.output_width);
else
{
int x;
@@ -209,9 +213,9 @@ int loadJPG(ePtr<gPixmap> &result, const char *filename, gPixmap *alpha)
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
- if (alpha)
+ if (palpha)
*dst++ = *palpha++;
- else
+ else
*dst++ = 0xFF;
}
}
diff --git a/lib/gdi/epng.h b/lib/gdi/epng.h
index 2db7bc43..753720b4 100644
--- a/lib/gdi/epng.h
+++ b/lib/gdi/epng.h
@@ -4,6 +4,8 @@
#include <lib/gdi/gpixmap.h>
SWIG_VOID(int) loadPNG(ePtr<gPixmap> &SWIG_OUTPUT, const char *filename);
+SWIG_VOID(int) loadJPG(ePtr<gPixmap> &SWIG_OUTPUT, const char *filename, ePtr<gPixmap> alpha = 0);
+
int savePNG(const char *filename, gPixmap *pixmap);
#endif