ReactOS 0.4.15-dev-7788-g1ad9096
coord.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS System Libraries
4 * FILE: win32ss/gdi/gdi32/objects/coord.c
5 * PURPOSE: Functions for coordinate transformation
6 * PROGRAMMER:
7 */
8#include <precomp.h>
9
10/* Currently we use a MATRIX inside the DC_ATTR containing the
11 coordinate transformations, while we deal with XFORM structures
12 internally. If we move all coordinate transformation to gdi32,
13 we might as well have an XFORM structure in the DC_ATTR. */
14void
15MatrixToXForm(XFORM *pxform, const MATRIX *pmx)
16{
17 XFORML *pxforml = (XFORML*)pxform;
18 pxforml->eM11 = FOtoF(&pmx->efM11);
19 pxforml->eM12 = FOtoF(&pmx->efM12);
20 pxforml->eM21 = FOtoF(&pmx->efM21);
21 pxforml->eM22 = FOtoF(&pmx->efM22);
22 pxforml->eDx = FOtoF(&pmx->efDx);
23 pxforml->eDy = FOtoF(&pmx->efDy);
24}
25
26void
28 _In_ XFORM *pxform,
30 _In_reads_(nCount) PPOINT pptIn,
31 _In_ ULONG nCount)
32{
33 ULONG i;
34 FLOAT x, y;
35
36 for (i = 0; i < nCount; i++)
37 {
38 x = pptIn[i].x * pxform->eM11 + pptIn[i].y * pxform->eM12 + pxform->eDx;
39 pptOut[i].x = _lrintf(x);
40 y = pptIn[i].x * pxform->eM21 + pptIn[i].y * pxform->eM22 + pxform->eDy;
41 pptOut[i].y = _lrintf(y);
42 }
43}
44
46void
48 _In_ MATRIX *pmx,
50 _In_reads_(nCount) PPOINT pptIn,
51 _In_ ULONG nCount)
52{
53 XFORM xform;
54
55 MatrixToXForm(&xform, pmx);
56 GdiTransformPoints2(&xform, pptOut, pptIn, nCount);
57}
58
59#define MAX_OFFSET 4294967041.0
60#define _fmul(x,y) (((x) == 0) ? 0 : (x) * (y))
61
62BOOL
65 _Out_ LPXFORM pxfResult,
66 _In_ const XFORM *pxf1,
67 _In_ const XFORM *pxf2)
68{
69 XFORM xformTmp;
70
71 /* Check paramters */
72 if (!pxfResult || !pxf1 || !pxf2) return FALSE;
73
74 /* Do matrix multiplication, start with scaling elements */
75 xformTmp.eM11 = (pxf1->eM11 * pxf2->eM11) + (pxf1->eM12 * pxf2->eM21);
76 xformTmp.eM22 = (pxf1->eM21 * pxf2->eM12) + (pxf1->eM22 * pxf2->eM22);
77
78 /* Calculate shear/rotate elements only of they are present */
79 if ((pxf1->eM12 != 0.) || (pxf1->eM21 != 0.) ||
80 (pxf2->eM12 != 0.) || (pxf2->eM21 != 0.))
81 {
82 xformTmp.eM12 = (pxf1->eM11 * pxf2->eM12) + (pxf1->eM12 * pxf2->eM22);
83 xformTmp.eM21 = (pxf1->eM21 * pxf2->eM11) + (pxf1->eM22 * pxf2->eM21);
84 }
85 else
86 {
87 xformTmp.eM12 = 0.;
88 xformTmp.eM21 = 0.;
89 }
90
91 /* Calculate the offset */
92 xformTmp.eDx = _fmul(pxf1->eDx, pxf2->eM11) + _fmul(pxf1->eDy, pxf2->eM21) + pxf2->eDx;
93 xformTmp.eDy = _fmul(pxf1->eDx, pxf2->eM12) + _fmul(pxf1->eDy, pxf2->eM22) + pxf2->eDy;
94
95 /* Check for invalid offset ranges */
96 if ((xformTmp.eDx > MAX_OFFSET) || (xformTmp.eDx < -MAX_OFFSET) ||
97 (xformTmp.eDy > MAX_OFFSET) || (xformTmp.eDy < -MAX_OFFSET))
98 {
99 return FALSE;
100 }
101
102 /* All is ok, return the calculated values */
103 *pxfResult = xformTmp;
104 return TRUE;
105}
106
107
108/*
109 * @implemented
110 *
111 */
112int
113WINAPI
115 _In_ HDC hdc)
116{
117 PDC_ATTR pdcattr;
118
119 /* Get the DC attribute */
120 pdcattr = GdiGetDcAttr(hdc);
121 if (pdcattr == NULL)
122 {
124 return 0;
125 }
126
127 /* Return the map mode */
128 return pdcattr->iMapMode;
129}
130
131/*
132 * @implemented
133 */
134INT
135WINAPI
137 _In_ HDC hdc,
138 _In_ INT iMode)
139{
140 PDC_ATTR pdcattr;
141
142 /* Handle METADC16 here, since we don't have a DCATTR. */
144 {
145 return METADC_SetMapMode(hdc, iMode);
146 }
147
148 /* Get the DC attribute */
149 pdcattr = GdiGetDcAttr(hdc);
150 if (pdcattr == NULL)
151 {
153 return 0;
154 }
155
156 /* Force change if Isotropic is set for recompute. */
157 if ((iMode != pdcattr->iMapMode) || (iMode == MM_ISOTROPIC))
158 {
159 pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
161 }
162
163 return pdcattr->iMapMode;
164}
165
166
167BOOL
168WINAPI
170 _In_ HDC hdc,
171 _Inout_updates_(nCount) LPPOINT lpPoints,
172 _In_ INT nCount)
173{
174 PDC_ATTR pdcattr;
175 SIZEL sizlView;
176
177 if (nCount <= 0)
178 return TRUE;
179
180 if (hdc == NULL)
181 {
183 return FALSE;
184 }
185 if (lpPoints == NULL)
186 {
187 return TRUE;
188 }
189
190 pdcattr = GdiGetDcAttr(hdc);
191 if (pdcattr == NULL)
192 return FALSE;
193
194 if (pdcattr->iMapMode == MM_ISOTROPIC)
195 {
197 {
198 if (sizlView.cx == 0 || sizlView.cy == 0)
199 return FALSE;
200 }
201 }
202
203 return NtGdiTransformPoints(hdc, lpPoints, lpPoints, nCount, GdiDpToLp);
204}
205
206BOOL
207WINAPI
209 _In_ HDC hdc,
210 _Inout_updates_(nCount) LPPOINT lpPoints,
211 _In_ INT nCount)
212{
213 PDC_ATTR pdcattr;
214
215 if (nCount <= 0)
216 return TRUE;
217
218 if (hdc == NULL)
219 {
221 return FALSE;
222 }
223 if (lpPoints == NULL)
224 {
225 return TRUE;
226 }
227
228 pdcattr = GdiGetDcAttr(hdc);
229 if (pdcattr == NULL)
230 return FALSE;
231
232 return NtGdiTransformPoints(hdc, lpPoints, lpPoints, nCount, GdiLpToDp);
233}
234
235/*
236 * @implemented
237 *
238 */
239BOOL
240WINAPI
242 _In_ HDC hdc,
243 _Out_ LPPOINT lpPoint)
244{
245 PDC_ATTR pdcattr;
246
247 /* Get the DC attribute */
248 pdcattr = GdiGetDcAttr(hdc);
249 if ((pdcattr == NULL) || (lpPoint == NULL))
250 {
252 return FALSE;
253 }
254
255 if (pdcattr->ulDirty_ & DIRTY_PTLCURRENT) // have a hit!
256 {
257 lpPoint->x = pdcattr->ptfxCurrent.x;
258 lpPoint->y = pdcattr->ptfxCurrent.y;
259 DPtoLP(hdc, lpPoint, 1); // reconvert back.
260 pdcattr->ptlCurrent.x = lpPoint->x; // save it
261 pdcattr->ptlCurrent.y = lpPoint->y;
262 pdcattr->ulDirty_ &= ~DIRTY_PTLCURRENT; // clear bit
263 }
264 else
265 {
266 lpPoint->x = pdcattr->ptlCurrent.x;
267 lpPoint->y = pdcattr->ptlCurrent.y;
268 }
269
270 return TRUE;
271}
272
273/*
274 * @implemented
275 */
276BOOL
277WINAPI
279 _In_ HDC hdc,
280 _Out_ LPXFORM pxform)
281{
282 PDC_ATTR pdcattr;
283
284 pdcattr = GdiGetDcAttr(hdc);
285 if (!pdcattr)
286 {
288 return FALSE;
289 }
290#if 0
291 if (pdcattr->flXform & ANY_XFORM_INVALID)
292 {
293 GdiFixupTransforms(pdcattr);
294 }
295
296 MatrixToXForm(pxform, &pdcattr->mxWorldToDevice);
297#endif
299}
300
301
302BOOL
303WINAPI
305 _In_ HDC hdc,
306 _Out_ CONST XFORM *pxform)
307{
308 return ModifyWorldTransform(hdc, pxform, MWT_SET);
309}
310
311
312BOOL
313WINAPI
315 _In_ HDC hdc,
316 _In_opt_ CONST XFORM *pxform,
317 _In_ DWORD dwMode)
318{
319 PDC_ATTR pdcattr;
320
322 return FALSE;
323
324 if (dwMode == MWT_SET)
325 {
327 }
328 else
329 {
331 }
332
333 /* Get the DC attribute */
334 pdcattr = GdiGetDcAttr(hdc);
335 if (pdcattr == NULL)
336 {
338 return FALSE;
339 }
340
341 /* Check that graphics mode is GM_ADVANCED */
342 if (pdcattr->iGraphicsMode != GM_ADVANCED)
343 return FALSE;
344
345 /* Call win32k to do the work */
346 return NtGdiModifyWorldTransform(hdc, (LPXFORM)pxform, dwMode);
347}
348
349BOOL
350WINAPI
352 _In_ HDC hdc,
353 _Out_ LPSIZE lpSize)
354{
355 PDC_ATTR pdcattr;
356
357 /* Get the DC attribute */
358 pdcattr = GdiGetDcAttr(hdc);
359 if (pdcattr == NULL)
360 {
361 /* Do not set LastError here! */
362 return FALSE;
363 }
364
365 /* Check if we need to update values */
366 if ((pdcattr->flXform & PAGE_EXTENTS_CHANGED) &&
367 (pdcattr->iMapMode == MM_ISOTROPIC))
368 {
369 /* Call win32k to do the work */
371 }
372
373 /* Nothing to calculate, return the current extension */
374 lpSize->cx = pdcattr->szlViewportExt.cx;
375 lpSize->cy = pdcattr->szlViewportExt.cy;
376
377 return TRUE;
378}
379
380
381BOOL
382WINAPI
384 _In_ HDC hdc,
385 _Out_ LPPOINT lpPoint)
386{
387 PDC_ATTR pdcattr;
388
389 /* Get the DC attribute */
390 pdcattr = GdiGetDcAttr(hdc);
391 if (pdcattr == NULL)
392 {
393 /* Do not set LastError here! */
394 return FALSE;
395 }
396
397 /* Get the current viewport org */
398 lpPoint->x = pdcattr->ptlViewportOrg.x;
399 lpPoint->y = pdcattr->ptlViewportOrg.y;
400
401 /* Handle right-to-left layout */
402 if (pdcattr->dwLayout & LAYOUT_RTL)
403 lpPoint->x = -lpPoint->x;
404
405 return TRUE;
406}
407
408
409BOOL
410WINAPI
412 _In_ HDC hdc,
413 _Out_ LPSIZE lpSize)
414{
415 PDC_ATTR pdcattr;
416
417 /* Get the DC attribute */
418 pdcattr = GdiGetDcAttr(hdc);
419 if (pdcattr == NULL)
420 {
421 /* Do not set LastError here! */
422 return FALSE;
423 }
424
425 /* Get the current window extension */
426 lpSize->cx = pdcattr->szlWindowExt.cx;
427 lpSize->cy = pdcattr->szlWindowExt.cy;
428
429 /* Handle right-to-left layout */
430 if (pdcattr->dwLayout & LAYOUT_RTL)
431 lpSize->cx = -lpSize->cx;
432
433 return TRUE;
434}
435
436
437BOOL
438WINAPI
440 _In_ HDC hdc,
441 _Out_ LPPOINT lpPoint)
442{
443 PDC_ATTR pdcattr;
444
445 /* Get the DC attribute */
446 pdcattr = GdiGetDcAttr(hdc);
447 if (pdcattr == NULL)
448 {
449 /* Do not set LastError here! */
450 return FALSE;
451 }
452
453 /* Get the current window origin */
454 lpPoint->x = pdcattr->ptlWindowOrg.x;
455 lpPoint->y = pdcattr->ptlWindowOrg.y;
456
457 return TRUE;
458}
459
460/*
461 * @implemented
462 */
463BOOL
464WINAPI
466 _In_ HDC hdc,
467 _In_ int nXExtent,
468 _In_ int nYExtent,
469 _Out_opt_ LPSIZE lpSize)
470{
471 PDC_ATTR pdcattr;
472
473 HANDLE_METADC(BOOL, SetViewportExtEx, FALSE, hdc, nXExtent, nYExtent);
474
475 /* Get the DC attribute */
476 pdcattr = GdiGetDcAttr(hdc);
477 if (pdcattr == NULL)
478 {
480 return FALSE;
481 }
482
483 /* Check if the caller wants the old extension */
484 if (lpSize)
485 {
486 /* Return the current viewport extension */
487 lpSize->cx = pdcattr->szlViewportExt.cx;
488 lpSize->cy = pdcattr->szlViewportExt.cy;
489 }
490
491 /* Check for trivial case */
492 if ((pdcattr->szlViewportExt.cx == nXExtent) &&
493 (pdcattr->szlViewportExt.cy == nYExtent))
494 return TRUE;
495
496 if (nXExtent == 0 || nYExtent == 0)
497 return TRUE;
498
499 /* Only change viewport extension if we are in iso or aniso mode */
500 if ((pdcattr->iMapMode == MM_ISOTROPIC) ||
501 (pdcattr->iMapMode == MM_ANISOTROPIC))
502 {
503 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
504 {
505 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
506 {
507 NtGdiFlush(); // Sync up pdcattr from Kernel space.
508 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
509 }
510 }
511
512 /* Set the new viewport extension */
513 pdcattr->szlViewportExt.cx = nXExtent;
514 pdcattr->szlViewportExt.cy = nYExtent;
515
516 /* Handle right-to-left layout */
517 if (pdcattr->dwLayout & LAYOUT_RTL)
519
520 /* Update xform flags */
522 }
523
524 return TRUE;
525}
526
527/*
528 * @implemented
529 */
530BOOL
531WINAPI
533 _In_ HDC hdc,
534 _In_ int X,
535 _In_ int Y,
536 _Out_opt_ LPPOINT lpPoint)
537{
538 PDC_ATTR pdcattr;
539
541
542 /* Get the DC attribute */
543 pdcattr = GdiGetDcAttr(hdc);
544 if (pdcattr == NULL)
545 {
546 /* Do not set LastError here! */
547 return FALSE;
548 }
549
550 if (lpPoint)
551 {
552 lpPoint->x = pdcattr->ptlWindowOrg.x;
553 lpPoint->y = pdcattr->ptlWindowOrg.y;
554 }
555
556 if ((pdcattr->ptlWindowOrg.x == X) && (pdcattr->ptlWindowOrg.y == Y))
557 return TRUE;
558
559 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
560 {
561 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
562 {
563 NtGdiFlush(); // Sync up pdcattr from Kernel space.
564 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
565 }
566 }
567
568 pdcattr->ptlWindowOrg.x = X;
569 pdcattr->ptlWindowOrg.y = Y;
570
571 pdcattr->lWindowOrgx = X;
574 return TRUE;
575
576// return NtGdiSetWindowOrgEx(hdc, X, Y, lpPoint);
577}
578
579/*
580 * @implemented
581 */
582BOOL
583WINAPI
585 _In_ HDC hdc,
586 _In_ INT nXExtent,
587 _In_ INT nYExtent,
588 _Out_opt_ LPSIZE lpSize)
589{
590 PDC_ATTR pdcattr;
591
592 HANDLE_METADC(BOOL, SetWindowExtEx, FALSE, hdc, nXExtent, nYExtent);
593
594 /* Get the DC attr */
595 pdcattr = GdiGetDcAttr(hdc);
596 if (!pdcattr)
597 {
598 /* Set the error value and return failure */
600 return FALSE;
601 }
602
603 /* Check if the caller wants the old extension */
604 if (lpSize)
605 {
606 /* Return the current window extension */
607 lpSize->cx = pdcattr->szlWindowExt.cx;
608 lpSize->cy = pdcattr->szlWindowExt.cy;
609
610 /* Handle right-to-left layout */
611 if (pdcattr->dwLayout & LAYOUT_RTL)
612 lpSize->cx = -lpSize->cx;
613 }
614
615 if (pdcattr->dwLayout & LAYOUT_RTL)
616 {
619 }
620 else if ((pdcattr->iMapMode == MM_ISOTROPIC) ||
621 (pdcattr->iMapMode == MM_ANISOTROPIC))
622 {
623 if ((pdcattr->szlWindowExt.cx == nXExtent) &&
624 (pdcattr->szlWindowExt.cy == nYExtent))
625 return TRUE;
626
627 if ((!nXExtent) || (!nYExtent))
628 return FALSE;
629
630 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
631 {
632 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
633 {
634 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
635 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
636 }
637 }
638
639 pdcattr->szlWindowExt.cx = nXExtent;
640 pdcattr->szlWindowExt.cy = nYExtent;
641 if (pdcattr->dwLayout & LAYOUT_RTL)
643
645 }
646
647 return TRUE;
648}
649
650/*
651 * @implemented
652 */
653BOOL
654WINAPI
656 _In_ HDC hdc,
657 _In_ int X,
658 _In_ int Y,
659 _Out_opt_ LPPOINT lpPoint)
660{
661 PDC_ATTR pdcattr;
662
664
665 /* Get the DC attribute */
666 pdcattr = GdiGetDcAttr(hdc);
667 if (!pdcattr)
668 {
669 /* Do not set LastError here! */
670 return FALSE;
671 }
673 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
674 {
675 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
676 {
677 NtGdiFlush();
678 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
679 }
680 }
682 if (lpPoint)
683 {
684 lpPoint->x = pdcattr->ptlViewportOrg.x;
685 lpPoint->y = pdcattr->ptlViewportOrg.y;
686 if (pdcattr->dwLayout & LAYOUT_RTL) lpPoint->x = -lpPoint->x;
687 }
689 if (pdcattr->dwLayout & LAYOUT_RTL) X = -X;
690 pdcattr->ptlViewportOrg.x = X;
691 pdcattr->ptlViewportOrg.y = Y;
692 return TRUE;
693
694// return NtGdiSetViewportOrgEx(hdc,X,Y,lpPoint);
695}
696
697/*
698 * @implemented
699 */
700BOOL
701WINAPI
703 _In_ HDC hdc,
704 _In_ INT xNum,
705 _In_ INT xDenom,
706 _In_ INT yNum,
707 _In_ INT yDenom,
708 _Out_ LPSIZE lpSize)
709{
710 HANDLE_METADC(BOOL, ScaleViewportExtEx, FALSE, hdc, xNum, xDenom, yNum, yDenom);
711
712 if (!GdiGetDcAttr(hdc))
713 {
715 return FALSE;
716 }
717
718 return NtGdiScaleViewportExtEx(hdc, xNum, xDenom, yNum, yDenom, lpSize);
719}
720
721/*
722 * @implemented
723 */
724BOOL
725WINAPI
727 _In_ HDC hdc,
728 _In_ INT xNum,
729 _In_ INT xDenom,
730 _In_ INT yNum,
731 _In_ INT yDenom,
732 _Out_ LPSIZE lpSize)
733{
734 HANDLE_METADC(BOOL, ScaleWindowExtEx, FALSE, hdc, xNum, xDenom, yNum, yDenom);
735
736 if (!GdiGetDcAttr(hdc))
737 {
739 return FALSE;
740 }
741
742 return NtGdiScaleWindowExtEx(hdc, xNum, xDenom, yNum, yDenom, lpSize);
743}
744
745/*
746 * @implemented
747 */
748DWORD
749WINAPI
751 _In_ HDC hdc)
752{
753 PDC_ATTR pdcattr;
754
755 /* METADC16 is not supported in this API */
757 {
758 return GDI_ERROR;
759 }
760
761 /* Get the DC attribute */
762 pdcattr = GdiGetDcAttr(hdc);
763 if (!pdcattr)
764 {
765 /* Set the error value and return failure */
767 return GDI_ERROR;
768 }
769
770 /* Return the layout */
771 return pdcattr->dwLayout;
772}
773
774
775/*
776 * @implemented
777 */
778DWORD
779WINAPI
781 _In_ HDC hdc,
782 _In_ DWORD dwLayout)
783{
785
786 if (!GdiGetDcAttr(hdc))
787 {
789 return GDI_ERROR;
790 }
791
792 return NtGdiSetLayout(hdc, -1, dwLayout);
793}
794
795/*
796 * @implemented
797 */
798DWORD
799WINAPI
801 _In_ HDC hdc,
802 _In_ LONG wox,
803 _In_ DWORD dwLayout)
804{
805 /* Only normal DCs are handled here */
807 {
808 return GDI_ERROR;
809 }
810
811 if (!GdiGetDcAttr(hdc))
812 {
814 return GDI_ERROR;
815 }
816
817 return NtGdiSetLayout(hdc, wox, dwLayout);
818}
819
820/*
821 * @implemented
822 */
823BOOL
824WINAPI
826 _In_ HDC hdc,
827 _Out_ LPPOINT lpPoint)
828{
829 return NtGdiGetDCPoint(hdc, GdiGetDCOrg, (PPOINTL)lpPoint);
830}
831
832
833/*
834 * @implemented
835 */
836LONG
837WINAPI
839 _In_ HDC hdc)
840{
841 POINT pt;
842
843 /* Call the new API */
844 if (!GetDCOrgEx(hdc, &pt))
845 return 0;
846
847 /* Return the point in the old way */
848 return(MAKELONG(pt.x, pt.y));
849}
850
851
852/*
853 * @implemented
854 *
855 */
856BOOL
857WINAPI
859 _In_ HDC hdc,
860 _In_ int nXOffset,
861 _In_ int nYOffset,
862 _Out_opt_ LPPOINT lpPoint)
863{
864 PDC_ATTR pdcattr;
865
866 HANDLE_METADC16(BOOL, OffsetViewportOrgEx, FALSE, hdc, nXOffset, nYOffset);
867
868 /* Get the DC attribute */
869 pdcattr = GdiGetDcAttr(hdc);
870 if (!pdcattr)
871 {
872 /* Do not set LastError here! */
873 return FALSE;
874 }
875
876 if (lpPoint)
877 {
878 *lpPoint = pdcattr->ptlViewportOrg;
879 if ( pdcattr->dwLayout & LAYOUT_RTL) lpPoint->x = -lpPoint->x;
880 }
881
882 if ( nXOffset || nYOffset != nXOffset )
883 {
884 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
885 {
886 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
887 {
888 NtGdiFlush();
889 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
890 }
891 }
892
894 if (pdcattr->dwLayout & LAYOUT_RTL) nXOffset = -nXOffset;
895 pdcattr->ptlViewportOrg.x += nXOffset;
896 pdcattr->ptlViewportOrg.y += nYOffset;
897 }
898
900
901 return TRUE;
902
903// return NtGdiOffsetViewportOrgEx(hdc, nXOffset, nYOffset, lpPoint);
904}
905
906/*
907 * @implemented
908 *
909 */
910BOOL
911WINAPI
913 _In_ HDC hdc,
914 _In_ int nXOffset,
915 _In_ int nYOffset,
916 _Out_opt_ LPPOINT lpPoint)
917{
918 PDC_ATTR pdcattr;
919
920 HANDLE_METADC16(BOOL, OffsetWindowOrgEx, FALSE, hdc, nXOffset, nYOffset);
921
922 /* Get the DC attribute */
923 pdcattr = GdiGetDcAttr(hdc);
924 if (!pdcattr)
925 {
926 /* Do not set LastError here! */
927 return FALSE;
928 }
929
930 if ( lpPoint )
931 {
932 *lpPoint = pdcattr->ptlWindowOrg;
933 //lpPoint->x = pdcattr->lWindowOrgx;
934 }
935
936 if ( nXOffset || nYOffset != nXOffset )
937 {
938 if (NtCurrentTeb()->GdiTebBatch.HDC == hdc)
939 {
940 if (pdcattr->ulDirty_ & DC_MODE_DIRTY)
941 {
942 NtGdiFlush();
943 pdcattr->ulDirty_ &= ~DC_MODE_DIRTY;
944 }
945 }
946
948 pdcattr->ptlWindowOrg.x += nXOffset;
949 pdcattr->ptlWindowOrg.y += nYOffset;
950 pdcattr->lWindowOrgx += nXOffset;
951 }
952
954
955 return TRUE;
956
957// return NtGdiOffsetWindowOrgEx(hdc, nXOffset, nYOffset, lpPoint);
958}
959
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define Y(I)
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define pt(x, y)
Definition: drawing.c:79
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL WINAPI CombineTransform(_Out_ LPXFORM pxfResult, _In_ const XFORM *pxf1, _In_ const XFORM *pxf2)
Definition: coord.c:64
#define _fmul(x, y)
Definition: coord.c:60
BOOL WINAPI DPtoLP(_In_ HDC hdc, _Inout_updates_(nCount) LPPOINT lpPoints, _In_ INT nCount)
Definition: coord.c:169
#define MAX_OFFSET
Definition: coord.c:59
INT WINAPI SetMapMode(_In_ HDC hdc, _In_ INT iMode)
Definition: coord.c:136
BOOL WINAPI LPtoDP(_In_ HDC hdc, _Inout_updates_(nCount) LPPOINT lpPoints, _In_ INT nCount)
Definition: coord.c:208
BOOL WINAPI ScaleViewportExtEx(_In_ HDC hdc, _In_ INT xNum, _In_ INT xDenom, _In_ INT yNum, _In_ INT yDenom, _Out_ LPSIZE lpSize)
Definition: coord.c:702
BOOL WINAPI SetWorldTransform(_In_ HDC hdc, _Out_ CONST XFORM *pxform)
Definition: coord.c:304
BOOL WINAPI OffsetWindowOrgEx(_In_ HDC hdc, _In_ int nXOffset, _In_ int nYOffset, _Out_opt_ LPPOINT lpPoint)
Definition: coord.c:912
BOOL WINAPI SetViewportExtEx(_In_ HDC hdc, _In_ int nXExtent, _In_ int nYExtent, _Out_opt_ LPSIZE lpSize)
Definition: coord.c:465
DWORD WINAPI SetLayoutWidth(_In_ HDC hdc, _In_ LONG wox, _In_ DWORD dwLayout)
Definition: coord.c:800
BOOL WINAPI GetWorldTransform(_In_ HDC hdc, _Out_ LPXFORM pxform)
Definition: coord.c:278
FORCEINLINE void GdiTransformPoints(_In_ MATRIX *pmx, _Out_writes_(nCount) PPOINT pptOut, _In_reads_(nCount) PPOINT pptIn, _In_ ULONG nCount)
Definition: coord.c:47
void GdiTransformPoints2(_In_ XFORM *pxform, _Out_writes_(nCount) PPOINT pptOut, _In_reads_(nCount) PPOINT pptIn, _In_ ULONG nCount)
Definition: coord.c:27
BOOL WINAPI SetViewportOrgEx(_In_ HDC hdc, _In_ int X, _In_ int Y, _Out_opt_ LPPOINT lpPoint)
Definition: coord.c:655
BOOL WINAPI SetWindowOrgEx(_In_ HDC hdc, _In_ int X, _In_ int Y, _Out_opt_ LPPOINT lpPoint)
Definition: coord.c:532
void MatrixToXForm(XFORM *pxform, const MATRIX *pmx)
Definition: coord.c:15
BOOL WINAPI GetWindowExtEx(_In_ HDC hdc, _Out_ LPSIZE lpSize)
Definition: coord.c:411
LONG WINAPI GetDCOrg(_In_ HDC hdc)
Definition: coord.c:838
int WINAPI GetMapMode(_In_ HDC hdc)
Definition: coord.c:114
BOOL WINAPI GetViewportOrgEx(_In_ HDC hdc, _Out_ LPPOINT lpPoint)
Definition: coord.c:383
BOOL WINAPI GetDCOrgEx(_In_ HDC hdc, _Out_ LPPOINT lpPoint)
Definition: coord.c:825
DWORD WINAPI GetLayout(_In_ HDC hdc)
Definition: coord.c:750
BOOL WINAPI GetViewportExtEx(_In_ HDC hdc, _Out_ LPSIZE lpSize)
Definition: coord.c:351
BOOL WINAPI ModifyWorldTransform(_In_ HDC hdc, _In_opt_ CONST XFORM *pxform, _In_ DWORD dwMode)
Definition: coord.c:314
BOOL WINAPI GetCurrentPositionEx(_In_ HDC hdc, _Out_ LPPOINT lpPoint)
Definition: coord.c:241
BOOL WINAPI OffsetViewportOrgEx(_In_ HDC hdc, _In_ int nXOffset, _In_ int nYOffset, _Out_opt_ LPPOINT lpPoint)
Definition: coord.c:858
BOOL WINAPI SetWindowExtEx(_In_ HDC hdc, _In_ INT nXExtent, _In_ INT nYExtent, _Out_opt_ LPSIZE lpSize)
Definition: coord.c:584
BOOL WINAPI ScaleWindowExtEx(_In_ HDC hdc, _In_ INT xNum, _In_ INT xDenom, _In_ INT yNum, _In_ INT yDenom, _Out_ LPSIZE lpSize)
Definition: coord.c:726
DWORD WINAPI SetLayout(_In_ HDC hdc, _In_ DWORD dwLayout)
Definition: coord.c:780
BOOL WINAPI GetWindowOrgEx(_In_ HDC hdc, _Out_ LPPOINT lpPoint)
Definition: coord.c:439
FORCEINLINE int _lrintf(float f)
Definition: gdi32p.h:498
BOOL METADC_SetMapMode(HDC hdc, INT mode) DECLSPEC_HIDDEN
Definition: metadc.c:271
#define FOtoF(pfo)
Definition: gdi32p.h:492
#define HANDLE_METADC16(_RetType, _Func, dwError, hdc,...)
Definition: gdi32p.h:613
#define HANDLE_METADC(_RetType, _Func, dwError, hdc,...)
Definition: gdi32p.h:589
DWORD WINAPI GetAndSetDCDWord(_In_ HDC hdc, _In_ UINT u, _In_ DWORD dwIn, _In_ ULONG ulMFId, _In_ USHORT usMF16Id, _In_ DWORD dwError)
Definition: dc.c:746
FORCEINLINE PDC_ATTR GdiGetDcAttr(HDC hdc)
Definition: gdi32p.h:451
#define HANDLE_EMETAFDC(_RetType, _Func, dwError, hdc,...)
Definition: gdi32p.h:644
#define GDI_HANDLE_GET_TYPE(h)
Definition: gdi.h:31
BOOL APIENTRY NtGdiGetTransform(_In_ HDC hdc, _In_ DWORD iXform, _Out_ LPXFORM pxf)
@ GDILoObjType_LO_METADC16_TYPE
Definition: gdi_private.h:49
@ GDILoObjType_LO_DC_TYPE
Definition: gdi_private.h:34
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define X(b, s)
#define NtCurrentTeb
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
#define _Out_opt_
Definition: ms_sal.h:346
#define _Inout_updates_(size)
Definition: ms_sal.h:387
#define _Out_writes_(size)
Definition: ms_sal.h:348
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
#define _In_reads_(size)
Definition: ms_sal.h:319
BOOL APIENTRY NtGdiGetDCPoint(HDC hDC, UINT iPoint, PPOINTL Point)
Definition: coord.c:1424
__kernel_entry W32KAPI DWORD APIENTRY NtGdiSetLayout(_In_ HDC hdc, _In_ LONG wox, _In_ DWORD dwLayout)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiTransformPoints(_In_ HDC hdc, _In_reads_(c) PPOINT pptIn, _Out_writes_(c) PPOINT pptOut, _In_ INT c, _In_ INT iMode)
_In_ UINT _Out_ PPOINTL pptOut
Definition: ntgdi.h:2198
__kernel_entry W32KAPI NTSTATUS APIENTRY NtGdiFlush(VOID)
Definition: gdibatch.c:471
__kernel_entry W32KAPI BOOL APIENTRY NtGdiScaleWindowExtEx(_In_ HDC hdc, _In_ INT xNum, _In_ INT xDenom, _In_ INT yNum, _In_ INT yDenom, _Out_opt_ LPSIZE pszOut)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiModifyWorldTransform(_In_ HDC hdc, _In_opt_ LPXFORM pxf, _In_ DWORD iXform)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiScaleViewportExtEx(_In_ HDC hdc, _In_ INT xNum, _In_ INT xDenom, _In_ INT yNum, _In_ INT yDenom, _Out_opt_ LPSIZE pszOut)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiMirrorWindowOrg(_In_ HDC hdc)
#define PAGE_EXTENTS_CHANGED
Definition: ntgdihdl.h:187
#define WORLD_XFORM_CHANGED
Definition: ntgdihdl.h:188
#define DC_MODE_DIRTY
Definition: ntgdihdl.h:144
#define DIRTY_PTLCURRENT
Definition: ntgdihdl.h:131
#define DEVICE_TO_WORLD_INVALID
Definition: ntgdihdl.h:177
#define PAGE_XLATE_CHANGED
Definition: ntgdihdl.h:186
#define INVALIDATE_ATTRIBUTES
Definition: ntgdihdl.h:180
@ GdiDpToLp
Definition: ntgdityp.h:99
@ GdiLpToDp
Definition: ntgdityp.h:100
#define MWT_SET
Definition: ntgdityp.h:180
@ GdiGetSetMapMode
Definition: ntgdityp.h:69
#define GdiWorldSpaceToPageSpace
Definition: ntgdityp.h:182
@ GdiGetViewPortExt
Definition: ntgdityp.h:75
@ GdiGetDCOrg
Definition: ntgdityp.h:80
#define CONST
Definition: pedump.c:81
long LONG
Definition: pedump.c:60
Definition: matrix.h:44
POINTL ptlCurrent
Definition: ntgdihdl.h:311
MATRIX mxWorldToDevice
Definition: ntgdihdl.h:331
SIZEL szlViewportExt
Definition: ntgdihdl.h:344
LONG lWindowOrgx
Definition: ntgdihdl.h:340
INT iMapMode
Definition: ntgdihdl.h:338
INT iGraphicsMode
Definition: ntgdihdl.h:306
FLONG flXform
Definition: ntgdihdl.h:345
DWORD dwLayout
Definition: ntgdihdl.h:339
POINTL ptlViewportOrg
Definition: ntgdihdl.h:343
POINTL ptlWindowOrg
Definition: ntgdihdl.h:341
ULONG ulDirty_
Definition: ntgdihdl.h:294
POINTL ptfxCurrent
Definition: ntgdihdl.h:312
SIZEL szlWindowExt
Definition: ntgdihdl.h:342
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
FLOATL eDx
Definition: winddi.h:1238
FLOATL eM12
Definition: winddi.h:1235
FLOATL eM11
Definition: winddi.h:1234
FLOATL eM22
Definition: winddi.h:1237
FLOATL eDy
Definition: winddi.h:1239
FLOATL eM21
Definition: winddi.h:1236
FLOAT eDy
Definition: wingdi.h:1726
FLOAT eM11
Definition: wingdi.h:1721
FLOAT eM21
Definition: wingdi.h:1723
FLOAT eM22
Definition: wingdi.h:1724
FLOAT eM12
Definition: wingdi.h:1722
FLOAT eDx
Definition: wingdi.h:1725
float FLOAT
Definition: typedefs.h:69
int32_t INT
Definition: typedefs.h:58
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define FORCEINLINE
Definition: wdftypes.h:67
_In_ ULONG iMode
Definition: winddi.h:3520
#define WINAPI
Definition: msvc.h:6
#define GM_ADVANCED
Definition: wingdi.h:865
#define MM_ANISOTROPIC
Definition: wingdi.h:867
#define LAYOUT_RTL
Definition: wingdi.h:1371
#define MM_ISOTROPIC
Definition: wingdi.h:870
#define GDI_ERROR
Definition: wingdi.h:1309
#define EMR_SETMAPMODE
Definition: wingdi.h:91