Module: wine Branch: master Commit: f7f5ed19965ecb32cab793deba3f075c671f9c86 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f7f5ed19965ecb32cab793deba...
Author: Huw Davies huw@codeweavers.com Date: Tue Apr 10 14:09:44 2007 +0100
wineps.drv: Add a heuristic to cope with resolution strings of the form "nnnmmmdpi" (ie without the 'x' separator).
---
dlls/wineps.drv/ppd.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/dlls/wineps.drv/ppd.c b/dlls/wineps.drv/ppd.c index 130613a..d52f6f9 100644 --- a/dlls/wineps.drv/ppd.c +++ b/dlls/wineps.drv/ppd.c @@ -516,6 +516,70 @@ static char *PSDRV_PPDGetWord(char *str, char **next) return ret; }
+/************************************************************ + * parse_resolution + * + * Helper to extract x and y resolutions from a resolution entry. + * Returns TRUE on successful parsing, otherwise FALSE. + * + * The ppd spec says that entries can either be: + * "nnndpi" + * or + * "nnnxmmmdpi" + * in the former case return sz.cx == cx.cy == nnn. + * + * There are broken ppd files out there (notably from Samsung) that + * use the form "nnnmmmdpi", so we have to work harder to spot these. + * We use a transition from a zero to a non-zero digit as separator + * (and fail if we find more than one of these). We also don't bother + * trying to parse "dpi" in case that's missing. + */ +static BOOL parse_resolution(const char *str, SIZE *sz) +{ + int tmp[2]; + int *cur; + BOOL had_zero; + const char *c; + + if(sscanf(str, "%dx%d", tmp, tmp + 1) == 2) + { + sz->cx = tmp[0]; + sz->cy = tmp[1]; + return TRUE; + } + + tmp[0] = 0; + tmp[1] = -1; + cur = tmp; + had_zero = FALSE; + for(c = str; isdigit(*c); c++) + { + if(!had_zero || *c == '0') + { + *cur *= 10; + *cur += *c - '0'; + if(*c == '0') + had_zero = TRUE; + } + else if(cur != tmp) + return FALSE; + else + { + cur++; + *cur = *c - '0'; + had_zero = FALSE; + } + } + if(tmp[0] == 0) return FALSE; + + sz->cx = tmp[0]; + if(tmp[1] != -1) + sz->cy = tmp[1]; + else + sz->cy = sz->cx; + return TRUE; +} + /******************************************************************************* * PSDRV_AddSlot * @@ -605,8 +669,14 @@ PPD *PSDRV_ParsePPD(char *fname)
else if((!strcmp("*DefaultResolution", tuple.key)) || (!strcmp("*DefaultJCLResolution", tuple.key))) { - sscanf(tuple.value, "%d", &(ppd->DefaultResolution)); - TRACE("DefaultResolution = %d\n", ppd->DefaultResolution); + SIZE sz; + if(parse_resolution(tuple.value, &sz)) + { + TRACE("DefaultResolution %dx%d\n", sz.cx, sz.cy); + ppd->DefaultResolution = sz.cx; + } + else + WARN("failed to parse DefaultResolution %s\n", debugstr_a(tuple.value)); }
else if(!strcmp("*Font", tuple.key)) {