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

📄 meta.h

📁 下载来的一个看图软件的源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
		else		{	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);	clip = (wmfRegion*) P->dc->clip;	WmfCombineRgn (API,clip,region,0,RGN_COPY);	return (changed);}static int meta_clip_offset (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;	wmfL_Coord l_pt;	U16 par_U16_x;	U16 par_U16_y;	unsigned int i;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 1",Record->size);	}	clip = (wmfRegion*) P->dc->clip;	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);	for (i = 0; i < clip->numRects; i++)	{	clip->rects[i].TL.x += l_pt.x;		clip->rects[i].TL.y += l_pt.y;		clip->rects[i].BR.x += l_pt.x;		clip->rects[i].BR.y += l_pt.y;	}	clip->extents.TL.x += l_pt.x;	clip->extents.TL.y += l_pt.y;	clip->extents.BR.x += l_pt.x;	clip->extents.BR.y += l_pt.y;				if (SCAN (API)) return (changed);	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;	}	polyrect.dc = P->dc;	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_clip_combine (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfRegion* visible;	wmfRegion* clip;	wmfPolyRectangle_t polyrect;	wmfD_Rect d_r;	U16 x1;	U16 x2;	U16 y1;	U16 y2;	unsigned int i;	visible = &(P->visible);	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = 3",Record->size);	}	x1 = ParU16 (API,Record,3);	y1 = ParU16 (API,Record,2);	x2 = ParU16 (API,Record,1);	y2 = ParU16 (API,Record,0);	D_Rect (API,&d_r,x1,y1,x2,y2);	clip = (wmfRegion*) P->dc->clip;	switch (Record->function)	{	case META_EXCLUDECLIPRECT:		Clipping (API,clip,visible,&d_r,CLIP_EXCLUDE);	break;	case META_INTERSECTCLIPRECT:		Clipping (API,clip,visible,&d_r,CLIP_INTERSECT);	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))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	if (SCAN (API)) return (changed);	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;	}	polyrect.dc = P->dc;	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_dib_draw (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfRecord bmp_record;	wmfBMP_Read_t bmp_read;	wmfBMP_Draw_t bmp_draw;	wmfL_Coord l_pt_TL;	wmfL_Coord l_pt;	wmfD_Coord d_pt;	U16 par_U16_x = 0;	U16 par_U16_y = 0;	U16 par_U16_w = 0;	U16 par_U16_h = 0;	S32 width;	S32 height;	long pos_current;	double stretch_x;	double stretch_y;	if ((Record->function == META_DIBBITBLT) && ((Record->size) == 9)) /* Special case... */	{	changed = meta_rop_draw (API,Record,attrlist);		return (changed);	}	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);	}	switch (Record->function)	{	case META_SETDIBTODEV:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; index 0 skipped; max. index = 8",Record->size);		}		par_U16_x = ParU16 (API,Record,8);		par_U16_y = ParU16 (API,Record,7);		par_U16_w = ParU16 (API,Record,6);		par_U16_h = ParU16 (API,Record,5);		bmp_draw.crop.w = par_U16_w;		bmp_draw.crop.h = par_U16_h;		bmp_draw.crop.x = ParU16 (API,Record,4);		bmp_draw.crop.y = ParU16 (API,Record,3);		bmp_read.width  = ParU16 (API,Record,2); /* uncertain about this ?? */		bmp_read.height = ParU16 (API,Record,1);		bmp_draw.type = SRCCOPY;		bmp_record = OffsetRecord (API,Record,9);	break;	case META_STRETCHDIB:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; index 2 skipped; max. index = 10",Record->size);		}		par_U16_x = ParU16 (API,Record,10);		par_U16_y = ParU16 (API,Record,9);		par_U16_w = ParU16 (API,Record,8);		par_U16_h = ParU16 (API,Record,7);		bmp_draw.crop.x = ParU16 (API,Record,6);		bmp_draw.crop.y = ParU16 (API,Record,5);		bmp_draw.crop.w = ParU16 (API,Record,4);		bmp_draw.crop.h = ParU16 (API,Record,3);		bmp_read.width  = 0;		bmp_read.height = 0;		bmp_draw.type = (U32) ParU16 (API,Record,0) + (((U32) ParU16 (API,Record,1)) << 16);		bmp_record = OffsetRecord (API,Record,11);	break;	case META_DIBSTRETCHBLT:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; max. index = 9",Record->size);		}		par_U16_x = ParU16 (API,Record,9);		par_U16_y = ParU16 (API,Record,8);		par_U16_w = ParU16 (API,Record,7);		par_U16_h = ParU16 (API,Record,6);		bmp_draw.crop.x = ParU16 (API,Record,5);		bmp_draw.crop.y = ParU16 (API,Record,4);		bmp_draw.crop.w = ParU16 (API,Record,3);		bmp_draw.crop.h = ParU16 (API,Record,2);		bmp_read.width  = 0;		bmp_read.height = 0;		bmp_draw.type = (U32) ParU16 (API,Record,0) + (((U32) ParU16 (API,Record,1)) << 16);		bmp_record = OffsetRecord (API,Record,10);	break;	case META_DIBBITBLT: WMF_DEBUG (API,"(play) META_DIBBITBLT");		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; max. index = 7",Record->size);		}		par_U16_x = ParU16 (API,Record,7);		par_U16_y = ParU16 (API,Record,6);		par_U16_w = ParU16 (API,Record,5);		par_U16_h = ParU16 (API,Record,4);		bmp_draw.crop.x = ParU16 (API,Record,3);		bmp_draw.crop.y = ParU16 (API,Record,2);		bmp_draw.crop.w = par_U16_w;		bmp_draw.crop.h = par_U16_h;		bmp_read.width  = 0;		bmp_read.height = 0;		bmp_draw.type = (U32) ParU16 (API,Record,0) + (((U32) ParU16 (API,Record,1)) << 16);		bmp_record = OffsetRecord (API,Record,8);	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))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	if ((par_U16_w == 0) || (par_U16_h == 0) || (bmp_draw.crop.w == 0) || (bmp_draw.crop.h == 0))	{	return (changed);	}	l_pt_TL = L_Coord (API,par_U16_x,par_U16_y);	bmp_draw.pt = wmf_D_Coord_translate (API,l_pt_TL);	l_pt = L_Coord (API,par_U16_w,par_U16_h);	width  = ABS (l_pt.x);	height = ABS (l_pt.y);	if (SCAN (API))	{	D_Coord_Register (API,bmp_draw.pt,0);		l_pt.x = l_pt_TL.x + width;		l_pt.y = l_pt_TL.y + height;		d_pt = wmf_D_Coord_translate (API,l_pt);		D_Coord_Register (API,d_pt,0);		return (changed);	}	pos_current = WMF_TELL (API);	if (pos_current < 0)	{	WMF_ERROR (API,"API's tell() failed on input stream!");		API->err = wmf_E_BadFile;		return (changed);	}	bmp_read.offset = bmp_record.position;	bmp_read.buffer = bmp_record.parameter;	bmp_read.length = (long) (bmp_record.size) * 2;	bmp_read.bmp.data = 0;	if (FR->bmp_read) FR->bmp_read (API,&bmp_read);	if (ERR (API) || (bmp_read.bmp.data == 0))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	if (WMF_SEEK (API,pos_current) == (-1))	{	WMF_ERROR (API,"API's seek() failed on input stream!");		API->err = wmf_E_BadFile;		return (changed);	}	bmp_draw.dc = P->dc;	bmp_draw.bmp = bmp_read.bmp;	if (bmp_draw.crop.x >= bmp_read.bmp.width ) bmp_draw.crop.x = 0;	if (bmp_draw.crop.y >= bmp_read.bmp.height) bmp_draw.crop.y = 0;	if (bmp_draw.crop.x + bmp_draw.crop.w >= bmp_read.bmp.width)	{	bmp_draw.crop.w = bmp_read.bmp.width - bmp_draw.crop.x;	}	if (bmp_draw.crop.y + bmp_draw.crop.h >= bmp_read.bmp.height)	{	bmp_draw.crop.h = bmp_read.bmp.height - bmp_draw.crop.y;	}	stretch_x = (double) par_U16_w / (double) bmp_draw.crop.w;	stretch_y = (double) par_U16_h / (double) bmp_draw.crop.h;	bmp_draw.pixel_width  = ABS (P->dc->pixel_width ) * stretch_x;	bmp_draw.pixel_height = ABS (P->dc->pixel_height) * stretch_y;	if (FR->bmp_draw) FR->bmp_draw (API,&bmp_draw);	if (FR->bmp_free) FR->bmp_free (API,&(bmp_draw.bmp));	return (changed);}static int meta_dib_brush (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfRecord bmp_record;	wmfObject* objects;	wmfObject* obj_brush;	wmfBrush* brush;	wmfBMP_Read_t bmp_read;	U16 oid_brush;	unsigned int i;	long pos_current;	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_brush = i;	obj_brush = objects + oid_brush;	obj_brush->type = OBJ_BRUSH;	brush = &(obj_brush->obj.brush);	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);		fprintf (stderr,"\t#par=%lu; max. index = ?",Record->size);		diagnose_object (API,(unsigned int) oid_brush,obj_brush);	}	bmp_record = OffsetRecord (API,Record,2);	pos_current = WMF_TELL (API);	if (pos_current < 0)	{	WMF_ERROR (API,"API's tell() failed on input stream!");		API->err = wmf_E_BadFile;		return (changed);	}	bmp_read.offset = bmp_record.position;	bmp_read.buffer = bmp_record.parameter;	bmp_read.length = (long) (bmp_record.size) * 2;	bmp_read.width  = 0;	bmp_read.height = 0;	bmp_read.bmp.width  = 0;	bmp_read.bmp.height = 0;	bmp_read.bmp.data = 0;	if (PLAY (API) && FR->bmp_read) FR->bmp_read (API,&bmp_read);	if (ERR (API))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	if (WMF_SEEK (API,pos_current) == (-1))	{	WMF_ERROR (API,"API's seek() failed on input stream!");		API->err = wmf_E_BadFile;		return (changed);	}	WMF_BRUSH_SET_STYLE (brush,BS_DIBPATTERN);	WMF_BRUSH_SET_COLOR (brush,&wmf_black);	WMF_BRUSH_SET_BITMAP (brush,&(bmp_read.bmp));	if (SCAN (API)) wmf_ipa_color_add (API,WMF_BRUSH_COLOR (brush));	WMF_DC_SET_BRUSH (P->dc,brush);	return (changed);}static int meta_rop_draw (wmfAPI* API,wmfRecord* Record,wmfAttributes* attrlist){	int changed = 0;	wmfPlayer_t*          P  = (wmfPlayer_t*)          API->player_data;	wmfFunctionReference* FR = (wmfFunctionReference*) API->function_reference;	wmfROP_Draw_t rop_draw;	wmfL_Coord l_pt_TL;	wmfL_Coord l_pt;	U16 par_U16_x = 0;	U16 par_U16_y = 0;	U16 par_U16_w = 0;	U16 par_U16_h = 0;	S32 width;	S32 height;	if (SCAN (API) && DIAG (API))	{	fprintf (stderr,"\t[0x%04x]",Record->function);	}	switch (Record->function)	{	case META_DIBBITBLT: /* META_DIBBITBLT: Special case: Size = 12 */		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; index 2-4 skipped; max. index = 8",Record->size);		}		par_U16_x = ParU16 (API,Record,8);		par_U16_y = ParU16 (API,Record,7);		par_U16_w = ParU16 (API,Record,6);		par_U16_h = ParU16 (API,Record,5);		rop_draw.ROP = (U32) ParU16 (API,Record,0) + (((U32) ParU16 (API,Record,1)) << 16);	break;	case META_PATBLT:		if (SCAN (API) && DIAG (API))		{	fprintf (stderr,"\t#par=%lu; max. index = 5",Record->size);		}		par_U16_x = ParU16 (API,Record,5);		par_U16_y = ParU16 (API,Record,4);		par_U16_w = ParU16 (API,Record,3);		par_U16_h = ParU16 (API,Record,2);		rop_draw.ROP = (U32) ParU16 (API,Record,0) + (((U32) ParU16 (API,Record,1)) << 16);	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))	{	WMF_DEBUG (API,"bailing...");		return (changed);	}	l_pt_TL = L_Coord (API,par_U16_x,par_U16_y);	rop_draw.TL = wmf_D_Coord_translate (API,l_pt_TL);

⌨️ 快捷键说明

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