⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pslib.c

📁 PSlib是一个用来生成PostScript文件的类库。提供了一个生成PostScript文件的简单方法。
💻 C
📖 第 1 页 / 共 5 页
字号:
		}		/* 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 + -