Release 980503
[wine/multimedia.git] / graphics / escape.c
blobc7bac2cf6aece15c9fea984ebd00b29ebb1fb268
1 /*
2 * Escape() function.
4 * Copyright 1994 Bob Amstadt
5 */
7 #include <stdio.h>
8 #include "windows.h"
9 #include "gdi.h"
10 #include "heap.h"
11 #include "ldt.h"
12 #include "dc.h"
13 #include <debug.h>
16 INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
17 SEGPTR lpszInData, SEGPTR lpvOutData )
19 DC * dc = DC_GetDCPtr( hdc );
20 if (!dc || !dc->funcs->pEscape) return 0;
21 return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
24 INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
25 LPVOID lpszInData, LPVOID lpvOutData )
27 DC *dc = DC_GetDCPtr( hdc );
28 SEGPTR segin,segout;
29 INT32 ret;
31 if (!dc || !dc->funcs->pEscape) return 0;
32 segin = (SEGPTR)lpszInData;
33 segout = (SEGPTR)lpvOutData;
34 switch (nEscape) {
35 /* Escape(hdc,QUERYESCSUPPORT,LPINT32,NULL) */
36 case QUERYESCSUPPORT: {
37 LPINT16 x = (LPINT16)SEGPTR_NEW(INT16);
38 *x = *(INT32*)lpszInData;
39 segin = SEGPTR_GET(x);
40 break;
43 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
44 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
45 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
47 case GETSCALINGFACTOR:
48 case GETPHYSPAGESIZE:
49 case GETPRINTINGOFFSET:
50 segout = SEGPTR_GET(SEGPTR_NEW(POINT16));
51 break;
53 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
55 case GETTECHNOLOGY: {
56 segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
57 break;
61 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
63 case ENABLEPAIRKERNING: {
64 LPINT16 enab = SEGPTR_NEW(INT16);
65 segout = SEGPTR_GET(SEGPTR_NEW(INT16));
66 segin = SEGPTR_GET(enab);
67 *enab = *(INT32*)lpszInData;
68 break;
71 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
73 case GETFACENAME: {
74 segout = SEGPTR_GET(SEGPTR_ALLOC(200));
75 break;
78 ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
79 switch(nEscape) {
80 case QUERYESCSUPPORT:
81 if (ret)
82 TRACE(driver,"target DC implements Escape %d\n",nEscape);
83 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
84 break;
85 case GETSCALINGFACTOR:
86 case GETPRINTINGOFFSET:
87 case GETPHYSPAGESIZE: {
88 LPPOINT16 x = (LPPOINT16)PTR_SEG_TO_LIN(segout);
89 CONV_POINT16TO32(x,(LPPOINT32)lpvOutData);
90 SEGPTR_FREE(x);
91 break;
93 case GETTECHNOLOGY: {
94 LPSTR x=PTR_SEG_TO_LIN(segout);
95 lstrcpy32A(lpvOutData,x);
96 SEGPTR_FREE(x);
97 break;
99 case ENABLEPAIRKERNING: {
100 LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
102 *(LPINT32)lpvOutData = *enab;
103 SEGPTR_FREE(enab);
104 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
105 break;
107 case GETFACENAME: {
108 LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
109 lstrcpy32A(lpvOutData,x);
110 SEGPTR_FREE(x);
111 break;
113 default:
114 break;
116 return ret;
119 INT32 WINAPI ExtEscape32(HDC32 hdc,INT32 nEscape,INT32 cbInput,LPCSTR x,INT32 cbOutput,LPSTR out) {
120 FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p),stub!\n",
121 hdc,nEscape,cbInput,x,cbOutput,out
123 return 1;