We got passed a NULL Dialect ptr and accessed it unprotected.
[wine] / graphics / mapping.c
1 /*
2  * GDI mapping mode functions
3  *
4  * Copyright 1993 Alexandre Julliard
5  */
6
7 #include "dc.h"
8 #include "debug.h"
9
10
11 /***********************************************************************
12  *           MAPPING_FixIsotropic
13  *
14  * Fix viewport extensions for isotropic mode.
15  */
16 void MAPPING_FixIsotropic( DC * dc )
17 {
18     double xdim = (double)dc->vportExtX * dc->w.devCaps->horzSize /
19                   (dc->w.devCaps->horzRes * dc->wndExtX);
20     double ydim = (double)dc->vportExtY * dc->w.devCaps->vertSize /
21                   (dc->w.devCaps->vertRes * dc->wndExtY);
22     if (xdim > ydim)
23     {
24         dc->vportExtX = dc->vportExtX * fabs( ydim / xdim );
25         if (!dc->vportExtX) dc->vportExtX = 1;
26     }
27     else
28     {
29         dc->vportExtY = dc->vportExtY * fabs( xdim / ydim );
30         if (!dc->vportExtY) dc->vportExtY = 1;
31     }   
32 }
33
34
35 /***********************************************************************
36  *           DPtoLP16    (GDI.67)
37  */
38 BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
39 {
40     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
41     if (!dc) return FALSE;
42
43     while (count--)
44     {
45         points->x = XDPTOLP( dc, points->x );
46         points->y = YDPTOLP( dc, points->y );
47         points++;
48     }
49     return TRUE;
50 }
51
52
53 /***********************************************************************
54  *           DPtoLP32    (GDI32.65)
55  */
56 BOOL WINAPI DPtoLP( HDC hdc, LPPOINT points, INT count )
57 {
58     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
59     if (!dc) return FALSE;
60
61     while (count--)
62     {
63         if (!INTERNAL_DPTOLP( dc, points ))
64             return FALSE;
65         points++;
66     }
67     return TRUE;
68 }
69
70
71 /***********************************************************************
72  *           LPtoDP16    (GDI.99)
73  */
74 BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
75 {
76     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
77     if (!dc) return FALSE;
78
79     while (count--)
80     {
81         points->x = XLPTODP( dc, points->x );
82         points->y = YLPTODP( dc, points->y );
83         points++;
84     }
85     return TRUE;
86 }
87
88
89 /***********************************************************************
90  *           LPtoDP32    (GDI32.247)
91  */
92 BOOL WINAPI LPtoDP( HDC hdc, LPPOINT points, INT count )
93 {
94     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
95     if (!dc) return FALSE;
96
97     while (count--)
98     {
99         INTERNAL_LPTODP( dc, points );
100         points++;
101     }
102     return TRUE;
103 }
104
105
106 /***********************************************************************
107  *           SetMapMode16    (GDI.3)
108  */
109 INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
110 {
111     return SetMapMode( hdc, mode );
112 }
113
114
115 /***********************************************************************
116  *           SetMapMode32    (GDI32.321)
117  */
118 INT WINAPI SetMapMode( HDC hdc, INT mode )
119 {
120     INT prevMode;
121     DC * dc = DC_GetDCPtr( hdc );
122     if (!dc) return 0;
123     if (dc->funcs->pSetMapMode) return dc->funcs->pSetMapMode( dc, mode );
124
125     TRACE(gdi, "%04x %d\n", hdc, mode );
126     
127     prevMode = dc->w.MapMode;
128     switch(mode)
129     {
130       case MM_TEXT:
131           dc->wndOrgX   = dc->wndOrgY   = 0;
132           dc->vportOrgX = dc->vportOrgY = 0;
133           dc->wndExtX   = 1;
134           dc->wndExtY   = 1;
135           dc->vportExtX = 1;
136           dc->vportExtY = 1;
137           break;
138           
139       case MM_LOMETRIC:
140       case MM_ISOTROPIC:
141           dc->wndOrgX   = dc->wndOrgY   = 0;
142           dc->vportOrgX = dc->vportOrgY = 0;
143           dc->wndExtX   = dc->w.devCaps->horzSize;
144           dc->wndExtY   = dc->w.devCaps->vertSize;
145           dc->vportExtX = dc->w.devCaps->horzRes / 10;
146           dc->vportExtY = dc->w.devCaps->vertRes / -10;
147           break;
148           
149       case MM_HIMETRIC:
150           dc->wndOrgX   = dc->wndOrgY   = 0;
151           dc->vportOrgX = dc->vportOrgY = 0;
152           dc->wndExtX   = dc->w.devCaps->horzSize * 10;
153           dc->wndExtY   = dc->w.devCaps->vertSize * 10;
154           dc->vportExtX = dc->w.devCaps->horzRes / 10;
155           dc->vportExtY = dc->w.devCaps->vertRes / -10;
156           break;
157           
158       case MM_LOENGLISH:
159           dc->wndOrgX   = dc->wndOrgY   = 0;
160           dc->vportOrgX = dc->vportOrgY = 0;
161           dc->wndExtX   = dc->w.devCaps->horzSize;
162           dc->wndExtY   = dc->w.devCaps->vertSize;
163           dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
164           dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
165           break;          
166           
167       case MM_HIENGLISH:
168           dc->wndOrgX   = dc->wndOrgY   = 0;
169           dc->vportOrgX = dc->vportOrgY = 0;
170           dc->wndExtX   = dc->w.devCaps->horzSize * 10;
171           dc->wndExtY   = dc->w.devCaps->vertSize * 10;
172           dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
173           dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
174           break;
175           
176       case MM_TWIPS:
177           dc->wndOrgX   = dc->wndOrgY   = 0;
178           dc->vportOrgX = dc->vportOrgY = 0;
179           dc->wndExtX   = 144L * dc->w.devCaps->horzSize / 10;
180           dc->wndExtY   = 144L * dc->w.devCaps->vertSize / 10;
181           dc->vportExtX = 254L * dc->w.devCaps->horzRes / 1000;
182           dc->vportExtY = -254L * dc->w.devCaps->vertRes / 1000;
183           break;
184           
185       case MM_ANISOTROPIC:
186           break;
187
188       default:
189           return prevMode;
190     }
191     dc->w.MapMode = mode;
192     DC_UpdateXforms( dc );
193     return prevMode;
194 }
195
196
197 /***********************************************************************
198  *           SetViewportExt    (GDI.14)
199  */
200 DWORD WINAPI SetViewportExt16( HDC16 hdc, INT16 x, INT16 y )
201 {
202     SIZE size;
203     if (!SetViewportExtEx( hdc, x, y, &size )) return 0;
204     return MAKELONG( size.cx, size.cy );
205 }
206
207
208 /***********************************************************************
209  *           SetViewportExtEx16    (GDI.479)
210  */
211 BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
212 {
213     SIZE size32;
214     BOOL16 ret = SetViewportExtEx( hdc, x, y, &size32 );
215     if (size) CONV_SIZE32TO16( &size32, size );
216     return ret;
217 }
218
219
220 /***********************************************************************
221  *           SetViewportExtEx32    (GDI32.340)
222  */
223 BOOL WINAPI SetViewportExtEx( HDC hdc, INT x, INT y, LPSIZE size )
224 {
225     DC * dc = DC_GetDCPtr( hdc );
226     if (!dc) return FALSE;
227     if (dc->funcs->pSetViewportExt)
228         return dc->funcs->pSetViewportExt( dc, x, y );
229     if (size)
230     {
231         size->cx = dc->vportExtX;
232         size->cy = dc->vportExtY;
233     }
234     if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
235         return TRUE;
236     if (!x || !y) return FALSE;
237     dc->vportExtX = x;
238     dc->vportExtY = y;
239     if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
240     DC_UpdateXforms( dc );
241     return TRUE;
242 }
243
244
245 /***********************************************************************
246  *           SetViewportOrg    (GDI.13)
247  */
248 DWORD WINAPI SetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
249 {
250     POINT pt;
251     if (!SetViewportOrgEx( hdc, x, y, &pt )) return 0;
252     return MAKELONG( pt.x, pt.y );
253 }
254
255
256 /***********************************************************************
257  *           SetViewportOrgEx16    (GDI.480)
258  */
259 BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
260 {
261     POINT pt32;
262     BOOL16 ret = SetViewportOrgEx( hdc, x, y, &pt32 );
263     if (pt) CONV_POINT32TO16( &pt32, pt );
264     return ret;
265 }
266
267
268 /***********************************************************************
269  *           SetViewportOrgEx32    (GDI32.341)
270  */
271 BOOL WINAPI SetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
272 {
273     DC * dc = DC_GetDCPtr( hdc );
274     if (!dc) return FALSE;
275     if (dc->funcs->pSetViewportOrg)
276         return dc->funcs->pSetViewportOrg( dc, x, y );
277     if (pt)
278     {
279         pt->x = dc->vportOrgX;
280         pt->y = dc->vportOrgY;
281     }
282     dc->vportOrgX = x;
283     dc->vportOrgY = y;
284     DC_UpdateXforms( dc );
285     return TRUE;
286 }
287
288
289 /***********************************************************************
290  *           SetWindowExt    (GDI.12)
291  */
292 DWORD WINAPI SetWindowExt16( HDC16 hdc, INT16 x, INT16 y )
293 {
294     SIZE size;
295     if (!SetWindowExtEx( hdc, x, y, &size )) return 0;
296     return MAKELONG( size.cx, size.cy );
297 }
298
299
300 /***********************************************************************
301  *           SetWindowExtEx16    (GDI.481)
302  */
303 BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
304 {
305     SIZE size32;
306     BOOL16 ret = SetWindowExtEx( hdc, x, y, &size32 );
307     if (size) CONV_SIZE32TO16( &size32, size );
308     return ret;
309 }
310
311
312 /***********************************************************************
313  *           SetWindowExtEx32    (GDI32.344)
314  */
315 BOOL WINAPI SetWindowExtEx( HDC hdc, INT x, INT y, LPSIZE size )
316 {
317     DC * dc = DC_GetDCPtr( hdc );
318     if (!dc) return FALSE;
319     if (dc->funcs->pSetWindowExt) return dc->funcs->pSetWindowExt( dc, x, y );
320     if (size)
321     {
322         size->cx = dc->wndExtX;
323         size->cy = dc->wndExtY;
324     }
325     if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
326         return TRUE;
327     if (!x || !y) return FALSE;
328     dc->wndExtX = x;
329     dc->wndExtY = y;
330     if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
331     DC_UpdateXforms( dc );
332     return TRUE;
333 }
334
335
336 /***********************************************************************
337  *           SetWindowOrg    (GDI.11)
338  */
339 DWORD WINAPI SetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
340 {
341     POINT pt;
342     if (!SetWindowOrgEx( hdc, x, y, &pt )) return 0;
343     return MAKELONG( pt.x, pt.y );
344 }
345
346
347 /***********************************************************************
348  *           SetWindowOrgEx16    (GDI.482)
349  */
350 BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
351 {
352     POINT pt32;
353     BOOL16 ret = SetWindowOrgEx( hdc, x, y, &pt32 );
354     if (pt) CONV_POINT32TO16( &pt32, pt );
355     return ret;
356 }
357
358
359 /***********************************************************************
360  *           SetWindowOrgEx32    (GDI32.345)
361  */
362 BOOL WINAPI SetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
363 {
364     DC * dc = DC_GetDCPtr( hdc );
365     if (!dc) return FALSE;
366     if (dc->funcs->pSetWindowOrg) return dc->funcs->pSetWindowOrg( dc, x, y );
367     if (pt)
368     {
369         pt->x = dc->wndOrgX;
370         pt->y = dc->wndOrgY;
371     }
372     dc->wndOrgX = x;
373     dc->wndOrgY = y;
374     DC_UpdateXforms( dc );
375     return TRUE;
376 }
377
378
379 /***********************************************************************
380  *           OffsetViewportOrg    (GDI.17)
381  */
382 DWORD WINAPI OffsetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
383 {
384     POINT pt;
385     if (!OffsetViewportOrgEx( hdc, x, y, &pt )) return 0;
386     return MAKELONG( pt.x, pt.y );
387 }
388
389
390 /***********************************************************************
391  *           OffsetViewportOrgEx16    (GDI.476)
392  */
393 BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
394 {
395     POINT pt32;
396     BOOL16 ret = OffsetViewportOrgEx( hdc, x, y, &pt32 );
397     if (pt) CONV_POINT32TO16( &pt32, pt );
398     return ret;
399 }
400
401
402 /***********************************************************************
403  *           OffsetViewportOrgEx32    (GDI32.257)
404  */
405 BOOL WINAPI OffsetViewportOrgEx( HDC hdc, INT x, INT y, LPPOINT pt)
406 {
407     DC * dc = DC_GetDCPtr( hdc );
408     if (!dc) return FALSE;
409     if (dc->funcs->pOffsetViewportOrg)
410         return dc->funcs->pOffsetViewportOrg( dc, x, y );
411     if (pt)
412     {
413         pt->x = dc->vportOrgX;
414         pt->y = dc->vportOrgY;
415     }
416     dc->vportOrgX += x;
417     dc->vportOrgY += y;
418     DC_UpdateXforms( dc );
419     return TRUE;
420 }
421
422
423 /***********************************************************************
424  *           OffsetWindowOrg    (GDI.15)
425  */
426 DWORD WINAPI OffsetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
427 {
428     POINT pt;
429     if (!OffsetWindowOrgEx( hdc, x, y, &pt )) return 0;
430     return MAKELONG( pt.x, pt.y );
431 }
432
433
434 /***********************************************************************
435  *           OffsetWindowOrgEx16    (GDI.477)
436  */
437 BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
438 {
439     POINT pt32;
440     BOOL16 ret = OffsetWindowOrgEx( hdc, x, y, &pt32 );
441     if (pt) CONV_POINT32TO16( &pt32, pt );
442     return ret;
443 }
444
445
446 /***********************************************************************
447  *           OffsetWindowOrgEx32    (GDI32.258)
448  */
449 BOOL WINAPI OffsetWindowOrgEx( HDC hdc, INT x, INT y, LPPOINT pt )
450 {
451     DC * dc = DC_GetDCPtr( hdc );
452     if (!dc) return FALSE;
453     if (dc->funcs->pOffsetWindowOrg)
454         return dc->funcs->pOffsetWindowOrg( dc, x, y );
455     if (pt)
456     {
457         pt->x = dc->wndOrgX;
458         pt->y = dc->wndOrgY;
459     }
460     dc->wndOrgX += x;
461     dc->wndOrgY += y;
462     DC_UpdateXforms( dc );
463     return TRUE;
464 }
465
466
467 /***********************************************************************
468  *           ScaleViewportExt    (GDI.18)
469  */
470 DWORD WINAPI ScaleViewportExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
471                                INT16 yNum, INT16 yDenom )
472 {
473     SIZE size;
474     if (!ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
475         return FALSE;
476     return MAKELONG( size.cx,  size.cy );
477 }
478
479
480 /***********************************************************************
481  *           ScaleViewportExtEx16    (GDI.484)
482  */
483 BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
484                                     INT16 yNum, INT16 yDenom, LPSIZE16 size )
485 {
486     SIZE size32;
487     BOOL16 ret = ScaleViewportExtEx( hdc, xNum, xDenom, yNum, yDenom,
488                                        &size32 );
489     if (size) CONV_SIZE32TO16( &size32, size );
490     return ret;
491 }
492
493
494 /***********************************************************************
495  *           ScaleViewportExtEx32    (GDI32.293)
496  */
497 BOOL WINAPI ScaleViewportExtEx( HDC hdc, INT xNum, INT xDenom,
498                                     INT yNum, INT yDenom, LPSIZE size )
499 {
500     DC * dc = DC_GetDCPtr( hdc );
501     if (!dc) return FALSE;
502     if (dc->funcs->pScaleViewportExt)
503         return dc->funcs->pScaleViewportExt( dc, xNum, xDenom, yNum, yDenom );
504     if (size)
505     {
506         size->cx = dc->vportExtX;
507         size->cy = dc->vportExtY;
508     }
509     if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
510         return TRUE;
511     if (!xNum || !xDenom || !xNum || !yDenom) return FALSE;
512     dc->vportExtX = (dc->vportExtX * xNum) / xDenom;
513     dc->vportExtY = (dc->vportExtY * yNum) / yDenom;
514     if (dc->vportExtX == 0) dc->vportExtX = 1;
515     if (dc->vportExtY == 0) dc->vportExtY = 1;
516     if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
517     DC_UpdateXforms( dc );
518     return TRUE;
519 }
520
521
522 /***********************************************************************
523  *           ScaleWindowExt    (GDI.16)
524  */
525 DWORD WINAPI ScaleWindowExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
526                              INT16 yNum, INT16 yDenom )
527 {
528     SIZE size;
529     if (!ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom, &size ))
530         return FALSE;
531     return MAKELONG( size.cx,  size.cy );
532 }
533
534
535 /***********************************************************************
536  *           ScaleWindowExtEx16    (GDI.485)
537  */
538 BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
539                                   INT16 yNum, INT16 yDenom, LPSIZE16 size )
540 {
541     SIZE size32;
542     BOOL16 ret = ScaleWindowExtEx( hdc, xNum, xDenom, yNum, yDenom,
543                                      &size32 );
544     if (size) CONV_SIZE32TO16( &size32, size );
545     return ret;
546 }
547
548
549 /***********************************************************************
550  *           ScaleWindowExtEx32    (GDI32.294)
551  */
552 BOOL WINAPI ScaleWindowExtEx( HDC hdc, INT xNum, INT xDenom,
553                                   INT yNum, INT yDenom, LPSIZE size )
554 {
555     DC * dc = DC_GetDCPtr( hdc );
556     if (!dc) return FALSE;
557     if (dc->funcs->pScaleWindowExt)
558         return dc->funcs->pScaleWindowExt( dc, xNum, xDenom, yNum, yDenom );
559     if (size)
560     {
561         size->cx = dc->wndExtX;
562         size->cy = dc->wndExtY;
563     }
564     if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC))
565         return TRUE;
566     if (!xNum || !xDenom || !xNum || !yDenom) return FALSE;
567     dc->wndExtX = (dc->wndExtX * xNum) / xDenom;
568     dc->wndExtY = (dc->wndExtY * yNum) / yDenom;
569     if (dc->wndExtX == 0) dc->wndExtX = 1;
570     if (dc->wndExtY == 0) dc->wndExtY = 1;
571     if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
572     DC_UpdateXforms( dc );
573     return TRUE;
574 }