Patch by Stefan Ginsberg:
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 16 Jul 2008 20:16:30 +0000 (20:16 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 16 Jul 2008 20:16:30 +0000 (20:16 +0000)
- remove XFORM members from DC structure and use MATRIX instead. Use MatrixS2XForm and XForm2MatrixS for intermediate conversion.
- this is a temporary solution (still using fpu) until I'm finished with FLOATOBJ rewrite + XFOROMOBJ api (soon)

svn path=/trunk/; revision=34554

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

index 94ccbd3..2d8700d 100644 (file)
 typedef struct _WIN_DC_INFO
 {
   HRGN     hClipRgn;     /* Clip region (may be 0) */
-  HRGN     hrgnMeta;     /* Meta region (may be 0) */
-  HRGN     hMetaClipRgn; /* Intersection of meta and clip regions (may be 0) */
   HRGN     hVisRgn;      /* Should me to DC. Visible region (must never be 0) */
-
   HRGN     hGCClipRgn;   /* GC clip region (ClipRgn AND VisRgn) */
   HBITMAP  hBitmap;
 
@@ -80,18 +77,9 @@ typedef struct _DCLEVEL
   BOOL              ufiSet;
   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;
@@ -102,7 +90,7 @@ typedef struct _DCLEVEL
   EFLOAT_S          efPr22;
   PBITMAPOBJ        pSurface; // SURFACE*
   SIZE              sizl;
-} DCLEVEL, PDCLEVEL;
+} DCLEVEL, *PDCLEVEL;
 
 /* The DC object structure */
 typedef struct _DC
@@ -150,8 +138,6 @@ typedef struct _DC
 
   /* Reactos specific members */
   WIN_DC_INFO w;
-  HRGN        hprgnAPI; // should use prgnAPI
-  HRGN        hprgnVis; // should use prgnVis
   CLIPOBJ     *CombinedClip;
   XLATEOBJ    *XlateBrush;
   XLATEOBJ    *XlatePen;
index c5d0581..dabef3b 100644 (file)
@@ -23,22 +23,29 @@ static __inline INT GDI_ROUND(FLOAT val)
    return (int)floor(val + 0.5);
 }
 
