3 #include <lib/codecs/picjpeg.h>
4 #include <lib/base/eerror.h>
5 #include <lib/base/esize.h>
6 #include <lib/gdi/gpixmap.h>
8 ePictureDecoderJPEG::ePictureDecoderJPEG(eIOBuffer
&input
): ePictureDecoder(input
)
11 cinfo
.err
=jpeg_std_error(&jerr
);
12 jpeg_create_decompress(&cinfo
);
15 ePictureDecoderJPEG::~ePictureDecoderJPEG()
17 jpeg_destroy_decompress(&cinfo
);
20 int ePictureDecoderJPEG::decodeMore(int maxscanlines
)
22 int decodedscanlines
=0;
23 while (decodedscanlines
< maxscanlines
)
29 code
=jpeg_read_header(&cinfo
, TRUE
);
30 if (code
== JPEG_SUSPENDED
)
32 if (code
== JPEG_HEADER_OK
)
34 jpeg_calc_output_dimensions(&cinfo
);
35 // allocate buffer for decompression
37 row_stride
=cinfo
.output_width
* cinfo
.output_components
;
38 buffer
=(*cinfo
.mem
->alloc_sarray
)((j_common_ptr
)&cinfo
, JPOOL_IMAGE
, row_stride
*16, 1);
40 // allocate a gImage for the output
41 if ((cinfo
.output_width
> 1024) || (cinfo
.output_height
> 1024))
43 eDebug("Image too big: %d x %d", cinfo
.output_width
, cinfo
.output_height
);
46 int bpp
=cinfo
.output_components
*8;
49 result
=new gImage(eSize(cinfo
.output_width
, cinfo
.output_height
), bpp
);
50 eDebug("JPEG reader: created gImage (%d x %d x %d bpp)", cinfo
.output_width
, cinfo
.output_height
, bpp
);
51 state
=stateStartDecompression
;
54 eDebug("jpeg_read_header returned: %d", code
);
57 case stateStartDecompression
:
58 if (!jpeg_start_decompress(&cinfo
))
60 eDebug("jpeg_start_decompress - suspended.");
67 if (cinfo
.output_scanline
>= cinfo
.output_height
)
69 eDebug("finished decompression.");
70 state
=stateFinishDecompression
;
73 int maxlines
=maxscanlines
- decodedscanlines
;
76 int d
, start
=cinfo
.output_scanline
;
78 d
=jpeg_read_scanlines(&cinfo
, buffer
, maxlines
);
81 eDebug("need more data..");
82 return 1024; // need more data..
86 eDebug("fatal error %d while decompressing.", d
);
93 if (cinfo
.output_components
== 1) // grayscale
95 for (int i
=0; i
<d
; ++i
)
96 memcpy(((__u8
*)result
->data
)+result
->stride
*(start
+d
), buffer
[i
], cinfo
.output_width
);
97 } else if (cinfo
.output_components
== 3) // true color
99 for (register int i
=0; i
<d
; ++i
)
101 __u32
*dst
=(__u32
*)(((__u8
*)result
->data
)+result
->stride
*(start
+i
));
102 JSAMPLE
*smp
=buffer
[i
];
104 for (register int x
=0; x
<result
->x
; ++x
)
105 *dst
++=smp
[x
*3] | (smp
[x
*3+1]<<8) | (smp
[x
*3+2]<<16);
110 eDebug("unsupported output_components %d", cinfo
.output_components
);
119 case stateFinishDecompression
:
121 if (jpeg_finish_decompress(&cinfo
))
128 eDebug("we reached the holy end..");
136 #endif //DISABLE_FILE