Last updated: 21. 2.1998, 0:50
<*/NOWARN:F*>
IMPLEMENTATION MODULE ezfont;
(*---------------------------------------
EZFONT.C --- Easy Font Creation
(c) Charles Petzold, 1996
ezfont.mod --- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1997
---------------------------------------*)
IMPORT WIN32;
IMPORT WINUSER;
IMPORT COMMDLG;
IMPORT WINGDI;
IMPORT SYSTEM;
IMPORT Str;
IMPORT WINX;
PROCEDURE EzCreateFont (hdc : WIN32.HDC;
szFaceName : ARRAY OF CHAR;
iDeciPtHeight : INTEGER;
iDeciPtWidth : INTEGER;
iAttributes : INTEGER;
fLogRes : BOOLEAN) : WIN32.HFONT;
VAR
cxDpi,cyDpi : REAL;
hFont : WIN32.HFONT;
lf : WINGDI.LOGFONT;
pt : WIN32.POINT;
tm : WINGDI.TEXTMETRIC;
BEGIN
WINGDI.SaveDC (hdc);
WINGDI.SetGraphicsMode (hdc, WINGDI.GM_ADVANCED);
WINGDI.ModifyWorldTransform (hdc, WINX.NIL_XFORM, WINGDI.MWT_IDENTITY);
WINGDI.SetViewportOrgEx (hdc, 0, 0, WINX.NIL_POINT);
WINGDI.SetWindowOrgEx (hdc, 0, 0, WINX.NIL_POINT);
IF (fLogRes) THEN
cxDpi := SYSTEM.CAST(REAL,WINGDI.GetDeviceCaps (hdc, WINGDI.LOGPIXELSX));
cyDpi := SYSTEM.CAST(REAL,WINGDI.GetDeviceCaps (hdc, WINGDI.LOGPIXELSY));
ELSE
cxDpi := 25.4 * SYSTEM.CAST(REAL,WINGDI.GetDeviceCaps (hdc, WINGDI.HORZRES) /
WINGDI.GetDeviceCaps (hdc, WINGDI.HORZSIZE));
cyDpi := 25.4 * SYSTEM.CAST(REAL,WINGDI.GetDeviceCaps (hdc, WINGDI.VERTRES) /
WINGDI.GetDeviceCaps (hdc, WINGDI.VERTSIZE));
END;
pt.x := VAL(INTEGER,FLOAT(iDeciPtWidth) * cxDpi / 72.);
pt.y := VAL(INTEGER,FLOAT(iDeciPtHeight) * cyDpi / 72.);
WINGDI.DPtoLP (hdc, pt, 1);
lf.lfHeight := - VAL(INTEGER,FLOAT(ABS(pt.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 := 0;
lf.lfClipPrecision := 0;
lf.lfQuality := 0;
lf.lfPitchAndFamily := 0;
Str.Copy(lf.lfFaceName, szFaceName);
hFont := WINGDI.CreateFontIndirect (lf);
IF (iDeciPtWidth # 0) THEN
hFont := SYSTEM.CAST(WIN32.HFONT,WINGDI.SelectObject (hdc, SYSTEM.CAST(WIN32.HGDIOBJ,hFont)));
WINGDI.GetTextMetrics (hdc, tm);
WINGDI.DeleteObject (WINGDI.SelectObject (hdc, SYSTEM.CAST(WIN32.HGDIOBJ,hFont)));
lf.lfWidth := VAL(INTEGER,FLOAT(tm.tmAveCharWidth) *
FLOAT(ABS(pt.x)) / FLOAT(ABS(pt.y)) + 0.5);
hFont := WINGDI.CreateFontIndirect (lf);
END;
WINGDI.RestoreDC (hdc, -1);
RETURN hFont;
END EzCreateFont;
BEGIN
END ezfont.