diff --git a/dlls/wineps/font.c b/dlls/wineps/font.c
index 7ca3510..42f6423 100644
--- a/dlls/wineps/font.c
+++ b/dlls/wineps/font.c
@@ -109,7 +109,7 @@
     afm = afmle->afm;
 
     physDev->font.afm = afm;
-    physDev->font.tm.tmHeight = YLSTODS(dc, lf->lfHeight);
+    physDev->font.tm.tmHeight = INTERNAL_YWSTODS(dc, lf->lfHeight);
     if(physDev->font.tm.tmHeight < 0) {
         physDev->font.tm.tmHeight *= - (afm->FullAscender - afm->Descender) /
 				       (afm->Ascender - afm->Descender);
@@ -206,7 +206,6 @@
     INT i;
     float width;
 
-    size->cy = YDSTOLS(dc, physDev->font.tm.tmHeight);
     width = 0.0;
 
     for(i = 0; i < count && str[i]; i++) {
@@ -216,7 +215,9 @@
     }
     width *= physDev->font.scale;
     TRACE("Width after scale (%f) is %f\n", physDev->font.scale, width);
-    size->cx = XDSTOLS(dc, width);
+
+    size->cx = GDI_ROUND((FLOAT)width * dc->xformVport2World.eM11);
+    size->cy = GDI_ROUND((FLOAT)physDev->font.tm.tmHeight  * dc->xformVport2World.eM22);
 
     return TRUE;
 }
diff --git a/dlls/wineps/graphics.c b/dlls/wineps/graphics.c
index 2849f22..3e8ea03 100644
--- a/dlls/wineps/graphics.c
+++ b/dlls/wineps/graphics.c
@@ -28,9 +28,10 @@
     TRACE("%d %d\n", x, y);
 
     PSDRV_SetPen(dc);
-    PSDRV_WriteMoveTo(dc, XLPTODP(dc, dc->CursPosX),
-		          YLPTODP(dc, dc->CursPosY));
-    PSDRV_WriteLineTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
+    PSDRV_WriteMoveTo(dc, INTERNAL_XWPTODP(dc, dc->CursPosX, dc->CursPosY),
+			  INTERNAL_YWPTODP(dc, dc->CursPosX, dc->CursPosY));
+    PSDRV_WriteLineTo(dc, INTERNAL_XWPTODP(dc, x, y),
+			  INTERNAL_YWPTODP(dc, x, y));
     PSDRV_DrawLine(dc);
 
     return TRUE;
@@ -43,15 +44,15 @@
 BOOL PSDRV_Rectangle( DC *dc, INT left, INT top, INT right,
 		       INT bottom )
 {
-    INT width = XLSTODS(dc, right - left);
-    INT height = YLSTODS(dc, bottom - top);
-
+    INT width;
+    INT height;
 
     TRACE("%d %d - %d %d\n", left, top, right, bottom);
-
-    PSDRV_WriteRectangle(dc, XLPTODP(dc, left), YLPTODP(dc, top),
+    width = INTERNAL_XWSTODS(dc, right - left);
+    height = INTERNAL_YWSTODS(dc, bottom - top);
+    PSDRV_WriteRectangle(dc, INTERNAL_XWPTODP(dc, left, top),
+			     INTERNAL_YWPTODP(dc, left, top),
 			     width, height);
-
     PSDRV_Brush(dc,0);
     PSDRV_SetPen(dc);
     PSDRV_DrawLine(dc);
@@ -216,10 +217,10 @@
 
     pt = pts;
     for(polyline = 0; polyline < polylines; polyline++) {
-        PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
+	PSDRV_WriteMoveTo(dc, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y));
 	pt++;
 	for(line = 1; line < counts[polyline]; line++) {
-	    PSDRV_WriteLineTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
+	    PSDRV_WriteLineTo(dc, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y));
 	    pt++;
 	}
     }
