Implement ResetDC and PHYSICALOFFSET[X|Y] devcaps.
Fixes to MergeDevmodes.

diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c
index 9e3192c..7aaa66f 100644
--- a/dlls/wineps/init.c
+++ b/dlls/wineps/init.c
@@ -138,6 +138,94 @@
 }
 
 
+static void PSDRV_UpdateDevCaps( PSDRV_PDEVICE *physDev )
+{
+    PAGESIZE *page;
+    INT width = 0, height = 0;
+    
+    if(physDev->Devmode->dmPublic.dmFields & DM_PAPERSIZE) {
+        for(page = physDev->pi->ppd->PageSizes; page; page = page->next) {
+	    if(page->WinPage == physDev->Devmode->dmPublic.u1.s1.dmPaperSize)
+	        break;
+	}
+
+	if(!page) {
+	    FIXME("Can't find page\n");
+	    physDev->ImageableArea.left = 0;
+	    physDev->ImageableArea.right = 0;
+	    physDev->ImageableArea.bottom = 0;
+	    physDev->ImageableArea.top = 0;
+	    physDev->PageSize.cx = 0;
+	    physDev->PageSize.cy = 0;
+	} else if(page->ImageableArea) {
+	  /* physDev sizes in device units; ppd sizes in 1/72" */
+	    physDev->ImageableArea.left = page->ImageableArea->llx *
+	      physDev->logPixelsX / 72;
+	    physDev->ImageableArea.right = page->ImageableArea->urx *
+	      physDev->logPixelsX / 72;
+	    physDev->ImageableArea.bottom = page->ImageableArea->lly *
+	      physDev->logPixelsY / 72;
+	    physDev->ImageableArea.top = page->ImageableArea->ury *
+	      physDev->logPixelsY / 72;
+	    physDev->PageSize.cx = page->PaperDimension->x *
+	      physDev->logPixelsX / 72;
+	    physDev->PageSize.cy = page->PaperDimension->y *
+	      physDev->logPixelsY / 72;
+	} else {
+	    physDev->ImageableArea.left = physDev->ImageableArea.bottom = 0;
+	    physDev->ImageableArea.right = physDev->PageSize.cx =
+	      page->PaperDimension->x * physDev->logPixelsX / 72;
+	    physDev->ImageableArea.top = physDev->PageSize.cy =
+	      page->PaperDimension->y * physDev->logPixelsY / 72;
+	}
+    } else if((physDev->Devmode->dmPublic.dmFields & DM_PAPERLENGTH) &&
+	      (physDev->Devmode->dmPublic.dmFields & DM_PAPERWIDTH)) {
+      /* physDev sizes in device units; Devmode sizes in 1/10 mm */
+        physDev->ImageableArea.left = physDev->ImageableArea.bottom = 0;
+	physDev->ImageableArea.right = physDev->PageSize.cx =
+	  physDev->Devmode->dmPublic.u1.s1.dmPaperWidth *
+	  physDev->logPixelsX / 254;
+	physDev->ImageableArea.top = physDev->PageSize.cy =
+	  physDev->Devmode->dmPublic.u1.s1.dmPaperLength *
+	  physDev->logPixelsY / 254;
+    } else {
+        FIXME("Odd dmFields %lx\n", physDev->Devmode->dmPublic.dmFields);
+	physDev->ImageableArea.left = 0;
+	physDev->ImageableArea.right = 0;
+	physDev->ImageableArea.bottom = 0;
+	physDev->ImageableArea.top = 0;
+	physDev->PageSize.cx = 0;
+	physDev->PageSize.cy = 0;
+    }
+
+    TRACE("ImageableArea = %d,%d - %d,%d: PageSize = %ldx%ld\n",
+	  physDev->ImageableArea.left, physDev->ImageableArea.bottom,
+	  physDev->ImageableArea.right, physDev->ImageableArea.top,
+	  physDev->PageSize.cx, physDev->PageSize.cy);
+
+    /* these are in device units */
+    width = physDev->ImageableArea.right - physDev->ImageableArea.left;
+    height = physDev->ImageableArea.top - physDev->ImageableArea.bottom;
+
+    if(physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_PORTRAIT) {
+        physDev->horzRes = width;
+        physDev->vertRes = height;
+    } else {
+        physDev->horzRes = height;
+        physDev->vertRes = width;
+    }
+
+    /* these are in mm */
+    physDev->horzSize = (physDev->horzRes * 25.4) / physDev->logPixelsX;
+    physDev->vertSize = (physDev->vertRes * 25.4) / physDev->logPixelsY;
+
+    TRACE("devcaps: horzSize = %dmm, vertSize = %dmm, "
+	  "horzRes = %d, vertRes = %d\n",
+	  physDev->horzSize, physDev->vertSize,
+	  physDev->horzRes, physDev->vertRes);
+}
+
+
 /**********************************************************************
  *	     PSDRV_CreateDC
  */
