/*
 * Windows driver font functions
 *
 * Copyright 1996 John Harvey
 */

#include <stdio.h>
#include "windows.h"
#include "win16drv.h"
#include "gdi.h"


/***********************************************************************
 *           WIN16DRV_GetTextExtentPoint
 */
BOOL32 WIN16DRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
                                    LPSIZE32 size )
{
    WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;
    
    printf("LPGDI_GetTextExtPoint: %04x %s %d %p\n", dc->hSelf, str, count, size);

	/* TTD support PS fonts */
	/* Assume fixed font */
    size->cx = count * physDev->tm.tmAveCharWidth;
    size->cy = physDev->tm.tmHeight;
    printf("LPGDI_GetTextExtPoint: cx=%d, cy=%d\n", size->cx,size->cy);
    return TRUE;
}


/***********************************************************************
 *           WIN16DRV_GetTextMetrics
 */
BOOL32 WIN16DRV_GetTextMetrics( DC *dc, TEXTMETRIC32A *metrics )
{
    WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;

    printf("LPGDI_GetTextMetrics: %04x \n", dc->hSelf);

    metrics->tmHeight           = physDev->tm.tmHeight;
    metrics->tmAscent           = physDev->tm.tmAscent;
    metrics->tmDescent          = physDev->tm.tmDescent;
    metrics->tmInternalLeading  = physDev->tm.tmInternalLeading;
    metrics->tmExternalLeading  = physDev->tm.tmExternalLeading;
    metrics->tmAveCharWidth     = physDev->tm.tmAveCharWidth;
    metrics->tmMaxCharWidth     = physDev->tm.tmMaxCharWidth;
    metrics->tmWeight           = physDev->tm.tmWeight;
    metrics->tmOverhang         = physDev->tm.tmOverhang;
    metrics->tmDigitizedAspectX = physDev->tm.tmDigitizedAspectX;
    metrics->tmDigitizedAspectY = physDev->tm.tmDigitizedAspectY;
    metrics->tmFirstChar        = physDev->tm.tmFirstChar;
    metrics->tmLastChar         = physDev->tm.tmLastChar;
    metrics->tmDefaultChar      = physDev->tm.tmDefaultChar;
    metrics->tmBreakChar        = physDev->tm.tmBreakChar;
    metrics->tmItalic           = physDev->tm.tmItalic;
    metrics->tmUnderlined       = physDev->tm.tmUnderlined;
    metrics->tmStruckOut        = physDev->tm.tmStruckOut;
    metrics->tmPitchAndFamily   = physDev->tm.tmPitchAndFamily;
    metrics->tmCharSet          = physDev->tm.tmCharSet;

    printf("H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
           physDev->tm.tmHeight,
           physDev->tm.tmAscent,
           physDev->tm.tmDescent,
           physDev->tm.tmInternalLeading,
           physDev->tm.tmExternalLeading,
           physDev->tm.tmAveCharWidth,
           physDev->tm.tmMaxCharWidth,
           physDev->tm.tmWeight);

    return TRUE;
}
