windows-nt/Source/XPSP1/NT/base/mvdm/wow32/wgtext.c

131 lines
3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
*
* 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 WG32GetTextExtent(PVDMFRAME pFrame)
{
ULONG ul = 0;
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 WG32GetTextMetrics(PVDMFRAME pFrame)
{
ULONG ul;
TEXTMETRIC t2;
register PGETTEXTMETRICS16 parg16;
GETARGPTR(pFrame, sizeof(GETTEXTMETRICS16), parg16);
ul = GETBOOL16(GetTextMetrics(
HDC32(parg16->f1),
&t2
));
#ifdef FE_SB
// original source code should be fixed
// If GetTextMetrics return value is FALSE, don't need set data to 16bit
// TEXTMETRICS STRUCTURE.
// kksuzuka #3759 BC++40J is not see return value and used TEXTMETRICS
// data. 1994.11.16 V-HIDEKK
if( ul )
#endif // FE_SB
PUTTEXTMETRIC16(parg16->f2, &t2);
FREEARGPTR(parg16);
RETURN(ul);
}