Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1317)

Unified Diff: printing/print_settings_initializer_win.cc

Issue 2714073002: Eliminate PS printing edge cases (Closed)
Patch Set: Fix compile errors Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: printing/print_settings_initializer_win.cc
diff --git a/printing/print_settings_initializer_win.cc b/printing/print_settings_initializer_win.cc
index 95d2fced08b5ff262a5d92de0105878ffee9e397..cd18ef071154fca7e74b74a55fbb99a511dd063f 100644
--- a/printing/print_settings_initializer_win.cc
+++ b/printing/print_settings_initializer_win.cc
@@ -24,14 +24,6 @@ bool IsTechnology(HDC hdc, const char* technology) {
// If postscript, try to query Postscript Identify and then set to
Lei Zhang 2017/02/25 03:03:35 Do we need to move this comment?
// postscript mode before calling any more ExtEscape functions. Otherwise,
// PSLEVEL query will not work.
- if (strcmp(technology, "PostScript") == 0 &&
- HasEscapeSupprt(hdc, POSTSCRIPT_IDENTIFY)) {
- DWORD mode = PSIDENT_PSCENTRIC;
- const char* ptr = reinterpret_cast<const char*>(&mode);
- ExtEscape(hdc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), ptr, 0, nullptr);
- return true;
- }
-
if (!HasEscapeSupprt(hdc, GETTECHNOLOGY))
return false;
@@ -42,36 +34,57 @@ bool IsTechnology(HDC hdc, const char* technology) {
return strcmp(buf, technology) == 0;
}
+bool SetPrinterPostScript(HDC hdc) {
Lei Zhang 2017/02/25 03:03:35 Maybe SetPrinterToPostScriptMode() ?
+ // Try to set to PS centric mode
+ DWORD mode = PSIDENT_PSCENTRIC;
+ const char* ptr = reinterpret_cast<const char*>(&mode);
+ int ret = ExtEscape(hdc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), ptr, 0, nullptr);
+ return ret > 0;
+}
+
+int GetPrinterPostScriptLevel(HDC hdc) {
Lei Zhang 2017/02/25 03:24:53 Does this require PS centric mode? Or does it just
+ constexpr int param = FEATURESETTING_PSLEVEL;
+ const char* param_char_ptr = reinterpret_cast<const char*>(&param);
+ int param_out = -1;
Lei Zhang 2017/02/25 03:24:53 Can we just use 0 or do we need to distinguish bet
+ char* param_out_char_ptr = reinterpret_cast<char*>(&param_out);
+ if (ExtEscape(hdc, GET_PS_FEATURESETTING, sizeof(param), param_char_ptr,
+ sizeof(param_out), param_out_char_ptr) > 0) {
+ return param_out;
+ }
+ return -1;
+}
+
bool IsPrinterPostScript(HDC hdc, int* level) {
static constexpr char kPostScriptDriver[] = "PostScript";
- if (!IsTechnology(hdc, kPostScriptDriver)) {
+ bool set_postscript = false;
+ // Try to set to PostScript mode so that language level detection works.
+ // This has to occur before other escape functions are called.
+ if (HasEscapeSupprt(hdc, POSTSCRIPT_IDENTIFY)) {
Lei Zhang 2017/02/25 03:24:53 Have you found printers that support POSTSCRIPT_ID
+ set_postscript = SetPrinterPostScript(hdc);
+ } else if (!IsTechnology(hdc, kPostScriptDriver)) {
+ // Doesn't support POSTSCRIPT_IDENTIFY and doesn't look like PostScript.
+ return false;
+ } else if (!HasEscapeSupprt(hdc, POSTSCRIPT_PASSTHROUGH) ||
+ !HasEscapeSupprt(hdc, POSTSCRIPT_DATA)) {
+ // Can't change to PS mode and doesn't have compatibility mode functions
return false;
}
- // Query the PS Level if possible.
- if (HasEscapeSupprt(hdc, GET_PS_FEATURESETTING)) {
- constexpr int param = FEATURESETTING_PSLEVEL;
- const char* param_char_ptr = reinterpret_cast<const char*>(&param);
- int param_out = -1;
- char* param_out_char_ptr = reinterpret_cast<char*>(&param_out);
- if (ExtEscape(hdc, GET_PS_FEATURESETTING, sizeof(param), param_char_ptr,
- sizeof(param_out), param_out_char_ptr) > 0) {
- if (param_out < 2 || param_out > 3)
- return false;
-
- *level = param_out;
- return true;
- }
- }
-
- // If it looks like a PS printer.
- if (HasEscapeSupprt(hdc, POSTSCRIPT_PASSTHROUGH) &&
- HasEscapeSupprt(hdc, POSTSCRIPT_DATA)) {
+ if (!HasEscapeSupprt(hdc, GET_PS_FEATURESETTING)) {
+ // Can't query the level, use level 2 to be safe
*level = 2;
return true;
}
-
- return false;
+ int ps_level = GetPrinterPostScriptLevel(hdc);
+ if ((ps_level < 2 || ps_level > 3) && !set_postscript) {
+ // if the PS level is < 2 or > 3 and we haven't set the driver to PS mode
+ return false;
+ }
+ // If we set the driver to PS mode, set to level 2 or 3 if it is not already.
+ // Once the driver is in PS mode, other modes won't work so we have to try
+ // postscript.
+ *level = ps_level <= 2 ? 2 : 3;
+ return true;
}
bool IsPrinterXPS(HDC hdc) {
@@ -86,7 +99,8 @@ bool IsPrinterXPS(HDC hdc) {
void PrintSettingsInitializerWin::InitPrintSettings(
HDC hdc,
const DEVMODE& dev_mode,
- PrintSettings* print_settings) {
+ PrintSettings* print_settings,
+ bool postscript_enabled) {
DCHECK(hdc);
DCHECK(print_settings);
@@ -129,17 +143,19 @@ void PrintSettingsInitializerWin::InitPrintSettings(
false);
// Check for postscript first so that we can change the mode with the
Lei Zhang 2017/02/25 03:24:53 This is a leftover question from the last CL. Why
// first command.
- int level;
- if (IsPrinterPostScript(hdc, &level)) {
- if (level == 2) {
+ if (postscript_enabled) {
+ int level;
+ if (IsPrinterPostScript(hdc, &level)) {
+ if (level == 2) {
+ print_settings->set_printer_type(
+ PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL2);
+ return;
+ }
+ DCHECK_EQ(3, level);
print_settings->set_printer_type(
- PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL2);
+ PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL3);
return;
}
- DCHECK_EQ(3, level);
- print_settings->set_printer_type(
- PrintSettings::PrinterType::TYPE_POSTSCRIPT_LEVEL3);
- return;
}
if (IsPrinterXPS(hdc)) {
print_settings->set_printer_type(PrintSettings::PrinterType::TYPE_XPS);

Powered by Google App Engine
This is Rietveld 408576698