📄 wpng.c
字号:
if (p[result] == 27) { /* escape character */ wpng_info.have_text &= ~TEXT_COPY; valid = FALSE; }#endif } } } while (!valid); do { valid = TRUE; p = textbuf + TEXT_EMAIL_OFFSET; fprintf(stderr, " E-mail: "); fflush(stderr); if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { if (p[len-1] == '\n') p[--len] = '\0'; wpng_info.email = p; wpng_info.have_text |= TEXT_EMAIL; if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { fprintf(stderr, " " PROGNAME " warning: character code" " %u is %sdiscouraged by the PNG\n specification " "[first occurrence was at character position #%d]\n", (unsigned)p[result], (p[result] == 27)? "strongly " : "", result+1); fflush(stderr);#ifdef FORBID_LATIN1_CTRL wpng_info.have_text &= ~TEXT_EMAIL; valid = FALSE;#else if (p[result] == 27) { /* escape character */ wpng_info.have_text &= ~TEXT_EMAIL; valid = FALSE; }#endif } } } while (!valid); do { valid = TRUE; p = textbuf + TEXT_URL_OFFSET; fprintf(stderr, " URL: "); fflush(stderr); if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { if (p[len-1] == '\n') p[--len] = '\0'; wpng_info.url = p; wpng_info.have_text |= TEXT_URL; if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { fprintf(stderr, " " PROGNAME " warning: character code" " %u is %sdiscouraged by the PNG\n specification " "[first occurrence was at character position #%d]\n", (unsigned)p[result], (p[result] == 27)? "strongly " : "", result+1); fflush(stderr);#ifdef FORBID_LATIN1_CTRL wpng_info.have_text &= ~TEXT_URL; valid = FALSE;#else if (p[result] == 27) { /* escape character */ wpng_info.have_text &= ~TEXT_URL; valid = FALSE; }#endif } } } while (!valid);#ifndef DOS_OS2_W32 fclose(keybd);#endif } else if (text) { fprintf(stderr, PROGNAME ": unable to allocate memory for text\n"); text = FALSE; wpng_info.have_text = 0; } /* allocate libpng stuff, initialize transformations, write pre-IDAT data */ if ((rc = writepng_init(&wpng_info)) != 0) { switch (rc) { case 2: fprintf(stderr, PROGNAME ": libpng initialization problem (longjmp)\n"); break; case 4: fprintf(stderr, PROGNAME ": insufficient memory\n"); break; case 11: fprintf(stderr, PROGNAME ": internal logic error (unexpected PNM type)\n"); break; default: fprintf(stderr, PROGNAME ": unknown writepng_init() error\n"); break; } exit(rc); } /* free textbuf, since it's a completely local variable and all text info * has just been written to the PNG file */ if (text && textbuf) { free(textbuf); textbuf = NULL; } /* calculate rowbytes on basis of image type; note that this becomes much * more complicated if we choose to support PBM type, ASCII PNM types, or * 16-bit-per-sample binary data [currently not an official NetPBM type] */ if (wpng_info.pnmtype == 5) rowbytes = wpng_info.width; else if (wpng_info.pnmtype == 6) rowbytes = wpng_info.width * 3; else /* if (wpng_info.pnmtype == 8) */ rowbytes = wpng_info.width * 4; /* read and write the image, either in its entirety (if writing interlaced * PNG) or row by row (if non-interlaced) */ fprintf(stderr, "Encoding image data...\n"); fflush(stderr); if (wpng_info.interlaced) { long i; ulg bytes; ulg image_bytes = rowbytes * wpng_info.height; /* overflow? */ wpng_info.image_data = (uch *)malloc(image_bytes); wpng_info.row_pointers = (uch **)malloc(wpng_info.height*sizeof(uch *)); if (wpng_info.image_data == NULL || wpng_info.row_pointers == NULL) { fprintf(stderr, PROGNAME ": insufficient memory for image data\n"); writepng_cleanup(&wpng_info); wpng_cleanup(); exit(5); } for (i = 0; i < wpng_info.height; ++i) wpng_info.row_pointers[i] = wpng_info.image_data + i*rowbytes; bytes = fread(wpng_info.image_data, 1, image_bytes, wpng_info.infile); if (bytes != image_bytes) { fprintf(stderr, PROGNAME ": expected %lu bytes, got %lu bytes\n", image_bytes, bytes); fprintf(stderr, " (continuing anyway)\n"); } if (writepng_encode_image(&wpng_info) != 0) { fprintf(stderr, PROGNAME ": libpng problem (longjmp) while writing image data\n"); writepng_cleanup(&wpng_info); wpng_cleanup(); exit(2); } } else /* not interlaced: write progressively (row by row) */ { long j; ulg bytes; wpng_info.image_data = (uch *)malloc(rowbytes); if (wpng_info.image_data == NULL) { fprintf(stderr, PROGNAME ": insufficient memory for row data\n"); writepng_cleanup(&wpng_info); wpng_cleanup(); exit(5); } error = 0; for (j = wpng_info.height; j > 0L; --j) { bytes = fread(wpng_info.image_data, 1, rowbytes, wpng_info.infile); if (bytes != rowbytes) { fprintf(stderr, PROGNAME ": expected %lu bytes, got %lu bytes (row %ld)\n", rowbytes, bytes, wpng_info.height-j); ++error; break; } if (writepng_encode_row(&wpng_info) != 0) { fprintf(stderr, PROGNAME ": libpng problem (longjmp) while writing row %ld\n", wpng_info.height-j); ++error; break; } } if (error) { writepng_cleanup(&wpng_info); wpng_cleanup(); exit(2); } if (writepng_encode_finish(&wpng_info) != 0) { fprintf(stderr, PROGNAME ": error on final libpng call\n"); writepng_cleanup(&wpng_info); wpng_cleanup(); exit(2); } } /* OK, we're done (successfully): clean up all resources and quit */ fprintf(stderr, "Done.\n"); fflush(stderr); writepng_cleanup(&wpng_info); wpng_cleanup(); return 0;}static int wpng_isvalid_latin1(uch *p, int len){ int i, result = -1; for (i = 0; i < len; ++i) { if (p[i] == 10 || (p[i] > 31 && p[i] < 127) || p[i] > 160) continue; /* character is completely OK */ if (result < 0 || (p[result] != 27 && p[i] == 27)) result = i; /* mark location of first questionable one */ } /* or of first escape character (bad) */ return result;}static void wpng_cleanup(void){ if (wpng_info.outfile) { fclose(wpng_info.outfile); wpng_info.outfile = NULL; } if (wpng_info.infile) { fclose(wpng_info.infile); wpng_info.infile = NULL; } if (wpng_info.image_data) { free(wpng_info.image_data); wpng_info.image_data = NULL; } if (wpng_info.row_pointers) { free(wpng_info.row_pointers); wpng_info.row_pointers = NULL; }}#ifdef DOS_OS2_W32static char *dos_kbd_gets(char *buf, int len){ int ch, count=0; do { buf[count++] = ch = getche(); } while (ch != '\r' && count < len-1); buf[count--] = '\0'; /* terminate string */ if (buf[count] == '\r') /* Enter key makes CR, so change to newline */ buf[count] = '\n'; fprintf(stderr, "\n"); /* Enter key does *not* cause a newline */ fflush(stderr); return buf;}#endif /* DOS_OS2_W32 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -