[ros-diffs] [jimtabor] 33830: Move xform data from W structure into DcLevel within unions. Why: Sticking with systems floating point and reducing the size of DC.

jimtabor at svn.reactos.org jimtabor at svn.reactos.org
Mon Jun 2 21:51:05 CEST 2008


Author: jimtabor
Date: Mon Jun  2 14:51:04 2008
New Revision: 33830

URL: http://svn.reactos.org/svn/reactos?rev=33830&view=rev
Log:
Move xform data from W structure into DcLevel within unions. Why: Sticking with systems floating point and reducing the size of DC.

Modified:
    trunk/reactos/subsystems/win32/win32k/include/dc.h
    trunk/reactos/subsystems/win32/win32k/include/gdifloat.h
    trunk/reactos/subsystems/win32/win32k/objects/coord.c
    trunk/reactos/subsystems/win32/win32k/objects/dc.c
    trunk/reactos/subsystems/win32/win32k/objects/dcutil.c
    trunk/reactos/subsystems/win32/win32k/objects/path.c
    trunk/reactos/subsystems/win32/win32k/objects/text.c

Modified: trunk/reactos/subsystems/win32/win32k/include/dc.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/dc.h?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -65,11 +65,6 @@
 /* #endif */
 
   BYTE   bitsPerPixel;
-
-  XFORM  xformWorld2Wnd;    /* World-to-window transformation */
-  XFORM  xformWorld2Vport;  /* World-to-viewport transformation */
-  XFORM  xformVport2World;  /* Inverse of the above transformation */
-  BOOL   vport2WorldValid;  /* Is xformVport2World valid? */
 } WIN_DC_INFO;
 
 // EXtended CLip and Window Region Object
@@ -107,9 +102,18 @@
   DWORD             unk4_00000000[11];
   FLONG             fl;
   FLONG             flBrush;
+  union{
   MATRIX_S          mxWorldToDevice;
+  XFORM             xformWorld2Vport; /* World-to-viewport transformation */
+  };
+  union{
   MATRIX_S          mxDeviceToWorld;
+  XFORM             xformVport2World; /* Inverse of the above transformation */
+  };
+  union{  
   MATRIX_S          mxWorldToPage;
+  XFORM             xformWorld2Wnd;   /* World-to-window transformation */
+  };
   EFLOAT_S          efM11PtoD;
   EFLOAT_S          efM22PtoD;
   EFLOAT_S          efDxPtoD;

