Commit 304d9a47 authored by Huw D M Davies's avatar Huw D M Davies Committed by Alexandre Julliard

Change interfaces to THUNK_Alloc/Free slightly and make them non-static.

Remove relays for win16drv from CallBack table, instead use build to generate them directly in graphics/win16drv/prtdrv.c. If Printer AbortProc is 16bit then allocate thunk and store that as a 32bit proc in DC. Setting of abortprocs now done in the correct place (i.e. not in the driver).
parent 9e9fc1b9
......@@ -22,6 +22,7 @@ INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
{
DC * dc = DC_GetDCPtr( hdc );
if (!dc || !dc->funcs->pEscape) return 0;
if(nEscape == SETABORTPROC) SetAbortProc16(hdc, lpszInData);
return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
}
......@@ -33,15 +34,15 @@ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
{
SEGPTR segin,segout;
INT ret;
DC * dc = DC_GetDCPtr( hdc );
if (!dc || !dc->funcs->pEscape) return 0;
segin = (SEGPTR)lpszInData;
segout = (SEGPTR)lpvOutData;
switch (nEscape) {
/* Escape(hdc,QUERYESCSUPPORT,LPINT,NULL) */
/* Escape(hdc,EXT_DEVICE_CAPS,LPINT,NULL) */
/* Escape(hdc,SETLINECAP,LPINT,NULL) */
case QUERYESCSUPPORT:
case EXT_DEVICE_CAPS:
case SETLINECAP:
case SETLINEJOIN:
{
......@@ -63,8 +64,20 @@ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
cbInput = sizeof(POINT16);
break;
/* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
/* Escape(hdc,EXT_DEVICE_CAPS,LPINT,LPDWORD) */
case EXT_DEVICE_CAPS:
{
LPINT16 lpIndex = (LPINT16)SEGPTR_NEW(INT16);
LPDWORD lpCaps = (LPDWORD)SEGPTR_NEW(DWORD);
*lpIndex = *(INT*)lpszInData;
segin = SEGPTR_GET(lpIndex);
segout = SEGPTR_GET(lpCaps);
cbInput = sizeof(INT16);
break;
}
/* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
case GETTECHNOLOGY: {
segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
break;
......@@ -100,12 +113,16 @@ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
segin = 0;
break;
case SETABORTPROC:
SetAbortProc(hdc, (ABORTPROC)lpszInData);
break;
default:
break;
}
ret = Escape16( hdc, nEscape, cbInput, segin, segout );
ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
switch(nEscape) {
case QUERYESCSUPPORT:
......@@ -113,7 +130,6 @@ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
TRACE("target DC implements Escape %d\n",nEscape);
SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
break;
case EXT_DEVICE_CAPS:
case SETLINECAP:
case SETLINEJOIN:
SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
......@@ -126,6 +142,12 @@ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
SEGPTR_FREE(x);
break;
}
case EXT_DEVICE_CAPS:
*(LPDWORD)lpvOutData = *(LPDWORD)PTR_SEG_TO_LIN(segout);
SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
SEGPTR_FREE(PTR_SEG_TO_LIN(segout));
break;
case GETTECHNOLOGY: {
LPSTR x=PTR_SEG_TO_LIN(segout);
lstrcpyA(lpvOutData,x);
......
......@@ -81,7 +81,6 @@ INT PSDRV_Escape( DC *dc, INT nEscape, INT cbInput,
case SETABORTPROC:
TRACE("SETABORTPROC\n");
dc->w.spfnPrint = (FARPROC16)lpInData;
return 1;
case STARTDOC:
......
......@@ -15,6 +15,8 @@ C_SRCS = \
prtdrv.c \
text.c
GLUE = prtdrv.c
all: $(MODULE).o
@MAKE_RULES@
......
......@@ -302,10 +302,9 @@ static INT WIN16DRV_Escape( DC *dc, INT nEscape, INT cbInput,
- Before every metafile record when GDI does banding
*/
/* save the callback address and call Control with hdc as lpInData */
/* Call Control with hdc as lpInData */
HDC16 *seghdc = SEGPTR_NEW(HDC16);
*seghdc = dc->hSelf;
dc->w.spfnPrint = (FARPROC16)lpInData;
nRet = PRTDRV_Control(physDev->segptrPDEVICE, nEscape,
SEGPTR_GET(seghdc), lpOutData);
SEGPTR_FREE(seghdc);
......@@ -362,3 +361,4 @@ static INT WIN16DRV_Escape( DC *dc, INT nEscape, INT cbInput,
return nRet;
}
......@@ -21,6 +21,33 @@
DEFAULT_DEBUG_CHANNEL(win16drv)
/* ### start build ### */
extern WORD CALLBACK PRTDRV_CallTo16_word_lwll (FARPROC16,LONG,WORD,LONG,LONG);
extern WORD CALLBACK PRTDRV_CallTo16_word_lwlll (FARPROC16,LONG,WORD,LONG,LONG,
LONG);
extern WORD CALLBACK PRTDRV_CallTo16_word_llll (FARPROC16,LONG,LONG,LONG,LONG);
extern WORD CALLBACK PRTDRV_CallTo16_word_lwwlllll (FARPROC16,LONG,WORD,WORD,
LONG,LONG,LONG,LONG,LONG);
extern LONG CALLBACK PRTDRV_CallTo16_long_lwlll (FARPROC16,LONG,WORD,LONG,LONG,
LONG);
extern WORD CALLBACK PRTDRV_CallTo16_word_lwwwwlwwwwllll (FARPROC16,LONG,WORD,
WORD,WORD,WORD,LONG,
WORD,WORD,WORD,WORD,
LONG,LONG,LONG,LONG);
extern LONG CALLBACK PRTDRV_CallTo16_long_lwwllwlllllw (FARPROC16,LONG,WORD,
WORD,LONG,LONG,WORD,
LONG,LONG,LONG,LONG,
LONG,WORD);
extern WORD CALLBACK PRTDRV_CallTo16_word_llwwlll (FARPROC16,LONG,LONG,WORD,
WORD,LONG,LONG,LONG);
extern WORD CALLBACK PRTDRV_CallTo16_word_wwlllllw (FARPROC16,WORD,WORD,LONG,
LONG,LONG,LONG,LONG,WORD);
extern LONG CALLBACK PRTDRV_CallTo16_long_llwll (FARPROC16,LONG,LONG,WORD,LONG,
LONG);
/* ### stop build ### */
#define MAX_PRINTER_DRIVERS 16
static LOADED_PRINTER_DRIVER *gapLoadedPrinterDrivers[MAX_PRINTER_DRIVERS];
......@@ -199,9 +226,9 @@ INT16 PRTDRV_Control(LPPDEVICE lpDestDev, WORD wfunction, SEGPTR lpInData, SEGPT
WARN("Not supported by driver\n");
return 0;
}
wRet = Callbacks->CallDrvControlProc( pLPD->fn[FUNC_CONTROL],
(SEGPTR)lpDestDev, wfunction,
lpInData, lpOutData );
wRet = PRTDRV_CallTo16_word_lwll( pLPD->fn[FUNC_CONTROL],
(SEGPTR)lpDestDev, wfunction,
lpInData, lpOutData );
}
TRACE("return %x\n", wRet);
return wRet;
......@@ -246,7 +273,7 @@ WORD PRTDRV_Enable(LPVOID lpDevInfo, WORD wStyle, LPCSTR lpDestDevType,
lP4 = SEGPTR_STRDUP(lpOutputFile);
lP5 = (LONG)lpData;
wRet = Callbacks->CallDrvEnableProc(pLPD->fn[FUNC_ENABLE],
wRet = PRTDRV_CallTo16_word_lwlll(pLPD->fn[FUNC_ENABLE],
(wStyle==INITPDEVICE)?(SEGPTR)lP1:SEGPTR_GET(lP1),
wP2,
SEGPTR_GET(lP3),
......@@ -294,8 +321,9 @@ WORD PRTDRV_EnumDFonts(LPPDEVICE lpDestDev, LPSTR lpFaceName,
else
lP2 = NULL;
lP4 = (LONG)lpClientData;
wRet = Callbacks->CallDrvEnumDFontsProc( pLPD->fn[FUNC_ENUMDFONTS],
lP1, SEGPTR_GET(lP2), lpCallbackFunc, lP4);
wRet = PRTDRV_CallTo16_word_llll( pLPD->fn[FUNC_ENUMDFONTS],
lP1, SEGPTR_GET(lP2),
(LONG)lpCallbackFunc,lP4);
if(lpFaceName)
SEGPTR_FREE(lP2);
} else
......@@ -317,8 +345,7 @@ BOOL16 PRTDRV_EnumObj(LPPDEVICE lpDestDev, WORD iStyle,
if ((pLPD = FindPrinterDriverFromPDEVICE(lpDestDev)) != NULL)
{
LONG lP1, lP4;
FARPROC16 lP3;
LONG lP1, lP3, lP4;
WORD wP2;
if (pLPD->fn[FUNC_ENUMOBJ] == NULL)
......@@ -334,12 +361,12 @@ BOOL16 PRTDRV_EnumObj(LPPDEVICE lpDestDev, WORD iStyle,
/*
* Need to pass addres of function conversion function that will switch back to 32 bit code if necessary
*/
lP3 = (FARPROC16)lpCallbackFunc;
lP3 = (LONG)lpCallbackFunc;
lP4 = (LONG)lpClientData;
wRet = Callbacks->CallDrvEnumObjProc( pLPD->fn[FUNC_ENUMOBJ],
lP1, wP2, lP3, lP4 );
wRet = PRTDRV_CallTo16_word_lwll( pLPD->fn[FUNC_ENUMOBJ],
lP1, wP2, lP3, lP4 );
}
else
WARN("Failed to find device\n");
......@@ -403,9 +430,11 @@ WORD PRTDRV_Output(LPPDEVICE lpDestDev,
GetRegionData( hClipRgn, size, clip );
if( clip->rdh.nCount == 0 )
{
wRet = Callbacks->CallDrvOutputProc(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3, SEGPTR_GET(lP4),
lP5, lP6, lP7, (SEGPTR) NULL);
wRet = PRTDRV_CallTo16_word_lwwlllll(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3,
SEGPTR_GET(lP4),
lP5, lP6, lP7,
(SEGPTR) NULL);
}
else
{
......@@ -419,9 +448,11 @@ WORD PRTDRV_Output(LPPDEVICE lpDestDev,
TRACE("rect = %d,%d - %d,%d\n",
lP8->left, lP8->top, lP8->right, lP8->bottom );
wRet = Callbacks->CallDrvOutputProc(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3, SEGPTR_GET(lP4),
lP5, lP6, lP7, SEGPTR_GET(lP8));
wRet = PRTDRV_CallTo16_word_lwwlllll(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3,
SEGPTR_GET(lP4),
lP5, lP6, lP7,
SEGPTR_GET(lP8));
}
SEGPTR_FREE(lP8);
}
......@@ -429,9 +460,10 @@ WORD PRTDRV_Output(LPPDEVICE lpDestDev,
}
else
{
wRet = Callbacks->CallDrvOutputProc(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3, SEGPTR_GET(lP4),
lP5, lP6, lP7, (SEGPTR) NULL);
wRet = PRTDRV_CallTo16_word_lwwlllll(pLPD->fn[FUNC_OUTPUT],
lP1, wP2, wP3,
SEGPTR_GET(lP4),
lP5, lP6, lP7, (SEGPTR) NULL);
}
SEGPTR_FREE(lP4);
}
......@@ -507,8 +539,8 @@ DWORD PRTDRV_RealizeObject(LPPDEVICE lpDestDev, WORD wStyle,
lP5 = lpTextXForm;
TRACE("Calling Realize %08lx %04x %08lx %08lx %08lx\n",
lP1, wP2, lP3, lP4, lP5);
dwRet = Callbacks->CallDrvRealizeProc(pLPD->fn[FUNC_REALIZEOBJECT],
lP1, wP2, lP3, lP4, lP5);
dwRet = PRTDRV_CallTo16_long_lwlll(pLPD->fn[FUNC_REALIZEOBJECT],
lP1, wP2, lP3, lP4, lP5);
if(lpBuf)
SEGPTR_FREE(lpBuf);
......@@ -568,11 +600,11 @@ DWORD PRTDRV_StretchBlt(LPPDEVICE lpDestDev,
}
else
lP14 = 0L;
wRet = Callbacks->CallDrvStretchBltProc(pLPD->fn[FUNC_STRETCHBLT],
lP1, wP2, wP3, wP4, wP5,
lP6, wP7, wP8, wP9, wP10,
lP11, lP12, lP13,
SEGPTR_GET(lP14));
wRet = PRTDRV_CallTo16_word_lwwwwlwwwwllll(pLPD->fn[FUNC_STRETCHBLT],
lP1, wP2, wP3, wP4, wP5,
lP6, wP7, wP8, wP9, wP10,
lP11, lP12, lP13,
SEGPTR_GET(lP14));
SEGPTR_FREE(lP14);
TRACE("Called StretchBlt ret %d\n",wRet);
}
......@@ -652,12 +684,12 @@ DWORD PRTDRV_ExtTextOut(LPPDEVICE lpDestDev, WORD wDestXOrg, WORD wDestYOrg,
nSize,lP5, iP6, lP7, lP8);
TRACE("0x%lx 0x%lx %p 0x%x\n",
lP9, lP10, lP11, wP12);
dwRet = Callbacks->CallDrvExtTextOutProc(pLPD->fn[FUNC_EXTTEXTOUT],
lP1, wP2, wP3,
SEGPTR_GET(lP4),
SEGPTR_GET(lP5), iP6, lP7,
lP8, lP9, lP10,
SEGPTR_GET(lP11), wP12);
dwRet = PRTDRV_CallTo16_long_lwwllwlllllw(pLPD->fn[FUNC_EXTTEXTOUT],
lP1, wP2, wP3,
SEGPTR_GET(lP4),
SEGPTR_GET(lP5), iP6, lP7,
lP8, lP9, lP10,
SEGPTR_GET(lP11), wP12);
}
TRACE("return %lx\n", dwRet);
return dwRet;
......@@ -779,9 +811,9 @@ WORD PRTDRV_GetCharWidth(LPPDEVICE lpDestDev, LPINT lpBuffer,
lP6 = lpDrawMode;
lP7 = lpTextXForm;
wRet = Callbacks->CallDrvGetCharWidthProc(pLPD->fn[FUNC_GETCHARWIDTH],
lP1, SEGPTR_GET(lP2), wP3,
wP4, lP5, lP6, lP7 );
wRet = PRTDRV_CallTo16_word_llwwlll(pLPD->fn[FUNC_GETCHARWIDTH],
lP1, SEGPTR_GET(lP2), wP3,
wP4, lP5, lP6, lP7 );
for(i = 0; i <= wLastChar - wFirstChar; i++)
lpBuffer[i] = (INT) lP2[i];
......@@ -819,7 +851,7 @@ INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
/* We don't know how big this will be so we call the driver's
ExtDeviceMode to find out */
wOutSize = Callbacks->CallDrvExtDeviceModeProc(
wOutSize = PRTDRV_CallTo16_word_wwlllllw(
pLPD->fn[FUNC_EXTDEVICEMODE], hwnd, pLPD->hInst, 0,
SEGPTR_GET(lpSegDevice), SEGPTR_GET(lpSegPort), 0,
SEGPTR_GET(lpSegProfile), 0 );
......@@ -832,14 +864,14 @@ INT WIN16DRV_ExtDeviceMode(LPSTR lpszDriver, HWND hwnd, LPDEVMODEA lpdmOutput,
memcpy(lpSegIn, lpdmInput, lpdmInput->dmSize +
lpdmInput->dmDriverExtra);
}
wRet = Callbacks->CallDrvExtDeviceModeProc( pLPD->fn[FUNC_EXTDEVICEMODE],
hwnd, pLPD->hInst,
SEGPTR_GET(lpSegOut),
SEGPTR_GET(lpSegDevice),
SEGPTR_GET(lpSegPort),
SEGPTR_GET(lpSegIn),
SEGPTR_GET(lpSegProfile),
dwMode );
wRet = PRTDRV_CallTo16_word_wwlllllw( pLPD->fn[FUNC_EXTDEVICEMODE],
hwnd, pLPD->hInst,
SEGPTR_GET(lpSegOut),
SEGPTR_GET(lpSegDevice),
SEGPTR_GET(lpSegPort),
SEGPTR_GET(lpSegIn),
SEGPTR_GET(lpSegProfile),
dwMode );
if(lpSegOut) {
memcpy(lpdmOutput, lpSegOut, wOutSize);
SEGPTR_FREE(lpSegOut);
......@@ -890,7 +922,7 @@ DWORD WIN16DRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice,
lpDevMode->dmDriverExtra);
}
dwRet = Callbacks->CallDrvDeviceCapabilitiesProc(
dwRet = PRTDRV_CallTo16_long_llwll(
pLPD->fn[FUNC_DEVICECAPABILITIES],
SEGPTR_GET(lpSegDevice), SEGPTR_GET(lpSegPort),
fwCapability, 0, SEGPTR_GET(lpSegdm) );
......@@ -963,7 +995,7 @@ DWORD WIN16DRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice,
if(OutputSize && lpszOutput) {
lpSegOut = SEGPTR_ALLOC(OutputSize);
dwRet = Callbacks->CallDrvDeviceCapabilitiesProc(
dwRet = PRTDRV_CallTo16_long_llwll(
pLPD->fn[FUNC_DEVICECAPABILITIES],
SEGPTR_GET(lpSegDevice),
SEGPTR_GET(lpSegPort),
......
......@@ -18,6 +18,12 @@ extern int (*IF1632_CallLargeStack)( int (*func)(void), void *arg );
IF1632_CallLargeStack( (int(*)())(func), (void *)(arg) ) : \
((int(*)())(func))((void *)arg))
typedef void (*RELAY)();
extern FARPROC THUNK_Alloc( FARPROC16 func, RELAY relay );
extern void THUNK_Free( FARPROC thunk );
extern FARPROC16 THUNK_GetProc( FARPROC thunk );
extern FARPROC THUNK_Find( FARPROC16 func );
typedef struct
{
LONG (CALLBACK *CallRegisterShortProc)( CONTEXT86 *, INT );
......@@ -37,35 +43,6 @@ typedef struct
HGLOBAL16 (CALLBACK *CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
DWORD (CALLBACK *CallUTProc)( FARPROC16, DWORD, DWORD );
LRESULT (CALLBACK *CallASPIPostProc)( FARPROC16, SEGPTR );
/* Following are the graphics driver callbacks */
WORD (CALLBACK *CallDrvControlProc)( FARPROC16, SEGPTR, WORD,
SEGPTR, SEGPTR );
WORD (CALLBACK *CallDrvEnableProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
SEGPTR, SEGPTR );
WORD (CALLBACK *CallDrvEnumDFontsProc)( FARPROC16, SEGPTR, SEGPTR,
FARPROC16, SEGPTR );
WORD (CALLBACK *CallDrvEnumObjProc)( FARPROC16, SEGPTR, WORD, FARPROC16,
SEGPTR );
WORD (CALLBACK *CallDrvOutputProc)( FARPROC16, SEGPTR, WORD, WORD, SEGPTR,
SEGPTR, SEGPTR, SEGPTR, SEGPTR );
DWORD (CALLBACK *CallDrvRealizeProc)( FARPROC16, SEGPTR, WORD, SEGPTR,
SEGPTR, SEGPTR );
WORD (CALLBACK *CallDrvStretchBltProc)( FARPROC16, SEGPTR, WORD, WORD,
WORD, WORD, SEGPTR, WORD, WORD,
WORD, WORD, DWORD, SEGPTR, SEGPTR,
SEGPTR );
DWORD (CALLBACK *CallDrvExtTextOutProc)( FARPROC16, SEGPTR, WORD, WORD,
SEGPTR, SEGPTR, INT16, SEGPTR,
SEGPTR, SEGPTR, SEGPTR, SEGPTR,
WORD );
WORD (CALLBACK *CallDrvGetCharWidthProc)( FARPROC16, SEGPTR, SEGPTR, WORD,
WORD, SEGPTR, SEGPTR, SEGPTR );
BOOL16 (CALLBACK *CallDrvAbortProc)( FARPROC16, HDC16, INT16 );
WORD (CALLBACK *CallDrvExtDeviceModeProc)( FARPROC16, WORD, WORD, SEGPTR,
SEGPTR, SEGPTR, SEGPTR, SEGPTR,
WORD );
DWORD (CALLBACK *CallDrvDeviceCapabilitiesProc)( FARPROC16, SEGPTR, SEGPTR,
WORD, SEGPTR, SEGPTR );
} CALLBACKS_TABLE;
extern const CALLBACKS_TABLE *Callbacks;
......
......@@ -120,22 +120,21 @@ typedef struct
short breakExtra; /* breakTotalExtra / breakCount */
short breakRem; /* breakTotalExtra % breakCount */
RECT totalExtent;
RECT totalExtent;
BYTE bitsPerPixel;
INT MapMode;
INT GraphicsMode; /* Graphics mode */
INT DCOrgX; /* DC origin */
INT DCOrgY;
FARPROC16 spfnPrint; /* 16bit AbortProc for Printing */
ABORTPROC lpfnPrint; /* 32bit AbortProc for Printing */
INT CursPosX; /* Current position */
INT CursPosY;
INT ArcDirection;
INT MapMode;
INT GraphicsMode; /* Graphics mode */
INT DCOrgX; /* DC origin */
INT DCOrgY;
ABORTPROC pAbortProc; /* AbortProc for Printing */
INT CursPosX; /* Current position */
INT CursPosY;
INT ArcDirection;
XFORM xformWorld2Wnd; /* World-to-window transformation */
XFORM xformWorld2Vport; /* World-to-viewport transformation */
XFORM xformVport2World; /* Inverse of the above transformation */
BOOL vport2WorldValid; /* Is xformVport2World valid? */
BOOL vport2WorldValid; /* Is xformVport2World valid? */
} WIN_DC_INFO;
typedef struct tagDC
......
......@@ -30,6 +30,8 @@ C_SRCS = \
wsprintf.c \
xmalloc.c
GLUE = printdrv.c
all: $(MODULE).o
@MAKE_RULES@
......
......@@ -208,36 +208,30 @@ INT WINAPI AbortDoc(HDC hdc)
BOOL16 WINAPI QueryAbort16(HDC16 hdc, INT16 reserved)
{
DC *dc = DC_GetDCPtr( hdc );
BOOL16 ret;
if(!dc) {
ERR("Invalid hdc %04x\n", hdc);
return FALSE;
}
if(!dc->w.lpfnPrint && !dc->w.spfnPrint)
if(!dc->w.pAbortProc)
return TRUE;
if(dc->w.lpfnPrint && dc->w.spfnPrint)
FIXME("16 and 32 bit AbortProcs set?\n");
if(dc->w.spfnPrint) {
TRACE("Calling 16bit AbortProc\n");
ret = Callbacks->CallDrvAbortProc(dc->w.spfnPrint, hdc, 0);
} else {
TRACE("Calling 32bit AbortProc\n");
ret = dc->w.lpfnPrint(hdc,0);
}
return ret;
return dc->w.pAbortProc(hdc, 0);
}
/* ### start build ### */
extern WORD CALLBACK PRTDRV_CallTo16_word_ww(FARPROC16,WORD,WORD);
/* ### stop build ### */
/**********************************************************************
* SetAbortProc16 (GDI.381)
*
*/
INT16 WINAPI SetAbortProc16(HDC16 hdc, SEGPTR abrtprc)
{
return Escape16(hdc, SETABORTPROC, 0, abrtprc, (SEGPTR)0);
ABORTPROC proc32 = (ABORTPROC)THUNK_Alloc((FARPROC16)abrtprc,
(RELAY)PRTDRV_CallTo16_word_ww);
return SetAbortProc(hdc, proc32);
}
/**********************************************************************
......@@ -248,7 +242,8 @@ INT WINAPI SetAbortProc(HDC hdc, ABORTPROC abrtprc)
{
DC *dc = DC_GetDCPtr( hdc );
dc->w.lpfnPrint = abrtprc;
if(dc->w.pAbortProc) THUNK_Free((FARPROC)dc->w.pAbortProc);
dc->w.pAbortProc = abrtprc;
return TRUE;
}
......
......@@ -19,6 +19,7 @@
#include "heap.h"
#include "debugtools.h"
#include "font.h"
#include "callback.h"
#include "winerror.h"
#include "wine/winuser16.h"
......@@ -63,8 +64,7 @@ static void DC_Init_DC_INFO( WIN_DC_INFO *win_dc_info )
win_dc_info->GraphicsMode = GM_COMPATIBLE;
win_dc_info->DCOrgX = 0;
win_dc_info->DCOrgY = 0;
win_dc_info->spfnPrint = 0;
win_dc_info->lpfnPrint = NULL;
win_dc_info->pAbortProc = NULL;
win_dc_info->CursPosX = 0;
win_dc_info->CursPosY = 0;
win_dc_info->ArcDirection = AD_COUNTERCLOCKWISE;
......@@ -285,6 +285,8 @@ HDC16 WINAPI GetDCState16( HDC16 hdc )
PATH_InitGdiPath( &newdc->w.path );
newdc->w.pAbortProc = NULL;
/* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */
newdc->w.hGCClipRgn = newdc->w.hVisRgn = 0;
......@@ -525,7 +527,7 @@ HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
debugstr_a(driver), debugstr_a(device), debugstr_a(output), dc->hSelf );
if (dc->funcs->pCreateDC &&
!dc->funcs->pCreateDC( dc, driver, device, output, initData ))
!dc->funcs->pCreateDC( dc, buf, device, output, initData ))
{
WARN("creation aborted by device\n" );
GDI_HEAP_FREE( dc->hSelf );
......@@ -707,7 +709,7 @@ BOOL WINAPI DeleteDC( HDC hdc )
if (dc->w.hClipRgn) DeleteObject( dc->w.hClipRgn );
if (dc->w.hVisRgn) DeleteObject( dc->w.hVisRgn );
if (dc->w.hGCClipRgn) DeleteObject( dc->w.hGCClipRgn );
if (dc->w.pAbortProc) THUNK_Free( (FARPROC)dc->w.pAbortProc );
PATH_DestroyGdiPath(&dc->w.path);
return GDI_FreeObject( hdc );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment