mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:33:16 +00:00
Patch by Stefan Ginsberg:
- 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
This commit is contained in:
parent
a8f3f89717
commit
a5e5e742fd
8 changed files with 96 additions and 71 deletions
|
@ -32,10 +32,7 @@
|
||||||
typedef struct _WIN_DC_INFO
|
typedef struct _WIN_DC_INFO
|
||||||
{
|
{
|
||||||
HRGN hClipRgn; /* Clip region (may be 0) */
|
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 hVisRgn; /* Should me to DC. Visible region (must never be 0) */
|
||||||
|
|
||||||
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
|
HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
|
||||||
HBITMAP hBitmap;
|
HBITMAP hBitmap;
|
||||||
|
|
||||||
|
@ -80,18 +77,9 @@ typedef struct _DCLEVEL
|
||||||
BOOL ufiSet;
|
BOOL ufiSet;
|
||||||
FLONG fl;
|
FLONG fl;
|
||||||
FLONG flBrush;
|
FLONG flBrush;
|
||||||
union{
|
|
||||||
MATRIX_S mxWorldToDevice;
|
MATRIX_S mxWorldToDevice;
|
||||||
XFORM xformWorld2Vport; /* World-to-viewport transformation */
|
|
||||||
};
|
|
||||||
union{
|
|
||||||
MATRIX_S mxDeviceToWorld;
|
MATRIX_S mxDeviceToWorld;
|
||||||
XFORM xformVport2World; /* Inverse of the above transformation */
|
|
||||||
};
|
|
||||||
union{
|
|
||||||
MATRIX_S mxWorldToPage;
|
MATRIX_S mxWorldToPage;
|
||||||
XFORM xformWorld2Wnd; /* World-to-window transformation */
|
|
||||||
};
|
|
||||||
EFLOAT_S efM11PtoD;
|
EFLOAT_S efM11PtoD;
|
||||||
EFLOAT_S efM22PtoD;
|
EFLOAT_S efM22PtoD;
|
||||||
EFLOAT_S efDxPtoD;
|
EFLOAT_S efDxPtoD;
|
||||||
|
@ -102,7 +90,7 @@ typedef struct _DCLEVEL
|
||||||
EFLOAT_S efPr22;
|
EFLOAT_S efPr22;
|
||||||
PBITMAPOBJ pSurface; // SURFACE*
|
PBITMAPOBJ pSurface; // SURFACE*
|
||||||
SIZE sizl;
|
SIZE sizl;
|
||||||
} DCLEVEL, PDCLEVEL;
|
} DCLEVEL, *PDCLEVEL;
|
||||||
|
|
||||||
/* The DC object structure */
|
/* The DC object structure */
|
||||||
typedef struct _DC
|
typedef struct _DC
|
||||||
|
@ -150,8 +138,6 @@ typedef struct _DC
|
||||||
|
|
||||||
/* Reactos specific members */
|
/* Reactos specific members */
|
||||||
WIN_DC_INFO w;
|
WIN_DC_INFO w;
|
||||||
HRGN hprgnAPI; // should use prgnAPI
|
|
||||||
HRGN hprgnVis; // should use prgnVis
|
|
||||||
CLIPOBJ *CombinedClip;
|
CLIPOBJ *CombinedClip;
|
||||||
XLATEOBJ *XlateBrush;
|
XLATEOBJ *XlateBrush;
|
||||||
XLATEOBJ *XlatePen;
|
XLATEOBJ *XlatePen;
|
||||||
|
|
|
@ -23,22 +23,29 @@ static __inline INT GDI_ROUND(FLOAT val)
|
||||||
return (int)floor(val + 0.5);
|
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
|
/* Performs a world-to-viewport transformation on the specified point (which
|
||||||
* is in floating point format).
|
* is in floating point format).
|
||||||
*/
|
*/
|
||||||
static __inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
|
static __inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
|
||||||
{
|
{
|
||||||
FLOAT x, y;
|
FLOAT x, y;
|
||||||
|
XFORM xformWorld2Vport;
|
||||||
|
|
||||||
|
MatrixS2XForm(&xformWorld2Vport, &dc->DcLevel.mxWorldToDevice);
|
||||||
|
|
||||||
/* Perform the transformation */
|
/* Perform the transformation */
|
||||||
x = point->x;
|
x = point->x;
|
||||||
y = point->y;
|
y = point->y;
|
||||||
point->x = x * dc->DcLevel.xformWorld2Vport.eM11 +
|
point->x = x * xformWorld2Vport.eM11 +
|
||||||
y * dc->DcLevel.xformWorld2Vport.eM21 +
|
y * xformWorld2Vport.eM21 +
|
||||||
dc->DcLevel.xformWorld2Vport.eDx;
|
xformWorld2Vport.eDx;
|
||||||
point->y = x * dc->DcLevel.xformWorld2Vport.eM12 +
|
|
||||||
y * dc->DcLevel.xformWorld2Vport.eM22 +
|
point->y = x * xformWorld2Vport.eM12 +
|
||||||
dc->DcLevel.xformWorld2Vport.eDy;
|
y * xformWorld2Vport.eM22 +
|
||||||
|
xformWorld2Vport.eDy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Performs a viewport-to-world transformation on the specified point (which
|
/* 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) \
|
#define YLSTODS(Dc_Attr,ty) \
|
||||||
MulDiv((ty), (Dc_Attr)->szlViewportExt.cy, (Dc_Attr)->szlWindowExt.cy)
|
MulDiv((ty), (Dc_Attr)->szlViewportExt.cy, (Dc_Attr)->szlWindowExt.cy)
|
||||||
|
|
||||||
VOID FASTCALL XForm2MatrixS( MATRIX_S *, PXFORM);
|
|
||||||
VOID FASTCALL MatrixS2XForm( PXFORM, MATRIX_S *);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -122,10 +122,14 @@ CoordDPtoLP(PDC Dc, LPPOINT Point)
|
||||||
FLOAT x, y;
|
FLOAT x, y;
|
||||||
x = (FLOAT)Point->x;
|
x = (FLOAT)Point->x;
|
||||||
y = (FLOAT)Point->y;
|
y = (FLOAT)Point->y;
|
||||||
Point->x = x * Dc->DcLevel.xformVport2World.eM11 +
|
XFORM xformVport2World;
|
||||||
y * Dc->DcLevel.xformVport2World.eM21 + Dc->DcLevel.xformVport2World.eDx;
|
|
||||||
Point->y = x * Dc->DcLevel.xformVport2World.eM12 +
|
MatrixS2XForm(&xformVport2World, &Dc->DcLevel.mxDeviceToWorld);
|
||||||
y * Dc->DcLevel.xformVport2World.eM22 + Dc->DcLevel.xformVport2World.eDy;
|
|
||||||
|
Point->x = x * xformVport2World.eM11 +
|
||||||
|
y * xformVport2World.eM21 + xformVport2World.eDx;
|
||||||
|
Point->y = x * xformVport2World.eM12 +
|
||||||
|
y * xformVport2World.eM22 + xformVport2World.eDy;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -158,28 +162,34 @@ IntGdiModifyWorldTransform(PDC pDc,
|
||||||
DWORD Mode)
|
DWORD Mode)
|
||||||
{
|
{
|
||||||
ASSERT(pDc);
|
ASSERT(pDc);
|
||||||
|
XFORM xformWorld2Wnd;
|
||||||
|
|
||||||
switch(Mode)
|
switch(Mode)
|
||||||
{
|
{
|
||||||
case MWT_IDENTITY:
|
case MWT_IDENTITY:
|
||||||
pDc->DcLevel.xformWorld2Wnd.eM11 = 1.0f;
|
xformWorld2Wnd.eM11 = 1.0f;
|
||||||
pDc->DcLevel.xformWorld2Wnd.eM12 = 0.0f;
|
xformWorld2Wnd.eM12 = 0.0f;
|
||||||
pDc->DcLevel.xformWorld2Wnd.eM21 = 0.0f;
|
xformWorld2Wnd.eM21 = 0.0f;
|
||||||
pDc->DcLevel.xformWorld2Wnd.eM22 = 1.0f;
|
xformWorld2Wnd.eM22 = 1.0f;
|
||||||
pDc->DcLevel.xformWorld2Wnd.eDx = 0.0f;
|
xformWorld2Wnd.eDx = 0.0f;
|
||||||
pDc->DcLevel.xformWorld2Wnd.eDy = 0.0f;
|
xformWorld2Wnd.eDy = 0.0f;
|
||||||
|
XForm2MatrixS(&pDc->DcLevel.mxWorldToPage, &xformWorld2Wnd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MWT_LEFTMULTIPLY:
|
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;
|
break;
|
||||||
|
|
||||||
case MWT_RIGHTMULTIPLY:
|
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;
|
break;
|
||||||
|
|
||||||
case MWT_MAX+1: // Must be MWT_SET????
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -219,7 +229,7 @@ NtGdiGetTransform(HDC hDC,
|
||||||
switch(iXform)
|
switch(iXform)
|
||||||
{
|
{
|
||||||
case GdiWorldSpaceToPageSpace:
|
case GdiWorldSpaceToPageSpace:
|
||||||
*XForm = dc->DcLevel.xformWorld2Wnd;
|
MatrixS2XForm(XForm, &dc->DcLevel.mxWorldToPage);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -240,16 +250,20 @@ FASTCALL
|
||||||
CoordLPtoDP ( PDC Dc, LPPOINT Point )
|
CoordLPtoDP ( PDC Dc, LPPOINT Point )
|
||||||
{
|
{
|
||||||
FLOAT x, y;
|
FLOAT x, y;
|
||||||
|
XFORM xformWorld2Vport;
|
||||||
|
|
||||||
ASSERT ( Dc );
|
ASSERT(Dc);
|
||||||
ASSERT ( Point );
|
ASSERT(Point);
|
||||||
|
|
||||||
x = (FLOAT)Point->x;
|
x = (FLOAT)Point->x;
|
||||||
y = (FLOAT)Point->y;
|
y = (FLOAT)Point->y;
|
||||||
Point->x = x * Dc->DcLevel.xformWorld2Vport.eM11 +
|
|
||||||
y * Dc->DcLevel.xformWorld2Vport.eM21 + Dc->DcLevel.xformWorld2Vport.eDx;
|
MatrixS2XForm(&xformWorld2Vport, &Dc->DcLevel.mxWorldToDevice);
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -1359,9 +1359,9 @@ IntGdiCopyToSaveState(PDC dc, PDC newdc)
|
||||||
#endif
|
#endif
|
||||||
nDc_Attr->ptlCurrent = Dc_Attr->ptlCurrent;
|
nDc_Attr->ptlCurrent = Dc_Attr->ptlCurrent;
|
||||||
nDc_Attr->ptfxCurrent = Dc_Attr->ptfxCurrent;
|
nDc_Attr->ptfxCurrent = Dc_Attr->ptfxCurrent;
|
||||||
newdc->DcLevel.xformWorld2Wnd = dc->DcLevel.xformWorld2Wnd;
|
newdc->DcLevel.mxWorldToDevice = dc->DcLevel.mxWorldToDevice;
|
||||||
newdc->DcLevel.xformWorld2Vport = dc->DcLevel.xformWorld2Vport;
|
newdc->DcLevel.mxDeviceToWorld = dc->DcLevel.mxDeviceToWorld;
|
||||||
newdc->DcLevel.xformVport2World = dc->DcLevel.xformVport2World;
|
newdc->DcLevel.mxWorldToPage = dc->DcLevel.mxWorldToPage;
|
||||||
nDc_Attr->flXform = Dc_Attr->flXform;
|
nDc_Attr->flXform = Dc_Attr->flXform;
|
||||||
nDc_Attr->ptlWindowOrg = Dc_Attr->ptlWindowOrg;
|
nDc_Attr->ptlWindowOrg = Dc_Attr->ptlWindowOrg;
|
||||||
nDc_Attr->szlWindowExt = Dc_Attr->szlWindowExt;
|
nDc_Attr->szlWindowExt = Dc_Attr->szlWindowExt;
|
||||||
|
@ -1425,9 +1425,9 @@ IntGdiCopyFromSaveState(PDC dc, PDC dcs, HDC hDC)
|
||||||
#endif
|
#endif
|
||||||
Dc_Attr->ptlCurrent = sDc_Attr->ptlCurrent;
|
Dc_Attr->ptlCurrent = sDc_Attr->ptlCurrent;
|
||||||
Dc_Attr->ptfxCurrent = sDc_Attr->ptfxCurrent;
|
Dc_Attr->ptfxCurrent = sDc_Attr->ptfxCurrent;
|
||||||
dc->DcLevel.xformWorld2Wnd = dcs->DcLevel.xformWorld2Wnd;
|
dc->DcLevel.mxWorldToDevice = dcs->DcLevel.mxWorldToDevice;
|
||||||
dc->DcLevel.xformWorld2Vport = dcs->DcLevel.xformWorld2Vport;
|
dc->DcLevel.mxDeviceToWorld = dcs->DcLevel.mxDeviceToWorld;
|
||||||
dc->DcLevel.xformVport2World = dcs->DcLevel.xformVport2World;
|
dc->DcLevel.mxWorldToPage = dcs->DcLevel.mxWorldToPage;
|
||||||
Dc_Attr->flXform = sDc_Attr->flXform;
|
Dc_Attr->flXform = sDc_Attr->flXform;
|
||||||
Dc_Attr->ptlWindowOrg = sDc_Attr->ptlWindowOrg;
|
Dc_Attr->ptlWindowOrg = sDc_Attr->ptlWindowOrg;
|
||||||
Dc_Attr->szlWindowExt = sDc_Attr->szlWindowExt;
|
Dc_Attr->szlWindowExt = sDc_Attr->szlWindowExt;
|
||||||
|
@ -2435,6 +2435,7 @@ DC_AllocDC(PUNICODE_STRING Driver)
|
||||||
PDC_ATTR Dc_Attr;
|
PDC_ATTR Dc_Attr;
|
||||||
HDC hDC;
|
HDC hDC;
|
||||||
PWSTR Buf = NULL;
|
PWSTR Buf = NULL;
|
||||||
|
XFORM xformTemplate;
|
||||||
|
|
||||||
if (Driver != NULL)
|
if (Driver != NULL)
|
||||||
{
|
{
|
||||||
|
@ -2471,14 +2472,17 @@ DC_AllocDC(PUNICODE_STRING Driver)
|
||||||
if(!Dc_Attr) Dc_Attr = &NewDC->Dc_Attr;
|
if(!Dc_Attr) Dc_Attr = &NewDC->Dc_Attr;
|
||||||
|
|
||||||
NewDC->BaseObject.hHmgr = (HGDIOBJ) hDC; // Save the handle for this DC object.
|
NewDC->BaseObject.hHmgr = (HGDIOBJ) hDC; // Save the handle for this DC object.
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eM11 = 1.0f;
|
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eM12 = 0.0f;
|
xformTemplate.eM11 = 1.0f;
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eM21 = 0.0f;
|
xformTemplate.eM12 = 0.0f;
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eM22 = 1.0f;
|
xformTemplate.eM21 = 0.0f;
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eDx = 0.0f;
|
xformTemplate.eM22 = 1.0f;
|
||||||
NewDC->DcLevel.xformWorld2Wnd.eDy = 0.0f;
|
xformTemplate.eDx = 0.0f;
|
||||||
NewDC->DcLevel.xformWorld2Vport = NewDC->DcLevel.xformWorld2Wnd;
|
xformTemplate.eDy = 0.0f;
|
||||||
NewDC->DcLevel.xformVport2World = NewDC->DcLevel.xformWorld2Wnd;
|
XForm2MatrixS(&NewDC->DcLevel.mxWorldToDevice, &xformTemplate);
|
||||||
|
XForm2MatrixS(&NewDC->DcLevel.mxDeviceToWorld, &xformTemplate);
|
||||||
|
XForm2MatrixS(&NewDC->DcLevel.mxWorldToPage, &xformTemplate);
|
||||||
|
|
||||||
// Setup syncing bits for the dcattr data packets.
|
// Setup syncing bits for the dcattr data packets.
|
||||||
Dc_Attr->flXform = DEVICE_TO_PAGE_INVALID;
|
Dc_Attr->flXform = DEVICE_TO_PAGE_INVALID;
|
||||||
|
|
||||||
|
@ -2663,6 +2667,7 @@ DC_UpdateXforms(PDC dc)
|
||||||
FLOAT scaleX, scaleY;
|
FLOAT scaleX, scaleY;
|
||||||
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
PDC_ATTR Dc_Attr = dc->pDc_Attr;
|
||||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||||
|
XFORM xformWorld2Vport, xformWorld2Wnd, xformVport2World;
|
||||||
|
|
||||||
/* Construct a transformation to do the window-to-viewport conversion */
|
/* 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);
|
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;
|
xformWnd2Vport.eDy = (FLOAT)Dc_Attr->ptlViewportOrg.y - scaleY * (FLOAT)Dc_Attr->ptlWindowOrg.y;
|
||||||
|
|
||||||
/* Combine with the world transformation */
|
/* 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 */
|
/* Create inverse of world-to-viewport transformation */
|
||||||
if (DC_InvertXform(&dc->DcLevel.xformWorld2Vport, &dc->DcLevel.xformVport2World))
|
MatrixS2XForm(&xformVport2World, &dc->DcLevel.mxDeviceToWorld);
|
||||||
Dc_Attr->flXform &= ~DEVICE_TO_WORLD_INVALID;
|
if (DC_InvertXform(&xformWorld2Vport, &xformVport2World))
|
||||||
|
{
|
||||||
|
Dc_Attr->flXform &= ~DEVICE_TO_WORLD_INVALID;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
Dc_Attr->flXform |= DEVICE_TO_WORLD_INVALID;
|
{
|
||||||
|
Dc_Attr->flXform |= DEVICE_TO_WORLD_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
XForm2MatrixS(&dc->DcLevel.mxWorldToDevice, &xformWorld2Vport);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
|
|
|
@ -113,9 +113,10 @@ VOID
|
||||||
CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr)
|
CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
XForm2MatrixS( &dc->Dc_Attr.mxWorldToDevice, &dc->DcLevel.xformWorld2Vport);
|
dc->Dc_Attr.mxWorldToDevice = dc->DcLevel.mxWorldToDevice;
|
||||||
XForm2MatrixS( &dc->Dc_Attr.mxDevicetoWorld, &dc->DcLevel.xformVport2World);
|
dc->Dc_Attr.mxDevicetoWorld = dc->DcLevel.mxDeviceToWorld;
|
||||||
XForm2MatrixS( &dc->Dc_Attr.mxWorldToPage, &dc->DcLevel.xformWorld2Wnd);
|
dc->Dc_Attr.mxWorldToPage = dc->DcLevel.mxWorldToPage;
|
||||||
|
|
||||||
_SEH_TRY
|
_SEH_TRY
|
||||||
{
|
{
|
||||||
ProbeForWrite( Dc_Attr,
|
ProbeForWrite( Dc_Attr,
|
||||||
|
|
|
@ -540,8 +540,7 @@ IntRectangle(PDC dc,
|
||||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||||
|
|
||||||
/* Do we rotate or shear? */
|
/* Do we rotate or shear? */
|
||||||
// if (!(dc->DcLevel.mxWorldToDevice.flAccel & MXACC_DIAGONAL))
|
if (!(dc->DcLevel.mxWorldToDevice.flAccel & MX_SCALE))
|
||||||
if (dc->DcLevel.xformWorld2Vport.eM12 != 0. || dc->DcLevel.xformWorld2Vport.eM21 != 0.)
|
|
||||||
{
|
{
|
||||||
POINTL DestCoords[4];
|
POINTL DestCoords[4];
|
||||||
DestCoords[0].x = DestCoords[3].x = LeftRect;
|
DestCoords[0].x = DestCoords[3].x = LeftRect;
|
||||||
|
|
|
@ -120,7 +120,7 @@ PATH_FillPath( PDC dc, PPATH pPath )
|
||||||
* tests show that resetting the graphics mode to GM_COMPATIBLE does
|
* tests show that resetting the graphics mode to GM_COMPATIBLE does
|
||||||
* not reset the world transform.
|
* not reset the world transform.
|
||||||
*/
|
*/
|
||||||
xform = dc->DcLevel.xformWorld2Wnd;
|
MatrixS2XForm(&xform, &dc->DcLevel.mxWorldToPage);
|
||||||
|
|
||||||
/* Set MM_TEXT */
|
/* Set MM_TEXT */
|
||||||
// IntGdiSetMapMode( dc, MM_TEXT );
|
// IntGdiSetMapMode( dc, MM_TEXT );
|
||||||
|
@ -1337,7 +1337,8 @@ BOOL FASTCALL PATH_StrokePath(DC *dc, PPATH pPath)
|
||||||
IntGetViewportOrgEx(dc, &ptViewportOrg);
|
IntGetViewportOrgEx(dc, &ptViewportOrg);
|
||||||
IntGetWindowExtEx(dc, &szWindowExt);
|
IntGetWindowExtEx(dc, &szWindowExt);
|
||||||
IntGetWindowOrgEx(dc, &ptWindowOrg);
|
IntGetWindowOrgEx(dc, &ptWindowOrg);
|
||||||
xform = dc->DcLevel.xformWorld2Wnd;
|
|
||||||
|
MatrixS2XForm(&xform, &dc->DcLevel.mxWorldToPage);
|
||||||
|
|
||||||
/* Set MM_TEXT */
|
/* Set MM_TEXT */
|
||||||
Dc_Attr->iMapMode = MM_TEXT;
|
Dc_Attr->iMapMode = MM_TEXT;
|
||||||
|
@ -1464,7 +1465,7 @@ end:
|
||||||
Dc_Attr->ptlViewportOrg.y = ptViewportOrg.y;
|
Dc_Attr->ptlViewportOrg.y = ptViewportOrg.y;
|
||||||
|
|
||||||
/* Restore the world transform */
|
/* 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
|
/* If we've moved the current point then get its new position
|
||||||
which will be in device (MM_TEXT) co-ords, convert it to
|
which will be in device (MM_TEXT) co-ords, convert it to
|
||||||
|
|
|
@ -2611,6 +2611,7 @@ NtGdiGetGlyphOutline(
|
||||||
PVOID pvBuf = NULL;
|
PVOID pvBuf = NULL;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
FT_CharMap found = 0, charmap;
|
FT_CharMap found = 0, charmap;
|
||||||
|
XFORM xForm;
|
||||||
|
|
||||||
DPRINT("%p, %d, %08x, %p, %08lx, %p, %p\n", hdc, wch, iFormat, pgm,
|
DPRINT("%p, %d, %08x, %p, %08lx, %p, %p\n", hdc, wch, iFormat, pgm,
|
||||||
cjBuf, UnsafeBuf, pmat2);
|
cjBuf, UnsafeBuf, pmat2);
|
||||||
|
@ -2623,7 +2624,10 @@ NtGdiGetGlyphOutline(
|
||||||
}
|
}
|
||||||
Dc_Attr = dc->pDc_Attr;
|
Dc_Attr = dc->pDc_Attr;
|
||||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_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;
|
hFont = Dc_Attr->hlfntNew;
|
||||||
TextObj = TEXTOBJ_LockText(hFont);
|
TextObj = TEXTOBJ_LockText(hFont);
|
||||||
DC_UnlockDc(dc);
|
DC_UnlockDc(dc);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue