diff options
author | Michael Sweet <michael.r.sweet@gmail.com> | 2017-03-09 14:55:24 -0500 |
---|---|---|
committer | Michael Sweet <michael.r.sweet@gmail.com> | 2017-03-09 14:55:24 -0500 |
commit | 3b6c3c8e9da937ce3957c5d2d0a01f97931878be (patch) | |
tree | e3136fb4d7be8f55f8c370d4bd03f23a820eb8d5 /cups/ppd-cache.c | |
parent | 40c808603add270306f0bc149249cefdff634458 (diff) | |
download | cups-3b6c3c8e9da937ce3957c5d2d0a01f97931878be.tar.gz |
Support all print-quality values reported by the printer, regardless of the
supported resolutions (Issue #4953)
Diffstat (limited to 'cups/ppd-cache.c')
-rw-r--r-- | cups/ppd-cache.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c index fa0b04cd5..d14bc25ca 100644 --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c @@ -3048,6 +3048,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ cups_array_t *sizes; /* Media sizes we've added */ ipp_attribute_t *attr, /* xxx-supported */ *defattr, /* xxx-default */ + *quality, /* print-quality-supported */ *x_dim, *y_dim; /* Media dimensions */ ipp_t *media_size; /* Media size collection */ char make[256], /* Make and model */ @@ -3949,6 +3950,8 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ * cupsPrintQuality and DefaultResolution... */ + quality = ippFindAttribute(response, "print-quality-supported", IPP_TAG_ENUM); + if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) { count = ippGetCount(attr); @@ -3959,16 +3962,19 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality/%s: PickOne\n" "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" "*DefaultcupsPrintQuality: Normal\n", _cupsLangString(lang, _("Print Quality"))); - if (count > 2) + if (count > 2 || ippContainsInteger(quality, IPP_QUALITY_DRAFT)) { pwg_ppdize_resolution(attr, 0, &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality Draft/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Draft")), xres, yres); } pwg_ppdize_resolution(attr, count / 2, &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality Normal/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Normal")), xres, yres); - if (count > 1) + if (count > 1 || ippContainsInteger(quality, IPP_QUALITY_HIGH)) { - pwg_ppdize_resolution(attr, count - 1, &xres, &yres, NULL, 0); + if (count > 1) + pwg_ppdize_resolution(attr, count - 1, &xres, &yres, NULL, 0); + else + pwg_ppdize_resolution(attr, 0, &xres, &yres, NULL, 0); cupsFilePrintf(fp, "*cupsPrintQuality High/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("High")), xres, yres); } @@ -4015,21 +4021,40 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */ "*DefaultcupsPrintQuality: Normal\n", _cupsLangString(lang, _("Print Quality"))); if ((lowdpi & 1) == 0) cupsFilePrintf(fp, "*cupsPrintQuality Draft/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Draft")), lowdpi, lowdpi / 2); + else if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) + cupsFilePrintf(fp, "*cupsPrintQuality Draft/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Draft")), lowdpi, lowdpi); cupsFilePrintf(fp, "*cupsPrintQuality Normal/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Normal")), lowdpi, lowdpi); - if (hidpi > lowdpi) + if (hidpi > lowdpi || ippContainsInteger(quality, IPP_QUALITY_HIGH)) cupsFilePrintf(fp, "*cupsPrintQuality High/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("High")), hidpi, hidpi); cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); } } else if (is_apple || is_pwg) goto bad_ppd; - else if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL) + else { - pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname)); + if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL) + { + pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname)); + } + else + { + xres = yres = 300; + strlcpy(ppdname, "300dpi", sizeof(ppdname)); + } + cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); + + cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality/%s: PickOne\n" + "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" + "*DefaultcupsPrintQuality: Normal\n", _cupsLangString(lang, _("Print Quality"))); + if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) + cupsFilePrintf(fp, "*cupsPrintQuality Draft/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Draft")), xres, yres); + cupsFilePrintf(fp, "*cupsPrintQuality Normal/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("Normal")), xres, yres); + if (ippContainsInteger(quality, IPP_QUALITY_HIGH)) + cupsFilePrintf(fp, "*cupsPrintQuality High/%s: \"<</HWResolution[%d %d]>>setpagedevice\"\n", _cupsLangString(lang, _("High")), xres, yres); + cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); } - else - cupsFilePuts(fp, "*DefaultResolution: 300dpi\n"); /* * Close up and return... |