blob: d6986a83549f2b0bfdc5a717217ac3895f2c966b [file] [log] [blame]
Alexandre Julliard490a27e1994-06-08 13:57:50 +00001/*
2 * Escape() function.
3 *
4 * Copyright 1994 Bob Amstadt
Alexandre Julliard0e270f41996-08-24 18:26:35 +00005 */
Alexandre Julliard490a27e1994-06-08 13:57:50 +00006
Alexandre Julliard490a27e1994-06-08 13:57:50 +00007#include <stdio.h>
Marcus Meissner04c3e1d1999-02-19 10:37:02 +00008#include "wingdi.h"
Alexandre Julliard0e270f41996-08-24 18:26:35 +00009#include "gdi.h"
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000010#include "heap.h"
11#include "ldt.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000012#include "dc.h"
Alexandre Julliard46ea8b31998-05-03 19:01:20 +000013#include <debug.h>
14
Alexandre Julliard490a27e1994-06-08 13:57:50 +000015
Alexandre Julliard670cdc41997-08-24 16:00:30 +000016INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
17 SEGPTR lpszInData, SEGPTR lpvOutData )
Alexandre Julliard490a27e1994-06-08 13:57:50 +000018{
Alexandre Julliard01d63461997-01-20 19:43:45 +000019 DC * dc = DC_GetDCPtr( hdc );
20 if (!dc || !dc->funcs->pEscape) return 0;
Alexandre Julliard0e270f41996-08-24 18:26:35 +000021 return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
Alexandre Julliard490a27e1994-06-08 13:57:50 +000022}
Alexandre Julliard01d63461997-01-20 19:43:45 +000023
Alexandre Julliard670cdc41997-08-24 16:00:30 +000024INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
François Gouget241c7301998-10-28 10:47:09 +000025 LPCSTR lpszInData, LPVOID lpvOutData )
Alexandre Julliard01d63461997-01-20 19:43:45 +000026{
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000027 DC *dc = DC_GetDCPtr( hdc );
28 SEGPTR segin,segout;
29 INT32 ret;
30
Alexandre Julliard01d63461997-01-20 19:43:45 +000031 if (!dc || !dc->funcs->pEscape) return 0;
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000032 segin = (SEGPTR)lpszInData;
33 segout = (SEGPTR)lpvOutData;
Alexandre Julliard670cdc41997-08-24 16:00:30 +000034 switch (nEscape) {
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000035 /* 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;
Alexandre Julliard670cdc41997-08-24 16:00:30 +000041 }
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000042
43 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
44 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
45 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
46
47 case GETSCALINGFACTOR:
48 case GETPHYSPAGESIZE:
49 case GETPRINTINGOFFSET:
50 segout = SEGPTR_GET(SEGPTR_NEW(POINT16));
51 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +000052
53 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
54
55 case GETTECHNOLOGY: {
56 segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
57 break;
58
59 }
60
61 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
62
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;
69 }
70
71 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
72
73 case GETFACENAME: {
74 segout = SEGPTR_GET(SEGPTR_ALLOC(200));
75 break;
76 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +000077
78 /* Escape(hdc,STARTDOC,LPSTR,NULL); */
79
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;
88
89 default:
90 break;
91
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000092 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +000093
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000094 ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
Huw D M Davies6fafe9e1998-11-01 14:06:04 +000095
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000096 switch(nEscape) {
97 case QUERYESCSUPPORT:
98 if (ret)
Alexandre Julliard46ea8b31998-05-03 19:01:20 +000099 TRACE(driver,"target DC implements Escape %d\n",nEscape);
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000100 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;
109 }
Alexandre Julliard491502b1997-11-01 19:08:16 +0000110 case GETTECHNOLOGY: {
111 LPSTR x=PTR_SEG_TO_LIN(segout);
112 lstrcpy32A(lpvOutData,x);
113 SEGPTR_FREE(x);
Alexandre Julliarde658d821997-11-30 17:45:40 +0000114 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000115 }
116 case ENABLEPAIRKERNING: {
117 LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
118
119 *(LPINT32)lpvOutData = *enab;
120 SEGPTR_FREE(enab);
121 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
Alexandre Julliarde658d821997-11-30 17:45:40 +0000122 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000123 }
124 case GETFACENAME: {
125 LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
126 lstrcpy32A(lpvOutData,x);
127 SEGPTR_FREE(x);
128 break;
129 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000130 case STARTDOC:
131 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
132 break;
133
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000134 default:
135 break;
136 }
137 return ret;
138}
139
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000140/******************************************************************************
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000141 * ExtEscape [GDI32.95]
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000142 *
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
150 *
151 * RETURNS
152 * Success: >0
153 * Not implemented: 0
154 * Failure: <0
155 */
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000156INT32 WINAPI ExtEscape( HDC32 hdc, INT32 nEscape, INT32 cbInput,
157 LPCSTR lpszInData, INT32 cbOutput, LPSTR lpszOutData )
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000158{
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;
Alexandre Julliard01d63461997-01-20 19:43:45 +0000162}
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000163
Paul Quinn1beaae51998-12-15 15:38:36 +0000164/*******************************************************************
165 * DrawEscape [GDI32.74]
166 *
167 *
168 */
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000169INT32 WINAPI DrawEscape(HDC32 hdc, INT32 nEscape, INT32 cbInput, LPCSTR lpszInData)
Paul Quinn1beaae51998-12-15 15:38:36 +0000170{
171 FIXME(gdi, "DrawEscape, stub\n");
172 return 0;
173}