@@ -146,8 +234,6 @@
 {
     PSDRV_PDEVICE *physDev;
     PRINTERINFO *pi;
-    PAGESIZE *page;
-    INT width = 0, height = 0;
 
     /* If no device name was specified, retrieve the device name
      * from the DEVMODE structure from the DC's physDev.
@@ -186,70 +272,26 @@
     
     memcpy( physDev->Devmode, pi->Devmode, sizeof(PSDRV_DEVMODEA) );
 
-    if(initData) {
-        PSDRV_MergeDevmodes(physDev->Devmode, (PSDRV_DEVMODEA *)initData, pi);
-    }
-
     physDev->logPixelsX = physDev->pi->ppd->DefaultResolution;
     physDev->logPixelsY = physDev->pi->ppd->DefaultResolution;
 
-    for(page = pi->ppd->PageSizes; page; page = page->next) {
-        if(page->WinPage == physDev->Devmode->dmPublic.u1.s1.dmPaperSize)
-	    break;
-    }
-
-    if(!page) {
-        FIXME("Can't find page\n");
-	physDev->PageSize.left = 0;
-	physDev->PageSize.right = 0;
-	physDev->PageSize.bottom = 0;
-        physDev->PageSize.top = 0;
-    } else if(page->ImageableArea) {  /* PageSize is in device units */
-        physDev->PageSize.left = page->ImageableArea->llx * physDev->logPixelsX / 72;
-        physDev->PageSize.right = page->ImageableArea->urx * physDev->logPixelsX / 72;
-        physDev->PageSize.bottom = page->ImageableArea->lly * physDev->logPixelsY / 72;
-        physDev->PageSize.top = page->ImageableArea->ury * physDev->logPixelsY / 72;
-    } else {
-        physDev->PageSize.left = physDev->PageSize.bottom = 0;
-        physDev->PageSize.right = page->PaperDimension->x * physDev->logPixelsX / 72;
-        physDev->PageSize.top = page->PaperDimension->y * physDev->logPixelsY / 72;
-    }
-    TRACE("PageSize = (%d,%d - %d,%d)\n",physDev->PageSize.left, physDev->PageSize.bottom, physDev->PageSize.right, physDev->PageSize.top);
-
-    /* these are in device units */
-    width = physDev->PageSize.right - physDev->PageSize.left;
-    height = physDev->PageSize.top - physDev->PageSize.bottom;
-
-    if(physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_PORTRAIT) {
-        physDev->horzRes = width;
-        physDev->vertRes = height;
-    } else {
-        physDev->horzRes = height;
-        physDev->vertRes = width;
-    }
-
-    /* these are in mm */
-    physDev->horzSize = (physDev->horzRes * 25.4) / physDev->logPixelsX;
-    physDev->vertSize = (physDev->vertRes * 25.4) / physDev->logPixelsY;
-
-    TRACE("devcaps: horzSize = %dmm, vertSize = %dmm, "
-	  "horzRes = %d, vertRes = %d\n",
-	  physDev->horzSize, physDev->vertSize,
-	  physDev->horzRes, physDev->vertRes);
-
-    /* etc */
-
-    dc->hVisRgn = CreateRectRgn(0, 0, physDev->horzRes, physDev->vertRes);
-    dc->hFont = PSDRV_DefaultFont;
-
     if (!output) output = "LPT1:";  /* HACK */
     physDev->job.output = HeapAlloc( PSDRV_Heap, 0, strlen(output)+1 );
     strcpy( physDev->job.output, output );
     physDev->job.hJob = 0;
+
+    if(initData) {
+        PSDRV_MergeDevmodes(physDev->Devmode, (PSDRV_DEVMODEA *)initData, pi);
+    }
+
+    PSDRV_UpdateDevCaps(physDev);
+    dc->hVisRgn = CreateRectRgn(0, 0, physDev->horzRes, physDev->vertRes);
+    dc->hFont = PSDRV_DefaultFont;
     return TRUE;
 }
 
 
+
 /**********************************************************************
  *	     PSDRV_DeleteDC
  */
@@ -266,76 +308,16 @@
 }
 
 
-/***********************************************************************
- *           get_phys_page_size
- *
- * Helper function to compute PHYSICALWIDTH and PHYSICALHEIGHT dev caps.
+/**********************************************************************
+ *	     ResetDC   (WINEPS.@)
  */