+
+VOID FASTCALL XForm2MatrixS( MATRIX_S *, PXFORM);
+VOID FASTCALL MatrixS2XForm( PXFORM, MATRIX_S *);
 /* Performs a world-to-viewport transformation on the specified point (which
  * is in floating point format).
  */
 static __inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
 {
     FLOAT x, y;
+    XFORM xformWorld2Vport;
+    
+    MatrixS2XForm(&xformWorld2Vport, &dc->DcLevel.mxWorldToDevice);
 
     /* Perform the transformation */
     x = point->x;
     y = point->y;
-    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;
+    point->x = x * xformWorld2Vport.eM11 +
+               y * xformWorld2Vport.eM21 +
+                 xformWorld2Vport.eDx;
+
+    point->y = x * xformWorld2Vport.eM12 +
+               y * xformWorld2Vport.eM22 +
+                 xformWorld2Vport.eDy;
 }
 
 /* Performs a viewport-to-world transformation on the specified point (which
@@ -103,8 +110,6 @@ static __inline void INTERNAL_LPTODP(DC *dc, LPPOINT point)
 #define YLSTODS(Dc_Attr,ty) \
     MulDiv((ty), (Dc_Attr)->szlViewportExt.cy, (Dc_Attr)->szlWindowExt.cy)
 
-VOID FASTCALL XForm2MatrixS( MATRIX_S *, PXFORM);
-VOID FASTCALL MatrixS2XForm( PXFORM, MATRIX_S *);
-
 #endif
 
+
index 55df78a..bc4cc60 100644 (file)
@@ -122,10 +122,14 @@ CoordDPtoLP(PDC Dc, LPPOINT Point)
 FLOAT x, y;
   x = (FLOAT)Point->x;
   y = (FLOAT)Point->y;
-  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;
+  XFORM xformVport2World;
+
+  MatrixS2XForm(&xformVport2World, &Dc->DcLevel.mxDeviceToWorld);
+
+  Point->x = x * xformVport2World.eM11 +
+    y * xformVport2World.eM21 + xformVport2World.eDx;
+  Point->y = x * xformVport2World.eM12 +
+    y * xformVport2World.eM22 + xformVport2World.eDy;
 }
 
 VOID
@@ -158,28 +162,34 @@ IntGdiModifyWorldTransform(PDC pDc,
                            DWORD Mode)
 {
    ASSERT(pDc);
+   XFORM xformWorld2Wnd;
 
    switch(Mode)
    {
      case MWT_IDENTITY:
-       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;
+       xformWorld2Wnd.eM11 = 1.0f;
+       xformWorld2Wnd.eM12 = 0.0f;
+       xformWorld2Wnd.eM21 = 0.0f;
+       xformWorld2Wnd.eM22 = 1.0f;
+       xformWorld2Wnd.eDx  = 0.0f;
+       xformWorld2Wnd.eDy  = 0.0f;
+       XForm2MatrixS(&pDc->DcLevel.mxWorldToPage, &xformWorld2Wnd);
        break;
 
      case MWT_LEFTMULTIPLY:
-       IntGdiCombineTransform(&pDc->DcLevel.xformWorld2Wnd, lpXForm, &pDc->DcLevel.xformWorld2Wnd );
+       MatrixS2XForm(&xformWorld2Wnd, &pDc->DcLevel.mxWorldToPage);
+       IntGdiCombineTransform(&xformWorld2Wnd, lpXForm, &xformWorld2Wnd);
+       XForm2MatrixS(&pDc->DcLevel.mxWorldToPage, &xformWorld2Wnd);
        break;
 
      case MWT_RIGHTMULTIPLY:
-       IntGdiCombineTransform(&pDc->DcLevel.xformWorld2Wnd, &pDc->DcLevel.xformWorld2Wnd, lpXForm);
+       MatrixS2XForm(&xformWorld2Wnd, &pDc->DcLevel.mxWorldToPage);
+       IntGdiCombineTransform(&xformWorld2Wnd, &xformWorld2Wnd, lpXForm);
+       XForm2MatrixS(&pDc->DcLevel.mxWorldToPage, &xformWorld2Wnd);
        break;
 
      case MWT_MAX+1: // Must be MWT_SET????
-       pDc->DcLevel.xformWorld2Wnd = *lpXForm; // Do it like Wine.
+       XForm2MatrixS(&pDc->DcLevel.mxWorldToPage, lpXForm); // Do it like Wine.
        break;
 
      default:
@@ -219,7 +229,7 @@ NtGdiGetTransform(HDC  hDC,
    switch(iXform)
    {
      case GdiWorldSpaceToPageSpace:
-        *XForm = dc->DcLevel.xformWorld2Wnd;
+        MatrixS2XForm(XForm, &dc->DcLevel.mxWorldToPage);
      break;
      default:
      break;
@@ -240,16 +250,20 @@ FASTCALL
 CoordLPtoDP ( PDC Dc, LPPOINT Point )
 {
   FLOAT x, y;
+  XFORM xformWorld2Vport;
 
-  ASSERT ( Dc );
-  ASSERT ( Point );
+  ASSERT(Dc);
+  ASSERT(Point);
 
   x = (FLOAT)Point->x;
   y = (FLOAT)Point->y;
-  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;
+  
+  MatrixS2XForm(&xformWorld2Vport, &Dc->DcLevel.mxWorldToDevice);
+  
+  Point->x = x * xformWorld2Vport.eM11 +
+    y * xformWorld2Vport.eM21 + xformWorld2Vport.eDx;
+  Point->y = x * xformWorld2Vport.eM12 +
+    y * xformWorld2Vport.eM22 + xformWorld2Vport.eDy;
 }
 
 VOID
index 4057f19..f9570d1 100644 (file)
@@ -1359,9 +1359,9 @@ IntGdiCopyToSaveState(PDC dc, PDC newdc)
 #endif
   nDc_Attr->ptlCurrent      = Dc_Attr->ptlCurrent;
   nDc_Attr->ptfxCurrent     = Dc_Attr->ptfxCurrent;
-  newdc->DcLevel.xformWorld2Wnd   = dc->DcLevel.xformWorld2Wnd;
-  newdc->DcLevel.xformWorld2Vport = dc->DcLevel.xformWorld2Vport;
-  newdc->DcLevel.xformVport2World = dc->DcLevel.xformVport2World;
+  newdc->DcLevel.mxWorldToDevice = dc->DcLevel.mxWorldToDevice;
+  newdc->DcLevel.mxDeviceToWorld = dc->DcLevel.mxDeviceToWorld;
+  newdc->DcLevel.mxWorldToPage   = dc->DcLevel.mxWorldToPage;
   nDc_Attr->flXform         = Dc_Attr->flXform;
   nDc_Attr->ptlWindowOrg    = Dc_Attr->ptlWindowOrg;
   nDc_Attr->szlWindowExt    = Dc_Attr->szlWindowExt;
@@ -1425,9 +1425,9 @@ IntGdiCopyFromSaveState(PDC dc, PDC dcs, HDC hDC)
 #endif
   Dc_Attr->ptlCurrent      = sDc_Attr->ptlCurrent;
   Dc_Attr->ptfxCurrent     = sDc_Attr->ptfxCurrent;
-  dc->DcLevel.xformWorld2Wnd     = dcs->DcLevel.xformWorld2Wnd;
-  dc->DcLevel.xformWorld2Vport   = dcs->DcLevel.xformWorld2Vport;
-  dc->DcLevel.xformVport2World   = dcs->DcLevel.xformVport2World;
+  dc->DcLevel.mxWorldToDevice = dcs->DcLevel.mxWorldToDevice;
+  dc->DcLevel.mxDeviceToWorld = dcs->DcLevel.mxDeviceToWorld;
+  dc->DcLevel.mxWorldToPage   = dcs->DcLevel.mxWorldToPage;
   Dc_Attr->flXform         = sDc_Attr->flXform;
   Dc_Attr->ptlWindowOrg    = sDc_Attr->ptlWindowOrg;
   Dc_Attr->szlWindowExt    = sDc_Attr->szlWindowExt;
@@ -2435,6 +2435,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
   PDC_ATTR Dc_Attr;
   HDC  hDC;
   PWSTR Buf = NULL;
+  XFORM xformTemplate;
 
   if (Driver != NULL)
   {
@@ -2471,14 +2472,17 @@ DC_AllocDC(PUNICODE_STRING Driver)
   if(!Dc_Attr) Dc_Attr = &NewDC->Dc_Attr;
 
   NewDC->BaseObject.hHmgr = (HGDIOBJ) hDC; // Save the handle for this DC object.
-  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;
+  
+  xformTemplate.eM11 = 1.0f;
+  xformTemplate.eM12 = 0.0f;
+  xformTemplate.eM21 = 0.0f;
+  xformTemplate.eM22 = 1.0f;
+  xformTemplate.eDx = 0.0f;
+  xformTemplate.eDy = 0.0f;
+  XForm2MatrixS(&NewDC->DcLevel.mxWorldToDevice, &xformTemplate);
+  XForm2MatrixS(&NewDC->DcLevel.mxDeviceToWorld, &xformTemplate);
+  XForm2MatrixS(&NewDC->DcLevel.mxWorldToPage, &xformTemplate);
+
 // Setup syncing bits for the dcattr data packets.
   Dc_Attr->flXform = DEVICE_TO_PAGE_INVALID;
 
@@ -2663,6 +2667,7 @@ DC_UpdateXforms(PDC  dc)
   FLOAT  scaleX, scaleY;
   PDC_ATTR Dc_Attr = dc->pDc_Attr;
   if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
+  XFORM xformWorld2Vport, xformWorld2Wnd, xformVport2World;
 
   /* Construct a transformation to do the window-to-viewport conversion */
   scaleX = (Dc_Attr->szlWindowExt.cx ? (FLOAT)Dc_Attr->szlViewportExt.cx / (FLOAT)Dc_Attr->szlWindowExt.cx : 0.0f);
