This is paowrite.c in view mode; [Download] [Up]
#include <stdio.h> #include <stdlib.h> #include <libc.h> #include "../common.h" #include "../strfunc.h" #include "save.h" static void png_write_p(FILE *fp, const commonInfo *cinf) { int i, n; int r, g, b, a; int alphaindex = -1; /* PXO */ fprintf(fp, "PX\n# %s\n%d %d %d\n", key_comm(cinf), cinf->width, cinf->height, cinf->palsteps - 1); if (cinf->alpha) { alphaindex = cinf->palsteps; if (alphaindex >= FIXcount) alphaindex = FIXcount - 1; /* Error */ fprintf(fp, "1 %d\n", alphaindex + 256); }else fprintf(fp, "0\n"); for (n = 0; n < cinf->palsteps; n++) { unsigned char *p = cinf->palette[n]; for (i = 0; i < 3; i++) putc(*p++, fp); } for (n = cinf->width * cinf->height - 1; n >= 0; n--) { getPixel(&r, &g, &b, &a); putc( (a == AlphaTransp ? alphaindex : mapping(r, g, b)), fp); } } static void png_write_f(FILE *fp, const commonInfo *cinf) { int max = 255, sft = 0, i, n, pn; int elm[MAXPLANE]; switch (cinf->bits) { case 1: max = 1; sft = 7; break; case 2: max = 3; sft = 6; break; case 4: max = 15; sft = 4; break; case 8: max = 255; sft = 0; break; } pn = cinf->numcolors; if (cinf->alpha) pn++; /* PAO */ fprintf(fp, "PA\n# %s\n%d %d %d %d\n", key_comm(cinf), cinf->width, cinf->height, max, pn); n = cinf->width * cinf->height; while (n-- > 0) { (void) getPixelA(elm); if (sft) for (i = 0; i < pn; i++) putc(elm[i] >> sft, fp); else for (i = 0; i < pn; i++) putc(elm[i], fp); } } int pngwrite(FILE *fp, const commonInfo *cinf, const char *dir, BOOL interl) { int err; char ppngPath[MAXFILENAMELEN]; static char *ppngArg[8] = { NULL, /* 0: Tool Path */ PAO_PNG, NULL, /* 2: -p (maybe) */ NULL, NULL }; sprintf(ppngPath, "%s/%s", dir, PAO_PNG); ppngArg[0] = ppngPath; ppngArg[2] = interl ? "-p" : NULL; /* Progressive */ if ((fp = openWPipe(fp, ppngArg, &err)) == NULL) { (void) fclose(fp); return err; } if (cinf->palette && cinf->palsteps > 0) png_write_p(fp, cinf); else png_write_f(fp, cinf); (void) fclose(fp); wait(0); /* Don't forget */ return 0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.