📄 meta.h
字号:
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 + -