/*---------------------------------------
  EZFONT.C -- Easy Font Creation
              (c) Charles Petzold, 1998
 ---------------------------------------*/

#include <windows.h>
#include <math.h>
#include "winlib.h"

HFONT EzCreateFont (HDC hdc, TCHAR * szFaceName, int iDeciPtHeight,
                   int iDeciPtWidth, int iAttributes, BOOL fLogRes)
{
    FLOAT      cxDpi, cyDpi ;
    HFONT      hFont ;
    LOGFONT    lf ;
    POINT      pt ;
    TEXTMETRIC tm ;

    SaveDC (hdc) ;

    SetGraphicsMode (hdc, GM_ADVANCED) ;
    ModifyWorldTransform (hdc, NULL, MWT_IDENTITY) ;
    SetViewportOrgEx (hdc, 0, 0, NULL) ;
    SetWindowOrgEx   (hdc, 0, 0, NULL) ;

    if (fLogRes)
    {
         cxDpi = (FLOAT) GetDeviceCaps (hdc, LOGPIXELSX) ;
         cyDpi = (FLOAT) GetDeviceCaps (hdc, LOGPIXELSY) ;
    }
    else
    {
         cxDpi = (FLOAT) (25.4 * GetDeviceCaps (hdc, HORZRES) /
                                       GetDeviceCaps (hdc, HORZSIZE)) ;

         cyDpi = (FLOAT) (25.4 * GetDeviceCaps (hdc, VERTRES) /
                                       GetDeviceCaps (hdc, VERTSIZE)) ;
    }

    pt.x = (int) (iDeciPtWidth  * cxDpi / 72) ;
    pt.y = (int) (iDeciPtHeight * cyDpi / 72) ;

    DPtoLP (hdc, &pt, 1) ;

    lf.lfHeight         = - (int) (fabs (pt.y) / 10.0 + 0.5) ;
    lf.lfWidth          = 0 ;
    lf.lfEscapement     = 0 ;
    lf.lfOrientation    = 0 ;
    lf.lfWeight         = iAttributes & EZ_ATTR_BOLD      ? 700 : 0 ;
    lf.lfItalic         = iAttributes & EZ_ATTR_ITALIC    ?   1 : 0 ;
    lf.lfUnderline      = iAttributes & EZ_ATTR_UNDERLINE ?   1 : 0 ;
    lf.lfStrikeOut      = iAttributes & EZ_ATTR_STRIKEOUT ?   1 : 0 ;
    lf.lfCharSet        = DEFAULT_CHARSET ;
    lf.lfOutPrecision   = 0 ;
    lf.lfClipPrecision  = 0 ;
    lf.lfQuality        = 0 ;
    lf.lfPitchAndFamily = 0 ;

    lstrcpy (lf.lfFaceName, szFaceName) ;

    hFont = CreateFontIndirect (&lf) ;

    if (iDeciPtWidth != 0)
    {
         hFont = (HFONT) SelectObject (hdc, hFont) ;

         GetTextMetrics (hdc, &tm) ;

         DeleteObject (SelectObject (hdc, hFont)) ;

         lf.lfWidth = (int) (tm.tmAveCharWidth *
                                       fabs (pt.x) / fabs (pt.y) + 0.5) ;

         hFont = CreateFontIndirect (&lf) ;
    }

    RestoreDC (hdc, -1) ;
    return hFont ;
}