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

📄 meta.h

📁 下载来的一个看图软件的源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
	return (changed);}static int meta_rect (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfL_Coord l_pt;	wmfDrawRectangle_t drawrect;	wmfPen* pen = 0;	U16 par_U16_x;	U16 par_U16_y;	float scope;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 3",Record->size);	}	par_U16_x = ParU16 (API,Record,3);	par_U16_y = ParU16 (API,Record,2);	l_pt = L_Coord (API,par_U16_x,par_U16_y);	drawrect.TL = wmf_D_Coord_translate (API,l_pt);	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);	drawrect.BR = wmf_D_Coord_translate (API,l_pt);	if (SCAN (API))	{	pen = WMF_DC_PEN (P->dc);		scope = (float) (MAX (WMF_PEN_WIDTH (pen),WMF_PEN_HEIGHT (pen))) / 2;		D_Coord_Register (API,drawrect.TL,scope);		D_Coord_Register (API,drawrect.BR,scope);		return (changed);	}	drawrect.width  = 0;	drawrect.height = 0;	drawrect.dc = P->dc;	if (FR->draw_rectangle) FR->draw_rectangle (API,&drawrect);	return (changed);}static int meta_rgn_brush (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfObject* objects;	wmfObject* obj_region;	wmfObject* obj_brush;	wmfRegion* region;	wmfRegion* clip;	wmfBrush* brush;	wmfBrush* temp_brush;	wmfD_Coord d_pt;	wmfPolyRectangle_t polyrect;	U16 oid_region;	U16 oid_brush;	U16 par_U16_x;	U16 par_U16_y;	unsigned int i;	unsigned long max_index;	float width;	float height;	objects = P->objects;	if (Record->function == META_FRAMEREGION)	{	max_index = 3;	}	else	{	max_index = 1;	}	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = %lu",Record->size,max_index);	}	oid_region = ParU16 (API,Record,0);	oid_brush  = ParU16 (API,Record,1);	if ((oid_region >= NUM_OBJECTS (API)) || (oid_brush >= NUM_OBJECTS (API)))	{	WMF_ERROR (API,"Object out of range!");		API->err = wmf_E_BadFormat;		return (changed);	}	obj_region = objects + oid_region;	obj_brush  = objects + oid_brush;	if (SCAN (API) && DIAG (API))	{	diagnose_object (API,(unsigned int) oid_region,obj_region);		diagnose_object (API,(unsigned int) oid_brush, obj_brush );	}	if ((obj_region->type != OBJ_REGION) || (obj_brush->type != OBJ_BRUSH))	{	WMF_ERROR (API,"libwmf: have lost track of the objects in this metafile");		WMF_ERROR (API,"        please send it to us at http://www.wvware.com/");		API->err = wmf_E_Glitch;		return (changed);	}	region = &(obj_region->obj.rgn);	brush = &(obj_brush->obj.brush);	if (Record->function == META_FRAMEREGION)	{	par_U16_x = ParU16 (API,Record,3);		par_U16_y = ParU16 (API,Record,2);		width  = (float) ((double) par_U16_x * ABS (P->dc->pixel_width ));		height = (float) ((double) par_U16_y * ABS (P->dc->pixel_height));	}	else	{	width  = 0;		height = 0;	}	if (SCAN (API))	{	d_pt = region->extents.TL;		d_pt.x -= width;		d_pt.y -= height;		D_Coord_Register (API,d_pt,0);		d_pt = region->extents.BR;		d_pt.x += width;		d_pt.y += height;		D_Coord_Register (API,d_pt,0);		return (changed);	}	polyrect.dc = P->dc;	polyrect.TL = 0;	polyrect.BR = 0;	polyrect.count = 0;	polyrect.width  = 0;	polyrect.height = 0;	if (FR->region_clip) FR->region_clip (API,&polyrect); /* i.e., none */	clip = (wmfRegion*) P->dc->clip;	polyrect.count = MAX (clip->numRects,region->numRects + 1);	polyrect.TL = (wmfD_Coord*) wmf_malloc (API,polyrect.count * sizeof (wmfD_Coord));	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	polyrect.BR = (wmfD_Coord*) wmf_malloc (API,polyrect.count * sizeof (wmfD_Coord));	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	polyrect.count = region->numRects;	for (i = 0; i < polyrect.count; i++)	{	polyrect.TL[i] = region->rects[i].TL;		polyrect.BR[i] = region->rects[i].BR;	}	i = polyrect.count;	polyrect.TL[i] = region->extents.TL;	polyrect.BR[i] = region->extents.BR;	polyrect.width  = width;	polyrect.height = height;	switch (Record->function)	{	case META_FRAMEREGION:		if (FR->region_frame)		{	temp_brush = WMF_DC_BRUSH (polyrect.dc); /* ultimately redundant ?? */			WMF_DC_SET_BRUSH (polyrect.dc,brush);			FR->region_frame (API,&polyrect);			WMF_DC_SET_BRUSH (polyrect.dc,temp_brush); /* ultimately redundant ?? */		}	break;	case META_FILLREGION:		if (FR->region_paint)		{	temp_brush = WMF_DC_BRUSH (polyrect.dc); /* ultimately redundant ?? */			WMF_DC_SET_BRUSH (polyrect.dc,brush);			FR->region_paint (API,&polyrect);			WMF_DC_SET_BRUSH (polyrect.dc,temp_brush); /* ultimately redundant ?? */		}	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;	}	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;	}	polyrect.width  = 0;	polyrect.height = 0;	if (FR->region_clip) FR->region_clip (API,&polyrect);	wmf_free (API,polyrect.TL);	wmf_free (API,polyrect.BR);	return (changed);}static int meta_rgn_paint (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfObject* objects;	wmfObject* obj_region;	wmfRegion* region;	wmfRegion* clip;	wmfD_Coord d_pt;	wmfPolyRectangle_t polyrect;	U16 oid_region;	U16 temp_rop;	unsigned int i;	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_region = ParU16 (API,Record,0);	if (oid_region >= NUM_OBJECTS (API))	{	WMF_ERROR (API,"Object out of range!");		API->err = wmf_E_BadFormat;		return (changed);	}	obj_region = objects + oid_region;	if (SCAN (API) && DIAG (API))	{	diagnose_object (API,(unsigned int) oid_region,obj_region);	}	if (obj_region->type != OBJ_REGION)	{	WMF_ERROR (API,"libwmf: have lost track of the objects in this metafile");		WMF_ERROR (API,"        please send it to us at http://www.wvware.com/");		API->err = wmf_E_Glitch;		return (changed);	}	region = &(obj_region->obj.rgn);	if (SCAN (API))	{	d_pt = region->extents.TL;		D_Coord_Register (API,d_pt,0);		d_pt = region->extents.BR;		D_Coord_Register (API,d_pt,0);		return (changed);	}	polyrect.dc = P->dc;	polyrect.TL = 0;	polyrect.BR = 0;	polyrect.count = 0;	polyrect.width  = 0;	polyrect.height = 0;	if (FR->region_clip) FR->region_clip (API,&polyrect); /* i.e., none */	clip = (wmfRegion*) P->dc->clip;	polyrect.count = MAX (clip->numRects,region->numRects + 1);	polyrect.TL = (wmfD_Coord*) wmf_malloc (API,polyrect.count * sizeof (wmfD_Coord));	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	polyrect.BR = (wmfD_Coord*) wmf_malloc (API,polyrect.count * sizeof (wmfD_Coord));	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	polyrect.count = region->numRects;	for (i = 0; i < polyrect.count; i++)	{	polyrect.TL[i] = region->rects[i].TL;		polyrect.BR[i] = region->rects[i].BR;	}	i = polyrect.count;	polyrect.TL[i] = region->extents.TL;	polyrect.BR[i] = region->extents.BR;	switch (Record->function)	{	case META_INVERTREGION:		if (FR->region_paint)		{	temp_rop = WMF_DC_ROP (polyrect.dc); /* ultimately redundant ?? */			WMF_DC_SET_ROP (polyrect.dc,R2_NOT);			FR->region_paint (API,&polyrect);			WMF_DC_SET_ROP (polyrect.dc,temp_rop); /* ultimately redundant ?? */		}	break;	case META_PAINTREGION:		if (FR->region_paint) FR->region_paint (API,&polyrect);	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;	}	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;	}	if (FR->region_clip) FR->region_clip (API,&polyrect);	wmf_free (API,polyrect.TL);	wmf_free (API,polyrect.BR);	return (changed);}static int meta_rgn_create (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	wmfRecord start;	wmfRecord end;	wmfObject* objects;	wmfObject* obj_region;	wmfRegion* region;	wmfRegion  temp_region;	wmfD_Rect d_r;	U16 i;	U16 oid_region;	U16 x1;	U16 x2;	U16 y1;	U16 y2;	U16 band;	U16 num_band;	U16 num_pair;	U16 count;	unsigned long max_index;	objects = P->objects;	i = 0;	while (objects[i].type && (i < NUM_OBJECTS (API))) i++;	if (i == NUM_OBJECTS (API))	{	WMF_ERROR (API,"Object out of range!");		API->err = wmf_E_BadFormat;		return (changed);	}	oid_region = i;	obj_region = objects + oid_region;	obj_region->type = OBJ_REGION;	region = &(obj_region->obj.rgn);	region->rects = (wmfD_Rect*) wmf_malloc (API,8 * sizeof (wmfD_Rect));	region->size = 8;	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	WmfSetRectRgn (API,region,0);	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; index 0-4,6-10 skipped; max. index = 5",Record->size);		diagnose_object (API,(unsigned int) oid_region,obj_region);	}	num_band = ParU16 (API,Record,5);	if (num_band == 0) return (changed);	temp_region.rects = (wmfD_Rect*) wmf_malloc (API,8 * sizeof (wmfD_Rect));	temp_region.size = 8;	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	WmfSetRectRgn (API,&temp_region,0);	end = OffsetRecord (API,Record,10);	max_index = 10;	for (band = 0; band < num_band; band++)	{	max_index++;		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,",%lu",max_index);		}		start = OffsetRecord (API,&end,1);		count = ParU16 (API,&start,0);		if (count & 1)		{	WMF_ERROR (API,"Delimiter not even!");			API->err = wmf_E_BadFormat;			break;		}		num_pair = count >> 1;		max_index += count + 3;		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,",%lu",max_index);		}		end = OffsetRecord (API,&start,(unsigned long) (count + 3));		if (ParU16 (API,&end,0) != count)		{	WMF_ERROR (API,"Mismatched delimiters!");			API->err = wmf_E_BadFormat;			break;		}		y1 = ParU16 (API,&start,1);		y2 = ParU16 (API,&start,2);		for (i = 0; i < num_pair; i++)		{	x1 = ParU16 (API,&start,(unsigned long) (3 + 2 * i));			x2 = ParU16 (API,&start,(unsigned long) (4 + 2 * i));			D_Rect (API,&d_r,x1,y1,x2,y2);			WmfSetRectRgn (API,&temp_region,&d_r);			WmfCombineRgn (API,region,region,&temp_region,RGN_OR);		}	}	wmf_free (API,temp_region.rects);	return (changed);}static int meta_clip_select (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t* P = (wmfPlayer_t*) API->player_data;	wmfObject* objects;	wmfObject* obj_region;	wmfRegion* region;	wmfRegion* clip;	U16 oid_region;	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_region = ParU16 (API,Record,0);	if (oid_region >= NUM_OBJECTS (API))	{	WMF_ERROR (API,"Object out of range!");		API->err = wmf_E_BadFormat;		return (changed);	}	obj_region = objects + oid_region;	if (SCAN (API) && DIAG (API))	{	diagnose_object (API,(unsigned int) oid_region,obj_region);	}	if (obj_region->type != OBJ_REGION)	{	if (API->flags & WMF_OPT_IGNORE_NONFATAL)		{	/* Some metafiles use this even though no region-objects have been defined,			 * so I have some doubt about the correctness of this handler; perhaps			 * this should reset the clip region to the entire space?			 * 			 * Anyway, I am making this particular error non-fatal.			 */			WMF_DEBUG (API,"libwmf: have lost track of the objects in this metafile");			WMF_DEBUG (API,"        please send it to us at http://www.wvware.com/");		}

⌨️ 快捷键说明

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