Release 950109
[wine.git] / windows / mapping.c
blob93a6f379ed49e1a60ff48e4967c911f7647ee566
1 /*
2 * GDI mapping mode functions
4 * Copyright 1993 Alexandre Julliard
5 */
7 #include "gdi.h"
8 #include "metafile.h"
9 #include "stddebug.h"
10 /* #define DEBUG_GDI */
11 #include "debug.h"
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);
25 if (xdim > ydim)
27 dc->w.VportExtX = dc->w.VportExtX * ydim / xdim;
28 if (!dc->w.VportExtX) dc->w.VportExtX = 1;
30 else
32 dc->w.VportExtY = dc->w.VportExtY * xdim / ydim;
33 if (!dc->w.VportExtY) dc->w.VportExtY = 1;
37 /***********************************************************************
38 * DPtoLP (GDI.67)
40 BOOL DPtoLP( HDC hdc, LPPOINT points, int count )
42 POINT * pt;
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 );
51 return TRUE;
55 /***********************************************************************
56 * LPtoDP (GDI.99)
58 BOOL LPtoDP( HDC hdc, LPPOINT points, int count )
60 POINT * pt;
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 );
69 return TRUE;
73 /***********************************************************************
74 * SetMapMode (GDI.3)
76 WORD SetMapMode( HDC hdc, WORD mode )
78 WORD prevMode;
79 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
80 if (!dc)
82 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
83 if (!dc) return 0;
84 MF_MetaParam1(dc, META_SETMAPMODE, mode);
85 return 1;
88 dprintf_gdi(stddeb, "SetMapMode: %d %d\n", hdc, mode );
90 prevMode = dc->w.MapMode;
91 switch(mode)
93 case MM_TEXT:
94 dc->w.WndOrgX = dc->w.WndOrgY = 0;
95 dc->w.VportOrgX = dc->w.VportOrgY = 0;
96 dc->w.WndExtX = 1;
97 dc->w.WndExtY = 1;
98 dc->w.VportExtX = 1;
99 dc->w.VportExtY = 1;
100 break;
102 case MM_LOMETRIC:
103 case MM_ISOTROPIC:
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;
110 break;
112 case MM_HIMETRIC:
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;
119 break;
121 case MM_LOENGLISH:
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);
128 break;
130 case MM_HIENGLISH:
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);
137 break;
139 case MM_TWIPS:
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);
146 break;
148 case MM_ANISOTROPIC:
149 break;
151 default:
152 return prevMode;
154 dc->w.MapMode = mode;
155 return prevMode;
159 /***********************************************************************
160 * SetViewportExt (GDI.14)
162 DWORD SetViewportExt( HDC hdc, short x, short y )
164 SIZE size;
165 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
166 if (!dc)
168 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
169 if (!dc) return FALSE;
170 MF_MetaParam2(dc, META_SETVIEWPORTEXT, x, y);
171 return 0;
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;
179 dc->w.VportExtX = x;
180 dc->w.VportExtY = y;
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;
193 if (size)
195 size->cx = dc->w.VportExtX;
196 size->cy = dc->w.VportExtY;
198 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
199 return TRUE;
200 if (!x || !y) return FALSE;
201 dc->w.VportExtX = x;
202 dc->w.VportExtY = y;
203 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
204 return TRUE;
208 /***********************************************************************
209 * SetViewportOrg (GDI.13)
211 DWORD SetViewportOrg( HDC hdc, short x, short y )
213 POINT pt;
214 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
215 if (!dc)
217 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
218 if (!dc) return FALSE;
219 MF_MetaParam2(dc, META_SETVIEWPORTORG, x, y);
220 return 0;
223 pt.x = dc->w.VportOrgX;
224 pt.y = dc->w.VportOrgY;
225 dc->w.VportOrgX = x;
226 dc->w.VportOrgY = y;
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;
238 if (pt)
240 pt->x = dc->w.VportOrgX;
241 pt->y = dc->w.VportOrgY;
243 dc->w.VportOrgX = x;
244 dc->w.VportOrgY = y;
245 return TRUE;
249 /***********************************************************************
250 * SetWindowExt (GDI.12)
252 DWORD SetWindowExt( HDC hdc, short x, short y )
254 SIZE size;
255 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
256 if (!dc)
258 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
259 if (!dc) return FALSE;
260 MF_MetaParam2(dc, META_SETWINDOWEXT, x, y);
261 return 0;
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;
269 dc->w.WndExtX = x;
270 dc->w.WndExtY = y;
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;
283 if (size)
285 size->cx = dc->w.WndExtX;
286 size->cy = dc->w.WndExtY;
288 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
289 return TRUE;
290 if (!x || !y) return FALSE;
291 dc->w.WndExtX = x;
292 dc->w.WndExtY = y;
293 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
294 return TRUE;
298 /***********************************************************************
299 * SetWindowOrg (GDI.11)
301 DWORD SetWindowOrg( HDC hdc, short x, short y )
303 POINT pt;
304 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
305 if (!dc)
307 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
308 if (!dc) return FALSE;
309 MF_MetaParam2(dc, META_SETWINDOWORG, x, y);
310 return 0;
313 pt.x = dc->w.WndOrgX;
314 pt.y = dc->w.WndOrgY;
315 dc->w.WndOrgX = x;
316 dc->w.WndOrgY = y;
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;
328 if (pt)
330 pt->x = dc->w.WndOrgX;
331 pt->y = dc->w.WndOrgY;
333 dc->w.WndOrgX = x;
334 dc->w.WndOrgY = y;
335 return TRUE;
339 /***********************************************************************
340 * OffsetViewportOrg (GDI.17)
342 DWORD OffsetViewportOrg( HDC hdc, short x, short y )
344 POINT pt;
345 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
346 if (!dc)
348 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
349 if (!dc) return FALSE;
350 MF_MetaParam2(dc, META_OFFSETVIEWPORTORG, x, y);
351 return 0;
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;
369 if (pt)
371 pt->x = dc->w.VportOrgX;
372 pt->y = dc->w.VportOrgY;
374 dc->w.VportOrgX += x;
375 dc->w.VportOrgY += y;
376 return TRUE;
380 /***********************************************************************
381 * OffsetWindowOrg (GDI.15)
383 DWORD OffsetWindowOrg( HDC hdc, short x, short y )
385 POINT pt;
386 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
387 if (!dc)
389 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
390 if (!dc) return FALSE;
391 MF_MetaParam2(dc, META_OFFSETWINDOWORG, x, y);
392 return 0;
395 pt.x = dc->w.WndOrgX;
396 pt.y = dc->w.WndOrgY;
397 dc->w.WndOrgX += x;
398 dc->w.WndOrgY += y;
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;
410 if (pt)
412 pt->x = dc->w.WndOrgX;
413 pt->y = dc->w.WndOrgY;
415 dc->w.WndOrgX += x;
416 dc->w.WndOrgY += y;
417 return TRUE;
421 /***********************************************************************
422 * ScaleViewportExt (GDI.18)
424 DWORD ScaleViewportExt( HDC hdc, short xNum, short xDenom,
425 short yNum, short yDenom )
427 SIZE size;
428 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
429 if (!dc)
431 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
432 if (!dc) return FALSE;
433 MF_MetaParam4(dc, META_SCALEVIEWPORTEXT, xNum, xDenom, yNum, yDenom);
434 return 0;
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;
459 if (size)
461 size->cx = dc->w.VportExtX;
462 size->cy = dc->w.VportExtY;
464 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
465 return TRUE;
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 );
472 return TRUE;
476 /***********************************************************************
477 * ScaleWindowExt (GDI.16)
479 DWORD ScaleWindowExt( HDC hdc, short xNum, short xDenom,
480 short yNum, short yDenom )
482 SIZE size;
483 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
484 if (!dc)
486 dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
487 if (!dc) return FALSE;
488 MF_MetaParam4(dc, META_SCALEWINDOWEXT, xNum, xDenom, yNum, yDenom);
489 return 0;
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;
514 if (size)
516 size->cx = dc->w.WndExtX;
517 size->cy = dc->w.WndExtY;
519 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
520 return TRUE;
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 );
527 return TRUE;