prevent small leak when resources are exhausted -- Mike Slifcak
[rrdtool.git] / src / pngsize.c
1 /*****************************************************************************
2  * RRDtool 1.1.x  Copyright Tobias Oetiker, 1997 - 2002
3  *****************************************************************************
4  * pngsize.c  determine the size of a PNG image
5  *****************************************************************************/
6
7 #include <png.h>
8
9 int
10 PngSize(FILE *fd, long *width, long *height)
11 {
12   png_structp png_read_ptr = 
13     png_create_read_struct(PNG_LIBPNG_VER_STRING, 
14                            (png_voidp)NULL,
15                                 /* we would need to point to error handlers
16                                    here to do it properly */
17                            (png_error_ptr)NULL, (png_error_ptr)NULL);
18     
19   png_infop info_ptr = png_create_info_struct(png_read_ptr);
20
21   (*width)=0;
22   (*height)=0;
23
24   if (setjmp(png_read_ptr->jmpbuf)){
25     png_destroy_read_struct(&png_read_ptr, &info_ptr, (png_infopp)NULL);
26     return 0;
27   }
28
29   png_init_io(png_read_ptr,fd);
30   png_read_info(png_read_ptr, info_ptr);
31   (*width)=png_get_image_width(png_read_ptr, info_ptr);
32   (*height)=png_get_image_height(png_read_ptr, info_ptr);
33   
34   png_destroy_read_struct(&png_read_ptr, &info_ptr, NULL);
35   if (*width >0 && *height >0) 
36     return 1;
37   else
38     return 0;
39 }
40
41
42