/* * GDI mapping mode functions * * Copyright 1993 Alexandre Julliard */ #include #include "gdi.h" #include "metafile.h" #include "stddebug.h" /* #define DEBUG_GDI */ #include "debug.h" /*********************************************************************** * MAPPING_FixIsotropic * * Fix viewport extensions for isotropic mode. */ void MAPPING_FixIsotropic( DC * dc ) { double xdim = (double)dc->w.VportExtX * dc->w.devCaps->horzSize / (dc->w.devCaps->horzRes * dc->w.WndExtX); double ydim = (double)dc->w.VportExtY * dc->w.devCaps->vertSize / (dc->w.devCaps->vertRes * dc->w.WndExtY); if (xdim > ydim) { dc->w.VportExtX = dc->w.VportExtX * fabs( ydim / xdim ); if (!dc->w.VportExtX) dc->w.VportExtX = 1; } else { dc->w.VportExtY = dc->w.VportExtY * fabs( xdim / ydim ); if (!dc->w.VportExtY) dc->w.VportExtY = 1; } } /*********************************************************************** * DPtoLP16 (GDI.67) */ BOOL16 DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; while (count--) { points->x = XDPTOLP( dc, points->x ); points->y = YDPTOLP( dc, points->y ); points++; } return TRUE; } /*********************************************************************** * DPtoLP32 (GDI32.65) */ BOOL32 DPtoLP32( HDC32 hdc, LPPOINT32 points, INT32 count ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; while (count--) { points->x = XDPTOLP( dc, points->x ); points->y = YDPTOLP( dc, points->y ); points++; } return TRUE; } /*********************************************************************** * LPtoDP16 (GDI.99) */ BOOL16 LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; while (count--) { points->x = XLPTODP( dc, points->x ); points->y = YLPTODP( dc, points->y ); points++; } return TRUE; } /*********************************************************************** * LPtoDP32 (GDI32.247) */ BOOL32 LPtoDP32( HDC32 hdc, LPPOINT32 points, INT32 count ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; while (count--) { points->x = XLPTODP( dc, points->x ); points->y = YLPTODP( dc, points->y ); points++; } return TRUE; } /*********************************************************************** * SetMapMode (GDI.3) */ WORD SetMapMode( HDC hdc, WORD mode ) { WORD prevMode; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return 0; MF_MetaParam1(dc, META_SETMAPMODE, mode); return 1; } dprintf_gdi(stddeb, "SetMapMode: %04x %d\n", hdc, mode ); prevMode = dc->w.MapMode; switch(mode) { case MM_TEXT: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = 1; dc->w.WndExtY = 1; dc->w.VportExtX = 1; dc->w.VportExtY = 1; break; case MM_LOMETRIC: case MM_ISOTROPIC: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = dc->w.devCaps->horzSize; dc->w.WndExtY = dc->w.devCaps->vertSize; dc->w.VportExtX = dc->w.devCaps->horzRes / 10; dc->w.VportExtY = dc->w.devCaps->vertRes / -10; break; case MM_HIMETRIC: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = dc->w.devCaps->horzSize * 10; dc->w.WndExtY = dc->w.devCaps->vertSize * 10; dc->w.VportExtX = dc->w.devCaps->horzRes / 10; dc->w.VportExtY = dc->w.devCaps->vertRes / -10; break; case MM_LOENGLISH: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = dc->w.devCaps->horzSize; dc->w.WndExtY = dc->w.devCaps->vertSize; dc->w.VportExtX = (short)(254L * dc->w.devCaps->horzRes / 1000); dc->w.VportExtY = (short)(-254L * dc->w.devCaps->vertRes / 1000); break; case MM_HIENGLISH: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = dc->w.devCaps->horzSize * 10; dc->w.WndExtY = dc->w.devCaps->vertSize * 10; dc->w.VportExtX = (short)(254L * dc->w.devCaps->horzRes / 1000); dc->w.VportExtY = (short)(-254L * dc->w.devCaps->vertRes / 1000); break; case MM_TWIPS: dc->w.WndOrgX = dc->w.WndOrgY = 0; dc->w.VportOrgX = dc->w.VportOrgY = 0; dc->w.WndExtX = (short)(144L * dc->w.devCaps->horzSize / 10); dc->w.WndExtY = (short)(144L * dc->w.devCaps->vertSize / 10); dc->w.VportExtX = (short)(254L * dc->w.devCaps->horzRes / 1000); dc->w.VportExtY = (short)(-254L * dc->w.devCaps->vertRes / 1000); break; case MM_ANISOTROPIC: break; default: return prevMode; } dc->w.MapMode = mode; return prevMode; } /*********************************************************************** * SetViewportExt (GDI.14) */ DWORD SetViewportExt( HDC16 hdc, INT16 x, INT16 y ) { SIZE16 size; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_SETVIEWPORTEXT, x, y); return 0; } size.cx = dc->w.VportExtX; size.cy = dc->w.VportExtY; if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return MAKELONG( size.cx, size.cy ); if (!x || !y) return 0; dc->w.VportExtX = x; dc->w.VportExtY = y; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return MAKELONG( size.cx, size.cy ); } /*********************************************************************** * SetViewportExtEx16 (GDI.479) */ BOOL16 SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (size) { size->cx = dc->w.VportExtX; size->cy = dc->w.VportExtY; } if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return TRUE; if (!x || !y) return FALSE; dc->w.VportExtX = x; dc->w.VportExtY = y; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return TRUE; } /*********************************************************************** * SetViewportExtEx32 (GDI32.340) */ BOOL32 SetViewportExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size ) { SIZE16 size16; BOOL16 ret = SetViewportExtEx16( (HDC16)hdc, (INT16)x, (INT16)y, &size16 ); if (size) CONV_SIZE16TO32( &size16, size ); return ret; } /*********************************************************************** * SetViewportOrg (GDI.13) */ DWORD SetViewportOrg( HDC16 hdc, INT16 x, INT16 y ) { POINT16 pt; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_SETVIEWPORTORG, x, y); return 0; } pt.x = dc->w.VportOrgX; pt.y = dc->w.VportOrgY; dc->w.VportOrgX = x; dc->w.VportOrgY = y; return pt.x | (pt.y << 16); } /*********************************************************************** * SetViewportOrgEx16 (GDI.480) */ BOOL16 SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (pt) { pt->x = dc->w.VportOrgX; pt->y = dc->w.VportOrgY; } dc->w.VportOrgX = x; dc->w.VportOrgY = y; return TRUE; } /*********************************************************************** * SetViewportOrgEx32 (GDI32.341) */ BOOL32 SetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt ) { POINT16 pt16; BOOL16 ret = SetViewportOrgEx16( (HDC16)hdc, (INT16)x, (INT16)y, &pt16 ); if (pt) CONV_POINT16TO32( &pt16, pt ); return ret; } /*********************************************************************** * SetWindowExt (GDI.12) */ DWORD SetWindowExt( HDC16 hdc, INT16 x, INT16 y ) { SIZE16 size; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_SETWINDOWEXT, x, y); return 0; } size.cx = dc->w.WndExtX; size.cy = dc->w.WndExtY; if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return MAKELONG( size.cx, size.cy ); if (!x || !y) return 0; dc->w.WndExtX = x; dc->w.WndExtY = y; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return MAKELONG( size.cx, size.cy ); } /*********************************************************************** * SetWindowExtEx16 (GDI.481) */ BOOL16 SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (size) { size->cx = dc->w.WndExtX; size->cy = dc->w.WndExtY; } if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return TRUE; if (!x || !y) return FALSE; dc->w.WndExtX = x; dc->w.WndExtY = y; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return TRUE; } /*********************************************************************** * SetWindowExtEx32 (GDI32.344) */ BOOL32 SetWindowExtEx32( HDC32 hdc, INT32 x, INT32 y, LPSIZE32 size ) { SIZE16 size16; BOOL16 ret = SetWindowExtEx16( (HDC16)hdc, (INT16)x, (INT16)y, &size16 ); if (size) CONV_SIZE16TO32( &size16, size ); return ret; } /*********************************************************************** * SetWindowOrg (GDI.11) */ DWORD SetWindowOrg( HDC16 hdc, INT16 x, INT16 y ) { POINT16 pt; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_SETWINDOWORG, x, y); return 0; } pt.x = dc->w.WndOrgX; pt.y = dc->w.WndOrgY; dc->w.WndOrgX = x; dc->w.WndOrgY = y; return MAKELONG( pt.x, pt.y ); } /*********************************************************************** * SetWindowOrgEx16 (GDI.482) */ BOOL16 SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (pt) { pt->x = dc->w.WndOrgX; pt->y = dc->w.WndOrgY; } dc->w.WndOrgX = x; dc->w.WndOrgY = y; return TRUE; } /*********************************************************************** * SetWindowOrgEx32 (GDI32.345) */ BOOL32 SetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt ) { POINT16 pt16; BOOL16 ret = SetWindowOrgEx16( (HDC16)hdc, (INT16)x, (INT16)y, &pt16 ); if (pt) CONV_POINT16TO32( &pt16, pt ); return ret; } /*********************************************************************** * OffsetViewportOrg (GDI.17) */ DWORD OffsetViewportOrg( HDC16 hdc, INT16 x, INT16 y ) { POINT16 pt; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_OFFSETVIEWPORTORG, x, y); return 0; } pt.x = dc->w.VportOrgX; pt.y = dc->w.VportOrgY; dc->w.VportOrgX += x; dc->w.VportOrgY += y; return pt.x | (pt.y << 16); } /*********************************************************************** * OffsetViewportOrgEx16 (GDI.476) */ BOOL16 OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (pt) { pt->x = dc->w.VportOrgX; pt->y = dc->w.VportOrgY; } dc->w.VportOrgX += x; dc->w.VportOrgY += y; return TRUE; } /*********************************************************************** * OffsetViewportOrgEx32 (GDI32.257) */ BOOL32 OffsetViewportOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt ) { POINT16 pt16; BOOL16 ret = OffsetViewportOrgEx16( (HDC16)hdc, (INT16)x, (INT16)y, &pt16); if (pt) CONV_POINT16TO32( &pt16, pt ); return ret; } /*********************************************************************** * OffsetWindowOrg (GDI.15) */ DWORD OffsetWindowOrg( HDC16 hdc, INT16 x, INT16 y ) { POINT16 pt; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam2(dc, META_OFFSETWINDOWORG, x, y); return 0; } pt.x = dc->w.WndOrgX; pt.y = dc->w.WndOrgY; dc->w.WndOrgX += x; dc->w.WndOrgY += y; return pt.x | (pt.y << 16); } /*********************************************************************** * OffsetWindowOrgEx16 (GDI.477) */ BOOL16 OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (pt) { pt->x = dc->w.WndOrgX; pt->y = dc->w.WndOrgY; } dc->w.WndOrgX += x; dc->w.WndOrgY += y; return TRUE; } /*********************************************************************** * OffsetWindowOrgEx32 (GDI32.258) */ BOOL32 OffsetWindowOrgEx32( HDC32 hdc, INT32 x, INT32 y, LPPOINT32 pt ) { POINT16 pt16; BOOL16 ret = OffsetWindowOrgEx16( (HDC16)hdc, (INT16)x, (INT16)y, &pt16 ); if (pt) CONV_POINT16TO32( &pt16, pt ); return ret; } /*********************************************************************** * ScaleViewportExt (GDI.18) */ DWORD ScaleViewportExt( HDC16 hdc, INT16 xNum, INT16 xDenom, INT16 yNum, INT16 yDenom ) { SIZE16 size; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam4(dc, META_SCALEVIEWPORTEXT, xNum, xDenom, yNum, yDenom); return 0; } size.cx = dc->w.VportExtX; size.cy = dc->w.VportExtY; if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return size.cx | (size.cy << 16); if (!xNum || !xDenom || !xNum || !yDenom) return 0; dc->w.VportExtX = (dc->w.VportExtX * xNum) / xDenom; dc->w.VportExtY = (dc->w.VportExtY * yNum) / yDenom; if (dc->w.VportExtX == 0) dc->w.VportExtX = 1; if (dc->w.VportExtY == 0) dc->w.VportExtY = 1; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return size.cx | (size.cy << 16); } /*********************************************************************** * ScaleViewportExtEx16 (GDI.484) */ BOOL16 ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom, INT16 yNum, INT16 yDenom, LPSIZE16 size ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (size) { size->cx = dc->w.VportExtX; size->cy = dc->w.VportExtY; } if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return TRUE; if (!xNum || !xDenom || !xNum || !yDenom) return FALSE; dc->w.VportExtX = (dc->w.VportExtX * xNum) / xDenom; dc->w.VportExtY = (dc->w.VportExtY * yNum) / yDenom; if (dc->w.VportExtX == 0) dc->w.VportExtX = 1; if (dc->w.VportExtY == 0) dc->w.VportExtY = 1; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return TRUE; } /*********************************************************************** * ScaleViewportExtEx32 (GDI32.293) */ BOOL32 ScaleViewportExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom, INT32 yNum, INT32 yDenom, LPSIZE32 size ) { SIZE16 size16; BOOL16 ret = ScaleViewportExtEx16( (HDC16)hdc, (INT16)xNum, (INT16)xDenom, (INT16)yNum, (INT16)yDenom, &size16 ); if (size) CONV_SIZE16TO32( &size16, size ); return ret; } /*********************************************************************** * ScaleWindowExt (GDI.16) */ DWORD ScaleWindowExt( HDC16 hdc, INT16 xNum, INT16 xDenom, INT16 yNum, INT16 yDenom ) { SIZE16 size; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) { dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); if (!dc) return FALSE; MF_MetaParam4(dc, META_SCALEWINDOWEXT, xNum, xDenom, yNum, yDenom); return 0; } size.cx = dc->w.WndExtX; size.cy = dc->w.WndExtY; if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return size.cx | (size.cy << 16); if (!xNum || !xDenom || !xNum || !yDenom) return FALSE; dc->w.WndExtX = (dc->w.WndExtX * xNum) / xDenom; dc->w.WndExtY = (dc->w.WndExtY * yNum) / yDenom; if (dc->w.WndExtX == 0) dc->w.WndExtX = 1; if (dc->w.WndExtY == 0) dc->w.WndExtY = 1; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return size.cx | (size.cy << 16); } /*********************************************************************** * ScaleWindowExtEx16 (GDI.485) */ BOOL16 ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom, INT16 yNum, INT16 yDenom, LPSIZE16 size ) { DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; if (size) { size->cx = dc->w.WndExtX; size->cy = dc->w.WndExtY; } if ((dc->w.MapMode != MM_ISOTROPIC) && (dc->w.MapMode != MM_ANISOTROPIC)) return TRUE; if (!xNum || !xDenom || !xNum || !yDenom) return FALSE; dc->w.WndExtX = (dc->w.WndExtX * xNum) / xDenom; dc->w.WndExtY = (dc->w.WndExtY * yNum) / yDenom; if (dc->w.WndExtX == 0) dc->w.WndExtX = 1; if (dc->w.WndExtY == 0) dc->w.WndExtY = 1; if (dc->w.MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); return TRUE; } /*********************************************************************** * ScaleWindowExtEx32 (GDI32.294) */ BOOL32 ScaleWindowExtEx32( HDC32 hdc, INT32 xNum, INT32 xDenom, INT32 yNum, INT32 yDenom, LPSIZE32 size ) { SIZE16 size16; BOOL16 ret = ScaleWindowExtEx16( (HDC16)hdc, (INT16)xNum, (INT16)xDenom, (INT16)yNum, (INT16)yDenom, &size16 ); if (size) CONV_SIZE16TO32( &size16, size ); return ret; }