blob: c55229b56bad43865edcd3ee8dc314235803bbbd [file] [log] [blame]
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001/*
2 * GDI mapping mode functions
3 *
4 * Copyright 1993 Alexandre Julliard
5 */
6
Alexandre Julliard2239abb2000-11-05 02:05:07 +00007#include "gdi.h"
Alexandre Julliard61fece01999-06-26 19:09:08 +00008#include "debugtools.h"
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00009
Alexandre Julliard2239abb2000-11-05 02:05:07 +000010DEFAULT_DEBUG_CHANNEL(gdi);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000011
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000012
13/***********************************************************************
14 * MAPPING_FixIsotropic
15 *
16 * Fix viewport extensions for isotropic mode.
17 */
18void MAPPING_FixIsotropic( DC * dc )
19{
Alexandre Julliard99bb9f92001-07-28 00:18:02 +000020 double xdim = (double)dc->vportExtX * GetDeviceCaps( dc->hSelf, HORZSIZE ) /
21 (GetDeviceCaps( dc->hSelf, HORZRES ) * dc->wndExtX);
22 double ydim = (double)dc->vportExtY * GetDeviceCaps( dc->hSelf, VERTSIZE ) /
23 (GetDeviceCaps( dc->hSelf, VERTRES ) * dc->wndExtY);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000024 if (xdim > ydim)
25 {
26 dc->vportExtX = dc->vportExtX * fabs( ydim / xdim );
27 if (!dc->vportExtX) dc->vportExtX = 1;
28 }
29 else
30 {
31 dc->vportExtY = dc->vportExtY * fabs( xdim / ydim );
32 if (!dc->vportExtY) dc->vportExtY = 1;
Alexandre Julliard99bb9f92001-07-28 00:18:02 +000033 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000034}
35
36
37/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +000038 * DPtoLP (GDI.67)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000039 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000040BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000041{
42 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
43 if (!dc) return FALSE;
44
45 while (count--)
46 {
47 points->x = XDPTOLP( dc, points->x );
48 points->y = YDPTOLP( dc, points->y );
49 points++;
50 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +000051 GDI_ReleaseObj( hdc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000052 return TRUE;
53}
54
55
56/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +000057 * DPtoLP (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000058 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000059BOOL WINAPI DPtoLP( HDC hdc, LPPOINT points, INT count )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000060{
61 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
62 if (!dc) return FALSE;
63
64 while (count--)
65 {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000066 if (!INTERNAL_DPTOLP( dc, points ))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +000067 break;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000068 points++;
69 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +000070 GDI_ReleaseObj( hdc );
71 return (count < 0);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000072}
73
74
75/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +000076 * LPtoDP (GDI.99)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000077 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000078BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000079{
80 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
81 if (!dc) return FALSE;
82
83 while (count--)
84 {
85 points->x = XLPTODP( dc, points->x );
86 points->y = YLPTODP( dc, points->y );
87 points++;
88 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +000089 GDI_ReleaseObj( hdc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000090 return TRUE;
91}
92
93
94/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +000095 * LPtoDP (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000096 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000097BOOL WINAPI LPtoDP( HDC hdc, LPPOINT points, INT count )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000098{
99 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
100 if (!dc) return FALSE;
101
102 while (count--)
103 {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000104 INTERNAL_LPTODP( dc, points );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000105 points++;
106 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000107 GDI_ReleaseObj( hdc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000108 return TRUE;
109}
110
111
112/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000113 * SetMapMode (GDI.3)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000114 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000115INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000116{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000117 return SetMapMode( hdc, mode );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000118}
119
120
121/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000122 * SetMapMode (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000123 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000124INT WINAPI SetMapMode( HDC hdc, INT mode )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000125{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000126 INT prevMode;
Alexandre Julliard99bb9f92001-07-28 00:18:02 +0000127 INT horzSize, vertSize, horzRes, vertRes;
128
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000129 DC * dc = DC_GetDCPtr( hdc );
130 if (!dc) return 0;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000131 if (dc->funcs->pSetMapMode)
132 {
133 prevMode = dc->funcs->pSetMapMode( dc, mode );
134 goto done;
135 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000136
Alexandre Julliard61fece01999-06-26 19:09:08 +0000137 TRACE("%04x %d\n", hdc, mode );
Alexandre Julliard99bb9f92001-07-28 00:18:02 +0000138
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000139 prevMode = dc->MapMode;
Alexandre Julliard99bb9f92001-07-28 00:18:02 +0000140 horzSize = GetDeviceCaps( hdc, HORZSIZE );
141 vertSize = GetDeviceCaps( hdc, VERTSIZE );
142 horzRes = GetDeviceCaps( hdc, HORZRES );
143 vertRes = GetDeviceCaps( hdc, VERTRES );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000144 switch(mode)
145 {
Alexandre Julliard99bb9f92001-07-28 00:18:02 +0000146 case MM_TEXT:
147 dc->wndExtX = 1;
148 dc->wndExtY = 1;
149 dc->vportExtX = 1;
150 dc->vportExtY = 1;
151 break;
152 case MM_LOMETRIC:
153 case MM_ISOTROPIC:
154 dc->wndExtX = horzSize;
155 dc->wndExtY = vertSize;
156 dc->vportExtX = horzRes / 10;
157 dc->vportExtY = vertRes / -10;
158 break;
159 case MM_HIMETRIC:
160 dc->wndExtX = horzSize * 10;
161 dc->wndExtY = vertSize * 10;
162 dc->vportExtX = horzRes / 10;
163 dc->vportExtY = vertRes / -10;
164 break;
165 case MM_LOENGLISH:
166 dc->wndExtX = horzSize;
167 dc->wndExtY = vertSize;
168 dc->vportExtX = 254L * horzRes / 1000;
169 dc->vportExtY = -254L * vertRes / 1000;
170 break;
171 case MM_HIENGLISH:
172 dc->wndExtX = horzSize * 10;
173 dc->wndExtY = vertSize * 10;
174 dc->vportExtX = 254L * horzRes / 1000;
175 dc->vportExtY = -254L * vertRes / 1000;
176 break;
177 case MM_TWIPS:
178 dc->wndExtX = 144L * horzSize / 10;
179 dc->wndExtY = 144L * vertSize / 10;
180 dc->vportExtX = 254L * horzRes / 1000;
181 dc->vportExtY = -254L * vertRes / 1000;
182 break;
183 case MM_ANISOTROPIC:
184 break;
185 default:
186 goto done;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000187 }
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000188 dc->MapMode = mode;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000189 DC_UpdateXforms( dc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000190 done:
191 GDI_ReleaseObj( hdc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000192 return prevMode;
193}
194
195
196/***********************************************************************
197 * SetViewportExt (GDI.14)
198 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000199DWORD WINAPI SetViewportExt16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000200{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000201 SIZE size;
202 if (!SetViewportExtEx( hdc, x, y, &size )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000203 return MAKELONG( size.cx, size.cy );
204}
205
206
207/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000208 * SetViewportExtEx (GDI.479)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000209 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000210BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000211{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000212 SIZE size32;
213 BOOL16 ret = SetViewportExtEx( hdc, x, y, &size32 );
Alexandre Julliard982a2232000-12-13 20:20:09 +0000214 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000215 return ret;
216}
217
218
219/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000220 * SetViewportExtEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000221 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000222BOOL WINAPI SetViewportExtEx( HDC hdc, INT x, INT y, LPSIZE size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000223{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000224 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000225 DC * dc = DC_GetDCPtr( hdc );
226 if (!dc) return FALSE;
227 if (dc->funcs->pSetViewportExt)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000228 {
229 ret = dc->funcs->pSetViewportExt( dc, x, y );
230 goto done;
231 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000232 if (size)
233 {
234 size->cx = dc->vportExtX;
235 size->cy = dc->vportExtY;
236 }
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000237 if ((dc->MapMode != MM_ISOTROPIC) && (dc->MapMode != MM_ANISOTROPIC))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000238 goto done;
239 if (!x || !y)
240 {
241 ret = FALSE;
242 goto done;
243 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000244 dc->vportExtX = x;
245 dc->vportExtY = y;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000246 if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000247 DC_UpdateXforms( dc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000248 done:
249 GDI_ReleaseObj( hdc );
250 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000251}
252
253
254/***********************************************************************
255 * SetViewportOrg (GDI.13)
256 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000257DWORD WINAPI SetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000258{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000259 POINT pt;
260 if (!SetViewportOrgEx( hdc, x, y, &pt )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000261 return MAKELONG( pt.x, pt.y );
262}
263
264
265/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000266 * SetViewportOrgEx (GDI.480)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000267 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000268BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000269{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000270 POINT pt32;
271 BOOL16 ret = SetViewportOrgEx( hdc, x, y, &pt32 );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000272 if (pt) CONV_POINT32TO16( &pt32, pt );
273 return ret;
274}
275
276
277/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000278 * SetViewportOrgEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000279 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000280BOOL WINAPI SetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000281{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000282 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000283 DC * dc = DC_GetDCPtr( hdc );
284 if (!dc) return FALSE;
285 if (dc->funcs->pSetViewportOrg)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000286 ret = dc->funcs->pSetViewportOrg( dc, x, y );
287 else
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000288 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000289 if (pt)
290 {
291 pt->x = dc->vportOrgX;
292 pt->y = dc->vportOrgY;
293 }
294 dc->vportOrgX = x;
295 dc->vportOrgY = y;
296 DC_UpdateXforms( dc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000297 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000298 GDI_ReleaseObj( hdc );
299 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000300}
301
302
303/***********************************************************************
304 * SetWindowExt (GDI.12)
305 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000306DWORD WINAPI SetWindowExt16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000307{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000308 SIZE size;
309 if (!SetWindowExtEx( hdc, x, y, &size )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000310 return MAKELONG( size.cx, size.cy );
311}
312
313
314/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000315 * SetWindowExtEx (GDI.481)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000316 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000317BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000318{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000319 SIZE size32;
320 BOOL16 ret = SetWindowExtEx( hdc, x, y, &size32 );
Alexandre Julliard982a2232000-12-13 20:20:09 +0000321 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000322 return ret;
323}
324
325
326/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000327 * SetWindowExtEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000328 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000329BOOL WINAPI SetWindowExtEx( HDC hdc, INT x, INT y, LPSIZE size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000330{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000331 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000332 DC * dc = DC_GetDCPtr( hdc );
333 if (!dc) return FALSE;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000334 if (dc->funcs->pSetWindowExt)
335 {
336 ret = dc->funcs->pSetWindowExt( dc, x, y );
337 goto done;
338 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000339 if (size)
340 {
341 size->cx = dc->wndExtX;
342 size->cy = dc->wndExtY;
343 }
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000344 if ((dc->MapMode != MM_ISOTROPIC) && (dc->MapMode != MM_ANISOTROPIC))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000345 goto done;
346 if (!x || !y)
347 {
348 ret = FALSE;
349 goto done;
350 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000351 dc->wndExtX = x;
352 dc->wndExtY = y;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000353 if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000354 DC_UpdateXforms( dc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000355 done:
356 GDI_ReleaseObj( hdc );
357 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000358}
359
360
361/***********************************************************************
362 * SetWindowOrg (GDI.11)
363 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000364DWORD WINAPI SetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000365{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000366 POINT pt;
367 if (!SetWindowOrgEx( hdc, x, y, &pt )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000368 return MAKELONG( pt.x, pt.y );
369}
370
371
372/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000373 * SetWindowOrgEx (GDI.482)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000374 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000375BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000376{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000377 POINT pt32;
378 BOOL16 ret = SetWindowOrgEx( hdc, x, y, &pt32 );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000379 if (pt) CONV_POINT32TO16( &pt32, pt );
380 return ret;
381}
382
383
384/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000385 * SetWindowOrgEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000386 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000387BOOL WINAPI SetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000388{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000389 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000390 DC * dc = DC_GetDCPtr( hdc );
391 if (!dc) return FALSE;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000392 if (dc->funcs->pSetWindowOrg) ret = dc->funcs->pSetWindowOrg( dc, x, y );
393 else
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000394 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000395 if (pt)
396 {
397 pt->x = dc->wndOrgX;
398 pt->y = dc->wndOrgY;
399 }
400 dc->wndOrgX = x;
401 dc->wndOrgY = y;
402 DC_UpdateXforms( dc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000403 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000404 GDI_ReleaseObj( hdc );
405 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000406}
407
408
409/***********************************************************************
410 * OffsetViewportOrg (GDI.17)
411 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000412DWORD WINAPI OffsetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000413{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000414 POINT pt;
415 if (!OffsetViewportOrgEx( hdc, x, y, &pt )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000416 return MAKELONG( pt.x, pt.y );
417}
418
419
420/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000421 * OffsetViewportOrgEx (GDI.476)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000422 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000423BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000424{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000425 POINT pt32;
426 BOOL16 ret = OffsetViewportOrgEx( hdc, x, y, &pt32 );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000427 if (pt) CONV_POINT32TO16( &pt32, pt );
428 return ret;
429}
430
431
432/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000433 * OffsetViewportOrgEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000434 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000435BOOL WINAPI OffsetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000436{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000437 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000438 DC * dc = DC_GetDCPtr( hdc );
439 if (!dc) return FALSE;
440 if (dc->funcs->pOffsetViewportOrg)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000441 ret = dc->funcs->pOffsetViewportOrg( dc, x, y );
442 else
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000443 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000444 if (pt)
445 {
446 pt->x = dc->vportOrgX;
447 pt->y = dc->vportOrgY;
448 }
449 dc->vportOrgX += x;
450 dc->vportOrgY += y;
451 DC_UpdateXforms( dc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000452 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000453 GDI_ReleaseObj( hdc );
454 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000455}
456
457
458/***********************************************************************
459 * OffsetWindowOrg (GDI.15)
460 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000461DWORD WINAPI OffsetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000462{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000463 POINT pt;
464 if (!OffsetWindowOrgEx( hdc, x, y, &pt )) return 0;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000465 return MAKELONG( pt.x, pt.y );
466}
467
468
469/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000470 * OffsetWindowOrgEx (GDI.477)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000471 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000472BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000473{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000474 POINT pt32;
475 BOOL16 ret = OffsetWindowOrgEx( hdc, x, y, &pt32 );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000476 if (pt) CONV_POINT32TO16( &pt32, pt );
477 return ret;
478}
479
480
481/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000482 * OffsetWindowOrgEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000483 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000484BOOL WINAPI OffsetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000485{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000486 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000487 DC * dc = DC_GetDCPtr( hdc );
488 if (!dc) return FALSE;
489 if (dc->funcs->pOffsetWindowOrg)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000490 ret = dc->funcs->pOffsetWindowOrg( dc, x, y );
491 else
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000492 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000493 if (pt)
494 {
495 pt->x = dc->wndOrgX;
496 pt->y = dc->wndOrgY;
497 }
498 dc->wndOrgX += x;
499 dc->wndOrgY += y;
500 DC_UpdateXforms( dc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000501 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000502 GDI_ReleaseObj( hdc );
503 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000504}
505
506
507/***********************************************************************
508 * ScaleViewportExt (GDI.18)
509 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000510DWORD WINAPI ScaleViewportExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000511 INT16 yNum, INT16 yDenom )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000512{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000513 SIZE size;
514 if (!ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000515 return FALSE;
516 return MAKELONG( size.cx, size.cy );
517}
518
519
520/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000521 * ScaleViewportExtEx (GDI.484)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000522 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000523BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
524 INT16 yNum, INT16 yDenom, LPSIZE16 size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000525{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000526 SIZE size32;
527 BOOL16 ret = ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom,
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000528 &size32 );
Alexandre Julliard982a2232000-12-13 20:20:09 +0000529 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000530 return ret;
531}
532
533
534/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000535 * ScaleViewportExtEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000536 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000537BOOL WINAPI ScaleViewportExtEx( HDC hdc, INT xNum, INT xDenom,
538 INT yNum, INT yDenom, LPSIZE size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000539{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000540 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000541 DC * dc = DC_GetDCPtr( hdc );
542 if (!dc) return FALSE;
543 if (dc->funcs->pScaleViewportExt)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000544 {
545 ret = dc->funcs->pScaleViewportExt( dc, xNum, xDenom, yNum, yDenom );
546 goto done;
547 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000548 if (size)
549 {
550 size->cx = dc->vportExtX;
551 size->cy = dc->vportExtY;
552 }
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000553 if ((dc->MapMode != MM_ISOTROPIC) && (dc->MapMode != MM_ANISOTROPIC))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000554 goto done;
555 if (!xNum || !xDenom || !xNum || !yDenom)
556 {
557 ret = FALSE;
558 goto done;
559 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000560 dc->vportExtX = (dc->vportExtX * xNum) / xDenom;
561 dc->vportExtY = (dc->vportExtY * yNum) / yDenom;
562 if (dc->vportExtX == 0) dc->vportExtX = 1;
563 if (dc->vportExtY == 0) dc->vportExtY = 1;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000564 if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000565 DC_UpdateXforms( dc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000566 done:
567 GDI_ReleaseObj( hdc );
568 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000569}
570
571
572/***********************************************************************
573 * ScaleWindowExt (GDI.16)
574 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000575DWORD WINAPI ScaleWindowExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000576 INT16 yNum, INT16 yDenom )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000577{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000578 SIZE size;
579 if (!ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000580 return FALSE;
581 return MAKELONG( size.cx, size.cy );
582}
583
584
585/***********************************************************************
Patrik Stridvall01d5e5b2001-07-02 19:59:40 +0000586 * ScaleWindowExtEx (GDI.485)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000587 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000588BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
589 INT16 yNum, INT16 yDenom, LPSIZE16 size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000590{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000591 SIZE size32;
592 BOOL16 ret = ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom,
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000593 &size32 );
Alexandre Julliard982a2232000-12-13 20:20:09 +0000594 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000595 return ret;
596}
597
598
599/***********************************************************************
Patrik Stridvalld0a41772001-02-14 23:11:17 +0000600 * ScaleWindowExtEx (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000601 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000602BOOL WINAPI ScaleWindowExtEx( HDC hdc, INT xNum, INT xDenom,
603 INT yNum, INT yDenom, LPSIZE size )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000604{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000605 BOOL ret = TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000606 DC * dc = DC_GetDCPtr( hdc );
607 if (!dc) return FALSE;
608 if (dc->funcs->pScaleWindowExt)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000609 {
610 ret = dc->funcs->pScaleWindowExt( dc, xNum, xDenom, yNum, yDenom );
611 goto done;
612 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000613 if (size)
614 {
615 size->cx = dc->wndExtX;
616 size->cy = dc->wndExtY;
617 }
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000618 if ((dc->MapMode != MM_ISOTROPIC) && (dc->MapMode != MM_ANISOTROPIC))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000619 goto done;
620 if (!xNum || !xDenom || !xNum || !yDenom)
621 {
622 ret = FALSE;
623 goto done;
624 }
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000625 dc->wndExtX = (dc->wndExtX * xNum) / xDenom;
626 dc->wndExtY = (dc->wndExtY * yNum) / yDenom;
627 if (dc->wndExtX == 0) dc->wndExtX = 1;
628 if (dc->wndExtY == 0) dc->wndExtY = 1;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000629 if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000630 DC_UpdateXforms( dc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000631 done:
632 GDI_ReleaseObj( hdc );
633 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000634}