Modified: trunk/reactos/subsystems/win32/win32k/include/gdifloat.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/gdifloat.h?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/gdifloat.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/gdifloat.h [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -33,12 +33,12 @@
     /* Perform the transformation */
     x = point->x;
     y = point->y;
-    point->x = x * dc->w.xformWorld2Vport.eM11 +
-               y * dc->w.xformWorld2Vport.eM21 +
-	       dc->w.xformWorld2Vport.eDx;
-    point->y = x * dc->w.xformWorld2Vport.eM12 +
-               y * dc->w.xformWorld2Vport.eM22 +
-	       dc->w.xformWorld2Vport.eDy;
+    point->x = x * dc->DcLevel.xformWorld2Vport.eM11 +
+               y * dc->DcLevel.xformWorld2Vport.eM21 +
+	       dc->DcLevel.xformWorld2Vport.eDx;
+    point->y = x * dc->DcLevel.xformWorld2Vport.eM12 +
+               y * dc->DcLevel.xformWorld2Vport.eM22 +
+	       dc->DcLevel.xformWorld2Vport.eDy;
 }
 
 /* Performs a viewport-to-world transformation on the specified point (which

Modified: trunk/reactos/subsystems/win32/win32k/objects/coord.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/coord.c?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/coord.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/coord.c [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -150,10 +150,10 @@
 FLOAT x, y;
   x = (FLOAT)Point->x;
   y = (FLOAT)Point->y;
-  Point->x = x * Dc->w.xformVport2World.eM11 +
-    y * Dc->w.xformVport2World.eM21 + Dc->w.xformVport2World.eDx;
-  Point->y = x * Dc->w.xformVport2World.eM12 +
-    y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy;
+  Point->x = x * Dc->DcLevel.xformVport2World.eM11 +
+    y * Dc->DcLevel.xformVport2World.eM21 + Dc->DcLevel.xformVport2World.eDx;
+  Point->y = x * Dc->DcLevel.xformVport2World.eM12 +
+    y * Dc->DcLevel.xformVport2World.eM22 + Dc->DcLevel.xformVport2World.eDy;
 }
 
 VOID
@@ -190,24 +190,24 @@
    switch(Mode)
    {
      case MWT_IDENTITY:
-       pDc->w.xformWorld2Wnd.eM11 = 1.0f;
-       pDc->w.xformWorld2Wnd.eM12 = 0.0f;
-       pDc->w.xformWorld2Wnd.eM21 = 0.0f;
-       pDc->w.xformWorld2Wnd.eM22 = 1.0f;
-       pDc->w.xformWorld2Wnd.eDx  = 0.0f;
-       pDc->w.xformWorld2Wnd.eDy  = 0.0f;
+       pDc->DcLevel.xformWorld2Wnd.eM11 = 1.0f;
+       pDc->DcLevel.xformWorld2Wnd.eM12 = 0.0f;
+       pDc->DcLevel.xformWorld2Wnd.eM21 = 0.0f;
+       pDc->DcLevel.xformWorld2Wnd.eM22 = 1.0f;
+       pDc->DcLevel.xformWorld2Wnd.eDx  = 0.0f;
+       pDc->DcLevel.xformWorld2Wnd.eDy  = 0.0f;
        break;
 
      case MWT_LEFTMULTIPLY:
-       IntGdiCombineTransform(&pDc->w.xformWorld2Wnd, lpXForm, &pDc->w.xformWorld2Wnd );
+       IntGdiCombineTransform(&pDc->DcLevel.xformWorld2Wnd, lpXForm, &pDc->DcLevel.xformWorld2Wnd );
        break;
 
      case MWT_RIGHTMULTIPLY:
-       IntGdiCombineTransform(&pDc->w.xformWorld2Wnd, &pDc->w.xformWorld2Wnd, lpXForm);
+       IntGdiCombineTransform(&pDc->DcLevel.xformWorld2Wnd, &pDc->DcLevel.xformWorld2Wnd, lpXForm);
        break;
 
      case MWT_MAX+1: // Must be MWT_SET????
-       pDc->w.xformWorld2Wnd = *lpXForm; // Do it like Wine.
+       pDc->DcLevel.xformWorld2Wnd = *lpXForm; // Do it like Wine.
        break;
 
      default:
@@ -248,7 +248,7 @@
    switch(iXform)
    {
      case GdiWorldSpaceToPageSpace:
-        *XForm = dc->w.xformWorld2Wnd;
+        *XForm = dc->DcLevel.xformWorld2Wnd;
      break;
      default:
      break;
@@ -275,10 +275,10 @@
 
   x = (FLOAT)Point->x;
   y = (FLOAT)Point->y;
-  Point->x = x * Dc->w.xformWorld2Vport.eM11 +
-    y * Dc->w.xformWorld2Vport.eM21 + Dc->w.xformWorld2Vport.eDx;
-  Point->y = x * Dc->w.xformWorld2Vport.eM12 +
-    y * Dc->w.xformWorld2Vport.eM22 + Dc->w.xformWorld2Vport.eDy;
+  Point->x = x * Dc->DcLevel.xformWorld2Vport.eM11 +
+    y * Dc->DcLevel.xformWorld2Vport.eM21 + Dc->DcLevel.xformWorld2Vport.eDx;
+  Point->y = x * Dc->DcLevel.xformWorld2Vport.eM12 +
+    y * Dc->DcLevel.xformWorld2Vport.eM22 + Dc->DcLevel.xformWorld2Vport.eDy;
 }
 
 VOID

Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dc.c?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -1336,10 +1336,10 @@
   nDc_Attr->ptlCurrent      = Dc_Attr->ptlCurrent;
   nDc_Attr->ptfxCurrent     = Dc_Attr->ptfxCurrent;
   newdc->DcLevel.flPath     = dc->DcLevel.flPath;
-  newdc->w.xformWorld2Wnd   = dc->w.xformWorld2Wnd;
-  newdc->w.xformWorld2Vport = dc->w.xformWorld2Vport;
-  newdc->w.xformVport2World = dc->w.xformVport2World;
-  newdc->w.vport2WorldValid = dc->w.vport2WorldValid;
+  newdc->DcLevel.xformWorld2Wnd   = dc->DcLevel.xformWorld2Wnd;
+  newdc->DcLevel.xformWorld2Vport = dc->DcLevel.xformWorld2Vport;
+  newdc->DcLevel.xformVport2World = dc->DcLevel.xformVport2World;
+  nDc_Attr->flXform         = Dc_Attr->flXform;
   nDc_Attr->ptlWindowOrg    = Dc_Attr->ptlWindowOrg;
   nDc_Attr->szlWindowExt    = Dc_Attr->szlWindowExt;
   nDc_Attr->ptlViewportOrg  = Dc_Attr->ptlViewportOrg;
@@ -1403,10 +1403,10 @@
   Dc_Attr->ptlCurrent      = sDc_Attr->ptlCurrent;
   Dc_Attr->ptfxCurrent     = sDc_Attr->ptfxCurrent;
   dc->DcLevel.flPath       = dcs->DcLevel.flPath;
-  dc->w.xformWorld2Wnd     = dcs->w.xformWorld2Wnd;
-  dc->w.xformWorld2Vport   = dcs->w.xformWorld2Vport;
-  dc->w.xformVport2World   = dcs->w.xformVport2World;
-  dc->w.vport2WorldValid   = dcs->w.vport2WorldValid;
+  dc->DcLevel.xformWorld2Wnd     = dcs->DcLevel.xformWorld2Wnd;
+  dc->DcLevel.xformWorld2Vport   = dcs->DcLevel.xformWorld2Vport;
+  dc->DcLevel.xformVport2World   = dcs->DcLevel.xformVport2World;
+  Dc_Attr->flXform         = sDc_Attr->flXform;
   Dc_Attr->ptlWindowOrg    = sDc_Attr->ptlWindowOrg;
   Dc_Attr->szlWindowExt    = sDc_Attr->szlWindowExt;
   Dc_Attr->ptlViewportOrg  = sDc_Attr->ptlViewportOrg;
@@ -2405,16 +2405,14 @@
   if(!Dc_Attr) Dc_Attr = &NewDC->Dc_Attr;
 
   NewDC->BaseObject.hHmgr = (HGDIOBJ) hDC; // Save the handle for this DC object.
-  NewDC->w.xformWorld2Wnd.eM11 = 1.0f;
-  NewDC->w.xformWorld2Wnd.eM12 = 0.0f;
-  NewDC->w.xformWorld2Wnd.eM21 = 0.0f;
-  NewDC->w.xformWorld2Wnd.eM22 = 1.0f;
-  NewDC->w.xformWorld2Wnd.eDx = 0.0f;
-  NewDC->w.xformWorld2Wnd.eDy = 0.0f;
-  NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd;
-  NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd;
-  NewDC->w.vport2WorldValid = TRUE;
-
+  NewDC->DcLevel.xformWorld2Wnd.eM11 = 1.0f;
+  NewDC->DcLevel.xformWorld2Wnd.eM12 = 0.0f;
+  NewDC->DcLevel.xformWorld2Wnd.eM21 = 0.0f;
+  NewDC->DcLevel.xformWorld2Wnd.eM22 = 1.0f;
+  NewDC->DcLevel.xformWorld2Wnd.eDx = 0.0f;
+  NewDC->DcLevel.xformWorld2Wnd.eDy = 0.0f;
+  NewDC->DcLevel.xformWorld2Vport = NewDC->DcLevel.xformWorld2Wnd;
+  NewDC->DcLevel.xformVport2World = NewDC->DcLevel.xformWorld2Wnd;
 // Setup syncing bits for the dcattr data packets.
   Dc_Attr->flXform = DEVICE_TO_PAGE_INVALID;
 
@@ -2603,10 +2601,13 @@
   xformWnd2Vport.eDy  = (FLOAT)Dc_Attr->ptlViewportOrg.y - scaleY * (FLOAT)Dc_Attr->ptlWindowOrg.y;
 
   /* Combine with the world transformation */
