📄 pslib.c
字号:
} /* Add an new parameter */ if(NULL == (parameter = (PS_PARAMETER *) dlst_newnode(psdoc->parameters, (int) sizeof(PS_PARAMETER)))) { return; } parameter->name = ps_strdup(psdoc, name); parameter->value = ps_strdup(psdoc, value); dlst_insertafter(psdoc->parameters, parameter, PS_DLST_HEAD(psdoc->parameters)); }}/* }}} *//* PS_get_parameter() {{{ * Returns a parameter. This function cannot return resources set by * PS_set_parameter(). */PSLIB_API const char * PSLIB_CALLPS_get_parameter(PSDoc *psdoc, const char *name, float modifier) { PS_PARAMETER *param; if(NULL == psdoc) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return(NULL); } if(name == NULL) { ps_error(psdoc, PS_RuntimeError, _("Do not know which parameter to get since the passed name is NULL.")); return(NULL); } if(strcmp(name, "fontname") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(NULL); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(NULL); } return(psfont->metrics->fontname); } else if(strcmp(name, "fontencoding") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(NULL); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(NULL); } return(psfont->metrics->codingscheme); } else if(strcmp(name, "dottedversion") == 0) { return(LIBPS_DOTTED_VERSION); } else if(strcmp(name, "scope") == 0) { switch(ps_current_scope(psdoc)) { case PS_SCOPE_OBJECT: return("object"); case PS_SCOPE_DOCUMENT: return("document"); case PS_SCOPE_NONE: return("null"); case PS_SCOPE_PAGE: return("page"); case PS_SCOPE_PATTERN: return("pattern"); case PS_SCOPE_PATH: return("path"); case PS_SCOPE_TEMPLATE: return("template"); case PS_SCOPE_PROLOG: return("prolog"); case PS_SCOPE_FONT: return("font"); case PS_SCOPE_GLYPH: return("glyph"); } } else { for(param = dlst_first(psdoc->parameters); param != NULL; param = dlst_next(param)) { if (0 == strcmp(param->name, name)) { return(param->value); } } } return(NULL);}/* }}} *//* PS_set_value() {{{ * Sets a float value. */PSLIB_API void PSLIB_CALLPS_set_value(PSDoc *psdoc, const char *name, float value) { PS_VALUE *parameter; if(NULL == psdoc) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return; } if(strcmp(name, "wordspacing") == 0) { ADOBEINFO *ai = NULL; if(psdoc->font && psdoc->font->metrics != NULL) ai = gfindadobe(psdoc->font->metrics->gadobechars, "space"); if(ai) psdoc->font->wordspace = (int) (value * ai->width); } else if(strcmp(name, "textx") == 0) { psdoc->tstates[psdoc->tstate].tx = value; psdoc->tstates[psdoc->tstate].cx = value; } else if(strcmp(name, "texty") == 0) { psdoc->tstates[psdoc->tstate].ty = value; psdoc->tstates[psdoc->tstate].cy = value; } else if(strcmp(name, "textrendering") == 0) { psdoc->textrendering = (int) value; } else { /* Check if value exists */ for(parameter = dlst_first(psdoc->values); parameter != NULL; parameter = dlst_next(parameter)) { if(0 == strcmp(parameter->name, name)) { parameter->value = value; return; } } /* Doesn't exist, so create a new one */ if(NULL == (parameter = (PS_VALUE *) dlst_newnode(psdoc->values, (int) sizeof(PS_VALUE)))) { ps_error(psdoc, PS_MemoryError, _("Could not allocate memory for new node in value list.")); return; } parameter->name = ps_strdup(psdoc, name); parameter->value = value; dlst_insertafter(psdoc->values, parameter, PS_DLST_HEAD(psdoc->values)); }}/* }}} *//* PS_get_value() {{{ * Returns a value set with PS_set_value() * modifier specifies a for which object this value shall be retrieved. * objects are fonts, images, ... */PSLIB_API float PSLIB_CALLPS_get_value(PSDoc *psdoc, const char *name, float modifier) { PS_VALUE *value; if(name == NULL) { ps_error(psdoc, PS_RuntimeError, _("Do not know which value to get since the passed name is NULL.")); return(0.0); } if(NULL == psdoc) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return(0.0); } if(strcmp(name, "fontsize") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->size); } else if(strcmp(name, "font") == 0) { return((float) _ps_find_font(psdoc, psdoc->font)); } else if(strcmp(name, "imagewidth") == 0) { PSImage *psimage = _ps_get_image(psdoc, (int) modifier); if(!psimage) return(0.0); return((float) psimage->width); } else if(strcmp(name, "imageheight") == 0) { PSImage *psimage = _ps_get_image(psdoc, (int) modifier); if(!psimage) return(0.0); return((float) psimage->height); } else if(strcmp(name, "capheight") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->capheight); } else if(strcmp(name, "ascender") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->ascender); } else if(strcmp(name, "descender") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->descender); } else if(strcmp(name, "italicangle") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->italicangle); } else if(strcmp(name, "underlineposition") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->underlineposition); } else if(strcmp(name, "underlinethickness") == 0) { PSFont *psfont; if(0 == (int) modifier) { psfont = psdoc->font; } else { if(NULL == (psfont = _ps_get_font(psdoc, (int) modifier))) return(0.0); } if(NULL == psfont || NULL == psfont->metrics) { ps_error(psdoc, PS_RuntimeError, _("No font set.")); return(0.0); } return(psfont->metrics->underlinethickness); } else if(strcmp(name, "textx") == 0) { return(psdoc->tstates[psdoc->tstate].tx); } else if(strcmp(name, "texty") == 0) { return(psdoc->tstates[psdoc->tstate].ty); } else if(strcmp(name, "textrendering") == 0) { return((float) psdoc->textrendering); } else if(strcmp(name, "wordspacing") == 0) { ADOBEINFO *ai = NULL; if(psdoc->font != NULL && psdoc->font->metrics != NULL) ai = gfindadobe(psdoc->font->metrics->gadobechars, "space"); if(ai) return((float) psdoc->font->wordspace / ai->width); else return(0.0); } else if(strcmp(name, "major") == 0) { return((float) LIBPS_MAJOR_VERSION); } else if(strcmp(name, "minor") == 0) { return((float) LIBPS_MINOR_VERSION); } else if(strcmp(name, "subminor") == 0) { return((float) LIBPS_MICRO_VERSION); } else if(strcmp(name, "revision") == 0) { return((float) LIBPS_MICRO_VERSION); } else { for(value = dlst_first(psdoc->values); value != NULL; value = dlst_next(value)) { if (0 == strcmp(value->name, name)) { return(value->value); } } } return(0.0);}/* }}} *//* PS_list_values() {{{ * Outputs a list of all values */PSLIB_API void PSLIB_CALLPS_list_values(PSDoc *psdoc) { PS_VALUE *value; if(psdoc == NULL) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return; } printf("List of Values\n-----------------------------------\n"); for(value = dlst_first(psdoc->values); value != NULL; value = dlst_next(value)) { printf("%s = %f\n", value->name, value->value); } printf("-------------------------------------\n");}/* }}} *//* PS_list_parameters() {{{ * Outputs a list of all parameters */PSLIB_API void PSLIB_CALLPS_list_parameters(PSDoc *psdoc) { PS_PARAMETER *parameter; if(psdoc == NULL) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return; } printf("List of Parameters\n-----------------------------------\n"); for(parameter = dlst_first(psdoc->parameters); parameter != NULL; parameter = dlst_next(parameter)) { printf("%s = %s\n", parameter->name, parameter->value); } printf("-------------------------------------\n");}/* }}} *//* PS_list_resources() {{{ * Outputs a list of all resources */PSLIB_API void PSLIB_CALLPS_list_resources(PSDoc *psdoc) { PS_CATEGORY *cat; PS_RESOURCE *res; if(psdoc == NULL) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return; } printf("List of Resources\n-----------------------------------\n"); for(cat = dlst_first(psdoc->categories); cat != NULL; cat = dlst_next(cat)) { for(res = dlst_first(cat->resources); res != NULL; res = dlst_next(res)) { printf("%s : %s = %s\n", cat->name, res->name, res->value); } } printf("-------------------------------------\n");}/* }}} *//* PS_begin_page() {{{ * starts a new (the next) page */PSLIB_API void PSLIB_CALLPS_begin_page(PSDoc *psdoc, float width, float height) { int sepcolor; if(NULL == psdoc) { ps_error(psdoc, PS_RuntimeError, _("PSDoc is null.")); return; }// if(psdoc->commentswritten == ps_false) { if(psdoc->page == 0) { /* Do not overwrite the BoundingBox if it has been set before */ if(width != 0.0 && height != 0.0) { if(psdoc->BoundingBox == NULL) { char tmp[30];#ifdef HAVE_SNPRINTF snprintf(tmp, 30, "0 0 %.0f %.0f", width, height);#else sprintf(tmp, "0 0 %.0f %.0f", width, height);#endif psdoc->BoundingBox = ps_strdup(psdoc, tmp); } if(psdoc->Orientation == NULL) { if(width > height) psdoc->Orientation = ps_strdup(psdoc, "Landscape"); else psdoc->Orientation = ps_strdup(psdoc, "Portrait"); } } } /* Make sure the rest of the header is written */ ps_write_ps_header(psdoc); if(!ps_check_scope(psdoc, PS_SCOPE_DOCUMENT)) { ps_error(psdoc, PS_RuntimeError, _("%s must be called within 'document' scope."), __FUNCTION__); return; } (psdoc->page)++; ps_printf(psdoc, "\n%%%%Page: %i %i\n", psdoc->page, psdoc->page); ps_printf(psdoc, "%%%%PageBoundingBox: 0 0 %d %d\n", (int) width, (int) height); ps_printf(psdoc, "%%%%BeginPageSetup\n"); ps_printf(psdoc, "[ /CropBox [0 0 %.2f %.2f] /PAGE pdfmark\n", width, height); sepcolor = (int) PS_get_value(psdoc, "separationcolor", 0.0); if(sepcolor > 0) { ps_printf(psdoc, "userdict 0 %d bop-hook\n", sepcolor-1); ps_printf(psdoc, "PslibDict begin "); ps_printf(psdoc, "/vsize %.2f def ", height); ps_printf(psdoc, "/hsize %.2f def
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -