wineps.drv: Add support for dmPrintQuality and for several Resolutions.

Fabian Franz FabianFranz at gmx.de
Thu Feb 1 19:17:07 CST 2007


This patch adds support for dmPrintQuality.

As the dmPrintQuality should somehow correspond with the values read from the 
ppd, I implemented full support for reading Resolutions from PPD.

Also DC_ENUMRESOLUTIONS was updated to reflect the change.

Note:

It might be possible that wine changes the Default Resolution to 150 dpi now,
where it used to be 300.

This comes from the fact, that the code uses the first found resolution, if 
there is no Default Resolution.

If the backwards compability is to be maintained, it is necessary to remove 
that code:

+    if(!ppd->DefaultResolution) {
+        ppd->DefaultResolution = ppd->Resolutions;
+        TRACE("Setting DefaultResolution to first in list\n");
+    }

and always use the dummy entry.

Signed-off-by: Fabian Franz <FabianFranz at gmx.de>
---
 dlls/wineps.drv/driver.c |   35 ++++++++++++++++++++------
 dlls/wineps.drv/init.c   |   24 +++++++++++++-----
 dlls/wineps.drv/ppd.c    |   61 ++++++++++++++++++++++++++++++++++++++++-----
 dlls/wineps.drv/psdrv.h  |   13 +++++++++-
 4 files changed, 110 insertions(+), 23 deletions(-)

diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c
index e096bf6..d27d030 100644
--- a/dlls/wineps.drv/driver.c
+++ b/dlls/wineps.drv/driver.c
@@ -129,11 +129,27 @@ void PSDRV_MergeDevmodes(PSDRV_DEVMODEA *dm1, 
PSDRV_DEVMODEA *dm2,
 		dm2->dmPublic.dmDefaultSource);
 	}
     }
+    if (dm2->dmPublic.dmFields & DM_PRINTQUALITY ) {
+	RESOLUTION *res;
+
+	for(res = pi->ppd->Resolutions; res; res = res->next) {
+	    if(res->WinRes == dm2->dmPublic.dmPrintQuality)
+	        break;
+	}
+	if(res) {
+	    dm1->dmPublic.dmPrintQuality = dm2->dmPublic.dmPrintQuality;
+	    dm1->dmPublic.dmFields |= DM_PRINTQUALITY;
+	    TRACE("Changing PrintQuality to '%s'\n", res->FullName);
+	} else {
+	  TRACE("Trying to change to unsupported PrintQuality %d\n",
+		dm2->dmPublic.dmPrintQuality);
+	}
+
+   }
+
 
    if (dm2->dmPublic.dmFields & DM_DEFAULTSOURCE )
        dm1->dmPublic.dmDefaultSource = dm2->dmPublic.dmDefaultSource;
-   if (dm2->dmPublic.dmFields & DM_PRINTQUALITY )
-       dm1->dmPublic.dmPrintQuality = dm2->dmPublic.dmPrintQuality;
    if (dm2->dmPublic.dmFields & DM_COLOR )
        dm1->dmPublic.dmColor = dm2->dmPublic.dmColor;
    if (dm2->dmPublic.dmFields & DM_DUPLEX && pi->ppd->DefaultDuplex && 
pi->ppd->DefaultDuplex->WinDuplex != 0)
@@ -531,13 +547,16 @@ DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR 
lpszDevice, LPCSTR lpszP
 
   case DC_ENUMRESOLUTIONS:
     {
-      LONG *lp = (LONG*)lpszOutput;
+      RESOLUTION *res;
+      LONG *lp = (LONG*) lpszOutput;
+      int i = 0;
 
-      if(lpszOutput != NULL) {
-	lp[0] = (LONG)pi->ppd->DefaultResolution;
-	lp[1] = (LONG)pi->ppd->DefaultResolution;
-      }
-      return 1;
+      for(res = pi->ppd->Resolutions; res; res = res->next, i++)
+	if(lpszOutput != NULL) {
+		lp[i*2]=res->WinRes;
+		lp[i*2+1]=res->WinRes;
+	}
+      return i;
     }
 
   /* Windows returns 9999 too */
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index 8ec88b5..166288c 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -175,6 +175,10 @@ static void PSDRV_UpdateDevCaps( PSDRV_PDEVICE *physDev )
     PAGESIZE *page;
     INT width = 0, height = 0;
 
