home *** CD-ROM | disk | FTP | other *** search
- #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;
- }
-