Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
pixbuf: basic support for JPEG
  • Loading branch information
Sebastien Bourdeauducq committed Nov 21, 2011
1 parent f063cf6 commit 65038bd
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/Makefile
Expand Up @@ -8,7 +8,7 @@ OBJCOPY=lm32-rtems$(RTEMS_VERSION)-objcopy

CFLAGS=-O9 -Wall -mbarrel-shift-enabled -mmultiply-enabled -mdivide-enabled -msign-extend-enabled -fsingle-precision-constant -I$(RTEMS_MAKEFILE_PATH)/lib/include -g
LDFLAGS=-mbarrel-shift-enabled -mmultiply-enabled -mdivide-enabled -msign-extend-enabled -B$(RTEMS_MAKEFILE_PATH)/lib -specs bsp_specs -qrtems
LIBS=-lnfs -lftpd -ltelnetd -lyaffs2 -lmtk -llop -lfpvm -lpng -lcurl -lexpat -lz -lm
LIBS=-lnfs -lftpd -ltelnetd -lyaffs2 -lmtk -llop -lfpvm -lpng -ljpeg -lcurl -lexpat -lz -lm
OBJDIR=obj
BINDIR=bin

Expand All @@ -18,7 +18,7 @@ OBJS+=$(addprefix gui/,messagebox.o filedialog.o resmgr.o guirender.o performanc
ifeq ($(WITH_PDF),1)
OBJS+=$(addprefix gui/,pdfreader.o)
CFLAGS+=-DWITH_PDF
LIBS:=-lmupdf -lfreetype -ljbig2dec -lopenjpeg -ljpeg $(LIBS)
LIBS:=-lmupdf -lfreetype -ljbig2dec -lopenjpeg $(LIBS)
endif
OBJS+=$(addprefix translations/,french.o german.o)
OBJS+=$(addprefix renderer/,framedescriptor.o analyzer.o sampler.o compiler.o eval.o line.o wave.o font.o osd.o raster.o renderer.o videoinreconf.o)
Expand Down
57 changes: 55 additions & 2 deletions src/pixbuf/loaderjpeg.c
Expand Up @@ -16,12 +16,65 @@
*/

#include <stdlib.h>
#include <stdio.h>
#include <jpeglib.h>

#include "pixbuf.h"
#include "dither.h"
#include "loaders.h"

struct pixbuf *pixbuf_load_jpeg(char *filename)
{
/* TODO */
return NULL;
struct pixbuf *ret;
FILE *fd;
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
unsigned char *pixels;
int i;
unsigned char **row_pointers;

ret = NULL;
fd = fopen(filename, "rb");
if(fd == NULL) goto free0;

cinfo.err = jpeg_std_error(&jerr); // TODO: get rid of the exit() code
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, fd);
jpeg_read_header(&cinfo, TRUE);

cinfo.out_color_space = JCS_RGB;
cinfo.out_color_components = 3;
cinfo.dither_mode = JDITHER_NONE;

pixels = malloc(3*cinfo.image_width*cinfo.image_height);
if(pixels == NULL) goto free2;
row_pointers = malloc(sizeof(char *)*cinfo.image_height);
if(row_pointers == NULL) goto free3;
for(i=0;i<cinfo.image_height;i++)
row_pointers[i] = &pixels[i*3*cinfo.image_width];

jpeg_start_decompress(&cinfo);
while(cinfo.output_scanline < cinfo.output_height)
jpeg_read_scanlines(&cinfo, &row_pointers[cinfo.output_scanline], 1);
ret = pixbuf_new(cinfo.image_width, cinfo.image_height);
if(ret == NULL) goto free5;

if(!pixbuf_dither(ret->pixels, row_pointers, cinfo.image_width, cinfo.image_height)) {
pixbuf_dec_ref(ret);
ret = NULL;
goto free5;
}

free5:
jpeg_finish_decompress(&cinfo);
free4:
free(row_pointers);
free3:
free(pixels);
free2:
jpeg_destroy_decompress(&cinfo);
free1:
fclose(fd);
free0:
return ret;
}

0 comments on commit 65038bd

Please sign in to comment.