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