Browse Source

Image::loadJPEG() error handling

v1.x
Tj Holowaychuk 14 years ago
parent
commit
9022aaa3a4
  1. 11
      src/Image.cc

11
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);

Loading…
Cancel
Save