Last updated: 21. 2.1998, 0:52
<* +M2EXTENSIONS *>
IMPLEMENTATION MODULE ezfont;
(*---------------------------------------
EZFONT.C --- Easy Font Creation
(c) Charles Petzold, 1996
ezfont.mod --- Translation to XDS Modula-2
(c) Peter Stadler, 1997
---------------------------------------*)
IMPORT Windows;
IMPORT SYSTEM;
IMPORT Str;
PROCEDURE EzCreateFont (hdc : Windows.HDC;
szFaceName : ARRAY OF CHAR;
iDeciPtHeight : INTEGER;
iDeciPtWidth : INTEGER;
iAttributes : INTEGER;
fLogRes : BOOLEAN) : Windows.HFONT;
VAR
cxDpi,cyDpi : REAL;
hFont : Windows.HFONT;
lf : Windows.LOGFONT;
pt : ARRAY[0..1] OF Windows.POINT;
tm : Windows.TEXTMETRIC;
BEGIN
Windows.SaveDC (hdc);
Windows.SetGraphicsMode (hdc, Windows.GM_ADVANCED);
Windows.ModifyWorldTransform (hdc, NIL, Windows.MWT_IDENTITY);
Windows.SetViewportOrgEx (hdc, 0, 0, NIL);
Windows.SetWindowOrgEx (hdc, 0, 0, NIL);
IF (fLogRes) THEN
cxDpi := SYSTEM.CAST(REAL,Windows.GetDeviceCaps (hdc, Windows.LOGPIXELSX));
cyDpi := SYSTEM.CAST(REAL,Windows.GetDeviceCaps (hdc, Windows.LOGPIXELSY));
ELSE
cxDpi := 25.4 * SYSTEM.CAST(REAL,Windows.GetDeviceCaps (hdc, Windows.HORZRES) /
Windows.GetDeviceCaps (hdc, Windows.HORZSIZE));
cyDpi := 25.4 * SYSTEM.CAST(REAL,Windows.GetDeviceCaps (hdc, Windows.VERTRES) /
Windows.GetDeviceCaps (hdc, Windows.VERTSIZE));
END;
pt[0].x := VAL(INTEGER,FLOAT(iDeciPtWidth) * cxDpi / 72.);
pt[0].y := VAL(INTEGER,FLOAT(iDeciPtHeight) * cyDpi / 72.);
Windows.DPtoLP (hdc, pt, 1);
lf.lfHeight := - VAL(INTEGER,FLOAT(ABS(pt[0].y)) / 10.0 + 0.5);
lf.lfWidth := 0;
lf.lfEscapement := 0;
lf.lfOrientation := 0;
IF (iAttributes - EZ_ATTR_BOLD=1) THEN
lf.lfWeight := 700;
ELSE
lf.lfWeight := 0;
END;
IF (iAttributes - EZ_ATTR_ITALIC=1) THEN
lf.lfItalic := TRUE;
ELSE
lf.lfItalic := FALSE;
END;
IF (iAttributes - EZ_ATTR_UNDERLINE=1) THEN
lf.lfUnderline := TRUE;
ELSE
lf.lfUnderline := FALSE;
END;
IF (iAttributes - EZ_ATTR_STRIKEOUT=1) THEN
lf.lfStrikeOut := TRUE;
ELSE
lf.lfStrikeOut := FALSE;
END;
lf.lfCharSet := 0;
lf.lfOutPrecision := SYSTEM.CAST(Windows.OUT_PRECIS_ENUM,0);
lf.lfClipPrecision := SYSTEM.CAST(Windows.CLIP_PRECIS_SET,0);
lf.lfQuality := SYSTEM.CAST(Windows.QUALITY_ENUM,0);
lf.lfPitchAndFamily := SYSTEM.CAST(Windows.PITCH_AND_FAMILY_SET,0);
Str.Copy(lf.lfFaceName, szFaceName);
hFont := Windows.CreateFontIndirect (lf);
IF (iDeciPtWidth # 0) THEN
hFont := SYSTEM.CAST(Windows.HFONT,Windows.SelectObject (hdc, SYSTEM.CAST(Windows.HGDIOBJ,hFont)));
Windows.GetTextMetrics (hdc, tm);
Windows.DeleteObject (Windows.SelectObject (hdc, SYSTEM.CAST(Windows.HGDIOBJ,hFont)));
lf.lfWidth := VAL(INTEGER,FLOAT(tm.tmAveCharWidth) *
FLOAT(ABS(pt[0].x)) / FLOAT(ABS(pt[0].y)) + 0.5);
hFont := Windows.CreateFontIndirect (lf);
END;
Windows.RestoreDC (hdc, -1);
RETURN hFont;
END EzCreateFont;
BEGIN
END ezfont.