|
|
@ -297,7 +297,11 @@ Image::loadPNG() { |
|
|
|
|
|
|
|
cairo_status_t |
|
|
|
Image::loadJPEG() { |
|
|
|
// File stream
|
|
|
|
FILE *stream = fopen(filename, "r"); |
|
|
|
if (!stream) return CAIRO_STATUS_READ_ERROR; |
|
|
|
|
|
|
|
// JPEG setup
|
|
|
|
struct jpeg_decompress_struct info; |
|
|
|
struct jpeg_error_mgr err; |
|
|
|
info.err = jpeg_std_error(&err); |
|
|
@ -308,10 +312,15 @@ Image::loadJPEG() { |
|
|
|
width = info.output_width; |
|
|
|
height = info.output_height; |
|
|
|
|
|
|
|
// Data alloc
|
|
|
|
int stride = width * 4; |
|
|
|
uint8_t *data = (uint8_t *) malloc(width * height * 4); |
|
|
|
if (!data) return CAIRO_STATUS_NO_MEMORY; |
|
|
|
|
|
|
|
uint8_t *src = (uint8_t *) malloc(width * 3); |
|
|
|
if (!src) return CAIRO_STATUS_NO_MEMORY; |
|
|
|
|
|
|
|
// Copy RGB -> ARGB
|
|
|
|
for (int y = 0; y < height; ++y) { |
|
|
|
jpeg_read_scanlines(&info, &src, 1); |
|
|
|
uint32_t *row = (uint32_t *)(data + stride * y); |
|
|
@ -325,6 +334,7 @@ Image::loadJPEG() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// New image surface
|
|
|
|
_surface = cairo_image_surface_create_for_data( |
|
|
|
data |
|
|
|
, CAIRO_FORMAT_ARGB32 |
|
|
@ -332,6 +342,7 @@ Image::loadJPEG() { |
|
|
|
, height |
|
|
|
, width * 4); |
|
|
|
|
|
|
|
// Cleanup
|
|
|
|
fclose(stream); |
|
|
|
jpeg_finish_decompress(&info); |
|
|
|
jpeg_destroy_decompress(&info); |
|
|
|