diff --git a/src/Image.cc b/src/Image.cc index d5af8e2..81df93d 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -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);