ezfont.mod: Translation to Stony Brook Modula-2

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.