@@ -2675,13 +2680,23 @@ DC_UpdateXforms(PDC  dc)
   xformWnd2Vport.eDy  = (FLOAT)Dc_Attr->ptlViewportOrg.y - scaleY * (FLOAT)Dc_Attr->ptlWindowOrg.y;
 
   /* Combine with the world transformation */
-  IntGdiCombineTransform(&dc->DcLevel.xformWorld2Vport, &dc->DcLevel.xformWorld2Wnd, &xformWnd2Vport);
+  MatrixS2XForm(&xformWorld2Vport, &dc->DcLevel.mxWorldToDevice);
+  MatrixS2XForm(&xformWorld2Wnd, &dc->DcLevel.mxWorldToPage);
+  IntGdiCombineTransform(&xformWorld2Vport, &xformWorld2Wnd, &xformWnd2Vport);
 
   /* Create inverse of world-to-viewport transformation */
-  if (DC_InvertXform(&dc->DcLevel.xformWorld2Vport, &dc->DcLevel.xformVport2World))
-     Dc_Attr->flXform &= ~DEVICE_TO_WORLD_INVALID;
+  MatrixS2XForm(&xformVport2World, &dc->DcLevel.mxDeviceToWorld);
+  if (DC_InvertXform(&xformWorld2Vport, &xformVport2World))
+  {
+      Dc_Attr->flXform &= ~DEVICE_TO_WORLD_INVALID;
+  }
   else
