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