-static void get_phys_page_size( const PSDRV_PDEVICE *pdev, POINT *p )
+HDC PSDRV_ResetDC( PSDRV_PDEVICE *physDev, const DEVMODEA *lpInitData )
 {
-    p->x = p->y = 0;
-
-    if ((pdev->Devmode->dmPublic.dmFields & DM_PAPERSIZE) != 0 &&
-        pdev->Devmode->dmPublic.u1.s1.dmPaperSize != 0)
-    {
-        PAGESIZE *page = pdev->pi->ppd->PageSizes;
-
-        while (page != NULL)
-        {
-            if (page->WinPage == pdev->Devmode->dmPublic.u1.s1.dmPaperSize)
-                break;
-            page = page->next;
-        }
-
-        if (page == NULL)
-        {
-            ERR("No entry for papersize %u in PPD file for '%s'\n",
-                pdev->Devmode->dmPublic.u1.s1.dmPaperSize,
-                pdev->pi->FriendlyName);
-            return;
-        }
-
-        TRACE("Found '%s' for paper size %u\n", page->FullName,
-              pdev->Devmode->dmPublic.u1.s1.dmPaperSize);
-
-        p->x = page->PaperDimension->x * pdev->logPixelsX / 72;
-        p->y = page->PaperDimension->y * pdev->logPixelsY / 72;
-
-        TRACE("%fx%f PostScript points = %lix%li device units\n",
-              page->PaperDimension->x, page->PaperDimension->y,
-              p->x, p->y);
+    if(lpInitData) {
+        PSDRV_MergeDevmodes(physDev->Devmode, (PSDRV_DEVMODEA *)lpInitData, physDev->pi);
+        PSDRV_UpdateDevCaps(physDev);
     }
-
-    /* These are in tenths of a millimeter */
-    if ((pdev->Devmode->dmPublic.dmFields & DM_PAPERWIDTH) != 0 &&
-        pdev->Devmode->dmPublic.u1.s1.dmPaperWidth != 0)
-    {
-        p->x = (pdev->Devmode->dmPublic.u1.s1.dmPaperWidth *
-                pdev->logPixelsX) / 254;
-        TRACE("dmPaperWidth = %li device units\n", p->x);
-    }
-
-    if ((pdev->Devmode->dmPublic.dmFields & DM_PAPERLENGTH) != 0 &&
-        pdev->Devmode->dmPublic.u1.s1.dmPaperLength != 0)
-    {
-        p->y = (pdev->Devmode->dmPublic.u1.s1.dmPaperLength *
-                pdev->logPixelsY) / 254;
-        TRACE("dmPaperLength = %li device units\n", p->y);
-    }
-
-    if (p->x == 0 || p->y == 0)
-    {
-        ERR("Paper size not properly set for '%s'\n", pdev->pi->FriendlyName);
-        return;
-    }
-
-    if ((pdev->Devmode->dmPublic.dmFields & DM_ORIENTATION) != 0 &&
-        pdev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_LANDSCAPE)
-    {
-        INT temp = p->y;
-        p->y = p->x;
-        p->x = temp;
-    }
+    return physDev->hdc;
 }
 
 
@@ -344,8 +326,6 @@
  */
 INT PSDRV_GetDeviceCaps( PSDRV_PDEVICE *physDev, INT cap )
 {
-    POINT pt;
-
     switch(cap)
     {
     case DRIVERVERSION:
@@ -386,7 +366,7 @@
         return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
                 PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
     case TEXTCAPS:
-        return TC_CR_ANY; /* psdrv 0x59f7 */
+        return TC_CR_ANY | TC_VA_ABLE; /* psdrv 0x59f7 */
     case CLIPCAPS:
         return CP_RECTANGLE;
     case RASTERCAPS:
@@ -411,13 +391,29 @@
     case COLORRES:
         return 0;
     case PHYSICALWIDTH:
-        get_phys_page_size( physDev, &pt );
-        return pt.x;
+        return (physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_LANDSCAPE) ?
+	  physDev->PageSize.cy : physDev->PageSize.cx;
     case PHYSICALHEIGHT:
-        get_phys_page_size( physDev, &pt );
-        return pt.y;
+        return (physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_LANDSCAPE) ?
+	  physDev->PageSize.cx : physDev->PageSize.cy;
     case PHYSICALOFFSETX:
+      if(physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_LANDSCAPE) {
+          if(physDev->pi->ppd->LandscapeOrientation == -90)
+	      return physDev->PageSize.cy - physDev->ImageableArea.top;
+	  else
+	      return physDev->ImageableArea.bottom;
+      }
+      return physDev->ImageableArea.left;
+
     case PHYSICALOFFSETY:
+      if(physDev->Devmode->dmPublic.u1.s1.dmOrientation == DMORIENT_LANDSCAPE) {
+          if(physDev->pi->ppd->LandscapeOrientation == -90)
+	      return physDev->PageSize.cx - physDev->ImageableArea.right;
+	  else
+	      return physDev->ImageableArea.left;
+      }
+      return physDev->PageSize.cy - physDev->ImageableArea.top;
+
     case SCALINGFACTORX:
     case SCALINGFACTORY:
     case VREFRESH: