📄 pnm_enc.c
字号:
/* Initialize the header. */ if (enc->numcmpts == 1) { hdr.magic = encopts.bin ? PNM_MAGIC_BINPGM : PNM_MAGIC_TXTPGM; } else if (enc->numcmpts == 3) { hdr.magic = encopts.bin ? PNM_MAGIC_BINPPM : PNM_MAGIC_TXTPPM; } else { return -1; } hdr.width = width; hdr.height = height; hdr.maxval = (1 << prec) - 1; hdr.sgnd = sgnd; /* Write the header. */ if (pnm_puthdr(out, &hdr)) { return -1; } /* Write the image data. */ if (pnm_putdata(out, &hdr, image, enc->numcmpts, enc->cmpts)) { return -1; } /* Flush the output stream. */ if (jas_stream_flush(out)) { return -1; } return 0;}/******************************************************************************\* Code for parsing options.\******************************************************************************//* Parse the encoder options string. */static int pnm_parseencopts(char *optstr, pnm_encopts_t *encopts){ jas_tvparser_t *tvp; int ret; tvp = 0; /* Initialize default values for encoder options. */ encopts->bin = true; /* Create the tag-value parser. */ if (!(tvp = jas_tvparser_create(optstr ? optstr : ""))) { goto error; } /* Get tag-value pairs, and process as necessary. */ while (!(ret = jas_tvparser_next(tvp))) { switch (jas_taginfo_nonull(jas_taginfos_lookup(pnm_opttab, jas_tvparser_gettag(tvp)))->id) { case OPT_TEXT: encopts->bin = false; break; default: fprintf(stderr, "warning: ignoring invalid option %s\n", jas_tvparser_gettag(tvp)); break; } } if (ret < 0) { goto error; } /* Destroy the tag-value parser. */ jas_tvparser_destroy(tvp); return 0;error: if (tvp) { jas_tvparser_destroy(tvp); } return -1;}/******************************************************************************\* Function for writing header.\******************************************************************************//* Write the header. */static int pnm_puthdr(jas_stream_t *out, pnm_hdr_t *hdr){ int_fast32_t maxval; if (pnm_putuint16(out, hdr->magic)) { return -1; } if (hdr->sgnd) { maxval = -hdr->maxval; } else { maxval = hdr->maxval; } jas_stream_printf(out, "\n%lu %lu\n%ld\n", (unsigned long) hdr->width, (unsigned long) hdr->height, (long) maxval); if (jas_stream_error(out)) { return -1; } return 0;}/******************************************************************************\* Functions for processing the sample data.\******************************************************************************//* Write the image sample data. */static int pnm_putdata(jas_stream_t *out, pnm_hdr_t *hdr, jas_image_t *image, int numcmpts, int *cmpts){ int ret; int cmptno; int x; int y; jas_matrix_t *data[3]; int fmt; jas_seqent_t *d[3]; jas_seqent_t v; int minval; int linelen; int n; char buf[256]; int depth; ret = -1; fmt = pnm_fmt(hdr->magic); minval = -((int) hdr->maxval + 1); depth = pnm_maxvaltodepth(hdr->maxval); data[0] = 0; data[1] = 0; data[2] = 0; for (cmptno = 0; cmptno < numcmpts; ++cmptno) { if (!(data[cmptno] = jas_matrix_create(1, hdr->width))) { goto done; } } for (y = 0; y < hdr->height; ++y) { for (cmptno = 0; cmptno < numcmpts; ++cmptno) { if (jas_image_readcmpt(image, cmpts[cmptno], 0, y, hdr->width, 1, data[cmptno])) { goto done; } d[cmptno] = jas_matrix_getref(data[cmptno], 0, 0); } linelen = 0; for (x = 0; x < hdr->width; ++x) { for (cmptno = 0; cmptno < numcmpts; ++cmptno) { v = *d[cmptno]; if (v < minval) { v = minval; } if (v > ((int) hdr->maxval)) { v = hdr->maxval; } if (fmt == PNM_FMT_BIN) { if (hdr->sgnd) { int_fast32_t sv; sv = v; if (pnm_putsint(out, depth, &sv)) { goto done; } } else { uint_fast32_t uv; uv = v; if (pnm_putuint(out, depth, &uv)) { goto done; } } } else { n = sprintf(buf, "%s%ld", ((!(!x && !cmptno)) ? " " : ""), (long) v); if (linelen > 0 && linelen + n > PNM_MAXLINELEN) { jas_stream_printf(out, "\n"); linelen = 0; } jas_stream_printf(out, "%s", buf); linelen += n; } ++d[cmptno]; } } if (fmt != PNM_FMT_BIN) { jas_stream_printf(out, "\n"); linelen = 0; } if (jas_stream_error(out)) { goto done; } } ret = 0;done: for (cmptno = 0; cmptno < numcmpts; ++cmptno) { if (data[cmptno]) { jas_matrix_destroy(data[cmptno]); } } return ret;}/******************************************************************************\* Miscellaneous functions.\******************************************************************************/static int pnm_putsint(jas_stream_t *out, int wordsize, int_fast32_t *val){ uint_fast32_t tmpval; tmpval = (*val < 0) ? ((~(JAS_CAST(uint_fast32_t, -(*val)) + 1)) & PNM_ONES(wordsize)) : JAS_CAST(uint_fast32_t, (*val)); return pnm_putuint(out, wordsize, &tmpval);}static int pnm_putuint(jas_stream_t *out, int wordsize, uint_fast32_t *val){ int n; uint_fast32_t tmpval; int c; n = (wordsize + 7) / 8; tmpval &= PNM_ONES(8 * n); tmpval = (*val) << (8 * (4 - n)); while (--n >= 0) { c = (tmpval >> 24) & 0xff; if (jas_stream_putc(out, c) == EOF) { return -1; } tmpval = (tmpval << 8) & 0xffffffff; } return 0;}/* Write a 16-bit unsigned integer to a stream. */static int pnm_putuint16(jas_stream_t *out, uint_fast16_t val){ if (jas_stream_putc(out, (unsigned char)(val >> 8)) == EOF || jas_stream_putc(out, (unsigned char)(val & 0xff)) == EOF) { return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -