Implement Get/SetMiterLimit, with proper float containment.
authorJames Tabor <james.tabor@reactos.org>
Tue, 17 Jun 2008 20:19:30 +0000 (20:19 +0000)
committerJames Tabor <james.tabor@reactos.org>
Tue, 17 Jun 2008 20:19:30 +0000 (20:19 +0000)
svn path=/trunk/; revision=34004

reactos/dll/win32/gdi32/objects/path.c
reactos/subsystems/win32/win32k/objects/dc.c
reactos/subsystems/win32/win32k/objects/path.c

index 6273003..2b9088d 100644 (file)
@@ -136,7 +136,13 @@ SetMiterLimit(
        PFLOAT  a2
        )
 {
-       return NtGdiSetMiterLimit ( hdc, a1, (PDWORD)a2 );
+  BOOL Ret;
+  gxf_long worker, worker1;
+
+  worker.f  = a1;
+  Ret = NtGdiSetMiterLimit ( hdc, worker.l, a2 ? &worker1.l : NULL  );
+  if (a2 && Ret) *a2 = worker1.f;
+  return Ret;
 }
 
 
index ee62db8..9b8212d 100644 (file)
@@ -3442,7 +3442,7 @@ NtGdiGetBoundsRect(
     OUT LPRECT prc,
     IN DWORD f)
 {
-  DPRINT1("stub");
+  DPRINT1("stub\n");
   return  DCB_RESET;   /* bounding rectangle always empty */
 }
 
@@ -3453,7 +3453,7 @@ NtGdiSetBoundsRect(
     IN LPRECT prc,
     IN DWORD f)
 {
-  DPRINT1("stub");
+  DPRINT1("stub\n");
   return  DCB_DISABLE;   /* bounding rectangle always empty */
 }
 
index f3cb7a9..21de3bf 100644 (file)
@@ -195,8 +195,39 @@ NtGdiGetMiterLimit(
     IN HDC hdc,
     OUT PDWORD pdwOut)
 {
-  UNIMPLEMENTED;
-  return FALSE;
+  DC *pDc;
+  gxf_long worker;
+  NTSTATUS Status = STATUS_SUCCESS;
+
+  if(!(pDc = DC_LockDc(hdc))) return FALSE;
+
+  worker.f = pDc->DcLevel.laPath.eMiterLimit;
+
+  if (pdwOut)
+  {
+      _SEH_TRY
+      {
+          ProbeForWrite(pdwOut,
+                 sizeof(DWORD),
+                             1);
+          *pdwOut = worker.l;
+      }
+      _SEH_HANDLE
+      {
+          Status = _SEH_GetExceptionCode();
+      }
+       _SEH_END;
+      if (!NT_SUCCESS(Status))
+      {
+         SetLastNtError(Status);
+         DC_UnlockDc(pDc);
+         return FALSE;
+      }
+  }
+
+  DC_UnlockDc(pDc);
+  return TRUE;
+
 }
 
 INT
@@ -298,8 +329,40 @@ NtGdiSetMiterLimit(
     IN DWORD dwNew,
     IN OUT OPTIONAL PDWORD pdwOut)
 {
-  UNIMPLEMENTED;
-  return FALSE;
+  DC *pDc;
+  gxf_long worker, worker1;
+  NTSTATUS Status = STATUS_SUCCESS;
+
+  if(!(pDc = DC_LockDc(hdc))) return FALSE;
+
+  worker.l  = dwNew;
+  worker1.f = pDc->DcLevel.laPath.eMiterLimit;
+  pDc->DcLevel.laPath.eMiterLimit = worker.f;
+
+  if (pdwOut)
+  {
+      _SEH_TRY
+      {
+          ProbeForWrite(pdwOut,
+                 sizeof(DWORD),
+                             1);
+          *pdwOut = worker1.l;
+      }
+      _SEH_HANDLE
+      {
+          Status = _SEH_GetExceptionCode();
+      }
+       _SEH_END;
+      if (!NT_SUCCESS(Status))
+      {
+         SetLastNtError(Status);
+         DC_UnlockDc(pDc);
+         return FALSE;
+      }
+  }
+
+  DC_UnlockDc(pDc);
+  return TRUE;
 }
 
 BOOL