-  IntGdiCombineTransform(&dc->w.xformWorld2Vport, &dc->w.xformWorld2Wnd, &xformWnd2Vport);
+  IntGdiCombineTransform(&dc->DcLevel.xformWorld2Vport, &dc->DcLevel.xformWorld2Wnd, &xformWnd2Vport);
 
   /* Create inverse of world-to-viewport transformation */
-  dc->w.vport2WorldValid = DC_InvertXform(&dc->w.xformWorld2Vport, &dc->w.xformVport2World);
+  if (DC_InvertXform(&dc->DcLevel.xformWorld2Vport, &dc->DcLevel.xformVport2World))
+     Dc_Attr->flXform &= ~DEVICE_TO_WORLD_INVALID;
+  else
+     Dc_Attr->flXform |= DEVICE_TO_WORLD_INVALID;
 }
 
 BOOL FASTCALL

Modified: trunk/reactos/subsystems/win32/win32k/objects/dcutil.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dcutil.c?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dcutil.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dcutil.c [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -113,9 +113,9 @@
 CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr)
 {
   NTSTATUS Status = STATUS_SUCCESS;
-  XForm2MatrixS( &dc->Dc_Attr.mxWorldToDevice, &dc->w.xformWorld2Vport);
-  XForm2MatrixS( &dc->Dc_Attr.mxDevicetoWorld, &dc->w.xformVport2World);
-  XForm2MatrixS( &dc->Dc_Attr.mxWorldToPage, &dc->w.xformWorld2Wnd);
+  XForm2MatrixS( &dc->Dc_Attr.mxWorldToDevice, &dc->DcLevel.xformWorld2Vport);
+  XForm2MatrixS( &dc->Dc_Attr.mxDevicetoWorld, &dc->DcLevel.xformVport2World);
+  XForm2MatrixS( &dc->Dc_Attr.mxWorldToPage, &dc->DcLevel.xformWorld2Wnd);
   _SEH_TRY
   {
       ProbeForWrite( Dc_Attr,

Modified: trunk/reactos/subsystems/win32/win32k/objects/path.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/path.c?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/path.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/path.c [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -431,7 +431,7 @@
      * tests show that resetting the graphics mode to GM_COMPATIBLE does
      * not reset the world transform.
      */
-    xform = dc->w.xformWorld2Wnd;
+    xform = dc->DcLevel.xformWorld2Wnd;
 
     /* Set MM_TEXT */
     IntGdiSetMapMode( dc, MM_TEXT );
@@ -1493,7 +1493,7 @@
     IntGetViewportOrgEx(dc, &ptViewportOrg);
     IntGetWindowExtEx(dc, &szWindowExt);
     IntGetWindowOrgEx(dc, &ptWindowOrg);
-    xform = dc->w.xformWorld2Wnd;
+    xform = dc->DcLevel.xformWorld2Wnd;
 
     /* Set MM_TEXT */
     Dc_Attr->iMapMode = MM_TEXT;
@@ -1621,7 +1621,7 @@
     Dc_Attr->ptlViewportOrg.y = ptViewportOrg.y;
 
     /* Restore the world transform */
-    dc->w.xformWorld2Wnd = xform;
+    dc->DcLevel.xformWorld2Wnd = xform;
 
     /* If we've moved the current point then get its new position
        which will be in device (MM_TEXT) co-ords, convert it to

Modified: trunk/reactos/subsystems/win32/win32k/objects/text.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/text.c?rev=33830&r1=33829&r2=33830&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] Mon Jun  2 14:51:04 2008
@@ -2613,7 +2613,7 @@
    }
   Dc_Attr = dc->pDc_Attr;
   if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
-  eM11 = dc->w.xformWorld2Vport.eM11;
+  eM11 = dc->DcLevel.xformWorld2Vport.eM11;
   hFont = Dc_Attr->hlfntNew;
   TextObj = TEXTOBJ_LockText(hFont);
   DC_UnlockDc(dc);



More information about the Ros-diffs mailing list