@@ -250,10 +251,10 @@
 
     pt = pts;
     for(polygon = 0; polygon < polygons; polygon++) {
-        PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
+	PSDRV_WriteMoveTo(dc, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y));
 	pt++;
 	for(line = 1; line < counts[polygon]; line++) {
-	    PSDRV_WriteLineTo(dc, XLPTODP(dc, pt->x), YLPTODP(dc, pt->y));
+	    PSDRV_WriteLineTo(dc, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y));
 	    pt++;
 	}
 	PSDRV_WriteClosePath(dc);
@@ -286,8 +287,8 @@
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
     PSCOLOR pscolor;
 
-    x = XLPTODP(dc, x);
-    y = YLPTODP(dc, y);
+    x = INTERNAL_XWPTODP(dc, x, y);
+    y = INTERNAL_YWPTODP(dc, x, y);
 
     PSDRV_WriteRectangle( dc, x, y, 0, 0 );
     PSDRV_CreateColor( physDev, &pscolor, color );
diff --git a/dlls/wineps/pen.c b/dlls/wineps/pen.c
index 45ffc2d..6710620 100644
--- a/dlls/wineps/pen.c
+++ b/dlls/wineps/pen.c
@@ -28,7 +28,7 @@
     TRACE("hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
     dc->hPen = hpen;
 
-    physDev->pen.width = XLSTODS(dc, pen->logpen.lopnWidth.x);
+    physDev->pen.width = INTERNAL_XWSTODS(dc, pen->logpen.lopnWidth.x);
     if(physDev->pen.width < 0)
         physDev->pen.width = -physDev->pen.width;
 
@@ -90,5 +90,3 @@
 
     return TRUE;
 }
