/*++
 *
 *  WOW v1.0
 *
 *  Copyright (c) 1991, Microsoft Corporation
 *
 *  WGTEXT.C
 *  WOW32 16-bit GDI API support
 *
 *  History:
 *  Created 07-Mar-1991 by Jeff Parsons (jeffpar)
 *  10-Nov-1992 Modified GetTextMetrics to GetTextMetricsWOW by Chandan Chauhan
--*/


#include "precomp.h"
#pragma hdrstop

MODNAME(wgtext.c);


ULONG FASTCALL WG32ExtTextOut(PVDMFRAME pFrame)
{
    ULONG ul;
    RECT t5;
    PSTR pstr6;
    PINT p8;
    register PEXTTEXTOUT16 parg16;
    INT      BufferT[256];

    GETARGPTR(pFrame, sizeof(EXTTEXTOUT16), parg16);
    GETRECT16(parg16->f5, &t5);
    GETSTRPTR(parg16->f6, parg16->f7, pstr6);
    if (DWORD32(parg16->f8)) {
       p8 = STACKORHEAPALLOC(parg16->f7 * sizeof(INT), sizeof(BufferT), BufferT);
       getintarray16((VPINT16)DWORD32(parg16->f8), parg16->f7, p8);   // *this* INT array is optional
    } else {
        p8 = NULL;
    }


    ul = GETBOOL16(ExtTextOut(
                    HDC32(parg16->f1),
                    INT32(parg16->f2),
                    INT32(parg16->f3),
                    (WORD32(parg16->f4) & (ETO_CLIPPED|ETO_OPAQUE)),
                    &t5,
                    pstr6,
                    WORD32(parg16->f7),
                    (LPINT)p8
                    ));

    FREESTRPTR(pstr6);
    STACKORHEAPFREE(p8, BufferT);
    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextAlign(PVDMFRAME pFrame)
{
    ULONG ul;
    register PGETTEXTALIGN16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTALIGN16), parg16);

    ul = GETWORD16(GetTextAlign(
                    HDC32(parg16->f1)
                  ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextCharacterExtra(PVDMFRAME pFrame)
{
    ULONG ul;
    register PGETTEXTCHARACTEREXTRA16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTCHARACTEREXTRA16), parg16);

    ul = GETINT16(GetTextCharacterExtra(
                   HDC32(parg16->f1)
                 ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextColor(PVDMFRAME pFrame)
{
    ULONG ul;
    register PGETTEXTCOLOR16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTCOLOR16), parg16);

    ul = GETDWORD16(GetTextColor(
                    HDC32(parg16->f1)
    ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextExtent(PVDMFRAME pFrame)
{
    ULONG ul;
    PSTR pstr2;
    SIZE size4;
    register PGETTEXTEXTENT16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTEXTENT16), parg16);
    GETSTRPTR(parg16->f2, parg16->f3, pstr2);

    if (GETDWORD16(GetTextExtentPoint(
                    HDC32(parg16->f1),
                    pstr2,
                    INT32(parg16->f3),
                    &size4
                   )))
    {
    // check if either cx or cy are bigger than SHRT_MAX == 7fff
    // but do it in ONE SINGLE check

	if ((size4.cx | size4.cy) & ~SHRT_MAX)
	{
	    if (size4.cx > SHRT_MAX)
	       ul = SHRT_MAX;
	    else
	       ul = (ULONG)size4.cx;

	    if (size4.cy > SHRT_MAX)
	       ul |= (SHRT_MAX << 16);
	    else
	       ul |= (ULONG)(size4.cy << 16);
	}
	else
	{
	    ul = (ULONG)(size4.cx | (size4.cy << 16));
	}

    }
    FREESTRPTR(pstr2);
    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextFace(PVDMFRAME pFrame)
{
    ULONG ul;
    PBYTE pb3;
    register PGETTEXTFACE16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTFACE16), parg16);
    ALLOCVDMPTR(parg16->f3, parg16->f2, pb3);

    ul = GETINT16(GetTextFace(
                    HDC32(parg16->f1),
                    INT32(parg16->f2),
                    pb3
                 ));

    FLUSHVDMPTR(parg16->f3, (USHORT)ul, pb3);
    FREEVDMPTR(pb3);
    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32GetTextMetrics(PVDMFRAME pFrame)
{
    ULONG ul;
    TEXTMETRIC t2;
    register PGETTEXTMETRICS16 parg16;

    GETARGPTR(pFrame, sizeof(GETTEXTMETRICS16), parg16);

    ul = GETBOOL16(GetTextMetrics(
                    HDC32(parg16->f1),
                    &t2
                  ));


    PUTTEXTMETRIC16(parg16->f2, &t2);

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32SetTextAlign(PVDMFRAME pFrame)
{
    ULONG ul;
    register PSETTEXTALIGN16 parg16;

    GETARGPTR(pFrame, sizeof(SETTEXTALIGN16), parg16);

    ul = GETWORD16(SetTextAlign(
                    HDC32(parg16->f1),
                    WORD32(parg16->f2)
                  ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32SetTextCharacterExtra(PVDMFRAME pFrame)
{
    ULONG ul;
    register PSETTEXTCHARACTEREXTRA16 parg16;

    GETARGPTR(pFrame, sizeof(SETTEXTCHARACTEREXTRA16), parg16);

    ul = GETINT16(SetTextCharacterExtra(
                    HDC32(parg16->f1),
                    INT32(parg16->f2)
    ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32SetTextColor(PVDMFRAME pFrame)
{
    ULONG ul;
    register PSETTEXTCOLOR16 parg16;
    COLORREF    color;

    GETARGPTR(pFrame, sizeof(SETTEXTCOLOR16), parg16);

    color = DWORD32(parg16->f2);

    if (((ULONG)color >= 0x03000000) &&
        (HIWORD(color) != 0x10ff))
    {
        color &= 0xffffff;
    }

    ul = GETDWORD16(SetTextColor(
        HDC32(parg16->f1),
        color
    ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32SetTextJustification(PVDMFRAME pFrame)
{
    ULONG ul;
    register PSETTEXTJUSTIFICATION16 parg16;

    GETARGPTR(pFrame, sizeof(SETTEXTJUSTIFICATION16), parg16);

    ul = GETINT16(SetTextJustification(
                    HDC32(parg16->f1),
                    INT32(parg16->f2),
                    INT32(parg16->f3)
                  ));

    FREEARGPTR(parg16);
    RETURN(ul);
}


ULONG FASTCALL WG32TextOut(PVDMFRAME pFrame)
{
    ULONG ul;
    PSTR pstr4;
    register PTEXTOUT16 parg16;

    GETARGPTR(pFrame, sizeof(TEXTOUT16), parg16);
    GETSTRPTR(parg16->f4, parg16->f5, pstr4);

    ul = GETBOOL16(TextOut(
                    HDC32(parg16->f1),
                    INT32(parg16->f2),
                    INT32(parg16->f3),
                    pstr4,
                    INT32(parg16->f5)
                  ));

    FREESTRPTR(pstr4);
    FREEARGPTR(parg16);
    RETURN(ul);
}