4 * Copyright 1994 Bob Amstadt
13 #include "debugtools.h"
15 DEFAULT_DEBUG_CHANNEL(driver
)
17 /***********************************************************************
20 INT16 WINAPI
Escape16( HDC16 hdc
, INT16 nEscape
, INT16 cbInput
,
21 SEGPTR lpszInData
, SEGPTR lpvOutData
)
23 DC
* dc
= DC_GetDCPtr( hdc
);
24 if (!dc
|| !dc
->funcs
->pEscape
) return 0;
25 return dc
->funcs
->pEscape( dc
, nEscape
, cbInput
, lpszInData
, lpvOutData
);
28 /************************************************************************
31 INT WINAPI
Escape( HDC hdc
, INT nEscape
, INT cbInput
,
32 LPCSTR lpszInData
, LPVOID lpvOutData
)
37 segin
= (SEGPTR
)lpszInData
;
38 segout
= (SEGPTR
)lpvOutData
;
40 /* Escape(hdc,QUERYESCSUPPORT,LPINT,NULL) */
41 /* Escape(hdc,EXT_DEVICE_CAPS,LPINT,NULL) */
42 /* Escape(hdc,SETLINECAP,LPINT,NULL) */
48 LPINT16 x
= (LPINT16
)SEGPTR_NEW(INT16
);
49 *x
= *(INT
*)lpszInData
;
50 segin
= SEGPTR_GET(x
);
51 cbInput
= sizeof(INT16
);
55 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
56 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
57 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
59 case GETSCALINGFACTOR
:
61 case GETPRINTINGOFFSET
:
62 segout
= SEGPTR_GET(SEGPTR_NEW(POINT16
));
63 cbInput
= sizeof(POINT16
);
66 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
69 segout
= SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
74 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
76 case ENABLEPAIRKERNING
: {
77 LPINT16 enab
= SEGPTR_NEW(INT16
);
78 segout
= SEGPTR_GET(SEGPTR_NEW(INT16
));
79 segin
= SEGPTR_GET(enab
);
80 *enab
= *(INT
*)lpszInData
;
81 cbInput
= sizeof(INT16
);
85 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
88 segout
= SEGPTR_GET(SEGPTR_ALLOC(200));
92 /* Escape(hdc,STARTDOC,LPSTR,NULL); */
94 case STARTDOC
: /* string may not be \0 terminated */
96 char *cp
= SEGPTR_ALLOC(cbInput
);
97 memcpy(cp
, lpszInData
, cbInput
);
98 segin
= SEGPTR_GET(cp
);
108 ret
= Escape16( hdc
, nEscape
, cbInput
, segin
, segout
);
111 case QUERYESCSUPPORT
:
113 TRACE("target DC implements Escape %d\n",nEscape
);
114 SEGPTR_FREE(PTR_SEG_TO_LIN(segin
));
116 case EXT_DEVICE_CAPS
:
119 SEGPTR_FREE(PTR_SEG_TO_LIN(segin
));
121 case GETSCALINGFACTOR
:
122 case GETPRINTINGOFFSET
:
123 case GETPHYSPAGESIZE
: {
124 LPPOINT16 x
= (LPPOINT16
)PTR_SEG_TO_LIN(segout
);
125 CONV_POINT16TO32(x
,(LPPOINT
)lpvOutData
);
129 case GETTECHNOLOGY
: {
130 LPSTR x
=PTR_SEG_TO_LIN(segout
);
131 lstrcpyA(lpvOutData
,x
);
135 case ENABLEPAIRKERNING
: {
136 LPINT16 enab
= (LPINT16
)PTR_SEG_TO_LIN(segout
);
138 *(LPINT
)lpvOutData
= *enab
;
140 SEGPTR_FREE(PTR_SEG_TO_LIN(segin
));
144 LPSTR x
= (LPSTR
)PTR_SEG_TO_LIN(segout
);
145 lstrcpyA(lpvOutData
,x
);
150 SEGPTR_FREE(PTR_SEG_TO_LIN(segin
));
159 /******************************************************************************
160 * ExtEscape [GDI32.95]
163 * hdc [I] Handle to device context
164 * nEscape [I] Escape function
165 * cbInput [I] Number of bytes in input structure
166 * lpszInData [I] Pointer to input structure
167 * cbOutput [I] Number of bytes in output structure
168 * lpszOutData [O] Pointer to output structure
175 INT WINAPI
ExtEscape( HDC hdc
, INT nEscape
, INT cbInput
,
176 LPCSTR lpszInData
, INT cbOutput
, LPSTR lpszOutData
)
178 char *inBuf
, *outBuf
;
181 inBuf
= SEGPTR_ALLOC(cbInput
);
182 memcpy(inBuf
, lpszInData
, cbInput
);
183 outBuf
= cbOutput
? SEGPTR_ALLOC(cbOutput
) : NULL
;
184 ret
= Escape16( hdc
, nEscape
, cbInput
, SEGPTR_GET(inBuf
),
185 SEGPTR_GET(outBuf
) );
188 memcpy(lpszOutData
, outBuf
, cbOutput
);
194 /*******************************************************************
195 * DrawEscape [GDI32.74]
199 INT WINAPI
DrawEscape(HDC hdc
, INT nEscape
, INT cbInput
, LPCSTR lpszInData
)
201 FIXME("DrawEscape, stub\n");