-
-
diff --git a/dlls/wineps/text.c b/dlls/wineps/text.c
index 514b26b..0c1fc4c 100644
--- a/dlls/wineps/text.c
+++ b/dlls/wineps/text.c
@@ -36,10 +36,10 @@
     /* set clipping and/or draw background */
     if ((flags & (ETO_CLIPPED | ETO_OPAQUE)) && (lprect != NULL))
     {
-	rect.left = XLPTODP(dc, lprect->left);
-	rect.right = XLPTODP(dc, lprect->right);
-	rect.top = YLPTODP(dc, lprect->top);
-	rect.bottom = YLPTODP(dc, lprect->bottom);
+	rect.left = INTERNAL_XWPTODP(dc, lprect->left, lprect->top);
+	rect.right = INTERNAL_XWPTODP(dc, lprect->right, lprect->bottom);
+	rect.top = INTERNAL_YWPTODP(dc, lprect->left, lprect->top);
+	rect.bottom = INTERNAL_YWPTODP(dc, lprect->right, lprect->bottom);
 
 	PSDRV_WriteGSave(dc);
 	PSDRV_WriteRectangle(dc, rect.left, rect.top, rect.right - rect.left, 
@@ -92,17 +92,17 @@
 	y = dc->CursPosY;
     }
 
-    x = XLPTODP(dc, x);
-    y = YLPTODP(dc, y);
+    x = INTERNAL_XWPTODP(dc, x, y);
+    y = INTERNAL_YWPTODP(dc, x, y);
 
     GetTextExtentPoint32W(dc->hSelf, str, count, &sz);
-    sz.cx = XLSTODS(dc, sz.cx);
-    sz.cy = YLSTODS(dc, sz.cy);
-
+    sz.cx = INTERNAL_XWSTODS(dc, sz.cx);
+    sz.cy = INTERNAL_YWSTODS(dc, sz.cy);
     switch(dc->textAlign & (TA_LEFT | TA_CENTER | TA_RIGHT) ) {
     case TA_LEFT:
-        if(dc->textAlign & TA_UPDATECP)
-	    dc->CursPosX = XDPTOLP(dc, x + sz.cx);
+        if(dc->textAlign & TA_UPDATECP) {
+	    dc->CursPosX = INTERNAL_XDPTOWP(dc, x + sz.cx, y);
+	}
 	break;
 
     case TA_CENTER:
@@ -111,8 +111,9 @@
 
     case TA_RIGHT:
 	x -= sz.cx;
-	if(dc->textAlign & TA_UPDATECP)
-	    dc->CursPosX = XDPTOLP(dc, x);
+	if(dc->textAlign & TA_UPDATECP) {
+	    dc->CursPosX = INTERNAL_XDPTOWP(dc, x, y);
+	}
 	break;
     }
 
@@ -166,7 +167,7 @@
         /* Get the width of the text */
 
         PSDRV_GetTextExtentPoint(dc, strbuf, lstrlenW(strbuf), &size);
-        size.cx = XLSTODS(dc, size.cx);
+        size.cx = INTERNAL_XWSTODS(dc, size.cx);
 
         /* Do the underline */
 
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index a6455c4..1ebd62d 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -5,7 +5,7 @@
  */
 
 /*
- * FIXME: none of these functions obey the GM_ADVANCED
+ * FIXME: only some of these functions obey the GM_ADVANCED
  * graphics mode
  */
 
@@ -291,15 +291,26 @@
 X11DRV_LineTo( DC *dc, INT x, INT y )
 {
     X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
+    POINT start;
+    POINT end;
 
     if (X11DRV_SetupGCForPen( dc )) {
 	/* Update the pixmap from the DIB section */
 	X11DRV_LockDIBSection(dc, DIB_Status_GdiMod, FALSE);
-	TSXDrawLine(display, physDev->drawable, physDev->gc, 
-		  dc->DCOrgX + XLPTODP( dc, dc->CursPosX ),
-		  dc->DCOrgY + YLPTODP( dc, dc->CursPosY ),
-		  dc->DCOrgX + XLPTODP( dc, x ),
-		  dc->DCOrgY + YLPTODP( dc, y ) );
+
+	start.x = dc->CursPosX;
+	start.y = dc->CursPosY;
+	end.x = x;
+	end.y = y;
+	INTERNAL_LPTODP(dc,&start);
+	INTERNAL_LPTODP(dc,&end);
+
+	TSXDrawLine(display, physDev->drawable, physDev->gc,
+		  dc->DCOrgX + start.x,
+		  dc->DCOrgY + start.y,
+		  dc->DCOrgX + end.x,
+		  dc->DCOrgY + end.y);
+
 	/* Update the DIBSection from the pixmap */
 	X11DRV_UnlockDIBSection(dc, TRUE); 
     }
@@ -581,10 +592,10 @@
     TRACE("(%d %d %d %d)\n", 
     	left, top, right, bottom);
 
-    left   = XLPTODP( dc, left );
-    top    = YLPTODP( dc, top );
-    right  = XLPTODP( dc, right );
-    bottom = YLPTODP( dc, bottom );
+    left   = INTERNAL_XWPTODP( dc, left, top );
+    top    = INTERNAL_YWPTODP( dc, left, top );
+    right  = INTERNAL_XWPTODP( dc, right, bottom );
+    bottom = INTERNAL_YWPTODP( dc, right, bottom );
 
     if ((left == right) || (top == bottom)) return TRUE;
 
@@ -850,8 +861,8 @@
     Pixel pixel;
     X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
     
-    x = dc->DCOrgX + XLPTODP( dc, x );
-    y = dc->DCOrgY + YLPTODP( dc, y );
+    x = dc->DCOrgX + INTERNAL_XWPTODP( dc, x, y );
+    y = dc->DCOrgY + INTERNAL_YWPTODP( dc, x, y );
     pixel = X11DRV_PALETTE_ToPhysical( dc, color );
     
     TSXSetForeground( display, physDev->gc, pixel );
@@ -877,8 +888,8 @@
     int pixel;
     X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
 
-    x = dc->DCOrgX + XLPTODP( dc, x );
-    y = dc->DCOrgY + YLPTODP( dc, y );
+    x = dc->DCOrgX + INTERNAL_XWPTODP( dc, x, y );
+    y = dc->DCOrgY + INTERNAL_YWPTODP( dc, x, y );
     wine_tsx11_lock();
     if (dc->flags & DC_MEMORY)
     {
@@ -973,8 +984,8 @@
     }
     for (i = 0; i < count; i++)
     {
-        points[i].x = dc->DCOrgX + XLPTODP( dc, pt[i].x );
-        points[i].y = dc->DCOrgY + YLPTODP( dc, pt[i].y );
+	points[i].x = dc->DCOrgX + INTERNAL_XWPTODP( dc, pt[i].x, pt[i].y );
+	points[i].y = dc->DCOrgY + INTERNAL_YWPTODP( dc, pt[i].x, pt[i].y );
     }
 
     if (X11DRV_SetupGCForPen ( dc ))
@@ -1013,8 +1024,8 @@
     }
     for (i = 0; i < count; i++)
     {
-	points[i].x = dc->DCOrgX + XLPTODP( dc, pt[i].x );
-	points[i].y = dc->DCOrgY + YLPTODP( dc, pt[i].y );
+	points[i].x = dc->DCOrgX + INTERNAL_XWPTODP( dc, pt[i].x, pt[i].y );
+	points[i].y = dc->DCOrgY + INTERNAL_YWPTODP( dc, pt[i].x, pt[i].y );
     }
     points[count] = points[0];
 
@@ -1078,8 +1089,8 @@
 	{
 	    for (j = 0; j < counts[i]; j++)
 	    {
-		points[j].x = dc->DCOrgX + XLPTODP( dc, pt->x );
-		points[j].y = dc->DCOrgY + YLPTODP( dc, pt->y );
+		points[j].x = dc->DCOrgX + INTERNAL_XWPTODP( dc, pt->x, pt->y );
+		points[j].y = dc->DCOrgY + INTERNAL_YWPTODP( dc, pt->x, pt->y );
 		pt++;
 	    }
 	    points[j] = points[0];
@@ -1122,8 +1133,8 @@
         {
             for (j = 0; j < counts[i]; j++)
             {
-                points[j].x = dc->DCOrgX + XLPTODP( dc, pt->x );
-                points[j].y = dc->DCOrgY + YLPTODP( dc, pt->y );
+		points[j].x = dc->DCOrgX + INTERNAL_XWPTODP( dc, pt->x, pt->y );
+		points[j].y = dc->DCOrgY + INTERNAL_YWPTODP( dc, pt->x, pt->y );
                 pt++;
             }
             TSXDrawLines( display, physDev->drawable, physDev->gc,
diff --git a/graphics/x11drv/pen.c b/graphics/x11drv/pen.c
index 7d789a6..c037c93 100644
--- a/graphics/x11drv/pen.c
+++ b/graphics/x11drv/pen.c
@@ -33,8 +33,8 @@
     physDev->pen.endcap = pen->logpen.lopnStyle & PS_ENDCAP_MASK;
     physDev->pen.linejoin = pen->logpen.lopnStyle & PS_JOIN_MASK;
 
-    physDev->pen.width = (pen->logpen.lopnWidth.x * dc->vportExtX +
-                    dc->wndExtX / 2) / dc->wndExtX;
+    physDev->pen.width = GDI_ROUND((FLOAT)pen->logpen.lopnWidth.x *
+                                   dc->xformWorld2Vport.eM11 * 0.5);
     if (physDev->pen.width < 0) physDev->pen.width = -physDev->pen.width;
     if (physDev->pen.width == 1) physDev->pen.width = 0;  /* Faster */
     physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( dc, pen->logpen.lopnColor );    
diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c
index 98b0115..be159f8 100644
--- a/graphics/x11drv/text.c
+++ b/graphics/x11drv/text.c
@@ -87,24 +87,24 @@
 	      return FALSE;
 	    if (!X11DRV_GetTextExtentPoint( dc, wstr, count, &sz ))
 	      return FALSE;
-	    rect.left   = XLPTODP( dc, x );
-	    rect.right  = XLPTODP( dc, x+sz.cx );
-	    rect.top    = YLPTODP( dc, y );
-	    rect.bottom = YLPTODP( dc, y+sz.cy );
+	    rect.left   = INTERNAL_XWPTODP( dc, x, y );
+	    rect.right  = INTERNAL_XWPTODP( dc, x+sz.cx, y+sz.cy );
+	    rect.top    = INTERNAL_YWPTODP( dc, x, y );
+	    rect.bottom = INTERNAL_YWPTODP( dc, x+sz.cx, y+sz.cy );
 	}
 	else
 	{
-	    rect.left   = XLPTODP( dc, lprect->left );
-	    rect.right  = XLPTODP( dc, lprect->right );
-	    rect.top    = YLPTODP( dc, lprect->top );
-	    rect.bottom = YLPTODP( dc, lprect->bottom );
+	    rect.left   = INTERNAL_XWPTODP( dc, lprect->left, lprect->top );
+	    rect.right  = INTERNAL_XWPTODP( dc, lprect->right, lprect->bottom );
+	    rect.top    = INTERNAL_YWPTODP( dc, lprect->left, lprect->top );
+	    rect.bottom = INTERNAL_YWPTODP( dc, lprect->right, lprect->bottom );
 	}
 	if (rect.right < rect.left) SWAP_INT( rect.left, rect.right );
 	if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
     }
 
-    x = XLPTODP( dc, x );
-    y = YLPTODP( dc, y );
+    x = INTERNAL_XWPTODP( dc, x, y );
+    y = INTERNAL_YWPTODP( dc, x, y );
 
     TRACE("\treal coord: x=%i, y=%i, rect=(%d,%d - %d,%d)\n",
 			  x, y, rect.left, rect.top, rect.right, rect.bottom);
@@ -126,16 +126,15 @@
 
     if (lpDx) /* have explicit character cell x offsets in logical coordinates */
     {
-	int extra = dc->wndExtX / 2;
         for (i = width = 0; i < count; i++) width += lpDx[i];
-	width = (width * dc->vportExtX + extra ) / dc->wndExtX;
+        width = INTERNAL_XWSTODS(dc, width);
     }
     else
     {
         SIZE sz;
         if (!X11DRV_GetTextExtentPoint( dc, wstr, count, &sz ))
 	    return FALSE;
-	width = XLSTODS(dc, sz.cx);
+	width = INTERNAL_XWSTODS(dc, sz.cx);
     }
     ascent = pfo->lpX11Trans ? pfo->lpX11Trans->ascent : font->ascent;
     descent = pfo->lpX11Trans ? pfo->lpX11Trans->descent : font->descent;
@@ -148,16 +147,16 @@
     {
       case TA_LEFT:
 	  if (dc->textAlign & TA_UPDATECP) {
-	      dc->CursPosX = XDPTOLP( dc, x + xwidth );
-	      dc->CursPosY = YDPTOLP( dc, y - ywidth );
+	      dc->CursPosX = INTERNAL_XDPTOWP( dc, x + xwidth, y - ywidth );
+	      dc->CursPosY = INTERNAL_YDPTOWP( dc, x + xwidth, y - ywidth );
 	  }
 	  break;
       case TA_RIGHT:
 	  x -= xwidth;
 	  y += ywidth;
 	  if (dc->textAlign & TA_UPDATECP) {
-	      dc->CursPosX = XDPTOLP( dc, x );
-	      dc->CursPosY = YDPTOLP( dc, y );
+	      dc->CursPosX = INTERNAL_XDPTOWP( dc, x, y );
+	      dc->CursPosY = INTERNAL_YDPTOWP( dc, x, y );
 	  }
 	  break;
       case TA_CENTER:
@@ -251,9 +250,11 @@
         delta = i = 0;
 	if( lpDx ) /* explicit character widths */
 	{
-	    const long ve_we = dc->vportExtX*0x10000 / dc->wndExtX;
+	    long ve_we;
 	    unsigned short err = 0;
 
+	    ve_we = (LONG)(dc->xformWorld2Vport.eM11 * 0x10000);
+
 	    while (i < count)
 	    {
 		/* initialize text item with accumulated delta */
@@ -329,7 +330,9 @@
 		pfo, display, physDev->drawable, physDev->gc,
 		x_i, y_i, &str2b[i], 1);
 	if (lpDx)
-	  offset += XLSTODS(dc, lpDx[i]);
+	{
+	  offset += INTERNAL_XWSTODS(dc, lpDx[i]);
+	}
 	else
 	{
 	  offset += (double) (font->per_char ?
@@ -408,10 +411,11 @@
 	    int info_width;
 	    X11DRV_cptable[pfo->fi->cptable].pTextExtents( pfo, p,
 				count, &dir, &ascent, &descent, &info_width );
-	    size->cx = abs((info_width + dc->breakRem + count * 
-			    dc->charExtra) * dc->wndExtX / dc->vportExtX);
-	    size->cy = abs((pfo->fs->ascent + pfo->fs->descent) * 
-			   dc->wndExtY / dc->vportExtY);
+
+	   size->cx = abs((info_width + dc->breakRem + count *
+			   dc->charExtra) * (int)dc->xformWorld2Vport.eM11);
+	   size->cy = abs((pfo->fs->ascent + pfo->fs->descent) *
+			  (int)dc->xformWorld2Vport.eM22);
 	} else {
 	    INT i;
 	    float x = 0.0, y = 0.0;
@@ -426,8 +430,8 @@
 	    x *= pfo->lpX11Trans->pixelsize / 1000.0;
 	    y *= pfo->lpX11Trans->pixelsize / 1000.0; 
 	    size->cx = fabs((x + dc->breakRem + count * dc->charExtra) *
-			     dc->wndExtX / dc->vportExtX);
-	    size->cy = fabs(y * dc->wndExtY / dc->vportExtY);
+			    dc->xformVport2World.eM11);
+	    size->cy = fabs(y * dc->xformVport2World.eM22);
 	}
 	size->cx *= pfo->rescale;
 	size->cy *= pfo->rescale;
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 88acae1..3ab0e96 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -3055,20 +3055,13 @@
     /* FIXME - check that the other drivers do this correctly */
     if (lf.lfWidth)
     {
-	int vpt = abs(dc->vportExtX);
-	int wnd = abs(dc->wndExtX);
-	lf.lfWidth = (abs(lf.lfWidth) * vpt + (wnd>>1))/wnd;
+	lf.lfWidth = GDI_ROUND((FLOAT)lf.lfWidth * fabs(dc->xformWorld2Vport.eM11));
 	if (lf.lfWidth == 0)
 	    lf.lfWidth = 1; /* Minimum width */
     }
     if (lf.lfHeight)
     {
-	int vpt = abs(dc->vportExtY);
-	int wnd = abs(dc->wndExtY);
-	if (lf.lfHeight > 0)
-	    lf.lfHeight = (lf.lfHeight * vpt + (wnd>>1))/wnd;
-	else
-	    lf.lfHeight = (lf.lfHeight * vpt - (wnd>>1))/wnd;
+	lf.lfHeight = GDI_ROUND((FLOAT)lf.lfHeight * fabs(dc->xformWorld2Vport.eM22));
 
 	if (lf.lfHeight == 0)
 	    lf.lfHeight = MIN_FONT_SIZE;
diff --git a/include/gdi.h b/include/gdi.h
index 6dbc8a7..b0f6ccd 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -413,6 +413,73 @@
     point->y = GDI_ROUND(floatPoint.y);
 }
 
+
+/* Performs a world-to-viewport transformation on the specified point (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_XWPTODP(DC *dc, INT x, INT y)
+{
+    FLOAT_POINT floatPoint;
+
+    /* Perform operation with floating point */
+    floatPoint.x=(FLOAT)x;
+    floatPoint.y=(FLOAT)y;
+    INTERNAL_LPTODP_FLOAT(dc, &floatPoint);
+
+    /* Round to integers */
+    return GDI_ROUND(floatPoint.x);
+}
+
+/* Performs a world-to-viewport transformation on the specified point (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_YWPTODP(DC *dc, INT x, INT y)
+{
+    FLOAT_POINT floatPoint;
+
+    /* Perform operation with floating point */
+    floatPoint.x=(FLOAT)x;
+    floatPoint.y=(FLOAT)y;
+    INTERNAL_LPTODP_FLOAT(dc, &floatPoint);
+
+    /* Round to integers */
+    return GDI_ROUND(floatPoint.y);
+}
+
+
+/* Performs a viewport-to-world transformation on the specified point (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_XDPTOWP(DC *dc, INT x, INT y)
+{
+    FLOAT_POINT floatPoint;
+
+    /* Perform operation with floating point */
+    floatPoint.x=(FLOAT)x;
+    floatPoint.y=(FLOAT)y;
+    INTERNAL_DPTOLP_FLOAT(dc, &floatPoint);
+
+    /* Round to integers */
+    return GDI_ROUND(floatPoint.x);
+}
+
+/* Performs a viewport-to-world transformation on the specified point (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_YDPTOWP(DC *dc, INT x, INT y)
+{
+    FLOAT_POINT floatPoint;
+
+    /* Perform operation with floating point */
+    floatPoint.x=(FLOAT)x;
+    floatPoint.y=(FLOAT)y;
+    INTERNAL_DPTOLP_FLOAT(dc, &floatPoint);
+
+    /* Round to integers */
+    return GDI_ROUND(floatPoint.y);
+}
+
+
 #define XDPTOLP(dc,x) \
     (MulDiv(((x)-(dc)->vportOrgX), (dc)->wndExtX, (dc)->vportExtX) + (dc)->wndOrgX)
 #define YDPTOLP(dc,y) \
