2 * GDI mapping mode functions
4 * Copyright 1993 Alexandre Julliard
8 #include "debugtools.h"
10 DEFAULT_DEBUG_CHANNEL(gdi
)
13 /***********************************************************************
14 * MAPPING_FixIsotropic
16 * Fix viewport extensions for isotropic mode.
18 void MAPPING_FixIsotropic( DC
* dc
)
20 double xdim
= (double)dc
->vportExtX
* dc
->w
.devCaps
->horzSize
/
21 (dc
->w
.devCaps
->horzRes
* dc
->wndExtX
);
22 double ydim
= (double)dc
->vportExtY
* dc
->w
.devCaps
->vertSize
/
23 (dc
->w
.devCaps
->vertRes
* dc
->wndExtY
);
26 dc
->vportExtX
= dc
->vportExtX
* fabs( ydim
/ xdim
);
27 if (!dc
->vportExtX
) dc
->vportExtX
= 1;
31 dc
->vportExtY
= dc
->vportExtY
* fabs( xdim
/ ydim
);
32 if (!dc
->vportExtY
) dc
->vportExtY
= 1;
37 /***********************************************************************
40 BOOL16 WINAPI
DPtoLP16( HDC16 hdc
, LPPOINT16 points
, INT16 count
)
42 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
43 if (!dc
) return FALSE
;
47 points
->x
= XDPTOLP( dc
, points
->x
);
48 points
->y
= YDPTOLP( dc
, points
->y
);
55 /***********************************************************************
58 BOOL WINAPI
DPtoLP( HDC hdc
, LPPOINT points
, INT count
)
60 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
61 if (!dc
) return FALSE
;
65 if (!INTERNAL_DPTOLP( dc
, points
))
73 /***********************************************************************
76 BOOL16 WINAPI
LPtoDP16( HDC16 hdc
, LPPOINT16 points
, INT16 count
)
78 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
79 if (!dc
) return FALSE
;
83 points
->x
= XLPTODP( dc
, points
->x
);
84 points
->y
= YLPTODP( dc
, points
->y
);
91 /***********************************************************************
94 BOOL WINAPI
LPtoDP( HDC hdc
, LPPOINT points
, INT count
)
96 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
97 if (!dc
) return FALSE
;
101 INTERNAL_LPTODP( dc
, points
);
108 /***********************************************************************
109 * SetMapMode16 (GDI.3)
111 INT16 WINAPI
SetMapMode16( HDC16 hdc
, INT16 mode
)
113 return SetMapMode( hdc
, mode
);
117 /***********************************************************************
118 * SetMapMode (GDI32.321)
120 INT WINAPI
SetMapMode( HDC hdc
, INT mode
)
123 DC
* dc
= DC_GetDCPtr( hdc
);
125 if (dc
->funcs
->pSetMapMode
) return dc
->funcs
->pSetMapMode( dc
, mode
);
127 TRACE("%04x %d\n", hdc
, mode
);
129 prevMode
= dc
->w
.MapMode
;
141 dc
->wndExtX
= dc
->w
.devCaps
->horzSize
;
142 dc
->wndExtY
= dc
->w
.devCaps
->vertSize
;
143 dc
->vportExtX
= dc
->w
.devCaps
->horzRes
/ 10;
144 dc
->vportExtY
= dc
->w
.devCaps
->vertRes
/ -10;
148 dc
->wndExtX
= dc
->w
.devCaps
->horzSize
* 10;
149 dc
->wndExtY
= dc
->w
.devCaps
->vertSize
* 10;
150 dc
->vportExtX
= dc
->w
.devCaps
->horzRes
/ 10;
151 dc
->vportExtY
= dc
->w
.devCaps
->vertRes
/ -10;
155 dc
->wndExtX
= dc
->w
.devCaps
->horzSize
;
156 dc
->wndExtY
= dc
->w
.devCaps
->vertSize
;
157 dc
->vportExtX
= 254L * dc
->w
.devCaps
->horzRes
/ 1000;
158 dc
->vportExtY
= -254L * dc
->w
.devCaps
->vertRes
/ 1000;
162 dc
->wndExtX
= dc
->w
.devCaps
->horzSize
* 10;
163 dc
->wndExtY
= dc
->w
.devCaps
->vertSize
* 10;
164 dc
->vportExtX
= 254L * dc
->w
.devCaps
->horzRes
/ 1000;
165 dc
->vportExtY
= -254L * dc
->w
.devCaps
->vertRes
/ 1000;
169 dc
->wndExtX
= 144L * dc
->w
.devCaps
->horzSize
/ 10;
170 dc
->wndExtY
= 144L * dc
->w
.devCaps
->vertSize
/ 10;
171 dc
->vportExtX
= 254L * dc
->w
.devCaps
->horzRes
/ 1000;
172 dc
->vportExtY
= -254L * dc
->w
.devCaps
->vertRes
/ 1000;
181 dc
->w
.MapMode
= mode
;
182 DC_UpdateXforms( dc
);
187 /***********************************************************************
188 * SetViewportExt (GDI.14)
190 DWORD WINAPI
SetViewportExt16( HDC16 hdc
, INT16 x
, INT16 y
)
193 if (!SetViewportExtEx( hdc
, x
, y
, &size
)) return 0;
194 return MAKELONG( size
.cx
, size
.cy
);
198 /***********************************************************************
199 * SetViewportExtEx16 (GDI.479)
201 BOOL16 WINAPI
SetViewportExtEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPSIZE16 size
)
204 BOOL16 ret
= SetViewportExtEx( hdc
, x
, y
, &size32
);
205 if (size
) CONV_SIZE32TO16( &size32
, size
);
210 /***********************************************************************
211 * SetViewportExtEx (GDI32.340)
213 BOOL WINAPI
SetViewportExtEx( HDC hdc
, INT x
, INT y
, LPSIZE size
)
215 DC
* dc
= DC_GetDCPtr( hdc
);
216 if (!dc
) return FALSE
;
217 if (dc
->funcs
->pSetViewportExt
)
218 return dc
->funcs
->pSetViewportExt( dc
, x
, y
);
221 size
->cx
= dc
->vportExtX
;
222 size
->cy
= dc
->vportExtY
;
224 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
226 if (!x
|| !y
) return FALSE
;
229 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
230 DC_UpdateXforms( dc
);
235 /***********************************************************************
236 * SetViewportOrg (GDI.13)
238 DWORD WINAPI
SetViewportOrg16( HDC16 hdc
, INT16 x
, INT16 y
)
241 if (!SetViewportOrgEx( hdc
, x
, y
, &pt
)) return 0;
242 return MAKELONG( pt
.x
, pt
.y
);
246 /***********************************************************************
247 * SetViewportOrgEx16 (GDI.480)
249 BOOL16 WINAPI
SetViewportOrgEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPPOINT16 pt
)
252 BOOL16 ret
= SetViewportOrgEx( hdc
, x
, y
, &pt32
);
253 if (pt
) CONV_POINT32TO16( &pt32
, pt
);
258 /***********************************************************************
259 * SetViewportOrgEx (GDI32.341)
261 BOOL WINAPI
SetViewportOrgEx( HDC hdc
, INT x
, INT y
, LPPOINT pt
)
263 DC
* dc
= DC_GetDCPtr( hdc
);
264 if (!dc
) return FALSE
;
265 if (dc
->funcs
->pSetViewportOrg
)
266 return dc
->funcs
->pSetViewportOrg( dc
, x
, y
);
269 pt
->x
= dc
->vportOrgX
;
270 pt
->y
= dc
->vportOrgY
;
274 DC_UpdateXforms( dc
);
279 /***********************************************************************
280 * SetWindowExt (GDI.12)
282 DWORD WINAPI
SetWindowExt16( HDC16 hdc
, INT16 x
, INT16 y
)
285 if (!SetWindowExtEx( hdc
, x
, y
, &size
)) return 0;
286 return MAKELONG( size
.cx
, size
.cy
);
290 /***********************************************************************
291 * SetWindowExtEx16 (GDI.481)
293 BOOL16 WINAPI
SetWindowExtEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPSIZE16 size
)
296 BOOL16 ret
= SetWindowExtEx( hdc
, x
, y
, &size32
);
297 if (size
) CONV_SIZE32TO16( &size32
, size
);
302 /***********************************************************************
303 * SetWindowExtEx (GDI32.344)
305 BOOL WINAPI
SetWindowExtEx( HDC hdc
, INT x
, INT y
, LPSIZE size
)
307 DC
* dc
= DC_GetDCPtr( hdc
);
308 if (!dc
) return FALSE
;
309 if (dc
->funcs
->pSetWindowExt
) return dc
->funcs
->pSetWindowExt( dc
, x
, y
);
312 size
->cx
= dc
->wndExtX
;
313 size
->cy
= dc
->wndExtY
;
315 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
317 if (!x
|| !y
) return FALSE
;
320 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
321 DC_UpdateXforms( dc
);
326 /***********************************************************************
327 * SetWindowOrg (GDI.11)
329 DWORD WINAPI
SetWindowOrg16( HDC16 hdc
, INT16 x
, INT16 y
)
332 if (!SetWindowOrgEx( hdc
, x
, y
, &pt
)) return 0;
333 return MAKELONG( pt
.x
, pt
.y
);
337 /***********************************************************************
338 * SetWindowOrgEx16 (GDI.482)
340 BOOL16 WINAPI
SetWindowOrgEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPPOINT16 pt
)
343 BOOL16 ret
= SetWindowOrgEx( hdc
, x
, y
, &pt32
);
344 if (pt
) CONV_POINT32TO16( &pt32
, pt
);
349 /***********************************************************************
350 * SetWindowOrgEx (GDI32.345)
352 BOOL WINAPI
SetWindowOrgEx( HDC hdc
, INT x
, INT y
, LPPOINT pt
)
354 DC
* dc
= DC_GetDCPtr( hdc
);
355 if (!dc
) return FALSE
;
356 if (dc
->funcs
->pSetWindowOrg
) return dc
->funcs
->pSetWindowOrg( dc
, x
, y
);
364 DC_UpdateXforms( dc
);
369 /***********************************************************************
370 * OffsetViewportOrg (GDI.17)
372 DWORD WINAPI
OffsetViewportOrg16( HDC16 hdc
, INT16 x
, INT16 y
)
375 if (!OffsetViewportOrgEx( hdc
, x
, y
, &pt
)) return 0;
376 return MAKELONG( pt
.x
, pt
.y
);
380 /***********************************************************************
381 * OffsetViewportOrgEx16 (GDI.476)
383 BOOL16 WINAPI
OffsetViewportOrgEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPPOINT16 pt
)
386 BOOL16 ret
= OffsetViewportOrgEx( hdc
, x
, y
, &pt32
);
387 if (pt
) CONV_POINT32TO16( &pt32
, pt
);
392 /***********************************************************************
393 * OffsetViewportOrgEx (GDI32.257)
395 BOOL WINAPI
OffsetViewportOrgEx( HDC hdc
, INT x
, INT y
, LPPOINT pt
)
397 DC
* dc
= DC_GetDCPtr( hdc
);
398 if (!dc
) return FALSE
;
399 if (dc
->funcs
->pOffsetViewportOrg
)
400 return dc
->funcs
->pOffsetViewportOrg( dc
, x
, y
);
403 pt
->x
= dc
->vportOrgX
;
404 pt
->y
= dc
->vportOrgY
;
408 DC_UpdateXforms( dc
);
413 /***********************************************************************
414 * OffsetWindowOrg (GDI.15)
416 DWORD WINAPI
OffsetWindowOrg16( HDC16 hdc
, INT16 x
, INT16 y
)
419 if (!OffsetWindowOrgEx( hdc
, x
, y
, &pt
)) return 0;
420 return MAKELONG( pt
.x
, pt
.y
);
424 /***********************************************************************
425 * OffsetWindowOrgEx16 (GDI.477)
427 BOOL16 WINAPI
OffsetWindowOrgEx16( HDC16 hdc
, INT16 x
, INT16 y
, LPPOINT16 pt
)
430 BOOL16 ret
= OffsetWindowOrgEx( hdc
, x
, y
, &pt32
);
431 if (pt
) CONV_POINT32TO16( &pt32
, pt
);
436 /***********************************************************************
437 * OffsetWindowOrgEx (GDI32.258)
439 BOOL WINAPI
OffsetWindowOrgEx( HDC hdc
, INT x
, INT y
, LPPOINT pt
)
441 DC
* dc
= DC_GetDCPtr( hdc
);
442 if (!dc
) return FALSE
;
443 if (dc
->funcs
->pOffsetWindowOrg
)
444 return dc
->funcs
->pOffsetWindowOrg( dc
, x
, y
);
452 DC_UpdateXforms( dc
);
457 /***********************************************************************
458 * ScaleViewportExt (GDI.18)
460 DWORD WINAPI
ScaleViewportExt16( HDC16 hdc
, INT16 xNum
, INT16 xDenom
,
461 INT16 yNum
, INT16 yDenom
)
464 if (!ScaleViewportExtEx( hdc
, xNum
, xDenom
, yNum
, yDenom
, &size
))
466 return MAKELONG( size
.cx
, size
.cy
);
470 /***********************************************************************
471 * ScaleViewportExtEx16 (GDI.484)
473 BOOL16 WINAPI
ScaleViewportExtEx16( HDC16 hdc
, INT16 xNum
, INT16 xDenom
,
474 INT16 yNum
, INT16 yDenom
, LPSIZE16 size
)
477 BOOL16 ret
= ScaleViewportExtEx( hdc
, xNum
, xDenom
, yNum
, yDenom
,
479 if (size
) CONV_SIZE32TO16( &size32
, size
);
484 /***********************************************************************
485 * ScaleViewportExtEx (GDI32.293)
487 BOOL WINAPI
ScaleViewportExtEx( HDC hdc
, INT xNum
, INT xDenom
,
488 INT yNum
, INT yDenom
, LPSIZE size
)
490 DC
* dc
= DC_GetDCPtr( hdc
);
491 if (!dc
) return FALSE
;
492 if (dc
->funcs
->pScaleViewportExt
)
493 return dc
->funcs
->pScaleViewportExt( dc
, xNum
, xDenom
, yNum
, yDenom
);
496 size
->cx
= dc
->vportExtX
;
497 size
->cy
= dc
->vportExtY
;
499 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
501 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return FALSE
;
502 dc
->vportExtX
= (dc
->vportExtX
* xNum
) / xDenom
;
503 dc
->vportExtY
= (dc
->vportExtY
* yNum
) / yDenom
;
504 if (dc
->vportExtX
== 0) dc
->vportExtX
= 1;
505 if (dc
->vportExtY
== 0) dc
->vportExtY
= 1;
506 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
507 DC_UpdateXforms( dc
);
512 /***********************************************************************
513 * ScaleWindowExt (GDI.16)
515 DWORD WINAPI
ScaleWindowExt16( HDC16 hdc
, INT16 xNum
, INT16 xDenom
,
516 INT16 yNum
, INT16 yDenom
)
519 if (!ScaleWindowExtEx( hdc
, xNum
, xDenom
, yNum
, yDenom
, &size
))
521 return MAKELONG( size
.cx
, size
.cy
);
525 /***********************************************************************
526 * ScaleWindowExtEx16 (GDI.485)
528 BOOL16 WINAPI
ScaleWindowExtEx16( HDC16 hdc
, INT16 xNum
, INT16 xDenom
,
529 INT16 yNum
, INT16 yDenom
, LPSIZE16 size
)
532 BOOL16 ret
= ScaleWindowExtEx( hdc
, xNum
, xDenom
, yNum
, yDenom
,
534 if (size
) CONV_SIZE32TO16( &size32
, size
);
539 /***********************************************************************
540 * ScaleWindowExtEx (GDI32.294)
542 BOOL WINAPI
ScaleWindowExtEx( HDC hdc
, INT xNum
, INT xDenom
,
543 INT yNum
, INT yDenom
, LPSIZE size
)
545 DC
* dc
= DC_GetDCPtr( hdc
);
546 if (!dc
) return FALSE
;
547 if (dc
->funcs
->pScaleWindowExt
)
548 return dc
->funcs
->pScaleWindowExt( dc
, xNum
, xDenom
, yNum
, yDenom
);
551 size
->cx
= dc
->wndExtX
;
552 size
->cy
= dc
->wndExtY
;
554 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
556 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return FALSE
;
557 dc
->wndExtX
= (dc
->wndExtX
* xNum
) / xDenom
;
558 dc
->wndExtY
= (dc
->wndExtY
* yNum
) / yDenom
;
559 if (dc
->wndExtX
== 0) dc
->wndExtX
= 1;
560 if (dc
->wndExtY
== 0) dc
->wndExtY
= 1;
561 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
562 DC_UpdateXforms( dc
);