📄 pslib.c
字号:
ps_printf(psdoc, " /Coords [%.2f %.2f %.2f %.2f]\n", psshading->x0, psshading->y0, psshading->x1, psshading->y1); ps_printf(psdoc, " /Extend [ %s %s ]\n", psshading->extend0 ? "true" : "false", psshading->extend1 ? "true" : "false"); ps_printf(psdoc, " /AntiAlias %s\n", psshading->antialias ? "true" : "false"); switch(psshading->startcolor.colorspace) { case PS_COLORSPACE_GRAY: ps_printf(psdoc, " /ColorSpace /DeviceGray\n"); ps_printf(psdoc, " /Function\n"); ps_printf(psdoc, " <<\n"); ps_printf(psdoc, " /FunctionType 2 /Domain [ 0 1 ]\n"); ps_printf(psdoc, " /C0 [ %.4f ]\n", psshading->startcolor.c1); ps_printf(psdoc, " /C1 [ %.4f ]\n", psshading->endcolor.c1); ps_printf(psdoc, " /N %.4f\n", psshading->N); ps_printf(psdoc, " >>\n"); break; case PS_COLORSPACE_RGB: ps_printf(psdoc, " /ColorSpace /DeviceRGB\n"); ps_printf(psdoc, " /Function\n"); ps_printf(psdoc, " <<\n"); ps_printf(psdoc, " /FunctionType 2 /Domain [ 0 1 ]\n"); ps_printf(psdoc, " /C0 [ %.4f %.4f %.4f ]\n", psshading->startcolor.c1, psshading->startcolor.c2, psshading->startcolor.c3); ps_printf(psdoc, " /C1 [ %.4f %.4f %.4f ]\n", psshading->endcolor.c1, psshading->endcolor.c2, psshading->endcolor.c3); ps_printf(psdoc, " /N %.4f\n", psshading->N); ps_printf(psdoc, " >>\n"); break; case PS_COLORSPACE_CMYK: ps_printf(psdoc, " /ColorSpace /DeviceCMYK\n"); ps_printf(psdoc, " /Function\n"); ps_printf(psdoc, " <<\n"); ps_printf(psdoc, " /FunctionType 2 /Domain [ 0 1 ]\n"); ps_printf(psdoc, " /C0 [ %.4f %.4f %.4f %.4f ]\n", psshading->startcolor.c1, psshading->startcolor.c2, psshading->startcolor.c3, psshading->startcolor.c4); ps_printf(psdoc, " /C1 [ %.4f %.4f %.4f %.4f ]\n", psshading->endcolor.c1, psshading->endcolor.c2, psshading->endcolor.c3, psshading->endcolor.c4); ps_printf(psdoc, " /N %.4f\n", psshading->N); ps_printf(psdoc, " >>\n"); break; case PS_COLORSPACE_SPOT: { PSSpotColor *spotcolor; spotcolor = _ps_get_spotcolor(psdoc, (int) psshading->startcolor.c1); if(!spotcolor) { ps_error(psdoc, PS_RuntimeError, _("Could not find spot color.")); return; } ps_printf(psdoc, " /ColorSpace "); ps_printf(psdoc, "[ /Separation (%s)\n", spotcolor->name); switch(spotcolor->colorspace) { case PS_COLORSPACE_GRAY: ps_printf(psdoc, " /DeviceGray { 1 %f sub mul 1 exch sub }\n", spotcolor->c1); break; case PS_COLORSPACE_RGB: { float max; max = (spotcolor->c1 > spotcolor->c2) ? spotcolor->c1 : spotcolor->c2; max = (max > spotcolor->c3) ? max : spotcolor->c3; ps_printf(psdoc, " /DeviceRGB { 1 exch sub dup dup %f exch sub %f mul add exch dup dup %f exch sub %f mul add exch dup %f exch sub %f mul add }\n", max, spotcolor->c1, max, spotcolor->c2, max, spotcolor->c3); break; } case PS_COLORSPACE_CMYK: ps_printf(psdoc, " /DeviceCMYK { dup %f mul exch dup %f mul exch dup %f mul exch %f mul }\n", spotcolor->c1, spotcolor->c2, spotcolor->c3, spotcolor->c4); break; } ps_printf(psdoc, " ]\n"); ps_printf(psdoc, " /Function\n"); ps_printf(psdoc, " <<\n"); ps_printf(psdoc, " /FunctionType 2 /Domain [ 0 1 ]\n"); ps_printf(psdoc, " /C0 [ %.4f ]\n", psshading->startcolor.c2); ps_printf(psdoc, " /C1 [ %.4f ]\n", psshading->endcolor.c2); ps_printf(psdoc, " /N %.4f\n", psshading->N); ps_printf(psdoc, " >>\n"); break; } } ps_printf(psdoc, ">>\n");}/* }}} *//* Start of API functions *//* PS_get_majorversion() {{{ * Get major version of library */PSLIB_API int PSLIB_CALLPS_get_majorversion(void) { return(LIBPS_MAJOR_VERSION);}/* }}} *//* PS_get_minorversion() {{{ * Get minor version of library */PSLIB_API int PSLIB_CALLPS_get_minorversion(void) { return(LIBPS_MINOR_VERSION);}/* }}} *//* PS_get_subminorversion() {{{ * Get minor version of library */PSLIB_API int PSLIB_CALLPS_get_subminorversion(void) { return(LIBPS_MICRO_VERSION);}/* }}} *//* PS_boot() {{{ * Will set text domain, once it works */PSLIB_API void PSLIB_CALLPS_boot(void) {#ifdef ENABLE_NLS /* do not call textdomain in a library textdomain (GETTEXT_PACKAGE); */// setlocale(LC_MESSAGES, "");// setlocale(LC_TIME, "");// setlocale(LC_CTYPE, ""); setlocale(LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);#endif}/* }}} *//* PS_shutdown() {{{ * Counter part to PS_boot() */PSLIB_API void PSLIB_CALLPS_shutdown(void) {}/* }}} *//* PS_set_info() {{{ * Sets several document information will show up as comments in the Header * of the PostScript document */PSLIB_API void PSLIB_CALLPS_set_info(PSDoc *p, const char *key, const char *val) { char *val_buf; char *key_buf; if(NULL == p) { ps_error(p, PS_RuntimeError, _("PSDoc is null.")); return; } if(!ps_check_scope(p, PS_SCOPE_OBJECT|PS_SCOPE_DOCUMENT)) { ps_error(p, PS_RuntimeError, _("%s must be called within 'object', or 'document' scope."), __FUNCTION__); return; } if (key == NULL || key[0] == '\0' || val == NULL || val[0] == '\0') { ps_error(p, PS_Warning, _("Empty key or value in PS_set_info().")); return; } if(p->headerwritten == ps_true) { ps_error(p, PS_Warning, _("Calling PS_set_info() has no effect because PostScript header is already written.")); } val_buf = ps_strdup(p, val); key_buf = ps_strdup(p, key); if (0 == strcmp(key_buf, "Keywords")) { p->Keywords = val_buf; } else if (0 == strcmp(key_buf, "Subject")) { p->Subject = val_buf; } else if (0 == strcmp(key_buf, "Title")) { p->Title = val_buf; } else if (0 == strcmp(key_buf, "Creator")) { p->Creator = val_buf; } else if (0 == strcmp(key_buf, "Author")) { p->Author = val_buf; } else if (0 == strcmp(key_buf, "BoundingBox")) { if(p->BoundingBox) p->free(p, p->BoundingBox); p->BoundingBox = val_buf; } else if (0 == strcmp(key_buf, "Orientation")) { p->Orientation = val_buf; } p->free(p, key_buf);}/* }}} *//* PS_new2() {{{ * Create a new PostScript document. Allows to set memory management * functions and error handler. */PSLIB_API PSDoc * PSLIB_CALLPS_new2(void (*errorhandler)(PSDoc *p, int type, const char *msg, void *data), void* (*allocproc)(PSDoc *p, size_t size, const char *caller), void* (*reallocproc)(PSDoc *p, void *mem, size_t size, const char *caller), void (*freeproc)(PSDoc *p, void *mem), void *opaque) { PSDoc *p; if(allocproc == NULL) { allocproc = _ps_malloc; reallocproc = _ps_realloc; freeproc = _ps_free; } if (errorhandler == NULL) errorhandler = _ps_errorhandler; if(NULL == (p = (PSDoc *) (* allocproc) (NULL, sizeof(PSDoc), "PS new"))) { (*errorhandler)(NULL, PS_MemoryError, _("Could not allocate memory for new PS document."), opaque); return(NULL); } memset((void *)p, 0, (size_t) sizeof(PSDoc)); p->errorhandler = errorhandler; p->user_data = opaque; p->malloc = allocproc; p->realloc = reallocproc; p->free = freeproc; p->fp = NULL; p->sb = NULL; p->copies = 1; p->warnings = ps_true; p->inputenc = ps_get_inputencoding("ISO-8859-1"); //&inputencoding; p->hdict = NULL; p->hdictfilename = NULL; p->categories = dlst_init(allocproc, reallocproc, freeproc); p->parameters = dlst_init(allocproc, reallocproc, freeproc); p->values = dlst_init(allocproc, reallocproc, freeproc); p->bookmarks = dlst_init(allocproc, reallocproc, freeproc); p->lastbookmarkid = 0; p->bookmarkdict = NULL; p->bookmarkcnt = 0; p->CreationDate = NULL; /* Initialize list of fonts */ p->fontcnt = 5; if(NULL == (p->fonts = p->malloc(p, p->fontcnt*sizeof(PSFont *), _("Allocate memory for internal Font list of document.")))) { return(NULL); } memset((void *)p->fonts, 0, p->fontcnt*sizeof(PSFont *)); /* Initialize list of images */ p->imagecnt = 5; if(NULL == (p->images = p->malloc(p, p->imagecnt*sizeof(PSImage *), _("Allocate memory for internal Image list of document.")))) { return(NULL); } memset((void *)p->images, 0, p->imagecnt*sizeof(PSImage *)); /* Initialize list of patterns */ p->patterncnt = 5; if(NULL == (p->patterns = p->malloc(p, p->patterncnt*sizeof(PSPattern *), _("Allocate memory for internal Pattern list of document.")))) { return(NULL); } memset((void *)p->patterns, 0, p->patterncnt*sizeof(PSPattern *)); /* Initialize list of spot colors */ p->spotcolorcnt = 5; if(NULL == (p->spotcolors = p->malloc(p, p->spotcolorcnt*sizeof(PSSpotColor *), _("Allocate memory for internal spot color list of document.")))) { return(NULL); } memset((void *)p->spotcolors, 0, p->spotcolorcnt*sizeof(PSSpotColor *)); /* Initialize list of shadings */ p->shadingcnt = 5; if(NULL == (p->shadings = p->malloc(p, p->shadingcnt*sizeof(PSShading *), _("Allocate memory for internal Shading list of document.")))) { return(NULL); } memset((void *)p->shadings, 0, p->shadingcnt*sizeof(PSShading *)); /* Initialize list of graphic states*/ p->gstatecnt = 5; if(NULL == (p->gstates = p->malloc(p, p->gstatecnt*sizeof(PSGState *), _("Allocate memory for internal graphic state list of document.")))) { return(NULL); } memset((void *)p->gstates, 0, p->gstatecnt*sizeof(PSGState *)); p->agstate = 0; p->agstates[0].x = 0.0; p->agstates[0].y = 0.0; p->agstates[0].strokecolor.colorspace = PS_COLORSPACE_GRAY; p->agstates[0].strokecolor.c1 = 0.0; p->agstates[0].strokecolorinvalid = ps_false; p->agstates[0].fillcolor.colorspace = PS_COLORSPACE_GRAY; p->agstates[0].fillcolor.c1 = 0.0; p->agstates[0].fillcolorinvalid = ps_false; p->tstate = 0; p->tstates[0].tx = 0.0; p->tstates[0].ty = 0.0; p->tstates[0].cx = 0.0; p->tstates[0].cy = 0.0; p->closefp = ps_false; p->page_open = ps_false; p->doc_open = ps_false; p->scopecount = 0; p->scopes[0] = PS_SCOPE_OBJECT; p->headerwritten = ps_false; p->commentswritten = ps_false; p->beginprologwritten = ps_false; p->endprologwritten = ps_false; p->setupwritten = ps_false; p->border_width = 1.0; p->border_style = PS_BORDER_SOLID; p->border_black = 3.0; p->border_white = 3.0; p->border_red = 0.0; p->border_green = 0.0; p->border_blue = 1.0; p->textrendering = -1; return(p);}/* }}} *//* PS_new() {{{ * Create a new PostScript Document. Use the internal memory management * functions and error handler. */PSLIB_API PSDoc * PSLIB_CALLPS_new(void) { return(PS_new2(NULL, NULL, NULL, NULL, NULL));}/* }}} *//* PS_get_opaque() {{{ * Returns the pointer on the user data as it is passed to each call * of the errorhandler. */PSLIB_API void * PSLIB_CALLPS_get_opaque(PSDoc *psdoc) { if(NULL == psdoc) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return(NULL); } return(psdoc->user_data);}/* }}} *//* ps_write_ps_comments() {{{ */static void ps_write_ps_comments(PSDoc *psdoc) { int i; time_t ps_calendar_time; struct tm *ps_local_tm; if(NULL != (psdoc->CreationDate = psdoc->malloc(psdoc, LINEBUFLEN/2, _("Allocate memory for PS header field 'CreationTime'.")))) { ps_calendar_time = time(NULL); if(ps_calendar_time == (time_t)(-1)) { sprintf(psdoc->CreationDate,"%s","20/3/2001 3:30 AM"); } else { ps_local_tm = localtime(&ps_calendar_time); strftime(psdoc->CreationDate, LINEBUFLEN/2, "%d/%m/%Y %I:%M %p", ps_local_tm); } } else { ps_error(psdoc, PS_MemoryError, _("Cannot allocate memory for PS header field 'CreationTime'.")); } ps_printf(psdoc, "%%!PS-Adobe-3.0\n"); if(psdoc->Creator) ps_printf(psdoc, "%%%%Creator: %s (%s)\n", psdoc->Creator, "pslib " LIBPS_DOTTED_VERSION); else ps_printf(psdoc, "%%%%Creator: %s\n", "pslib " LIBPS_DOTTED_VERSION); if(psdoc->CreationDate) { ps_printf(psdoc, "%%%%Creation-Date: %s\n", psdoc->CreationDate); } if(psdoc->Title) ps_printf(psdoc, "%%%%Title: %s\n", psdoc->Title); if(psdoc->Author) ps_printf(psdoc, "%%%%Author: %s\n", psdoc->Author); ps_printf(psdoc, "%%%%PageOrder: Ascend\n"); ps_printf(psdoc, "%%%%Pages: (atend)\n"); if(psdoc->BoundingBox) { ps_printf(psdoc, "%%%%BoundingBox: %s\n", psdoc->BoundingBox); } else { ps_printf(psdoc, "%%%%BoundingBox: (atend)\n"); } if(psdoc->Orientation) ps_printf(psdoc, "%%%%Orientation: %s\n", psdoc->Orientation); else ps_printf(psdoc, "%%%%Orientation: (atend)\n"); ps_printf(psdoc, "%%%%DocumentProcessColors: Black\n"); ps_printf(psdoc, "%%%%DocumentCustomColors: \n"); for(i=0; i<psdoc->spotcolorcnt; i++) { PSSpotColor *spotcolor = psdoc->spotcolors[i]; if(NULL != spotcolor) ps_printf(psdoc, "%%%%+ (%s)\n", spotcolor->name); } ps_printf(psdoc, "%%%%CMYKCustomColor: \n"); for(i=0; i<psdoc->spotcolorcnt; i++) { PSSpotColor *spotcolor = psdoc->spotcolors[i]; if(NULL != spotcolor && spotcolor->colorspace == PS_COLORSPACE_CMYK) ps_printf(psdoc, "%%%%+ %f %f %f %f (%s)\n", spotcolor->c1, spotcolor->c2, spotcolor->c3, spotcolor->c4, spotcolor->name); } ps_printf(psdoc, "%%%%RGBCustomColor: \n"); for(i=0; i<psdoc->spotcolorcnt; i++) { PSSpotColor *spotcolor = psdoc->spotcolors[i]; if(NULL != spotcolor && spotcolor->colorspace == PS_COLORSPACE_RGB) ps_printf(psdoc, "%%%%+ %f %f %f (%s)\n", spotcolor->c1, spotcolor->c2, spotcolor->c3, spotcolor->name); } ps_printf(psdoc, "%%%%EndComments\n"); psdoc->commentswritten = ps_true;}/* }}} *//* ps_write_ps_beginprolog() {{{ */static void ps_write_ps_beginprolog(PSDoc *psdoc) { ps_enter_scope(psdoc, PS_SCOPE_PROLOG); ps_printf(psdoc, "%%%%BeginProlog\n"); ps_printf(psdoc, "%%%%BeginResource: definicoes\n"); ps_printf(psdoc, "%%%%EndResource\n"); ps_printf(psdoc, "%%%%BeginProcSet: standard\n"); ps_printf(psdoc, "/PslibDict 300 dict def PslibDict begin/N{def}def/B{bind def}N\n"); ps_printf(psdoc, "/TR{translate}N/vsize 11 72 mul N/hsize 8.5 72 mul N/isls false N\n"); ps_printf(psdoc, "/p{show}N/w{0 rmoveto}B/a{moveto}B/l{lineto}B"); ps_printf(psdoc, "/qs{currentpoint\n"); ps_printf(psdoc, "currentpoint newpath moveto 3 2 roll dup true charpath stroke\n"); ps_printf(psdoc, "stringwidth pop 3 2 roll add exch moveto}B"); ps_printf(psdoc, "/qf{currentpoint\n"); ps_printf(psdoc, "currentpoint newpath moveto 3 2 roll dup true charpath fill\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -