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