@@ -422,6 +489,60 @@
 #define YLPTODP(dc,y) \
     (MulDiv(((y)-(dc)->wndOrgY), (dc)->vportExtY, (dc)->wndExtY) + (dc)->vportOrgY)
 
+
+
+  /* World -> Device size conversion */
+
+/* Performs a world-to-viewport transformation on the specified width (which
+ * is in floating point format).
+ */
+static inline void WINE_UNUSED INTERNAL_XWSTODS_FLOAT(DC *dc, FLOAT *width)
+{
+    /* Perform the transformation */
+    *width = *width * dc->xformWorld2Vport.eM11;
+}
+
+/* Performs a world-to-viewport transformation on the specified width (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_XWSTODS(DC *dc, INT width)
+{
+    FLOAT floatWidth;
+
+    /* Perform operation with floating point */
+    floatWidth = (FLOAT)width;
+    INTERNAL_XWSTODS_FLOAT(dc, &floatWidth);
+
+    /* Round to integers */
+    return GDI_ROUND(floatWidth);
+}
+
+
+/* Performs a world-to-viewport transformation on the specified size (which
+ * is in floating point format).
+ */
+static inline void WINE_UNUSED INTERNAL_YWSTODS_FLOAT(DC *dc, FLOAT *height)
+{
+    /* Perform the transformation */
+    *height = *height * dc->xformWorld2Vport.eM22;
+}
+
+/* Performs a world-to-viewport transformation on the specified size (which
+ * is in integer format).
+ */
+static inline INT WINE_UNUSED INTERNAL_YWSTODS(DC *dc, INT height)
+{
+    FLOAT floatHeight;
+
+    /* Perform operation with floating point */
+    floatHeight = (FLOAT)height;
+    INTERNAL_XWSTODS_FLOAT(dc, &floatHeight);
+
+    /* Round to integers */
+    return GDI_ROUND(floatHeight);
+}
+
+
   /* Device <-> logical size conversion */
 
 #define XDSTOLS(dc,x) \
