2 * GDI mapping mode functions
4 * Copyright 1993 Alexandre Julliard
10 /* #define DEBUG_GDI */
14 /***********************************************************************
15 * MAPPING_FixIsotropic
17 * Fix viewport extensions for isotropic mode.
19 void MAPPING_FixIsotropic( DC
* dc
)
21 double xdim
= (double)dc
->w
.VportExtX
* dc
->w
.devCaps
->horzSize
/
22 (dc
->w
.devCaps
->horzRes
* dc
->w
.WndExtX
);
23 double ydim
= (double)dc
->w
.VportExtY
* dc
->w
.devCaps
->vertSize
/
24 (dc
->w
.devCaps
->vertRes
* dc
->w
.WndExtY
);
27 dc
->w
.VportExtX
= dc
->w
.VportExtX
* ydim
/ xdim
;
28 if (!dc
->w
.VportExtX
) dc
->w
.VportExtX
= 1;
32 dc
->w
.VportExtY
= dc
->w
.VportExtY
* xdim
/ ydim
;
33 if (!dc
->w
.VportExtY
) dc
->w
.VportExtY
= 1;
37 /***********************************************************************
40 BOOL
DPtoLP( HDC hdc
, LPPOINT points
, int count
)
43 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
44 if (!dc
) return FALSE
;
46 for (pt
= points
; count
> 0; pt
++, count
--)
48 pt
->x
= XDPTOLP( dc
, pt
->x
);
49 pt
->y
= YDPTOLP( dc
, pt
->y
);
55 /***********************************************************************
58 BOOL
LPtoDP( HDC hdc
, LPPOINT points
, int count
)
61 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
62 if (!dc
) return FALSE
;
64 for (pt
= points
; count
> 0; pt
++, count
--)
66 pt
->x
= XLPTODP( dc
, pt
->x
);
67 pt
->y
= YLPTODP( dc
, pt
->y
);
73 /***********************************************************************
76 WORD
SetMapMode( HDC hdc
, WORD mode
)
79 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
82 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
84 MF_MetaParam1(dc
, META_SETMAPMODE
, mode
);
88 dprintf_gdi(stddeb
, "SetMapMode: %d %d\n", hdc
, mode
);
90 prevMode
= dc
->w
.MapMode
;
94 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
95 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
104 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
105 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
106 dc
->w
.WndExtX
= dc
->w
.devCaps
->horzSize
;
107 dc
->w
.WndExtY
= dc
->w
.devCaps
->vertSize
;
108 dc
->w
.VportExtX
= dc
->w
.devCaps
->horzRes
/ 10;
109 dc
->w
.VportExtY
= dc
->w
.devCaps
->vertRes
/ -10;
113 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
114 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
115 dc
->w
.WndExtX
= dc
->w
.devCaps
->horzSize
* 10;
116 dc
->w
.WndExtY
= dc
->w
.devCaps
->vertSize
* 10;
117 dc
->w
.VportExtX
= dc
->w
.devCaps
->horzRes
/ 10;
118 dc
->w
.VportExtY
= dc
->w
.devCaps
->vertRes
/ -10;
122 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
123 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
124 dc
->w
.WndExtX
= dc
->w
.devCaps
->horzSize
;
125 dc
->w
.WndExtY
= dc
->w
.devCaps
->vertSize
;
126 dc
->w
.VportExtX
= (short)(254L * dc
->w
.devCaps
->horzRes
/ 1000);
127 dc
->w
.VportExtY
= (short)(-254L * dc
->w
.devCaps
->vertRes
/ 1000);
131 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
132 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
133 dc
->w
.WndExtX
= dc
->w
.devCaps
->horzSize
* 10;
134 dc
->w
.WndExtY
= dc
->w
.devCaps
->vertSize
* 10;
135 dc
->w
.VportExtX
= (short)(254L * dc
->w
.devCaps
->horzRes
/ 1000);
136 dc
->w
.VportExtY
= (short)(-254L * dc
->w
.devCaps
->vertRes
/ 1000);
140 dc
->w
.WndOrgX
= dc
->w
.WndOrgY
= 0;
141 dc
->w
.VportOrgX
= dc
->w
.VportOrgY
= 0;
142 dc
->w
.WndExtX
= (short)(144L * dc
->w
.devCaps
->horzSize
/ 10);
143 dc
->w
.WndExtY
= (short)(144L * dc
->w
.devCaps
->vertSize
/ 10);
144 dc
->w
.VportExtX
= (short)(254L * dc
->w
.devCaps
->horzRes
/ 1000);
145 dc
->w
.VportExtY
= (short)(-254L * dc
->w
.devCaps
->vertRes
/ 1000);
154 dc
->w
.MapMode
= mode
;
159 /***********************************************************************
160 * SetViewportExt (GDI.14)
162 DWORD
SetViewportExt( HDC hdc
, short x
, short y
)
165 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
168 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
169 if (!dc
) return FALSE
;
170 MF_MetaParam2(dc
, META_SETVIEWPORTEXT
, x
, y
);
174 size
.cx
= dc
->w
.VportExtX
;
175 size
.cy
= dc
->w
.VportExtY
;
176 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
177 return size
.cx
| (size
.cy
<< 16);
178 if (!x
|| !y
) return 0;
181 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
182 return size
.cx
| (size
.cy
<< 16);
186 /***********************************************************************
187 * SetViewportExtEx (GDI.479)
189 BOOL
SetViewportExtEx( HDC hdc
, short x
, short y
, LPSIZE size
)
191 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
192 if (!dc
) return FALSE
;
195 size
->cx
= dc
->w
.VportExtX
;
196 size
->cy
= dc
->w
.VportExtY
;
198 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
200 if (!x
|| !y
) return FALSE
;
203 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
208 /***********************************************************************
209 * SetViewportOrg (GDI.13)
211 DWORD
SetViewportOrg( HDC hdc
, short x
, short y
)
214 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
217 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
218 if (!dc
) return FALSE
;
219 MF_MetaParam2(dc
, META_SETVIEWPORTORG
, x
, y
);
223 pt
.x
= dc
->w
.VportOrgX
;
224 pt
.y
= dc
->w
.VportOrgY
;
227 return pt
.x
| (pt
.y
<< 16);
231 /***********************************************************************
232 * SetViewportOrgEx (GDI.480)
234 BOOL
SetViewportOrgEx( HDC hdc
, short x
, short y
, LPPOINT pt
)
236 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
237 if (!dc
) return FALSE
;
240 pt
->x
= dc
->w
.VportOrgX
;
241 pt
->y
= dc
->w
.VportOrgY
;
249 /***********************************************************************
250 * SetWindowExt (GDI.12)
252 DWORD
SetWindowExt( HDC hdc
, short x
, short y
)
255 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
258 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
259 if (!dc
) return FALSE
;
260 MF_MetaParam2(dc
, META_SETWINDOWEXT
, x
, y
);
264 size
.cx
= dc
->w
.WndExtX
;
265 size
.cy
= dc
->w
.WndExtY
;
266 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
267 return size
.cx
| (size
.cy
<< 16);
268 if (!x
|| !y
) return 0;
271 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
272 return size
.cx
| (size
.cy
<< 16);
276 /***********************************************************************
277 * SetWindowExtEx (GDI.481)
279 BOOL
SetWindowExtEx( HDC hdc
, short x
, short y
, LPSIZE size
)
281 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
282 if (!dc
) return FALSE
;
285 size
->cx
= dc
->w
.WndExtX
;
286 size
->cy
= dc
->w
.WndExtY
;
288 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
290 if (!x
|| !y
) return FALSE
;
293 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
298 /***********************************************************************
299 * SetWindowOrg (GDI.11)
301 DWORD
SetWindowOrg( HDC hdc
, short x
, short y
)
304 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
307 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
308 if (!dc
) return FALSE
;
309 MF_MetaParam2(dc
, META_SETWINDOWORG
, x
, y
);
313 pt
.x
= dc
->w
.WndOrgX
;
314 pt
.y
= dc
->w
.WndOrgY
;
317 return pt
.x
| (pt
.y
<< 16);
321 /***********************************************************************
322 * SetWindowOrgEx (GDI.482)
324 BOOL
SetWindowOrgEx( HDC hdc
, short x
, short y
, LPPOINT pt
)
326 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
327 if (!dc
) return FALSE
;
330 pt
->x
= dc
->w
.WndOrgX
;
331 pt
->y
= dc
->w
.WndOrgY
;
339 /***********************************************************************
340 * OffsetViewportOrg (GDI.17)
342 DWORD
OffsetViewportOrg( HDC hdc
, short x
, short y
)
345 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
348 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
349 if (!dc
) return FALSE
;
350 MF_MetaParam2(dc
, META_OFFSETVIEWPORTORG
, x
, y
);
354 pt
.x
= dc
->w
.VportOrgX
;
355 pt
.y
= dc
->w
.VportOrgY
;
356 dc
->w
.VportOrgX
+= x
;
357 dc
->w
.VportOrgY
+= y
;
358 return pt
.x
| (pt
.y
<< 16);
362 /***********************************************************************
363 * OffsetViewportOrgEx (GDI.476)
365 BOOL
OffsetViewportOrgEx( HDC hdc
, short x
, short y
, LPPOINT pt
)
367 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
368 if (!dc
) return FALSE
;
371 pt
->x
= dc
->w
.VportOrgX
;
372 pt
->y
= dc
->w
.VportOrgY
;
374 dc
->w
.VportOrgX
+= x
;
375 dc
->w
.VportOrgY
+= y
;
380 /***********************************************************************
381 * OffsetWindowOrg (GDI.15)
383 DWORD
OffsetWindowOrg( HDC hdc
, short x
, short y
)
386 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
389 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
390 if (!dc
) return FALSE
;
391 MF_MetaParam2(dc
, META_OFFSETWINDOWORG
, x
, y
);
395 pt
.x
= dc
->w
.WndOrgX
;
396 pt
.y
= dc
->w
.WndOrgY
;
399 return pt
.x
| (pt
.y
<< 16);
403 /***********************************************************************
404 * OffsetWindowOrgEx (GDI.477)
406 BOOL
OffsetWindowOrgEx( HDC hdc
, short x
, short y
, LPPOINT pt
)
408 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
409 if (!dc
) return FALSE
;
412 pt
->x
= dc
->w
.WndOrgX
;
413 pt
->y
= dc
->w
.WndOrgY
;
421 /***********************************************************************
422 * ScaleViewportExt (GDI.18)
424 DWORD
ScaleViewportExt( HDC hdc
, short xNum
, short xDenom
,
425 short yNum
, short yDenom
)
428 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
431 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
432 if (!dc
) return FALSE
;
433 MF_MetaParam4(dc
, META_SCALEVIEWPORTEXT
, xNum
, xDenom
, yNum
, yDenom
);
437 size
.cx
= dc
->w
.VportExtX
;
438 size
.cy
= dc
->w
.VportExtY
;
439 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
440 return size
.cx
| (size
.cy
<< 16);
441 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return 0;
442 dc
->w
.VportExtX
= (dc
->w
.VportExtX
* xNum
) / xDenom
;
443 dc
->w
.VportExtY
= (dc
->w
.VportExtY
* yNum
) / yDenom
;
444 if (dc
->w
.VportExtX
== 0) dc
->w
.VportExtX
= 1;
445 if (dc
->w
.VportExtY
== 0) dc
->w
.VportExtY
= 1;
446 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
447 return size
.cx
| (size
.cy
<< 16);
451 /***********************************************************************
452 * ScaleViewportExtEx (GDI.484)
454 BOOL
ScaleViewportExtEx( HDC hdc
, short xNum
, short xDenom
,
455 short yNum
, short yDenom
, LPSIZE size
)
457 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
458 if (!dc
) return FALSE
;
461 size
->cx
= dc
->w
.VportExtX
;
462 size
->cy
= dc
->w
.VportExtY
;
464 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
466 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return FALSE
;
467 dc
->w
.VportExtX
= (dc
->w
.VportExtX
* xNum
) / xDenom
;
468 dc
->w
.VportExtY
= (dc
->w
.VportExtY
* yNum
) / yDenom
;
469 if (dc
->w
.VportExtX
== 0) dc
->w
.VportExtX
= 1;
470 if (dc
->w
.VportExtY
== 0) dc
->w
.VportExtY
= 1;
471 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
476 /***********************************************************************
477 * ScaleWindowExt (GDI.16)
479 DWORD
ScaleWindowExt( HDC hdc
, short xNum
, short xDenom
,
480 short yNum
, short yDenom
)
483 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
486 dc
= (DC
*)GDI_GetObjPtr(hdc
, METAFILE_DC_MAGIC
);
487 if (!dc
) return FALSE
;
488 MF_MetaParam4(dc
, META_SCALEWINDOWEXT
, xNum
, xDenom
, yNum
, yDenom
);
492 size
.cx
= dc
->w
.WndExtX
;
493 size
.cy
= dc
->w
.WndExtY
;
494 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
495 return size
.cx
| (size
.cy
<< 16);
496 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return FALSE
;
497 dc
->w
.WndExtX
= (dc
->w
.WndExtX
* xNum
) / xDenom
;
498 dc
->w
.WndExtY
= (dc
->w
.WndExtY
* yNum
) / yDenom
;
499 if (dc
->w
.WndExtX
== 0) dc
->w
.WndExtX
= 1;
500 if (dc
->w
.WndExtY
== 0) dc
->w
.WndExtY
= 1;
501 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);
502 return size
.cx
| (size
.cy
<< 16);
506 /***********************************************************************
507 * ScaleWindowExtEx (GDI.485)
509 BOOL
ScaleWindowExtEx( HDC hdc
, short xNum
, short xDenom
,
510 short yNum
, short yDenom
, LPSIZE size
)
512 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
513 if (!dc
) return FALSE
;
516 size
->cx
= dc
->w
.WndExtX
;
517 size
->cy
= dc
->w
.WndExtY
;
519 if ((dc
->w
.MapMode
!= MM_ISOTROPIC
) && (dc
->w
.MapMode
!= MM_ANISOTROPIC
))
521 if (!xNum
|| !xDenom
|| !xNum
|| !yDenom
) return FALSE
;
522 dc
->w
.WndExtX
= (dc
->w
.WndExtX
* xNum
) / xDenom
;
523 dc
->w
.WndExtY
= (dc
->w
.WndExtY
* yNum
) / yDenom
;
524 if (dc
->w
.WndExtX
== 0) dc
->w
.WndExtX
= 1;
525 if (dc
->w
.WndExtY
== 0) dc
->w
.WndExtY
= 1;
526 if (dc
->w
.MapMode
== MM_ISOTROPIC
) MAPPING_FixIsotropic( dc
);