static void pdc_begin_compress(pdc_output *out) { pdc_core *pdc = out->pdc; if (!pdc_get_compresslevel(out)) { out->compressing = pdc_false; return; } #ifdef HAVE_LIBZ if (out->compr_changed) { if (deflateEnd(&out->z) != Z_OK) pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateEnd", 0, 0, 0); if (deflateInit(&out->z, pdc_get_compresslevel(out)) != Z_OK) pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateInit", 0, 0, 0); out->compr_changed = pdc_false; } else { if (deflateReset(&out->z) != Z_OK) pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateReset", 0, 0, 0); } out->z.avail_in = 0; #endif /* HAVE_LIBZ */ out->compressing = pdc_true; }
static void pdc_end_compress(pdc_output *out) { int status; pdc_core *pdc = out->pdc; /* this may happen during cleanup triggered by an exception handler */ if (!out->compressing) return; if (!pdc_get_compresslevel(out)) { out->compressing = pdc_false; return; } #ifdef HAVE_LIBZ /* Finish the stream */ do { pdc_check_stream(out, 128); out->z.next_out = (Bytef *) out->curpos; out->z.avail_out = (uInt) (out->maxpos - out->curpos); status = deflate(&(out->z), Z_FINISH); out->curpos = out->z.next_out; if (status != Z_STREAM_END && status != Z_OK) pdc_error(pdc, PDC_E_IO_COMPRESS, "Z_FINISH", 0, 0, 0); } while (status != Z_STREAM_END); out->compressing = pdc_false; #endif /* HAVE_LIBZ */ }
void pdf_write_colormap(PDF *p, int slot) { PDF_data_source src; pdf_colorspace *cs, *base; pdc_id length_id; cs = &p->colorspaces[slot]; if (cs->type != Indexed || cs->val.indexed.colormap_done == pdc_true) return; base = &p->colorspaces[cs->val.indexed.base]; pdc_begin_obj(p->out, cs->val.indexed.colormap_id); /* colormap object */ pdc_begin_dict(p->out); if (pdc_get_compresslevel(p->out)) pdc_puts(p->out, "/Filter/FlateDecode\n"); /* Length of colormap object */ length_id = pdc_alloc_id(p->out); pdc_objref(p->out, "/Length", length_id); pdc_end_dict(p->out); src.init = NULL; src.fill = pdf_data_source_buf_fill; src.terminate = NULL; src.buffer_start = (unsigned char *) cs->val.indexed.colormap; src.buffer_length = (size_t) (cs->val.indexed.palette_size * pdf_color_components(p, cs->val.indexed.base)); src.bytes_available = 0; src.next_byte = NULL; /* Write colormap data */ pdf_copy_stream(p, &src, pdc_true); /* colormap data */ pdc_end_obj(p->out); /* colormap object */ pdc_put_pdfstreamlength(p->out, length_id); /* free the colormap now that it's written */ pdc_free(p->pdc, cs->val.indexed.colormap); cs->val.indexed.colormap = NULL; cs->val.indexed.colormap_done = pdc_true; } /* pdf_write_colormap */
/* copy the complete contents of src to a stream */ void pdf_copy_stream(PDF *p, PDF_data_source *src, pdc_bool compress) { int oldcompresslevel = pdc_get_compresslevel(p->out); if (!compress) pdc_set_compresslevel(p->out, 0); if (src->init) src->init(p, src); pdc_begin_pdfstream(p->out); while (src->fill(p, src)) pdc_write(p->out, src->next_byte, src->bytes_available); pdc_end_pdfstream(p->out); if (src->terminate) src->terminate(p, src); if (!compress) pdc_set_compresslevel(p->out, oldcompresslevel); }
/* Start a new pattern definition. */ int pdf__begin_pattern( PDF *p, pdc_scalar width, pdc_scalar height, pdc_scalar xstep, pdc_scalar ystep, int painttype) { int slot = -1; pdc_check_number_limits(p->pdc, "width", width, PDC_FLOAT_PREC, PDC_FLOAT_MAX); pdc_check_number_limits(p->pdc, "height", height, PDC_FLOAT_PREC, PDC_FLOAT_MAX); pdc_check_number_zero(p->pdc, "xstep", xstep); pdc_check_number_zero(p->pdc, "ystep", ystep); if (painttype != 1 && painttype != 2) pdc_error(p->pdc, PDC_E_ILLARG_INT, "painttype", pdc_errprintf(p->pdc, "%d", painttype), 0, 0); if (p->pattern_number == p->pattern_capacity) pdf_grow_pattern(p); pdf_pg_suspend(p); PDF_SET_STATE(p, pdf_state_pattern); p->pattern[p->pattern_number].obj_id = pdc_begin_obj(p->out, PDC_NEW_ID); p->pattern[p->pattern_number].painttype = painttype; pdc_begin_dict(p->out); /* pattern dict*/ p->res_id = pdc_alloc_id(p->out); pdc_puts(p->out, "/PatternType 1\n"); /* tiling pattern */ /* colored or uncolored pattern */ pdc_printf(p->out, "/PaintType %d\n", painttype); pdc_puts(p->out, "/TilingType 1\n"); /* constant spacing */ pdc_printf(p->out, "/BBox[0 0 %f %f]\n", width, height); pdc_printf(p->out, "/XStep %f\n", xstep); pdc_printf(p->out, "/YStep %f\n", ystep); pdc_objref(p->out, "/Resources", p->res_id); p->length_id = pdc_alloc_id(p->out); pdc_objref(p->out, "/Length", p->length_id); if (pdc_get_compresslevel(p->out)) pdc_puts(p->out, "/Filter/FlateDecode\n"); pdc_end_dict(p->out); /* pattern dict*/ pdc_begin_pdfstream(p->out); slot = p->pattern_number; p->pattern_number++; /* top-down y-coordinates */ pdf_set_topdownsystem(p, height); /* set color differing from PDF default */ pdf_set_default_color(p, pdc_false); if (!p->pdc->smokerun) pdc_logg_cond(p->pdc, 1, trc_api, "[Begin pattern %d]\n", slot); return slot; }
static pdc_bool pdc_init_stream( pdc_core *pdc, pdc_output *out, const char *filename, FILE *fp, size_t (*writeproc)(pdc_output *out, void *data, size_t size)) { static const char fn[] = "pdc_init_stream"; #if (defined(MAC) || defined(MACOSX)) && defined(PDF_FILETYPE_SUPPORTED) #if !defined(TARGET_API_MAC_CARBON) || defined(__MWERKS__) FCBPBRec fcbInfo; Str32 name; #endif /* TARGET_API_MAC_CARBON */ FInfo fInfo; FSSpec fSpec; #endif /* (MAC || MACOSX) && PDF_FILETYPE_SUPPORTED */ /* * This may be left over from the previous run. We deliberately * don't reuse the previous buffer in order to avoid potentially * unwanted growth of the allocated buffer due to a single large * document in a longer series of documents. */ if (out->basepos) pdc_free(pdc, (void *) out->basepos); out->basepos = (pdc_byte *) pdc_malloc(pdc, STREAM_BUFSIZE, fn); out->curpos = out->basepos; out->maxpos = out->basepos + STREAM_BUFSIZE; out->buf_incr = STREAM_BUFSIZE; out->base_offset = 0; out->compressing = pdc_false; #ifdef HAVE_LIBZ /* zlib sometimes reads uninitialized memory where it shouldn't... */ memset(&out->z, 0, sizeof out->z); out->z.zalloc = (alloc_func) pdc_zlib_alloc; out->z.zfree = (free_func) pdc_free; out->z.opaque = (voidpf) pdc; if (deflateInit(&out->z, pdc_get_compresslevel(out)) != Z_OK) pdc_error(pdc, PDC_E_IO_COMPRESS, "deflateInit", 0, 0, 0); out->compr_changed = pdc_false; #endif /* Defaults */ out->fp = (FILE *) NULL; out->writeproc = pdc_writeproc_file; if (fp) { out->fp = fp; } else if (writeproc) { out->writeproc = writeproc; /* PDF_open_mem */ } else if (filename == NULL || *filename == '\0') { /* PDF_open_file with in-core output */ out->writeproc = NULL; } else { /* PDF_open_file with file output */ #if !((defined(MAC) || defined (MACOSX)) && defined(__MWERKS__)) if (filename && !strcmp(filename, "-")) { out->fp = stdout; #if !defined(__MWERKS__) && (defined(WIN32) || defined(OS2)) #if !defined(__BORLANDC__) && !defined(OS2) _setmode(_fileno(stdout), _O_BINARY); #else setmode(fileno(stdout), O_BINARY); #endif /* !__BORLANDC__ && !OS2 */ #endif } else { #endif /* !MAC */ char fopenparams[200]; /* sufficient */ #if defined(MVS) || defined(MVS_TEST) if (out->fopenparams != (char *) 0) { strcpy(fopenparams, WRITEMODE); strcat(fopenparams, ","); strcat(fopenparams, out->fopenparams); } else if (out->recordsize <= 1) { strcpy(fopenparams, WRITEMODE_V); } else { strcpy(fopenparams, WRITEMODE); } #else strcpy(fopenparams, WRITEMODE); #endif out->fp = pdc_fopen_logg(out->pdc, filename, fopenparams); if (out->fp == NULL) return pdc_false; #if (defined(MAC) || defined(MACOSX)) && defined(PDF_FILETYPE_SUPPORTED) if (!pdc->ptfrun) { /* set the proper type and creator for the output file */ #if TARGET_API_MAC_CARBON && !defined(__MWERKS__) if (FSPathMakeFSSpec((const UInt8 *) filename, &fSpec) == noErr) { FSpGetFInfo(&fSpec, &fInfo); fInfo.fdType = 'PDF '; fInfo.fdCreator = 'CARO'; FSpSetFInfo(&fSpec, &fInfo); } #else memset(&fcbInfo, 0, sizeof(FCBPBRec)); fcbInfo.ioRefNum = (short) out->fp->handle; fcbInfo.ioNamePtr = name; if (!PBGetFCBInfoSync(&fcbInfo) && FSMakeFSSpec(fcbInfo.ioFCBVRefNum, fcbInfo.ioFCBParID, name, &fSpec) == noErr) { FSpGetFInfo(&fSpec, &fInfo); fInfo.fdType = 'PDF '; fInfo.fdCreator = 'CARO'; FSpSetFInfo(&fSpec, &fInfo); } #endif /* !defined(TARGET_API_MAC_CARBON) || defined(__MWERKS__) */ } #endif /* (MAC || MACOSX) && PDF_FILETYPE_SUPPORTED */ #if !((defined(MAC) || defined (MACOSX)) && defined(__MWERKS__)) } #endif /* !MAC */ } return pdc_true; }
double pdf__get_value(PDF *p, const char *key, double mod) { int i = -1; int imod = (int) mod; double result = 0; const pdc_rectangle *box = NULL; pdf_ppt *ppt; i = pdf_get_index(p, key, pdc_false); if (parms[i].mod_zero && mod != 0) pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%f", mod), key, 0, 0); ppt = p->curr_ppt; switch (i) { case PDF_PARAMETER_IMAGEWIDTH: case PDF_PARAMETER_IMAGEHEIGHT: case PDF_PARAMETER_RESX: case PDF_PARAMETER_RESY: case PDF_PARAMETER_ORIENTATION: if (p->pdc->hastobepos) imod -= 1; pdf_check_handle(p, imod, pdc_imagehandle); break; case PDF_PARAMETER_FONTMAXCODE: case PDF_PARAMETER_CAPHEIGHT: case PDF_PARAMETER_ASCENDER: case PDF_PARAMETER_DESCENDER: case PDF_PARAMETER_XHEIGHT: if (p->pdc->hastobepos) imod -= 1; pdf_check_handle(p, imod, pdc_fonthandle); break; } switch (i) { #if defined(WIN32) && !defined(__BORLANDC__) && !defined(__CYGWIN__) /* CDPDF */ case PDF_PARAMETER_MAXFILEHANDLES: result = (double) pdc_get_maxfilehandles(); break; #endif case PDF_PARAMETER_COMPRESS: result = (double) pdc_get_compresslevel(p->out); break; case PDF_PARAMETER_FLOATDIGITS: result = (double) p->pdc->floatdigits; break; /* TODO (york): take /CropBox into account? */ case PDF_PARAMETER_PAGEWIDTH: box = pdf_get_pagebox(p, pdf_mediabox); result = box->urx - box->llx; break; /* TODO (york): take /CropBox into account? */ case PDF_PARAMETER_PAGEHEIGHT: box = pdf_get_pagebox(p, pdf_mediabox); result = box->ury - box->lly; break; case PDF_PARAMETER_CROPBOX_LLX: box = pdf_get_pagebox(p, pdf_cropbox); result = box->llx; break; case PDF_PARAMETER_CROPBOX_LLY: box = pdf_get_pagebox(p, pdf_cropbox); result = box->lly; break; case PDF_PARAMETER_CROPBOX_URX: box = pdf_get_pagebox(p, pdf_cropbox); result = box->urx; break; case PDF_PARAMETER_CROPBOX_URY: box = pdf_get_pagebox(p, pdf_cropbox); result = box->ury; break; case PDF_PARAMETER_BLEEDBOX_LLX: box = pdf_get_pagebox(p, pdf_bleedbox); result = box->llx; break; case PDF_PARAMETER_BLEEDBOX_LLY: box = pdf_get_pagebox(p, pdf_bleedbox); result = box->lly; break; case PDF_PARAMETER_BLEEDBOX_URX: box = pdf_get_pagebox(p, pdf_bleedbox); result = box->urx; break; case PDF_PARAMETER_BLEEDBOX_URY: box = pdf_get_pagebox(p, pdf_bleedbox); result = box->ury; break; case PDF_PARAMETER_TRIMBOX_LLX: box = pdf_get_pagebox(p, pdf_trimbox); result = box->llx; break; case PDF_PARAMETER_TRIMBOX_LLY: box = pdf_get_pagebox(p, pdf_trimbox); result = box->lly; break; case PDF_PARAMETER_TRIMBOX_URX: box = pdf_get_pagebox(p, pdf_trimbox); result = box->urx; break; case PDF_PARAMETER_TRIMBOX_URY: box = pdf_get_pagebox(p, pdf_trimbox); result = box->ury; break; case PDF_PARAMETER_ARTBOX_LLX: box = pdf_get_pagebox(p, pdf_artbox); result = box->llx; break; case PDF_PARAMETER_ARTBOX_LLY: box = pdf_get_pagebox(p, pdf_artbox); result = box->lly; break; case PDF_PARAMETER_ARTBOX_URX: box = pdf_get_pagebox(p, pdf_artbox); result = box->urx; break; case PDF_PARAMETER_ARTBOX_URY: box = pdf_get_pagebox(p, pdf_artbox); result = box->ury; break; case PDF_PARAMETER_IMAGEWIDTH: pdf_get_image_size(p, imod, (double *) &result, NULL); break; case PDF_PARAMETER_IMAGEHEIGHT: pdf_get_image_size(p, imod, NULL, (double *) &result); break; case PDF_PARAMETER_RESX: pdf_get_image_resolution(p, imod, (double *) &result, NULL); break; case PDF_PARAMETER_RESY: pdf_get_image_resolution(p, imod, NULL, (double *) &result); break; case PDF_PARAMETER_ORIENTATION: result = (double) (p->images[imod].orientation); break; case PDF_PARAMETER_CURRENTX: result = (double) (ppt->gstate[ppt->sl].x); break; case PDF_PARAMETER_CURRENTY: result = (double) (ppt->gstate[ppt->sl].y); break; case PDF_PARAMETER_CTM_A: result = (double) (ppt->gstate[ppt->sl].ctm.a); break; case PDF_PARAMETER_CTM_B: result = (double) (ppt->gstate[ppt->sl].ctm.b); break; case PDF_PARAMETER_CTM_C: result = (double) (ppt->gstate[ppt->sl].ctm.c); break; case PDF_PARAMETER_CTM_D: result = (double) (ppt->gstate[ppt->sl].ctm.d); break; case PDF_PARAMETER_CTM_E: result = (double) (ppt->gstate[ppt->sl].ctm.e); break; case PDF_PARAMETER_CTM_F: result = (double) (ppt->gstate[ppt->sl].ctm.f); break; case PDF_PARAMETER_TEXTX: result = pdf_get_tstate(p, to_textx); break; case PDF_PARAMETER_TEXTY: result = pdf_get_tstate(p, to_texty); break; case PDF_PARAMETER_UNDERLINEWIDTH: result = pdf_get_tstate(p, to_underlinewidth); break; case PDF_PARAMETER_UNDERLINEPOSITION: result = pdf_get_tstate(p, to_underlineposition); break; case PDF_PARAMETER_WORDSPACING: result = pdf_get_tstate(p, to_wordspacing); break; case PDF_PARAMETER_CHARSPACING: result = pdf_get_tstate(p, to_charspacing); break; case PDF_PARAMETER_HORIZSCALING: result = 100 * pdf_get_tstate(p, to_horizscaling); break; case PDF_PARAMETER_ITALICANGLE: result = pdf_get_tstate(p, to_italicangle); break; case PDF_PARAMETER_TEXTRISE: result = pdf_get_tstate(p, to_textrise); break; case PDF_PARAMETER_LEADING: result = pdf_get_tstate(p, to_leading); break; case PDF_PARAMETER_TEXTRENDERING: result = pdf_get_tstate(p, to_textrendering); break; case PDF_PARAMETER_FONTSIZE: result = pdf_get_tstate(p, to_fontsize); break; case PDF_PARAMETER_FONT: result = pdf_get_tstate(p, to_font); if (p->pdc->hastobepos) result += 1; break; case PDF_PARAMETER_MONOSPACE: result = pdf_get_font_float_option(p, fo_monospace); break; case PDF_PARAMETER_FONTMAXCODE: result = (double) (p->fonts[imod].ft.numcodes - 1); break; case PDF_PARAMETER_ASCENDER: result = pdf_font_get_metric_value(p->fonts[imod].ft.m.ascender); break; case PDF_PARAMETER_DESCENDER: result = pdf_font_get_metric_value(p->fonts[imod].ft.m.descender); break; case PDF_PARAMETER_CAPHEIGHT: result = pdf_font_get_metric_value(p->fonts[imod].ft.m.capHeight); break; case PDF_PARAMETER_XHEIGHT: result = pdf_font_get_metric_value(p->fonts[imod].ft.m.xHeight); break; default: pdc_error(p->pdc, PDC_E_PAR_UNSUPPKEY, key, 0, 0, 0); break; } /* switch */ return result; } /* pdf__get_value */
void pdf__set_value(PDF *p, const char *key, double value) { int i; int ivalue = (int) value; pdf_ppt *ppt; i = pdf_get_index(p, key, pdc_true); ppt = p->curr_ppt; pdc_check_number(p->pdc, "value", value); switch (i) { #if defined(WIN32) && !defined(__BORLANDC__) && !defined(__CYGWIN__) /* CDPDF */ case PDF_PARAMETER_MAXFILEHANDLES: ivalue = pdc_set_maxfilehandles(p->pdc, ivalue); if (ivalue == -1) pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%f", value), key, 0, 0); break; #endif case PDF_PARAMETER_COMPRESS: if (ivalue < 0 || ivalue > 9) pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%f", value), key, 0, 0); if (pdc_get_compresslevel(p->out) != ivalue) { /* * We must restart the compression engine and start a new * contents section if we're in the middle of a page. */ if (PDF_GET_STATE(p) == pdf_state_page) { pdf_end_contents_section(p); pdc_set_compresslevel(p->out, ivalue); pdf_begin_contents_section(p); } else pdc_set_compresslevel(p->out, ivalue); } break; case PDF_PARAMETER_FLOATDIGITS: if (3 <= ivalue && ivalue <= 6) { p->pdc->floatdigits = ivalue; } else pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%d", ivalue), key, 0, 0); break; /* TODO (york): take /CropBox into account? */ case PDF_PARAMETER_PAGEWIDTH: { const pdc_rectangle *box = pdf_get_pagebox(p, pdf_mediabox); if (p->ydirection == -1) pdc_error(p->pdc, PDF_E_PAGE_ILLCHGSIZE, 0, 0, 0, 0); if (value < PDF_ACRO_MINPAGE || value > PDF_ACRO_MAXPAGE) pdc_warning(p->pdc, PDF_E_PAGE_SIZE_ACRO, 0, 0, 0, 0); pdf_set_pagebox_urx(p, pdf_mediabox, box->llx + pdf_pos_value(p, key, value, PDC_1_3)); break; } /* TODO (york): take /CropBox into account? */ case PDF_PARAMETER_PAGEHEIGHT: { const pdc_rectangle *box = pdf_get_pagebox(p, pdf_mediabox); if (p->ydirection == -1) pdc_error(p->pdc, PDF_E_PAGE_ILLCHGSIZE, 0, 0, 0, 0); if (value < PDF_ACRO_MINPAGE || value > PDF_ACRO_MAXPAGE) pdc_warning(p->pdc, PDF_E_PAGE_SIZE_ACRO, 0, 0, 0, 0); pdf_set_pagebox_ury(p, pdf_mediabox, box->lly + pdf_pos_value(p, key, value, PDC_1_3)); break; } case PDF_PARAMETER_CROPBOX_LLX: pdf_set_pagebox_llx(p, pdf_cropbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_CROPBOX_LLY: pdf_set_pagebox_lly(p, pdf_cropbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_CROPBOX_URX: pdf_set_pagebox_urx(p, pdf_cropbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_CROPBOX_URY: pdf_set_pagebox_ury(p, pdf_cropbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_BLEEDBOX_LLX: pdf_set_pagebox_llx(p, pdf_bleedbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_BLEEDBOX_LLY: pdf_set_pagebox_lly(p, pdf_bleedbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_BLEEDBOX_URX: pdf_set_pagebox_urx(p, pdf_bleedbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_BLEEDBOX_URY: pdf_set_pagebox_ury(p, pdf_bleedbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_TRIMBOX_LLX: pdf_set_pagebox_llx(p, pdf_trimbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_TRIMBOX_LLY: pdf_set_pagebox_lly(p, pdf_trimbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_TRIMBOX_URX: pdf_set_pagebox_urx(p, pdf_trimbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_TRIMBOX_URY: pdf_set_pagebox_ury(p, pdf_trimbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_ARTBOX_LLX: pdf_set_pagebox_llx(p, pdf_artbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_ARTBOX_LLY: pdf_set_pagebox_lly(p, pdf_artbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_ARTBOX_URX: pdf_set_pagebox_urx(p, pdf_artbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_ARTBOX_URY: pdf_set_pagebox_ury(p, pdf_artbox, pdf_value(p, key, value, PDC_1_3)); break; case PDF_PARAMETER_LEADING: pdf_set_tstate(p, value, to_leading); break; case PDF_PARAMETER_TEXTRISE: pdf_set_tstate(p, value, to_textrise); break; case PDF_PARAMETER_HORIZSCALING: pdf_set_tstate(p, value /100, to_horizscaling); break; case PDF_PARAMETER_ITALICANGLE: pdf_set_tstate(p, value, to_italicangle); break; case PDF_PARAMETER_TEXTRENDERING: pdf_set_tstate(p, value, to_textrendering); break; case PDF_PARAMETER_CHARSPACING: pdf_set_tstate(p, value, to_charspacing); break; case PDF_PARAMETER_WORDSPACING: pdf_set_tstate(p, value, to_wordspacing); break; case PDF_PARAMETER_UNDERLINEWIDTH: pdf_set_tstate(p, value, to_underlinewidth); break; case PDF_PARAMETER_UNDERLINEPOSITION: pdf_set_tstate(p, value, to_underlineposition); break; case PDF_PARAMETER_DEFAULTGRAY: break; case PDF_PARAMETER_DEFAULTRGB: break; case PDF_PARAMETER_DEFAULTCMYK: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILEGRAY: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILERGB: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILECMYK: break; /*****************************************************************************/ /** deprecated historical parameters **/ /*****************************************************************************/ case PDF_PARAMETER_SUBSETLIMIT: case PDF_PARAMETER_SUBSETMINSIZE: { pdc_warning(p->pdc, PDF_E_UNSUPP_SUBSET, 0, 0, 0, 0); break; } case PDF_PARAMETER_DURATION: pdf_set_duration(p, value); break; default: pdc_error(p->pdc, PDC_E_PAR_UNKNOWNKEY, key, 0, 0, 0); break; } /* switch */ } /* pdf__set_value */
void pdf__begin_glyph( PDF *p, const char *glyphname, pdc_scalar wx, pdc_scalar llx, pdc_scalar lly, pdc_scalar urx, pdc_scalar ury) { static const char fn[] = "pdf__begin_glyph"; pdf_font *font; pdf_t3font *t3font; pdf_t3glyph *glyph = NULL; pdc_scalar tbc; int ig; if (glyphname == NULL || *glyphname == '\0') pdc_error(p->pdc, PDC_E_ILLARG_EMPTY, "glyphname", 0, 0, 0); font = &p->fonts[p->t3slot]; t3font = font->t3font; /* error message prefix */ pdc_push_errmsg(p->pdc, PDF_E_T3_FONT_PREFIX, font->apiname, 0, 0, 0); for (ig = 0; ig < t3font->next_glyph; ig++) { glyph = &t3font->glyphs[ig]; if (!pdc_strcmp(glyph->name, glyphname)) { if (t3font->pass == glyph->pass) pdc_error(p->pdc, PDF_E_T3_GLYPH, glyphname, 0, 0, 0); else break; } } /* new glyph */ if (ig == t3font->next_glyph) { if (t3font->pass == 2) pdc_error(p->pdc, PDF_E_T3_UNKOWNGLYPH, glyphname, 0, 0, 0); pdc_check_number(p->pdc, "wx", wx); pdc_check_number(p->pdc, "llx", llx); pdc_check_number(p->pdc, "lly", lly); pdc_check_number(p->pdc, "urx", urx); pdc_check_number(p->pdc, "ury", ury); if (t3font->colorized == pdc_true && (llx != 0 || lly != 0 || urx != 0 || ury != 0)) pdc_error(p->pdc, PDF_E_T3_BADBBOX, 0, 0, 0, 0); if (urx < llx) { tbc = llx; llx = urx; urx = tbc; } if (ury < lly) { tbc = lly; lly = ury; ury = tbc; } if (ig == t3font->capacity) { t3font->capacity *= 2; t3font->glyphs = (pdf_t3glyph *) pdc_realloc(p->pdc, t3font->glyphs, t3font->capacity * sizeof (pdf_t3glyph), fn); } glyph = &t3font->glyphs[ig]; glyph->charproc_id = PDC_BAD_ID; glyph->name = pdc_strdup(p->pdc, glyphname); glyph->wx = wx; glyph->llx = llx; glyph->lly = lly; glyph->urx = urx; glyph->ury = ury; /* see comment in p_font.c for explanation */ glyph->width = 1000 * wx * font->ft.matrix.a; /* if the strdup above fails, cleanup won't touch this slot. */ t3font->next_glyph++; } glyph->pass = t3font->pass; t3font->curr_glyph = ig; pdc_logg_cond(p->pdc, 1, trc_font, "\tBegin of Type3 font glyph \"%s\"\n", glyphname); if (t3font->pass != 1) { if (t3font->pass == 2) pdc_logg_cond(p->pdc, 2, trc_font, "\t\tglyph [%d] was used in text\n", ig); glyph->charproc_id = pdc_begin_obj(p->out, PDC_NEW_ID); pdc_begin_dict(p->out); p->length_id = pdc_alloc_id(p->out); pdc_objref(p->out, "/Length", p->length_id); if (pdc_get_compresslevel(p->out)) pdc_puts(p->out, "/Filter/FlateDecode\n"); pdc_end_dict(p->out); pdc_begin_pdfstream(p->out); if (t3font->colorized == pdc_true) pdc_printf(p->out, "%f 0 d0\n", glyph->wx); else { pdc_printf(p->out, "%f 0 %f %f %f %f d1\n", glyph->wx, glyph->llx, glyph->lly, glyph->urx, glyph->ury); /* adjust the font's bounding box */ if (glyph->llx < font->ft.bbox.llx) font->ft.bbox.llx = glyph->llx; if (glyph->lly < font->ft.bbox.lly) font->ft.bbox.lly = glyph->lly; if (glyph->urx > font->ft.bbox.urx) font->ft.bbox.urx = glyph->urx; if (glyph->ury > font->ft.bbox.ury) font->ft.bbox.ury = glyph->ury; } /* we must initialize the text, graphics and color state * otherwise the user get unpredictable appearance of a * glyph because of optimizing outputting graphics properties. * Following statements were inserted due to bug #719 */ pdf_init_tstate(p); pdf_init_gstate(p); pdf_init_cstate(p); PDF_SET_STATE(p, pdf_state_glyph); } else { PDF_SET_STATE(p, pdf_state_glyphmetrics); } pdc_pop_errmsg(p->pdc); if (!p->pdc->smokerun) pdc_logg_cond(p->pdc, 1, trc_api, "[Begin glyph %d]\n", ig); }
PDFLIB_API void PDFLIB_CALL PDF_set_value(PDF *p, const char *key, float value) { static const char fn[] = "PDF_set_value"; int i; int ivalue = (int) value; if (key == NULL || !*key) pdc_error(p->pdc, PDC_E_ILLARG_EMPTY, "key", 0, 0, 0); i = get_index(key); if (!pdf_enter_api(p, fn, (pdf_state) pdf_state_all, "(p[%p], \"%s\", %g)\n", (void *) p, key, value)) return; if (i == -1) pdc_error(p->pdc, PDC_E_PAR_UNKNOWNKEY, key, 0, 0, 0); if ((p->state_stack[p->state_sp] & parms[i].set_scope) == 0) pdc_error(p->pdc, PDF_E_DOC_SCOPE_SET, key, pdf_current_scope(p), 0, 0); switch (i) { case PDF_PARAMETER_COMPRESS: if (ivalue < 0 || ivalue > 9) pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%f", value), key, 0, 0); if (pdc_get_compresslevel(p->out) != ivalue) { /* * We must restart the compression engine and start a new * contents section if we're in the middle of a page. */ if (PDF_GET_STATE(p) == pdf_state_page) { pdf_end_contents_section(p); pdc_set_compresslevel(p->out, ivalue); pdf_begin_contents_section(p); } else pdc_set_compresslevel(p->out, ivalue); } break; case PDF_PARAMETER_FLOATDIGITS: if (3 <= ivalue && ivalue <= 6) pdc_set_floatdigits(p->pdc, ivalue); else pdc_error(p->pdc, PDC_E_PAR_ILLVALUE, pdc_errprintf(p->pdc, "%d", ivalue), key, 0, 0); break; case PDF_PARAMETER_PAGEWIDTH: if (p->ydirection == -1) pdc_error(p->pdc, PDF_E_PAGE_ILLCHGSIZE, 0, 0, 0, 0); if (p->compatibility >= PDC_1_3 && (value < PDF_ACRO4_MINPAGE || value > PDF_ACRO4_MAXPAGE)) pdc_warning(p->pdc, PDF_E_PAGE_SIZE_ACRO4, 0, 0, 0, 0); p->width = pdf_pos_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_PAGEHEIGHT: if (p->ydirection == -1) pdc_error(p->pdc, PDF_E_PAGE_ILLCHGSIZE, 0, 0, 0, 0); if (p->compatibility >= PDC_1_3 && (value < PDF_ACRO4_MINPAGE || value > PDF_ACRO4_MAXPAGE)) pdc_warning(p->pdc, PDF_E_PAGE_SIZE_ACRO4, 0, 0, 0, 0); p->height = pdf_pos_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_CROPBOX_LLX: p->CropBox.llx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_CROPBOX_LLY: p->CropBox.lly = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_CROPBOX_URX: p->CropBox.urx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_CROPBOX_URY: p->CropBox.ury = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_BLEEDBOX_LLX: p->BleedBox.llx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_BLEEDBOX_LLY: p->BleedBox.lly = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_BLEEDBOX_URX: p->BleedBox.urx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_BLEEDBOX_URY: p->BleedBox.ury = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_TRIMBOX_LLX: p->TrimBox.llx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_TRIMBOX_LLY: p->TrimBox.lly = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_TRIMBOX_URX: p->TrimBox.urx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_TRIMBOX_URY: p->TrimBox.ury = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_ARTBOX_LLX: p->ArtBox.llx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_ARTBOX_LLY: p->ArtBox.lly = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_ARTBOX_URX: p->ArtBox.urx = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_ARTBOX_URY: p->ArtBox.ury = pdf_value(p, key, value, PDC_1_3); break; case PDF_PARAMETER_LEADING: pdf_set_leading(p, value); break; case PDF_PARAMETER_TEXTRISE: pdf_set_text_rise(p, value); break; case PDF_PARAMETER_HORIZSCALING: pdf_set_horiz_scaling(p, value); break; case PDF_PARAMETER_TEXTRENDERING: pdf_set_text_rendering(p, (int) value); break; case PDF_PARAMETER_CHARSPACING: pdf_set_char_spacing(p, value); break; case PDF_PARAMETER_WORDSPACING: pdf_set_word_spacing(p, value); break; case PDF_PARAMETER_DURATION: pdf_set_duration(p, value); break; case PDF_PARAMETER_DEFAULTGRAY: break; case PDF_PARAMETER_DEFAULTRGB: break; case PDF_PARAMETER_DEFAULTCMYK: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILEGRAY: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILERGB: break; case PDF_PARAMETER_SETCOLOR_ICCPROFILECMYK: break; case PDF_PARAMETER_SUBSETLIMIT: pdc_warning(p->pdc, PDF_E_UNSUPP_SUBSET, 0, 0, 0, 0); break; case PDF_PARAMETER_SUBSETMINSIZE: pdc_warning(p->pdc, PDF_E_UNSUPP_SUBSET, 0, 0, 0, 0); break; default: pdc_error(p->pdc, PDC_E_PAR_UNKNOWNKEY, key, 0, 0, 0); break; } /* switch */ } /* PDF_set_value */
void pdf__begin_glyph( PDF *p, const char *glyphname, float wx, float llx, float lly, float urx, float ury) { static const char fn[] = "pdf__begin_glyph"; pdc_t3font *t3font; pdc_t3glyph *glyph; int i; t3font = p->t3font; if (t3font->colorized == pdc_true && (llx != (float) 0 || lly != (float) 0 || urx != (float) 0 || ury != (float) 0)) pdc_error(p->pdc, PDF_E_T3_BADBBOX, t3font->fontname, 0, 0, 0); PDF_SET_STATE(p, pdf_state_glyph); for (i = 0; i < t3font->next_glyph; ++i) { if (!strcmp(t3font->glyphs[i].name, glyphname)) { pdc_error(p->pdc, PDF_E_T3_GLYPH, glyphname, t3font->fontname, 0, 0); } } if (t3font->next_glyph == t3font->capacity) { t3font->capacity *= 2; t3font->glyphs = (pdc_t3glyph *) pdc_realloc(p->pdc, t3font->glyphs, t3font->capacity * sizeof (pdc_t3glyph), fn); } glyph = &t3font->glyphs[t3font->next_glyph]; glyph->charproc_id = pdc_begin_obj(p->out, PDC_NEW_ID); glyph->name = pdc_strdup(p->pdc, glyphname); /* see comment in p_font.c for explanation */ glyph->width = 1000 * wx * t3font->matrix.a; /* if the strdup above fails, cleanup won't touch this slot. */ ++t3font->next_glyph; p->contents = c_page; /* glyph description */ pdc_begin_dict(p->out); /* glyph description dict */ p->length_id = pdc_alloc_id(p->out); pdc_printf(p->out, "/Length %ld 0 R\n", p->length_id); if (pdc_get_compresslevel(p->out)) pdc_puts(p->out, "/Filter/FlateDecode\n"); pdc_end_dict(p->out); /* glyph description dict */ pdc_begin_pdfstream(p->out); /* glyph description stream */ p->next_content++; if (t3font->colorized == pdc_true) pdc_printf(p->out, "%f 0 d0\n", wx); else { pdc_printf(p->out, "%f 0 %f %f %f %f d1\n", wx, llx, lly, urx, ury); /* adjust the font's bounding box */ if (llx < t3font->bbox.llx) t3font->bbox.llx = llx; if (lly < t3font->bbox.lly) t3font->bbox.lly = lly; if (urx > t3font->bbox.urx) t3font->bbox.urx = urx; if (ury > t3font->bbox.ury) t3font->bbox.ury = ury; } }