labyrinth

annotate src/image.c @ 0:8ba79034e8a6

labyrinth example initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 15 Jan 2015 14:59:38 +0200
parents
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include <string.h>
nuclear@0 4 #include <errno.h>
nuclear@0 5 #include "image.h"
nuclear@0 6
nuclear@0 7 struct image *load_image(const char *fname)
nuclear@0 8 {
nuclear@0 9 FILE *fp;
nuclear@0 10 int i, hdrline = 0;
nuclear@0 11 struct image *img = 0;
nuclear@0 12
nuclear@0 13 if(!(fp = fopen(fname, "rb"))) {
nuclear@0 14 fprintf(stderr, "failed to open pixmap: %s: %s\n", fname, strerror(errno));
nuclear@0 15 return 0;
nuclear@0 16 }
nuclear@0 17
nuclear@0 18 if(!(img = malloc(sizeof *img))) {
nuclear@0 19 perror("failed to allocate image structure");
nuclear@0 20 goto err;
nuclear@0 21 }
nuclear@0 22
nuclear@0 23 /* read ppm header */
nuclear@0 24 while(hdrline < 3) {
nuclear@0 25 char buf[64];
nuclear@0 26
nuclear@0 27 if(!fgets(buf, sizeof buf, fp)) {
nuclear@0 28 goto err;
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 /* skip comments */
nuclear@0 32 if(buf[0] == '#')
nuclear@0 33 continue;
nuclear@0 34
nuclear@0 35 switch(hdrline++) {
nuclear@0 36 case 0:
nuclear@0 37 /* first header line should be P6 */
nuclear@0 38 if(strcmp(buf, "P6\n") != 0) {
nuclear@0 39 goto err;
nuclear@0 40 }
nuclear@0 41 break;
nuclear@0 42
nuclear@0 43 case 1:
nuclear@0 44 /* second header line contains the pixmap dimensions */
nuclear@0 45 if(sscanf(buf, "%d %d", &img->width, &img->height) != 2) {
nuclear@0 46 goto err;
nuclear@0 47 }
nuclear@0 48 break;
nuclear@0 49 }
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 /* allocate the image (each pixel is 3 bytes r, g, and b) */
nuclear@0 53 if(!(img->pixels = malloc(img->width * img->height * 3))) {
nuclear@0 54 goto err;
nuclear@0 55 }
nuclear@0 56
nuclear@0 57 /* read all pixels */
nuclear@0 58 for(i=0; i<img->width * img->height * 3; i++) {
nuclear@0 59 int c = fgetc(fp);
nuclear@0 60 if(c < 0) {
nuclear@0 61 goto err;
nuclear@0 62 }
nuclear@0 63 img->pixels[i] = c;
nuclear@0 64 }
nuclear@0 65 fclose(fp);
nuclear@0 66
nuclear@0 67 return img;
nuclear@0 68
nuclear@0 69 err:
nuclear@0 70 fprintf(stderr, "failed to load pixmap: %s\n", fname);
nuclear@0 71 if(img) {
nuclear@0 72 free(img->pixels);
nuclear@0 73 free(img);
nuclear@0 74 }
nuclear@0 75 if(fp) {
nuclear@0 76 fclose(fp);
nuclear@0 77 }
nuclear@0 78 return 0;
nuclear@0 79 }
nuclear@0 80
nuclear@0 81
nuclear@0 82 void free_image(struct image *img)
nuclear@0 83 {
nuclear@0 84 if(img) {
nuclear@0 85 free(img->pixels);
nuclear@0 86 free(img);
nuclear@0 87 }
nuclear@0 88 }