-     Dc_Attr->flXform |= DEVICE_TO_WORLD_INVALID;
+  {
+      Dc_Attr->flXform |= DEVICE_TO_WORLD_INVALID;
+  }
+  
+  XForm2MatrixS(&dc->DcLevel.mxWorldToDevice, &xformWorld2Vport);
+
 }
 
 BOOL FASTCALL
index d036d17..ce425a8 100644 (file)
@@ -113,9 +113,10 @@ VOID
 CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr)
 {
   NTSTATUS Status = STATUS_SUCCESS;
-  XForm2MatrixS( &dc->Dc_Attr.mxWorldToDevice, &dc->DcLevel.xformWorld2Vport);
-  XForm2MatrixS( &dc->Dc_Attr.mxDevicetoWorld, &dc->DcLevel.xformVport2World);
-  XForm2MatrixS( &dc->Dc_Attr.mxWorldToPage, &dc->DcLevel.xformWorld2Wnd);
+  dc->Dc_Attr.mxWorldToDevice = dc->DcLevel.mxWorldToDevice;
+  dc->Dc_Attr.mxDevicetoWorld = dc->DcLevel.mxDeviceToWorld;
+  dc->Dc_Attr.mxWorldToPage = dc->DcLevel.mxWorldToPage;
+
   _SEH_TRY
   {
       ProbeForWrite( Dc_Attr,
index 5ae0d1e..d6a50bc 100644 (file)
@@ -540,8 +540,7 @@ IntRectangle(PDC dc,
     if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
 
     /* Do we rotate or shear? */
-//    if (!(dc->DcLevel.mxWorldToDevice.flAccel & MXACC_DIAGONAL))
-    if (dc->DcLevel.xformWorld2Vport.eM12 != 0. || dc->DcLevel.xformWorld2Vport.eM21 != 0.)
+    if (!(dc->DcLevel.mxWorldToDevice.flAccel & MX_SCALE))
     {
         POINTL DestCoords[4];
         DestCoords[0].x = DestCoords[3].x = LeftRect;
index 7947435..a17270e 100644 (file)
@@ -120,7 +120,7 @@ PATH_FillPath( PDC dc, PPATH pPath )
      * tests show that resetting the graphics mode to GM_COMPATIBLE does
      * not reset the world transform.
      */
-    xform = dc->DcLevel.xformWorld2Wnd;
+    MatrixS2XForm(&xform, &dc->DcLevel.mxWorldToPage);
 
     /* Set MM_TEXT */
 //    IntGdiSetMapMode( dc, MM_TEXT );
@@ -1337,7 +1337,8 @@ BOOL FASTCALL PATH_StrokePath(DC *dc, PPATH pPath)
     IntGetViewportOrgEx(dc, &ptViewportOrg);
     IntGetWindowExtEx(dc, &szWindowExt);
     IntGetWindowOrgEx(dc, &ptWindowOrg);
-    xform = dc->DcLevel.xformWorld2Wnd;
+    
+    MatrixS2XForm(&xform, &dc->DcLevel.mxWorldToPage);
 
     /* Set MM_TEXT */
     Dc_Attr->iMapMode = MM_TEXT;
@@ -1464,7 +1465,7 @@ end:
     Dc_Attr->ptlViewportOrg.y = ptViewportOrg.y;
 
     /* Restore the world transform */
-    dc->DcLevel.xformWorld2Wnd = xform;
+    XForm2MatrixS(&dc->DcLevel.mxWorldToPage, &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
index 3e94ce2..e4e5c2f 100644 (file)
@@ -2611,6 +2611,7 @@ NtGdiGetGlyphOutline(
   PVOID pvBuf = NULL;
   int n = 0;
   FT_CharMap found = 0, charmap;
+  XFORM xForm;
 
   DPRINT("%p, %d, %08x, %p, %08lx, %p, %p\n", hdc, wch, iFormat, pgm,
               cjBuf, UnsafeBuf, pmat2);
@@ -2623,7 +2624,10 @@ NtGdiGetGlyphOutline(
    }
   Dc_Attr = dc->pDc_Attr;
   if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
-  eM11 = dc->DcLevel.xformWorld2Vport.eM11;
+  
+  MatrixS2XForm(&xForm, &dc->DcLevel.mxWorldToDevice);
+  eM11 = xForm.eM11;
+  
   hFont = Dc_Attr->hlfntNew;
   TextObj = TEXTOBJ_LockText(hFont);
   DC_UnlockDc(dc);