+    if(physDev->Devmode->dmPublic.dmFields & DM_PRINTQUALITY) {
+        
physDev->logPixelsX=physDev->logPixelsY=physDev->Devmode->dmPublic.dmPrintQuality;
+    }
+
     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)
@@ -351,8 +355,8 @@ BOOL PSDRV_CreateDC( HDC hdc, PSDRV_PDEVICE **pdev, 
LPCWSTR driver, LPCWSTR devi
 
     memcpy( physDev->Devmode, pi->Devmode, sizeof(PSDRV_DEVMODEA) );
 
-    physDev->logPixelsX = physDev->pi->ppd->DefaultResolution;
-    physDev->logPixelsY = physDev->pi->ppd->DefaultResolution;
+    physDev->logPixelsX = physDev->pi->ppd->DefaultResolution->WinRes;
+    physDev->logPixelsY = physDev->pi->ppd->DefaultResolution->WinRes;
 
     if (output) {
         INT len = WideCharToMultiByte( CP_ACP, 0, output, -1, NULL, 0, NULL, 
NULL );
@@ -464,11 +468,12 @@ INT PSDRV_GetDeviceCaps( PSDRV_PDEVICE *physDev, INT 
cap )
     /* Are aspect[XY] and logPixels[XY] correct? */
     /* Need to handle different res in x and y => fix ppd */
     case ASPECTX:
+        return physDev->logPixelsX;
     case ASPECTY:
-        return physDev->pi->ppd->DefaultResolution;
+        return physDev->logPixelsY;
     case ASPECTXY:
-        return (int)hypot( (double)physDev->pi->ppd->DefaultResolution,
-                           (double)physDev->pi->ppd->DefaultResolution );
+        return (int)hypot( (double)physDev->logPixelsX,
+                           (double)physDev->logPixelsY);
     case LOGPIXELSX:
         return MulDiv(physDev->logPixelsX,
 		      physDev->Devmode->dmPublic.dmScale, 100);
@@ -671,8 +676,13 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
 
     /* Some gimp-print ppd files don't contain a DefaultResolution line
        set it to 300 if it's not specified */
-    if(pi->ppd->DefaultResolution == 0)
-        pi->ppd->DefaultResolution = 300;
+    if(pi->ppd->DefaultResolution->WinRes == 0)
+    {
+        pi->ppd->DefaultResolution->Name = "300dpi";
+        pi->ppd->DefaultResolution->FullName = "300 DPI";
+        pi->ppd->DefaultResolution->InvocationString = "<</HWResolution[300 
300]>>setpagedevice";
+        pi->ppd->DefaultResolution->WinRes = 300;
+    }
 
     if(using_default_devmode) {
         DWORD papersize;
diff --git a/dlls/wineps.drv/ppd.c b/dlls/wineps.drv/ppd.c
index 0b17bce..7ffd071 100644
--- a/dlls/wineps.drv/ppd.c
+++ b/dlls/wineps.drv/ppd.c
@@ -556,7 +556,7 @@ PPD *PSDRV_ParsePPD(char *fname)
     FILE *fp;
     PPD *ppd;
     PPDTuple tuple;
-    char *default_pagesize = NULL, *default_duplex = NULL;
+    char *default_pagesize = NULL, *default_duplex = NULL, 
*default_resolution = NULL;
 
     TRACE("file '%s'\n", fname);
 
@@ -603,12 +603,6 @@ PPD *PSDRV_ParsePPD(char *fname)
 	    TRACE("ColorDevice = %d\n", (int)ppd->ColorDevice);
 	}
 
-	else if((!strcmp("*DefaultResolution", tuple.key)) ||
-		(!strcmp("*DefaultJCLResolution", tuple.key))) {
-	    sscanf(tuple.value, "%d", &(ppd->DefaultResolution));
-	    TRACE("DefaultResolution = %d\n", ppd->DefaultResolution);
-	}
-
 	else if(!strcmp("*Font", tuple.key)) {
 	    FONTNAME *fn;
 
@@ -818,6 +812,30 @@ PPD *PSDRV_ParsePPD(char *fname)
 	    TRACE("*TTRasterizer = %d\n", ppd->TTRasterizer);
 	}
 
+	else if(!strcmp("*Resolution", tuple.key)) {
+            RESOLUTION **res;
+            for(res = &ppd->Resolutions; *res; res = &(*res)->next)
+                ;
+            *res = HeapAlloc(GetProcessHeap(), 0, sizeof(**res));
+            (*res)->Name = tuple.option;
+            (*res)->FullName = tuple.opttrans;
+            (*res)->InvocationString = tuple.value;
+            sscanf(tuple.option, "%d", &((*res)->WinRes));
+            (*res)->next = NULL;
+            tuple.option = tuple.opttrans = tuple.value = NULL;
+        }
+
+        else if((!strcmp("*DefaultResolution", tuple.key)) ||
+	       (!strcmp("*DefaultJCLResolution", tuple.key))) {
+            if(default_resolution) {
+                WARN("Already set default resolution\n");
+            } else {
+                default_resolution = tuple.value;
+                tuple.value = NULL;
+           }
+        }
+
+
         else if(!strcmp("*Duplex", tuple.key)) {
             DUPLEX **duplex;
             for(duplex = &ppd->Duplexes; *duplex; duplex = &(*duplex)->next)
@@ -878,6 +896,35 @@ PPD *PSDRV_ParsePPD(char *fname)
         TRACE("Setting DefaultPageSize to first in list\n");
     }
 
+    ppd->DefaultResolution = NULL;
+    if(default_resolution) {
+	RESOLUTION *res;
+	for(res = ppd->Resolutions; res; res = res->next) {
+            if(!strcmp(res->Name, default_resolution)) {
+                ppd->DefaultResolution = res;
+                TRACE("DefaultResolution: %s\n", res->Name);
+                break;
+            }
+        }
+        HeapFree(PSDRV_Heap, 0, default_resolution);
+    }
+
+    if(!ppd->DefaultResolution) {
+        ppd->DefaultResolution = ppd->Resolutions;
+        TRACE("Setting DefaultResolution to first in list\n");
+    }
+
+    if (!ppd->DefaultResolution)
+    {
+        RESOLUTION **res = &ppd->Resolutions;
+        *res = HeapAlloc(GetProcessHeap(), 0, sizeof(**res));
+        (*res)->Name = NULL;
+        (*res)->FullName = NULL;
+        (*res)->InvocationString = NULL;
+        (*res)->WinRes=0;
+        TRACE("Setting DefaultResolution to dummy entry\n");
+    }
+
     ppd->DefaultDuplex = NULL;
     if(default_duplex) {
 	DUPLEX *duplex;
diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h
index 74abe39..93c5de1 100644
--- a/dlls/wineps.drv/psdrv.h
+++ b/dlls/wineps.drv/psdrv.h
@@ -180,6 +180,16 @@ typedef struct _tagINPUTSLOT {
     struct _tagINPUTSLOT	*next;
 } INPUTSLOT;
 
+typedef struct _tagRESOLUTION {
+    const char			*Name;
+    const char			*FullName;
+    const char			*InvocationString;
+    int				WinRes;
+    struct _tagRESOLUTION	*next;
+} RESOLUTION;
+
+
+
 typedef enum _RASTERIZEROPTION
   {RO_None, RO_Accept68K, RO_Type42, RO_TrueImage} RASTERIZEROPTION;
 
@@ -195,7 +205,6 @@ typedef struct {
     char		*NickName;
     int			LanguageLevel;
     BOOL		ColorDevice;
-    int			DefaultResolution;
     signed int		LandscapeOrientation;
     char		*JCLBegin;
     char		*JCLToPSInterpreter;
@@ -207,6 +216,8 @@ typedef struct {
     OPTION		*InstalledOptions;
     CONSTRAINT		*Constraints;
     INPUTSLOT		*InputSlots;
+    RESOLUTION		*Resolutions;
+    RESOLUTION		*DefaultResolution;
     RASTERIZEROPTION    TTRasterizer;
     DUPLEX              *Duplexes;
     DUPLEX              *DefaultDuplex;
-- 
1.4.4.3




More information about the wine-patches mailing list