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

📄 pslib.c

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