/*
 * True Type font engine support
 *
 * Copyright 1996 John Harvey
 * Copyright 1998 David Lee Lambert
 * 
 */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "winbase.h"
#include "font.h"
#include "debug.h"     



/* **************************************************************** 
 *    EngineEnumerateFont [GDI.300] 
 */
WORD WINAPI 
EngineEnumerateFont16(LPSTR fontname, FARPROC16 proc, DWORD data )
{
    FIXME(font,"(%s,%p,%lx),stub\n",fontname,proc,data);
    return 0;
}

/* **************************************************************** 
 *   EngineDeleteFont [GDI.301] 
 */
WORD WINAPI EngineDeleteFont16(LPFONTINFO16 lpFontInfo)
{
    WORD handle;

    /*	untested, don't know if it works.
	We seem to access some structure that is located after the
	FONTINFO. The FONTINFO documentation says that there may 
	follow some char-width table or font bitmap or vector info.
	I think it is some kind of font bitmap that begins at offset 0x52,
	as FONTINFO goes up to 0x51.
	If this is correct, everything should be implemented correctly.
    */
    if ( ((lpFontInfo->dfType & (RASTER_FONTTYPE|DEVICE_FONTTYPE))
      == (RASTER_FONTTYPE|DEVICE_FONTTYPE))
	&& (LOWORD(lpFontInfo->dfFace) == LOWORD(lpFontInfo)+0x6e)
	&& (handle = *(WORD *)(lpFontInfo+0x54)) )
    {
	*(WORD *)(lpFontInfo+0x54) = 0;
	GlobalFree16(handle);
    }
    return 1;
}

/* ****************************************************************
 *       EngineRealizeFont [GDI.302] 
 */
WORD WINAPI EngineRealizeFont16(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
{
    FIXME(font,"(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
    
    return 0;
}

/* ****************************************************************
 *        EngineGetCharWidth [GDI.303] 
 */
WORD WINAPI EngineGetCharWidth16(LPFONTINFO16 lpFontInfo, BYTE firstChar, BYTE lastChar, LPINT16 buffer)
{
    int i;

    for (i = firstChar; i <= lastChar; i++)
       FIXME(font, " returns font's average width for range %d to %d\n", firstChar, lastChar);
	*buffer++ = lpFontInfo->dfAvgWidth; /* insert some charwidth functionality here; use average width for now */
    return 1;
}

/* ****************************************************************
 *      EngineSetFontContext [GDI.304] 
 */
WORD WINAPI EngineSetFontContext(LPFONTINFO16 lpFontInfo, WORD data)
{
   FIXME(font, "stub?\n");
	return 0;
}

/* ****************************************************************
 *       EngineGetGlyphBMP   [GDI.305] 
 */
WORD WINAPI EngineGetGlyphBMP(WORD word, LPFONTINFO16 lpFontInfo, WORD w1, WORD w2, LPSTR string, DWORD dword, /*LPBITMAPMETRICS16*/ LPVOID metrics)
{
   FIXME(font, "stub?\n");
    return 0;
}

/* ****************************************************************
 *             EngineMakeFontDir  [GDI.306] 
 */
DWORD WINAPI EngineMakeFontDir(HDC16 hdc, LPFONTDIR16 fontdir, LPCSTR string)
{
   FIXME(font, " stub! (always fails)\n");
    return -1; /* error */
    
}

/* ****************************************************************
 *              EngineExtTextOut [GDI.314] 
 */

WORD WINAPI EngineExtTextOut()
{
   FIXME(font, "stub!\n");
    return 0;
}
