nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "image.h" nuclear@0: nuclear@0: int image_create(struct image *img, int w, int h) nuclear@0: { nuclear@0: img->width = w; nuclear@0: img->height = h; nuclear@0: if(!(img->pixels = malloc(w * h * 4))) { nuclear@0: return -1; nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void image_destroy(struct image *img) nuclear@0: { nuclear@0: free(img->pixels); nuclear@0: img->pixels = 0; nuclear@0: } nuclear@0: nuclear@0: int image_save(struct image *img, const char *rgbname, const char *aname) nuclear@0: { nuclear@0: int i; nuclear@0: FILE *fp; nuclear@0: unsigned char *pptr; nuclear@0: nuclear@0: if(rgbname) { nuclear@0: if(!(fp = fopen(rgbname, "wb"))) { nuclear@0: fprintf(stderr, "failed to open %s for writing: %s\n", rgbname, strerror(errno)); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: fprintf(fp, "P6\n%d %d\n255\n", img->width, img->height); nuclear@0: pptr = img->pixels; nuclear@0: for(i=0; iwidth * img->height; i++) { nuclear@0: fputc(*pptr++, fp); nuclear@0: fputc(*pptr++, fp); nuclear@0: fputc(*pptr++, fp); nuclear@0: ++pptr; nuclear@0: } nuclear@0: fclose(fp); nuclear@0: } nuclear@0: if(aname) { nuclear@0: if(!(fp = fopen(aname, "wb"))) { nuclear@0: fprintf(stderr, "failed to open %s for writing: %s\n", rgbname, strerror(errno)); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: fprintf(fp, "P6\n%d %d\n255\n", img->width, img->height); nuclear@0: pptr = img->pixels; nuclear@0: for(i=0; iwidth * img->height; i++) { nuclear@0: int c = pptr[3]; nuclear@0: pptr += 4; nuclear@0: fputc(c, fp); nuclear@0: fputc(c, fp); nuclear@0: fputc(c, fp); nuclear@0: } nuclear@0: fclose(fp); nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int image_clear(struct image *img, int r, int g, int b, int a) nuclear@0: { nuclear@0: return image_fillrect(img, 0, 0, img->width, img->height, r, g, b, a); nuclear@0: } nuclear@0: nuclear@0: int image_fillrect(struct image *img, int x, int y, int w, int h, int r, int g, int b, int a) nuclear@0: { nuclear@0: int i, j; nuclear@0: unsigned char *pptr; nuclear@0: nuclear@0: if(x < 0) { nuclear@0: w += x; nuclear@0: x = 0; nuclear@0: } nuclear@0: if(y < 0) { nuclear@0: h += y; nuclear@0: y = 0; nuclear@0: } nuclear@0: if(x + w >= img->width) { nuclear@0: w = img->width - x; nuclear@0: } nuclear@0: if(y + h >= img->height) { nuclear@0: h = img->height - y; nuclear@0: } nuclear@0: if(w <= 0 || h <= 0) { nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: pptr = img->pixels + (y * img->width + x) * 4; nuclear@0: for(i=0; iwidth - w) * 4; nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int image_chess(struct image *img, int sz, int r0, int g0, int b0, int r1, int g1, int b1) nuclear@0: { nuclear@0: int i, j; nuclear@0: unsigned char *pptr = img->pixels; nuclear@0: nuclear@0: for(i=0; iheight; i++) { nuclear@0: for(j=0; jwidth; j++) { nuclear@0: int chess = ((i / sz) & 1) == ((j / sz) & 1); nuclear@0: *pptr++ = chess ? r0 : r1; nuclear@0: *pptr++ = chess ? g0 : g1; nuclear@0: *pptr++ = chess ? b0 : b1; nuclear@0: *pptr++ = 255; nuclear@0: } nuclear@0: } nuclear@0: return 0; nuclear@0: }