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

📄 meta.h

📁 下载来的一个看图软件的源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
	l_pt = L_Coord (API,par_U16_w,par_U16_h);	width  = ABS (l_pt.x);	height = ABS (l_pt.y);	l_pt.x = l_pt_TL.x + width;	l_pt.y = l_pt_TL.y + height;	rop_draw.BR = wmf_D_Coord_translate (API,l_pt);	if (SCAN (API))	{	D_Coord_Register (API,rop_draw.TL,0);		D_Coord_Register (API,rop_draw.BR,0);		return (changed);	}	rop_draw.dc = P->dc;	rop_draw.pixel_width  = ABS (P->dc->pixel_width );	rop_draw.pixel_height = ABS (P->dc->pixel_height);	if (FR->rop_draw) FR->rop_draw (API,&rop_draw);	return (changed);}static int meta_dc_set (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	U16 par_U16;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 0",Record->size);	}	par_U16 = ParU16 (API,Record,0);	switch (Record->function)	{	case META_SETROP2:		WMF_DC_SET_ROP (P->dc,par_U16);	break;	case META_SETTEXTJUSTIFICATION:		WMF_DC_SET_BREAKEXTRA (P->dc,par_U16);	break;	case META_SETTEXTCHAREXTRA:		WMF_DC_SET_CHAREXTRA (P->dc,par_U16);	break;	case META_SETPOLYFILLMODE:		WMF_DC_SET_POLYFILL (P->dc,par_U16);	break;	case META_SETTEXTALIGN:		WMF_DC_SET_TEXTALIGN (P->dc,par_U16);	break;	case META_SETBKMODE:		if (par_U16 == TRANSPARENT)		{	WMF_DC_SET_TRANSPARENT (P->dc);		}		else		{	WMF_DC_SET_OPAQUE (P->dc);			if (par_U16 != OPAQUE) WMF_DEBUG (API,"unexpected background mode; assuming opaque...");		}	break;	default:		WMF_ERROR (API,"libwmf: erk! programmer's error...");		WMF_ERROR (API,"        please contact us at http://www.wvware.com/");		API->err = wmf_E_Glitch;	break;	}	return (changed);}static int meta_dc_color (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	wmfRGB color;	U16 par_U16_rg;	U16 par_U16_b;	const char * value = 0;	char hash[8];	unsigned long rgbhex;	static char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 1",Record->size);	}	if (API->flags & API_ENABLE_EDITING)	{	if (value = wmf_attr_query (API, attrlist, "color"))		{	if ((*value) == '#')			{	if (sscanf (value+1, "%lx", &rgbhex) == 1)				{	par_U16_rg = (U16) ((rgbhex >> 8) & 0xffff);					par_U16_b  = (U16) ( rgbhex       & 0x00ff);					if (PutParU16 (API,Record,1,par_U16_b )) changed = 1;					if (PutParU16 (API,Record,0,par_U16_rg)) changed = 1;				}				else				{	value = 0; /* force a re-write below */				}			}			else			{	value = 0; /* force a re-write below */			}		}	}	par_U16_b  = ParU16 (API,Record,1);	par_U16_rg = ParU16 (API,Record,0);	color = rgb (API,par_U16_rg,par_U16_b);	if ((API->flags & API_ENABLE_EDITING) && ((value == 0) || changed))	{	hash[0] = '#';		hash[1] = hex[(color.r >> 4) & 0x0f];		hash[2] = hex[ color.r       & 0x0f];		hash[3] = hex[(color.g >> 4) & 0x0f];		hash[4] = hex[ color.g       & 0x0f];		hash[5] = hex[(color.b >> 4) & 0x0f];		hash[6] = hex[ color.b       & 0x0f];		hash[7] = 0;		value = wmf_attr_add (API, attrlist, "color", hash);	}	if (SCAN (API)) wmf_ipa_color_add (API,&color);	switch (Record->function)	{	case META_SETTEXTCOLOR:		WMF_DC_SET_TEXTCOLOR (P->dc,&color);	break;	case META_SETBKCOLOR:		WMF_DC_SET_BACKGROUND (P->dc,&color);	break;	default:		WMF_ERROR (API,"libwmf: erk! programmer's error...");		WMF_ERROR (API,"        please contact us at http://www.wvware.com/");		API->err = wmf_E_Glitch;	break;	}	return (changed);}static int meta_dc_select (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	wmfObject* objects;	wmfObject* obj;	U16 oid;	objects = P->objects;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 0",Record->size);	}	oid = ParU16 (API,Record,0);	if (oid >= NUM_OBJECTS (API))	{	WMF_ERROR (API,"Object out of range!");		API->err = wmf_E_BadFormat;		return (changed);	}	obj = objects + oid;	if (SCAN (API) && DIAG (API))	{	diagnose_object (API,(unsigned int) oid,obj);	}	switch (obj->type)	{	case OBJ_BRUSH:		WMF_DC_SET_BRUSH (P->dc,&(obj->obj.brush));	break;	case OBJ_PEN:		WMF_DC_SET_PEN (P->dc,&(obj->obj.pen));	break;	case OBJ_FONT:		WMF_DC_SET_FONT (P->dc,&(obj->obj.font));	break;	default:		WMF_DEBUG (API,"unexpected object type!");	break;	}	return (changed);}static int meta_dc_save (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist) /* complete ?? */{	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = ?",Record->size);	}	dc_stack_push (API,P->dc);	P->dc = dc_copy (API,P->dc);	return (changed);}static int meta_dc_restore (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfRegion* clip;	wmfPolyRectangle_t polyrect;	wmfUserData_t      userdata;	unsigned int i;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = ?",Record->size);	}	/* for (i = PAR(0); i < 0; i++) *//* Implies PAR(0) is signed ?? */	userdata.dc = P->dc;	userdata.data = P->dc->userdata;	if (PLAY (API) && FR->udata_free) FR->udata_free (API,&userdata);	clip = (wmfRegion*) P->dc->clip;	wmf_free (API,clip->rects);	wmf_free (API,P->dc->clip);	wmf_free (API,P->dc);	P->dc = dc_stack_pop (API);	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	if (SCAN (API)) return (changed);	userdata.dc = P->dc;	userdata.data = P->dc->userdata;	if (FR->udata_set) FR->udata_set (API,&userdata);				clip = (wmfRegion*) P->dc->clip;	polyrect.dc = P->dc;	polyrect.width  = 0;	polyrect.height = 0;	if (clip->numRects)	{	polyrect.TL = (wmfD_Coord*) wmf_malloc (API,clip->numRects * sizeof (wmfD_Coord));		if (ERR (API))		{	WMF_DEBUG (API,"bailing...");			return (changed);		}		polyrect.BR = (wmfD_Coord*) wmf_malloc (API,clip->numRects * sizeof (wmfD_Coord));		if (ERR (API))		{	WMF_DEBUG (API,"bailing...");			return (changed);		}		polyrect.count = clip->numRects;		for (i = 0; i < polyrect.count; i++)		{	polyrect.TL[i] = clip->rects[i].TL;			polyrect.BR[i] = clip->rects[i].BR;		}		wmf_free (API,polyrect.TL);		wmf_free (API,polyrect.BR);	}	else	{	polyrect.TL = 0;		polyrect.BR = 0;		polyrect.count = 0;	}	if (FR->region_clip) FR->region_clip (API,&polyrect);	return (changed);}static int meta_text (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfFontData*          FD = (wmfFontData*)          API->font_data;	wmfRecord str_record;	wmfRecord lpDx_record;	wmfL_Coord l_pt;	wmfD_Coord d_pt;	wmfD_Coord t_pt;	wmfD_Coord o_pt;	wmfDrawText_t drawtext;	wmfFont* font = 0;	U16 par_U16;	U16 par_U16_x;	U16 par_U16_y;	U16 i;	U16 length = 0;	U16 bbox_info = 0;	U16 l_width;	U16* lpDx = 0;	char buffer[2];	char* str_save;	double theta;	double ratio;	float cos_theta;	float sin_theta;	float width;	switch (Record->function)	{	case META_TEXTOUT:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t[0x%04x]",Record->function);			fprintf (stderr,"\t#par=%lu; max. index = 0",Record->size);		}		if (WMF_DC_TEXTALIGN (P->dc) & TA_UPDATECP)		{	if ((Record->size) < (1 + (length + 1) / 2))			{	WMF_ERROR (API,"Record is too short!");				API->err = wmf_E_BadFormat;				break;			}			l_pt = P->current;		}		else		{	if ((Record->size) < (3 + (length + 1) / 2))			{	WMF_ERROR (API,"Record is too short!");				API->err = wmf_E_BadFormat;				break;			}			if (SCAN (API) && DIAG (API))			{	fprintf (stderr,",-2,-1");			}			par_U16_x  = ParU16 (API,Record,(Record->size)-1);			par_U16_y  = ParU16 (API,Record,(Record->size)-2);			l_pt = L_Coord (API,par_U16_x,par_U16_y);		}		drawtext.pt = wmf_D_Coord_translate (API,l_pt);		length = ParU16 (API,Record,0);		if (length == 0) break;		drawtext.TL.x = 0;		drawtext.TL.y = 0;		drawtext.BR.x = 0;		drawtext.BR.y = 0;		str_record = OffsetRecord (API,Record,1);	break;	case META_EXTTEXTOUT:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t[0x%04x]",Record->function);		}		if (WMF_DC_TEXTALIGN (P->dc) & TA_UPDATECP)		{	if (SCAN (API) && DIAG (API))			{	fprintf (stderr,"\t#par=%lu; index 0-1 ignored; max. index = 3",Record->size);			}			l_pt = P->current;		}		else		{	if (SCAN (API) && DIAG (API))			{	fprintf (stderr,"\t#par=%lu; max. index = 3",Record->size);			}			par_U16_x  = ParU16 (API,Record,1);			par_U16_y  = ParU16 (API,Record,0);			l_pt = L_Coord (API,par_U16_x,par_U16_y);		}		drawtext.pt = wmf_D_Coord_translate (API,l_pt);		length = ParU16 (API,Record,2);		if (length == 0) break;		bbox_info = ParU16 (API,Record,3);		if (bbox_info)		{	if (SCAN (API) && DIAG (API))			{	fprintf (stderr,",7");			}			par_U16_x  = ParU16 (API,Record,4); /* Is this right ?? */			par_U16_y  = ParU16 (API,Record,5);			l_pt = L_Coord (API,par_U16_x,par_U16_y);			drawtext.TL = wmf_D_Coord_translate (API,l_pt);			par_U16_x  = ParU16 (API,Record,6); /* Is this right ?? */			par_U16_y  = ParU16 (API,Record,7);			l_pt = L_Coord (API,par_U16_x,par_U16_y);			drawtext.BR = wmf_D_Coord_translate (API,l_pt);			if (SCAN (API))			{	D_Coord_Register (API,drawtext.TL,0);				D_Coord_Register (API,drawtext.BR,0);			}			str_record = OffsetRecord (API,Record,8);		}		else		{	drawtext.TL.x = 0;			drawtext.TL.y = 0;			drawtext.BR.x = 0;			drawtext.BR.y = 0;			str_record = OffsetRecord (API,Record,4);		}	break;	default:		WMF_ERROR (API,"libwmf: erk! programmer's error...");		WMF_ERROR (API,"        please contact us at http://www.wvware.com/");		API->err = wmf_E_Glitch;	break;	}	if (ERR (API)) return (changed);	if (length == 0) return (changed);	drawtext.str = (char*) wmf_malloc (API,length + 1);	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	font = WMF_DC_FONT (P->dc);        /* FIXME: bug here?  Negative font height is supposed to represent absolute font pointsize */	drawtext.font_height = (double) WMF_FONT_HEIGHT (font) * ABS (P->dc->pixel_height);        /* FIXME: bug here, WMF_FONT_WIDTH and  WMF_FONT_HEIGHT do not necessarily have same scale! */	drawtext.font_ratio = (double) WMF_FONT_WIDTH (font) / (double) WMF_FONT_HEIGHT (font);	par_U16 = 0;	for (i = 0; i < length; i++)	{	if (i & 1)		{	drawtext.str[i] =  (par_U16 >> 8) & 0xff;		}		else		{	par_U16 = ParU16 (API,&str_record,i/2);			drawtext.str[i] =  par_U16 & 0xff;		}	}	drawtext.str[length] = '\0';	width = FD->stringwidth (API,font,drawtext.str);	width = (float) ((double) width * drawtext.font_height * drawtext.font_ratio);	lpDx_record = OffsetRecord (API,&str_record,(length+1)/2);	if ((Record->function == META_EXTTEXTOUT) && ((lpDx_record.size) >= length))	{	lpDx = (U16*) wmf_malloc (API,length * sizeof (U16));		if (ERR (API))		{	WMF_DEBUG (API,"bailing...");			return (changed);		}		l_width = 0;		for (i = 0; i < length; i++)		{	lpDx[i] = ParU16 (API,&lpDx_record,i);			l_width += lpDx[i];		}		l_pt = L_Coord (API,0,0);		t_pt = wmf_D_Coord_translate (API,l_pt);		l_pt = L_Coord (API,l_width,0);		d_pt = wmf_D_Coord_translate (API,l_pt);		width = d_pt.x - t_pt.x;	}	theta = - WMF_TEXT_ANGLE (font);	cos_theta = (float) cos (theta);	sin_theta = (float) sin (theta);	/* Okay, have text reference point, string width & font height, & angle (in radians)	 * Compute bounding box and adjust for alignment:	 */	if (WMF_DC_TEXTALIGN (P->dc) & TA_BASELINE)	{	/* */	}	else if (WMF_DC_TEXTALIGN (P->dc) & TA_BOTTOM)	{	d_pt.y = - drawtext.font_height / 3; /* This is only approximate... */		t_pt.x = - d_pt.y * sin_theta;		t_pt.y =   d_pt.y * cos_theta;		drawtext.pt.x += t_pt.x;		drawtext.pt.y += t_pt.y;	}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -