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: