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

Unified Diff: printing/print_settings_initializer_win.cc

Issue 2714073002: Eliminate PS printing edge cases (Closed)
Patch Set: Use GDI mode for PS level query 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
« no previous file with comments | « chrome/browser/printing/pdf_to_emf_converter.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..e82f54659e31ecf6fb530e45ef65699e915d26fc 100644
--- a/printing/print_settings_initializer_win.cc
+++ b/printing/print_settings_initializer_win.cc
@@ -21,17 +21,6 @@ bool IsTechnology(HDC hdc, const char* technology) {
if (::GetDeviceCaps(hdc, TECHNOLOGY) != DT_RASPRINTER)
return false;
- // If postscript, try to query Postscript Identify and then set to
- // 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 +31,56 @@ bool IsTechnology(HDC hdc, const char* technology) {
return strcmp(buf, technology) == 0;
}
+bool SetPrinterToGdiMode(HDC hdc) {
+ // Try to set to GDI centric mode
+ DWORD mode = PSIDENT_GDICENTRIC;
+ 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) {
+ constexpr int param = FEATURESETTING_PSLEVEL;
+ const char* param_char_ptr = reinterpret_cast<const char*>(&param);
+ int param_out = 0;
+ 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;
Lei Zhang 2017/02/25 09:09:35 0 here as well?
rbpotter 2017/02/27 16:40:50 Done.
+}
+
bool IsPrinterPostScript(HDC hdc, int* level) {
static constexpr char kPostScriptDriver[] = "PostScript";
- if (!IsTechnology(hdc, kPostScriptDriver)) {
+ // Try to set to Gdi mode so that language level detection works (not
Lei Zhang 2017/02/25 09:09:35 s/Gdi/GDI/
rbpotter 2017/02/27 16:40:50 Done.
+ // supported in compatability mode). Use GDI mode instead of PS mode so that
+ // if level detection fails we can fall back to normal printing.
+ // Note: This has to occur before other escape functions are called. Also, if
+ // the printer supports POSTSCRIPT_IDENTIFY, we know it has a postscript
+ // driver.
+ if (HasEscapeSupprt(hdc, POSTSCRIPT_IDENTIFY)) {
+ SetPrinterToGdiMode(hdc);
Lei Zhang 2017/02/25 09:09:35 This patch set no longer checks the return value.
rbpotter 2017/02/27 16:40:50 Yes- don't need to check since GDI mode doesn't ca
+ } 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 GDI 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)) {
Lei Zhang 2017/02/25 09:09:35 If a printer does not support POSTSCRIPT_IDENTIFY,
rbpotter 2017/02/27 16:40:50 Done.
+ // Can't query the level, use level 2 to be safe
*level = 2;
return true;
}
-
- return false;
+ *level = GetPrinterPostScriptLevel(hdc);
+ if (*level < 2 || *level > 3) {
+ // Invalid or insufficient postscript language level.
+ return false;
+ }
+ return true;
}
bool IsPrinterXPS(HDC hdc) {
« no previous file with comments | « chrome/browser/printing/pdf_to_emf_converter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698