Playing a non-existent CD should fail instead of crash.
[wine/multimedia.git] / graphics / escape.c
blobda8f35fe044b911430d943ea4b89917ae9fee3d9
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 LPCSTR 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 /* Escape(hdc,STARTDOC,LPSTR,NULL); */
80 case STARTDOC: /* string may not be \0 terminated */
81 if(lpszInData) {
82 char *cp = SEGPTR_ALLOC(cbInput);
83 memcpy(cp, lpszInData, cbInput);
84 segin = SEGPTR_GET(cp);
85 } else
86 segin = 0;
87 break;
89 default:
90 break;
94 ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
96 switch(nEscape) {
97 case QUERYESCSUPPORT:
98 if (ret)
99 TRACE(driver,"target DC implements Escape %d\n",nEscape);
100 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
101 break;
102 case GETSCALINGFACTOR:
103 case GETPRINTINGOFFSET:
104 case GETPHYSPAGESIZE: {
105 LPPOINT16 x = (LPPOINT16)PTR_SEG_TO_LIN(segout);
106 CONV_POINT16TO32(x,(LPPOINT32)lpvOutData);
107 SEGPTR_FREE(x);
108 break;
110 case GETTECHNOLOGY: {
111 LPSTR x=PTR_SEG_TO_LIN(segout);
112 lstrcpy32A(lpvOutData,x);
113 SEGPTR_FREE(x);
114 break;
116 case ENABLEPAIRKERNING: {
117 LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
119 *(LPINT32)lpvOutData = *enab;
120 SEGPTR_FREE(enab);
121 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
122 break;
124 case GETFACENAME: {
125 LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
126 lstrcpy32A(lpvOutData,x);
127 SEGPTR_FREE(x);
128 break;
130 case STARTDOC:
131 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
132 break;
134 default:
135 break;
137 return ret;
140 /******************************************************************************
141 * ExtEscape32 [GDI32.95]
143 * PARAMS
144 * hdc [I] Handle to device context
145 * nEscape [I] Escape function
146 * cbInput [I] Number of bytes in input structure
147 * lpszInData [I] Pointer to input structure
148 * cbOutput [I] Number of bytes in output structure
149 * lpszOutData [O] Pointer to output structure
151 * RETURNS
152 * Success: >0
153 * Not implemented: 0
154 * Failure: <0
156 INT32 WINAPI ExtEscape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
157 LPCSTR lpszInData, INT32 cbOutput, LPSTR lpszOutData )
159 FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p):stub\n",
160 hdc,nEscape,cbInput,debugstr_a(lpszInData),cbOutput,lpszOutData);
161 return 0;
164 /*******************************************************************
165 * DrawEscape [GDI32.74]
169 INT32 WINAPI DrawEscape32(HDC32 hdc, INT32 nEscape, INT32 cbInput, LPCSTR lpszInData)
171 FIXME(gdi, "DrawEscape, stub\n");
172 return 0;