void get_log_fontW(const GpFont *font, GpGraphics *graphics, LOGFONTW *lf) { REAL height; if (font->unit == UnitPixel) { height = units_to_pixels(font->emSize, graphics->unit, graphics->yres); if (graphics->unit != UnitDisplay) height *= graphics->scale; } else { if (graphics->unit == UnitDisplay || graphics->unit == UnitPixel) height = units_to_pixels(font->emSize, font->unit, graphics->xres); else height = units_to_pixels(font->emSize, font->unit, graphics->yres); } lf->lfHeight = -(height + 0.5); lf->lfWidth = 0; lf->lfEscapement = 0; lf->lfOrientation = 0; lf->lfWeight = font->otm.otmTextMetrics.tmWeight; lf->lfItalic = font->otm.otmTextMetrics.tmItalic ? 1 : 0; lf->lfUnderline = font->otm.otmTextMetrics.tmUnderlined ? 1 : 0; lf->lfStrikeOut = font->otm.otmTextMetrics.tmStruckOut ? 1 : 0; lf->lfCharSet = font->otm.otmTextMetrics.tmCharSet; lf->lfOutPrecision = OUT_DEFAULT_PRECIS; lf->lfClipPrecision = CLIP_DEFAULT_PRECIS; lf->lfQuality = DEFAULT_QUALITY; lf->lfPitchAndFamily = 0; strcpyW(lf->lfFaceName, font->family->FamilyName); }
GpStatus WINGDIPAPI GdipEnumerateMetafileDestPoint(GpGraphics *graphics, GDIPCONST GpMetafile *metafile, GDIPCONST GpPointF *dest, EnumerateMetafileProc callback, VOID *cb_data, GDIPCONST GpImageAttributes *attrs) { GpRectF destf; if (!graphics || !metafile || !dest) return InvalidParameter; destf.X = dest->X; destf.Y = dest->Y; destf.Width = units_to_pixels(metafile->bounds.Width, metafile->unit, metafile->image.xres); destf.Height = units_to_pixels(metafile->bounds.Height, metafile->unit, metafile->image.yres); return GdipEnumerateMetafileDestRect(graphics, metafile, &destf, callback, cb_data, attrs); }
static GpStatus METAFILE_PlaybackUpdateWorldTransform(GpMetafile *metafile) { GpMatrix *real_transform; GpStatus stat; stat = GdipCreateMatrix3(&metafile->src_rect, metafile->playback_points, &real_transform); if (stat == Ok) { REAL scale = units_to_pixels(1.0, metafile->page_unit, 96.0); if (metafile->page_unit != UnitDisplay) scale *= metafile->page_scale; stat = GdipScaleMatrix(real_transform, scale, scale, MatrixOrderPrepend); if (stat == Ok) stat = GdipMultiplyMatrix(real_transform, metafile->world_transform, MatrixOrderPrepend); if (stat == Ok) stat = GdipSetWorldTransform(metafile->playback_graphics, real_transform); GdipDeleteMatrix(real_transform); } return stat; }
/******************************************************************************* * GdipGetFontHeightGivenDPI [GDIPLUS.@] * PARAMS * font [I] Font to retrieve DPI from * dpi [I] DPI to assume * height [O] Return value * * RETURNS * SUCCESS: Ok * FAILURE: InvalidParameter if font or height is NULL * * NOTES * According to MSDN, the result is (lineSpacing)*(fontSize / emHeight)*dpi * (for anything other than unit Pixel) */ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height) { GpStatus stat; INT style; UINT16 line_spacing, em_height; REAL font_size; if (!font || !height) return InvalidParameter; TRACE("%p (%s), %f, %p\n", font, debugstr_w(font->family->FamilyName), dpi, height); font_size = units_to_pixels(get_font_size(font), font->unit, dpi); style = get_font_style(font); stat = GdipGetLineSpacing(font->family, style, &line_spacing); if (stat != Ok) return stat; stat = GdipGetEmHeight(font->family, style, &em_height); if (stat != Ok) return stat; *height = (REAL)line_spacing * font_size / (REAL)em_height; TRACE("%s,%d => %f\n", debugstr_w(font->family->FamilyName), font->otm.otmTextMetrics.tmHeight, *height); return Ok; }
/******************************************************************************* * GdipCreateFont [GDIPLUS.@] * * Create a new font based off of a FontFamily * * PARAMS * *fontFamily [I] Family to base the font off of * emSize [I] Size of the font * style [I] Bitwise OR of FontStyle enumeration * unit [I] Unit emSize is measured in * **font [I] the resulting Font object * * RETURNS * SUCCESS: Ok * FAILURE: InvalidParameter if fontfamily or font is NULL. * FAILURE: FontFamilyNotFound if an invalid FontFamily is given * * NOTES * UnitDisplay is unsupported. * emSize is stored separately from lfHeight, to hold the fraction. */ GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font) { HFONT hfont; OUTLINETEXTMETRICW otm; LOGFONTW lfw; HDC hdc; GpStatus stat; int ret; if (!fontFamily || !font || emSize < 0.0) return InvalidParameter; TRACE("%p (%s), %f, %d, %d, %p\n", fontFamily, debugstr_w(fontFamily->FamilyName), emSize, style, unit, font); memset(&lfw, 0, sizeof(lfw)); stat = GdipGetFamilyName(fontFamily, lfw.lfFaceName, LANG_NEUTRAL); if (stat != Ok) return stat; lfw.lfHeight = -units_to_pixels(emSize, unit, fontFamily->dpi); lfw.lfWeight = style & FontStyleBold ? FW_BOLD : FW_REGULAR; lfw.lfItalic = style & FontStyleItalic; lfw.lfUnderline = style & FontStyleUnderline; lfw.lfStrikeOut = style & FontStyleStrikeout; hfont = CreateFontIndirectW(&lfw); hdc = CreateCompatibleDC(0); SelectObject(hdc, hfont); otm.otmSize = sizeof(otm); ret = GetOutlineTextMetricsW(hdc, otm.otmSize, &otm); DeleteDC(hdc); DeleteObject(hfont); if (!ret) return NotTrueTypeFont; *font = GdipAlloc(sizeof(GpFont)); if (!*font) return OutOfMemory; (*font)->unit = unit; (*font)->emSize = emSize; (*font)->otm = otm; stat = clone_font_family(fontFamily, &(*font)->family); if (stat != Ok) { GdipFree(*font); return stat; } TRACE("<-- %p\n", *font); return Ok; }