New debug scheme with explicit debug channels declaration.
[wine/testsucceed.git] / graphics / mapping.c
blob15b6160a0b3f71796a4def647d03b6d577836106
1 /*
2 * GDI mapping mode functions
4 * Copyright 1993 Alexandre Julliard
5 */
7 #include "dc.h"
8 #include "debug.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);
24 if (xdim > ydim)
26 dc->vportExtX = dc->vportExtX * fabs( ydim / xdim );
27 if (!dc->vportExtX) dc->vportExtX = 1;
29 else
31 dc->vportExtY = dc->vportExtY * fabs( xdim / ydim );
32 if (!dc->vportExtY) dc->vportExtY = 1;
37 /***********************************************************************
38 * DPtoLP16 (GDI.67)
40 BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
42 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
43 if (!dc) return FALSE;
45 while (count--)
47 points->x = XDPTOLP( dc, points->x );
48 points->y = YDPTOLP( dc, points->y );
49 points++;
51 return TRUE;
55 /***********************************************************************
56 * DPtoLP32 (GDI32.65)
58 BOOL WINAPI DPtoLP( HDC hdc, LPPOINT points, INT count )
60 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
61 if (!dc) return FALSE;
63 while (count--)
65 if (!INTERNAL_DPTOLP( dc, points ))
66 return FALSE;
67 points++;
69 return TRUE;
73 /***********************************************************************
74 * LPtoDP16 (GDI.99)
76 BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
78 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
79 if (!dc) return FALSE;
81 while (count--)
83 points->x = XLPTODP( dc, points->x );
84 points->y = YLPTODP( dc, points->y );
85 points++;
87 return TRUE;
91 /***********************************************************************
92 * LPtoDP32 (GDI32.247)
94 BOOL WINAPI LPtoDP( HDC hdc, LPPOINT points, INT count )
96 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
97 if (!dc) return FALSE;
99 while (count--)
101 INTERNAL_LPTODP( dc, points );
102 points++;
104 return TRUE;
108 /***********************************************************************
109 * SetMapMode16 (GDI.3)
111 INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
113 return SetMapMode( hdc, mode );
117 /***********************************************************************
118 * SetMapMode32 (GDI32.321)
120 INT WINAPI SetMapMode( HDC hdc, INT mode )
122 INT prevMode;
123 DC * dc = DC_GetDCPtr( hdc );
124 if (!dc) return 0;
125 if (dc->funcs->pSetMapMode) return dc->funcs->pSetMapMode( dc, mode );
127 TRACE(gdi, "%04x %d\n", hdc, mode );
129 prevMode = dc->w.MapMode;
130 switch(mode)
132 case MM_TEXT:
133 dc->wndOrgX = dc->wndOrgY = 0;
134 dc->vportOrgX = dc->vportOrgY = 0;
135 dc->wndExtX = 1;
136 dc->wndExtY = 1;
137 dc->vportExtX = 1;
138 dc->vportExtY = 1;
139 break;
141 case MM_LOMETRIC:
142 case MM_ISOTROPIC:
143 dc->wndOrgX = dc->wndOrgY = 0;
144 dc->vportOrgX = dc->vportOrgY = 0;
145 dc->wndExtX = dc->w.devCaps->horzSize;
146 dc->wndExtY = dc->w.devCaps->vertSize;
147 dc->vportExtX = dc->w.devCaps->horzRes / 10;
148 dc->vportExtY = dc->w.devCaps->vertRes / -10;
149 break;
151 case MM_HIMETRIC:
152 dc->wndOrgX = dc->wndOrgY = 0;
153 dc->vportOrgX = dc->vportOrgY = 0;
154 dc->wndExtX = dc->w.devCaps->horzSize * 10;
155 dc->wndExtY = dc->w.devCaps->vertSize * 10;
156 dc->vportExtX = dc->w.devCaps->horzRes / 10;
157 dc->vportExtY = dc->w.devCaps->vertRes / -10;
158 break;
160 case MM_LOENGLISH:
161 dc->wndOrgX = dc->wndOrgY = 0;
162 dc->vportOrgX = dc->vportOrgY = 0;
163 dc->wndExtX = dc->w.devCaps->horzSize;
164 dc->wndExtY = dc->w.devCaps->vertSize;
165 dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
166 dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
167 break;
169 case MM_HIENGLISH:
170 dc->wndOrgX = dc->wndOrgY = 0;
171 dc->vportOrgX = dc->vportOrgY = 0;
172 dc->wndExtX = dc->w.devCaps->horzSize * 10;
173 dc->wndExtY = dc->w.devCaps->vertSize * 10;
174 dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
175 dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
176 break;
178 case MM_TWIPS:
179 dc->wndOrgX = dc->wndOrgY = 0;
180 dc->vportOrgX = dc->vportOrgY = 0;
181 dc->wndExtX = 144L * dc->w.devCaps->horzSize / 10;
182 dc->wndExtY = 144L * dc->w.devCaps->vertSize / 10;
183 dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
184 dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
185 break;
187 case MM_ANISOTROPIC:
188 break;
190 default:
191 return prevMode;
193 dc->w.MapMode = mode;
194 DC_UpdateXforms( dc );
195 return prevMode;
199 /***********************************************************************
200 * SetViewportExt (GDI.14)
202 DWORD WINAPI SetViewportExt16( HDC16 hdc, INT16 x, INT16 y )
204 SIZE size;
205 if (!SetViewportExtEx( hdc, x, y, &size )) return 0;
206 return MAKELONG( size.cx, size.cy );
210 /***********************************************************************
211 * SetViewportExtEx16 (GDI.479)
213 BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
215 SIZE size32;
216 BOOL16 ret = SetViewportExtEx( hdc, x, y, &size32 );
217 if (size) CONV_SIZE32TO16( &size32, size );
218 return ret;
222 /***********************************************************************
223 * SetViewportExtEx32 (GDI32.340)
225 BOOL WINAPI SetViewportExtEx( HDC hdc, INT x, INT y, LPSIZE size )
227 DC * dc = DC_GetDCPtr( hdc );
228 if (!dc) return FALSE;
229 if (dc->funcs->pSetViewportExt)
230 return dc->funcs->pSetViewportExt( dc, x, y );
231 if (size)
233 size->cx = dc->vportExtX;
234 size->cy = dc->vportExtY;
236 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
237 return TRUE;
238 if (!x || !y) return FALSE;
239 dc->vportExtX = x;
240 dc->vportExtY = y;
241 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
242 DC_UpdateXforms( dc );
243 return TRUE;
247 /***********************************************************************
248 * SetViewportOrg (GDI.13)
250 DWORD WINAPI SetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
252 POINT pt;
253 if (!SetViewportOrgEx( hdc, x, y, &pt )) return 0;
254 return MAKELONG( pt.x, pt.y );
258 /***********************************************************************
259 * SetViewportOrgEx16 (GDI.480)
261 BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
263 POINT pt32;
264 BOOL16 ret = SetViewportOrgEx( hdc, x, y, &pt32 );
265 if (pt) CONV_POINT32TO16( &pt32, pt );
266 return ret;
270 /***********************************************************************
271 * SetViewportOrgEx32 (GDI32.341)
273 BOOL WINAPI SetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
275 DC * dc = DC_GetDCPtr( hdc );
276 if (!dc) return FALSE;
277 if (dc->funcs->pSetViewportOrg)
278 return dc->funcs->pSetViewportOrg( dc, x, y );
279 if (pt)
281 pt->x = dc->vportOrgX;
282 pt->y = dc->vportOrgY;
284 dc->vportOrgX = x;
285 dc->vportOrgY = y;
286 DC_UpdateXforms( dc );
287 return TRUE;
291 /***********************************************************************
292 * SetWindowExt (GDI.12)
294 DWORD WINAPI SetWindowExt16( HDC16 hdc, INT16 x, INT16 y )
296 SIZE size;
297 if (!SetWindowExtEx( hdc, x, y, &size )) return 0;
298 return MAKELONG( size.cx, size.cy );
302 /***********************************************************************
303 * SetWindowExtEx16 (GDI.481)
305 BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
307 SIZE size32;
308 BOOL16 ret = SetWindowExtEx( hdc, x, y, &size32 );
309 if (size) CONV_SIZE32TO16( &size32, size );
310 return ret;
314 /***********************************************************************
315 * SetWindowExtEx32 (GDI32.344)
317 BOOL WINAPI SetWindowExtEx( HDC hdc, INT x, INT y, LPSIZE size )
319 DC * dc = DC_GetDCPtr( hdc );
320 if (!dc) return FALSE;
321 if (dc->funcs->pSetWindowExt) return dc->funcs->pSetWindowExt( dc, x, y );
322 if (size)
324 size->cx = dc->wndExtX;
325 size->cy = dc->wndExtY;
327 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
328 return TRUE;
329 if (!x || !y) return FALSE;
330 dc->wndExtX = x;
331 dc->wndExtY = y;
332 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
333 DC_UpdateXforms( dc );
334 return TRUE;
338 /***********************************************************************
339 * SetWindowOrg (GDI.11)
341 DWORD WINAPI SetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
343 POINT pt;
344 if (!SetWindowOrgEx( hdc, x, y, &pt )) return 0;
345 return MAKELONG( pt.x, pt.y );
349 /***********************************************************************
350 * SetWindowOrgEx16 (GDI.482)
352 BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
354 POINT pt32;
355 BOOL16 ret = SetWindowOrgEx( hdc, x, y, &pt32 );
356 if (pt) CONV_POINT32TO16( &pt32, pt );
357 return ret;
361 /***********************************************************************
362 * SetWindowOrgEx32 (GDI32.345)
364 BOOL WINAPI SetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
366 DC * dc = DC_GetDCPtr( hdc );
367 if (!dc) return FALSE;
368 if (dc->funcs->pSetWindowOrg) return dc->funcs->pSetWindowOrg( dc, x, y );
369 if (pt)
371 pt->x = dc->wndOrgX;
372 pt->y = dc->wndOrgY;
374 dc->wndOrgX = x;
375 dc->wndOrgY = y;
376 DC_UpdateXforms( dc );
377 return TRUE;
381 /***********************************************************************
382 * OffsetViewportOrg (GDI.17)
384 DWORD WINAPI OffsetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
386 POINT pt;
387 if (!OffsetViewportOrgEx( hdc, x, y, &pt )) return 0;
388 return MAKELONG( pt.x, pt.y );
392 /***********************************************************************
393 * OffsetViewportOrgEx16 (GDI.476)
395 BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
397 POINT pt32;
398 BOOL16 ret = OffsetViewportOrgEx( hdc, x, y, &pt32 );
399 if (pt) CONV_POINT32TO16( &pt32, pt );
400 return ret;
404 /***********************************************************************
405 * OffsetViewportOrgEx32 (GDI32.257)
407 BOOL WINAPI OffsetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt)
409 DC * dc = DC_GetDCPtr( hdc );
410 if (!dc) return FALSE;
411 if (dc->funcs->pOffsetViewportOrg)
412 return dc->funcs->pOffsetViewportOrg( dc, x, y );
413 if (pt)
415 pt->x = dc->vportOrgX;
416 pt->y = dc->vportOrgY;
418 dc->vportOrgX += x;
419 dc->vportOrgY += y;
420 DC_UpdateXforms( dc );
421 return TRUE;
425 /***********************************************************************
426 * OffsetWindowOrg (GDI.15)
428 DWORD WINAPI OffsetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
430 POINT pt;
431 if (!OffsetWindowOrgEx( hdc, x, y, &pt )) return 0;
432 return MAKELONG( pt.x, pt.y );
436 /***********************************************************************
437 * OffsetWindowOrgEx16 (GDI.477)
439 BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
441 POINT pt32;
442 BOOL16 ret = OffsetWindowOrgEx( hdc, x, y, &pt32 );
443 if (pt) CONV_POINT32TO16( &pt32, pt );
444 return ret;
448 /***********************************************************************
449 * OffsetWindowOrgEx32 (GDI32.258)
451 BOOL WINAPI OffsetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
453 DC * dc = DC_GetDCPtr( hdc );
454 if (!dc) return FALSE;
455 if (dc->funcs->pOffsetWindowOrg)
456 return dc->funcs->pOffsetWindowOrg( dc, x, y );
457 if (pt)
459 pt->x = dc->wndOrgX;
460 pt->y = dc->wndOrgY;
462 dc->wndOrgX += x;
463 dc->wndOrgY += y;
464 DC_UpdateXforms( dc );
465 return TRUE;
469 /***********************************************************************
470 * ScaleViewportExt (GDI.18)
472 DWORD WINAPI ScaleViewportExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
473 INT16 yNum, INT16 yDenom )
475 SIZE size;
476 if (!ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
477 return FALSE;
478 return MAKELONG( size.cx, size.cy );
482 /***********************************************************************
483 * ScaleViewportExtEx16 (GDI.484)
485 BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
486 INT16 yNum, INT16 yDenom, LPSIZE16 size )
488 SIZE size32;
489 BOOL16 ret = ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom,
490 &size32 );
491 if (size) CONV_SIZE32TO16( &size32, size );
492 return ret;
496 /***********************************************************************
497 * ScaleViewportExtEx32 (GDI32.293)
499 BOOL WINAPI ScaleViewportExtEx( HDC hdc, INT xNum, INT xDenom,
500 INT yNum, INT yDenom, LPSIZE size )
502 DC * dc = DC_GetDCPtr( hdc );
503 if (!dc) return FALSE;
504 if (dc->funcs->pScaleViewportExt)
505 return dc->funcs->pScaleViewportExt( dc, xNum, xDenom, yNum, yDenom );
506 if (size)
508 size->cx = dc->vportExtX;
509 size->cy = dc->vportExtY;
511 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
512 return TRUE;
513 if (!xNum || !xDenom || !xNum || !yDenom) return FALSE;
514 dc->vportExtX = (dc->vportExtX * xNum) / xDenom;
515 dc->vportExtY = (dc->vportExtY * yNum) / yDenom;
516 if (dc->vportExtX == 0) dc->vportExtX = 1;
517 if (dc->vportExtY == 0) dc->vportExtY = 1;
518 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
519 DC_UpdateXforms( dc );
520 return TRUE;
524 /***********************************************************************
525 * ScaleWindowExt (GDI.16)
527 DWORD WINAPI ScaleWindowExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
528 INT16 yNum, INT16 yDenom )
530 SIZE size;
531 if (!ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
532 return FALSE;
533 return MAKELONG( size.cx, size.cy );
537 /***********************************************************************
538 * ScaleWindowExtEx16 (GDI.485)
540 BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
541 INT16 yNum, INT16 yDenom, LPSIZE16 size )
543 SIZE size32;
544 BOOL16 ret = ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom,
545 &size32 );
546 if (size) CONV_SIZE32TO16( &size32, size );
547 return ret;
551 /***********************************************************************
552 * ScaleWindowExtEx32 (GDI32.294)
554 BOOL WINAPI ScaleWindowExtEx( HDC hdc, INT xNum, INT xDenom,
555 INT yNum, INT yDenom, LPSIZE size )
557 DC * dc = DC_GetDCPtr( hdc );
558 if (!dc) return FALSE;
559 if (dc->funcs->pScaleWindowExt)
560 return dc->funcs->pScaleWindowExt( dc, xNum, xDenom, yNum, yDenom );
561 if (size)
563 size->cx = dc->wndExtX;
564 size->cy = dc->wndExtY;
566 if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
567 return TRUE;
568 if (!xNum || !xDenom || !xNum || !yDenom) return FALSE;
569 dc->wndExtX = (dc->wndExtX * xNum) / xDenom;
570 dc->wndExtY = (dc->wndExtY * yNum) / yDenom;
571 if (dc->wndExtX == 0) dc->wndExtX = 1;
572 if (dc->wndExtY == 0) dc->wndExtY = 1;
573 if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
574 DC_UpdateXforms( dc );
575 return TRUE;