/* * Escape() function. * * Copyright 1994 Bob Amstadt */ #include #include "windef.h" #include "wingdi.h" #include "gdi.h" #include "heap.h" #include "debugtools.h" DEFAULT_DEBUG_CHANNEL(driver); /*********************************************************************** * Escape16 [GDI.38] */ INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput, SEGPTR lpszInData, SEGPTR lpvOutData ) { INT16 ret = 0; DC * dc = DC_GetDCPtr( hdc ); if (dc) { if (dc->funcs->pEscape) { if(nEscape == SETABORTPROC) SetAbortProc16(hdc, lpszInData); ret = dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData ); } GDI_ReleaseObj( hdc ); } return ret; } /************************************************************************ * Escape [GDI32.@] */ INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData, LPVOID lpvOutData ) { SEGPTR segin,segout; INT ret = 0; DC * dc = DC_GetDCPtr( hdc ); if (!dc) return 0; if (!dc->funcs->pEscape) goto done; segin = (SEGPTR)lpszInData; segout = (SEGPTR)lpvOutData; switch (nEscape) { /* Escape(hdc,QUERYESCSUPPORT,LPINT,NULL) */ /* Escape(hdc,CLIP_TO_PATH,LPINT,NULL) */ case QUERYESCSUPPORT: case CLIP_TO_PATH: { LPINT16 x = (LPINT16)SEGPTR_NEW(INT16); *x = *(INT*)lpszInData; segin = SEGPTR_GET(x); cbInput = sizeof(INT16); break; } /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */ /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */ /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */ case GETSCALINGFACTOR: case GETPHYSPAGESIZE: case GETPRINTINGOFFSET: segout = SEGPTR_GET(SEGPTR_NEW(POINT16)); cbInput = sizeof(POINT16); break; /* 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,SETLINECAP,LPINT,LPINT) */ case SETLINECAP: case SETLINEJOIN: case SETMITERLIMIT: { LPINT16 new = (LPINT16)SEGPTR_NEW(INT16); LPINT16 old = (LPINT16)SEGPTR_NEW(INT16); *new = *(INT*)lpszInData; segin = SEGPTR_GET(new); segout = SEGPTR_GET(old); cbInput = sizeof(INT16); break; } /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */ case GETTECHNOLOGY: { segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */ break; } /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */ case ENABLEPAIRKERNING: { LPINT16 enab = SEGPTR_NEW(INT16); segout = SEGPTR_GET(SEGPTR_NEW(INT16)); segin = SEGPTR_GET(enab); *enab = *(INT*)lpszInData; cbInput = sizeof(INT16); break; } /* Escape(hdc,GETFACENAME,NULL,LPSTR); */ case GETFACENAME: { segout = SEGPTR_GET(SEGPTR_ALLOC(200)); break; } /* Escape(hdc,STARTDOC,LPSTR,LPDOCINFOA); * lpvOutData is actually a pointer to the DocInfo structure and used as * a second input parameter */ case STARTDOC: /* string may not be \0 terminated */ if(lpszInData) { char *cp = SEGPTR_ALLOC(cbInput); memcpy(cp, lpszInData, cbInput); segin = SEGPTR_GET(cp); } else segin = 0; if(lpvOutData) { DOCINFO16 *lpsegdoc = SEGPTR_NEW(DOCINFO16); DOCINFOA *lpdoc = lpvOutData; memset(lpsegdoc, 0, sizeof(*lpsegdoc)); lpsegdoc->cbSize = sizeof(*lpsegdoc); lpsegdoc->lpszDocName = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszDocName)); lpsegdoc->lpszOutput = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszOutput)); lpsegdoc->lpszDatatype = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszDatatype)); lpsegdoc->fwType = lpdoc->fwType; segout = SEGPTR_GET(lpsegdoc); } break; case SETABORTPROC: SetAbortProc(hdc, (ABORTPROC)lpszInData); break; /* Escape(hdc,END_PATH,PATHINFO,NULL); */ case END_PATH: { BYTE *p = SEGPTR_ALLOC(cbInput); memcpy(p, lpszInData, cbInput); segin = SEGPTR_GET(p); break; } default: break; } ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout ); switch(nEscape) { case QUERYESCSUPPORT: if (ret) TRACE("target DC implements Escape %d\n",nEscape); SEGPTR_FREE(MapSL(segin)); break; case SETLINECAP: case SETLINEJOIN: case SETMITERLIMIT: *(LPINT)lpvOutData = *(LPINT16)MapSL(segout); SEGPTR_FREE(MapSL(segin)); SEGPTR_FREE(MapSL(segout)); break; case GETSCALINGFACTOR: case GETPRINTINGOFFSET: case GETPHYSPAGESIZE: { LPPOINT16 x = MapSL(segout); CONV_POINT16TO32(x,(LPPOINT)lpvOutData); SEGPTR_FREE(x); break; } case EXT_DEVICE_CAPS: *(LPDWORD)lpvOutData = *(LPDWORD)MapSL(segout); SEGPTR_FREE(MapSL(segin)); SEGPTR_FREE(MapSL(segout)); break; case GETTECHNOLOGY: { LPSTR x=MapSL(segout); strcpy(lpvOutData,x); SEGPTR_FREE(x); break; } case ENABLEPAIRKERNING: { LPINT16 enab = MapSL(segout); *(LPINT)lpvOutData = *enab; SEGPTR_FREE(enab); SEGPTR_FREE(MapSL(segin)); break; } case GETFACENAME: { LPSTR x = (LPSTR)MapSL(segout); strcpy(lpvOutData,x); SEGPTR_FREE(x); break; } case STARTDOC: { DOCINFO16 *doc = MapSL(segout); SEGPTR_FREE(MapSL(doc->lpszDocName)); SEGPTR_FREE(MapSL(doc->lpszOutput)); SEGPTR_FREE(MapSL(doc->lpszDatatype)); SEGPTR_FREE(doc); SEGPTR_FREE(MapSL(segin)); break; } case CLIP_TO_PATH: case END_PATH: SEGPTR_FREE(MapSL(segin)); break; default: break; } done: GDI_ReleaseObj( hdc ); return ret; } /****************************************************************************** * ExtEscape [GDI32.@] * * PARAMS * hdc [I] Handle to device context * nEscape [I] Escape function * cbInput [I] Number of bytes in input structure * lpszInData [I] Pointer to input structure * cbOutput [I] Number of bytes in output structure * lpszOutData [O] Pointer to output structure * * RETURNS * Success: >0 * Not implemented: 0 * Failure: <0 */ INT WINAPI ExtEscape( HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData, INT cbOutput, LPSTR lpszOutData ) { char *inBuf, *outBuf; INT ret; inBuf = SEGPTR_ALLOC(cbInput); memcpy(inBuf, lpszInData, cbInput); outBuf = cbOutput ? SEGPTR_ALLOC(cbOutput) : NULL; ret = Escape16( hdc, nEscape, cbInput, SEGPTR_GET(inBuf), SEGPTR_GET(outBuf) ); SEGPTR_FREE(inBuf); if(outBuf) { memcpy(lpszOutData, outBuf, cbOutput); SEGPTR_FREE(outBuf); } return ret; } /******************************************************************* * DrawEscape [GDI32.@] * * */ INT WINAPI DrawEscape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData) { FIXME("DrawEscape, stub\n"); return 0; }