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

Unified Diff: chrome/browser/ui/webui/print_preview_handler.cc

Issue 8138020: PrintPreview: Fix printer color settings issues based on printer ppd/schema information. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 2 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: chrome/browser/ui/webui/print_preview_handler.cc
diff --git a/chrome/browser/ui/webui/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview_handler.cc
index a627293bfbd9fc445e075e805cb46a92d27a680f..bda5d97418871cb16377cea24716a4a3d419502a 100644
--- a/chrome/browser/ui/webui/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview_handler.cc
@@ -151,18 +151,28 @@ namespace {
const char kDisableColorOption[] = "disableColorOption";
const char kSetColorAsDefault[] = "setColorAsDefault";
const char kSetDuplexAsDefault[] = "setDuplexAsDefault";
+const char kPrinterColorModelForBlack[] = "printerColorModelForBlack";
const char kPrinterColorModelForColor[] = "printerColorModelForColor";
const char kPrinterDefaultDuplexValue[] = "printerDefaultDuplexValue";
#if defined(USE_CUPS)
const char kColorDevice[] = "ColorDevice";
const char kColorModel[] = "ColorModel";
-const char kColorModelForColor[] = "Color";
-const char kCMYK[] = "CMYK";
+const char kColorMode[] = "ColorMode";
+const char kProcessColorModel[] = "ProcessColorModel";
+
const char kDuplex[] = "Duplex";
const char kDuplexNone[] = "None";
+
+// Foomatic ppd attributes and values.
+const char kFoomaticId[] = "FoomaticIDs";
+const char kPrintoutMode[] = "PrintoutMode";
+const char kDraftGray[] = "Draft.Gray";
+const char kHighGray[] = "High.Gray";
#elif defined(OS_WIN)
const char kPskColor[] = "psk:Color";
+const char kPskGray[] = "psk:Grayscale";
+const char kPskMonochrome[] = "psk:Monochrome";
const char kPskDuplexFeature[] = "psk:JobDuplexAllDocumentsContiguously";
const char kPskTwoSided[] = "psk:TwoSided";
#endif
@@ -248,6 +258,15 @@ int GetPageCountFromSettingsDictionary(const DictionaryValue& settings) {
return count;
}
+// Returns true if |color_mode| is a valid color model.
+bool isColorModeSelected(int color_mode) {
+ return (color_mode != printing::GRAY &&
+ color_mode != printing::BLACK &&
+ color_mode != printing::PRINTOUTMODE_NORMAL_GRAY &&
+ color_mode != printing::COLORMODE_MONOCHROME &&
+ color_mode != printing::PROCESSCOLORMODEL_GREYSCALE);
+}
+
// Track the popularity of print settings and report the stats.
void ReportPrintSettingsStats(const DictionaryValue& settings) {
bool landscape;
@@ -264,8 +283,8 @@ void ReportPrintSettingsStats(const DictionaryValue& settings) {
int color_mode;
if (settings.GetInteger(printing::kSettingColor, &color_mode)) {
- ReportPrintSettingHistogram(color_mode == printing::GRAY ? BLACK_AND_WHITE :
- COLOR);
+ ReportPrintSettingHistogram(
+ isColorModeSelected(color_mode) ? COLOR : BLACK_AND_WHITE);
}
}
@@ -373,9 +392,12 @@ class PrintSystemTaskProxy
void GetPrinterCapabilities(const std::string& printer_name) {
VLOG(1) << "Get printer capabilities start for " << printer_name;
printing::PrinterCapsAndDefaults printer_info;
- bool supports_color = true;
+
+ bool set_color_as_default = false;
+ bool disable_color_options = false;
bool set_duplex_as_default = false;
- int printer_color_space = printing::GRAY;
+ int printer_color_space_for_color = printing::COLOR;
vandebo (ex-Chrome) 2011/10/07 18:23:30 Move both of these down to line 448 - just before
kmadhusu 2011/10/10 23:34:26 This is also used by windows code.
+ int printer_color_space_for_black = printing::GRAY;
int default_duplex_setting_value = printing::UNKNOWN_DUPLEX_MODE;
if (!print_backend_->GetPrinterCapsAndDefaults(printer_name,
&printer_info)) {
@@ -401,9 +423,11 @@ class PrintSystemTaskProxy
#if !defined(OS_MACOSX)
printing_internal::mark_lpoptions(printer_name, &ppd);
#endif
+ bool is_color_device = false;
ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL);
if (attr && attr->value)
- supports_color = ppd->color_device;
+ is_color_device = ppd->color_device;
+ disable_color_options = !is_color_device;
ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
if (duplex_choice) {
@@ -421,14 +445,154 @@ class PrintSystemTaskProxy
}
}
- if (supports_color) {
+ set_color_as_default = is_color_device;
+ if (is_color_device) {
// Identify the color space (COLOR/CMYK) for this printer.
ppd_option_t* color_model = ppdFindOption(ppd, kColorModel);
if (color_model) {
vandebo (ex-Chrome) 2011/10/07 18:23:30 I would pull each of these blocks into a method...
kmadhusu 2011/10/10 23:34:26 Done.
- if (ppdFindChoice(color_model, kColorModelForColor))
- printer_color_space = printing::COLOR;
- else if (ppdFindChoice(color_model, kCMYK))
- printer_color_space = printing::CMYK;
+ if (ppdFindChoice(color_model, printing::kBlack))
vandebo (ex-Chrome) 2011/10/07 18:23:30 Does this need to happen even if it's not a color
kmadhusu 2011/10/10 23:34:26 No. I have seen Black and Gray only as ColorModel
+ printer_color_space_for_black = printing::BLACK;
+ else if (!ppdFindChoice(color_model, printing::kGray)) {
+ disable_color_options = true;
+ }
+
+ if (ppdFindChoice(color_model, printing::kColor))
+ printer_color_space_for_color = printing::COLOR;
+ else if (ppdFindChoice(color_model, printing::kCMYK))
+ printer_color_space_for_color = printing::CMYK;
+ else if (ppdFindChoice(color_model, printing::kRGB))
+ printer_color_space_for_color = printing::RGB;
+ else if (ppdFindChoice(color_model, printing::kRGBA))
+ printer_color_space_for_color = printing::RGBA;
+ else if (ppdFindChoice(color_model, printing::kRGB16))
+ printer_color_space_for_color = printing::RGB16;
+ else if (ppdFindChoice(color_model, printing::kCMY))
+ printer_color_space_for_color = printing::CMY;
+ else if (ppdFindChoice(color_model, printing::kKCMY))
+ printer_color_space_for_color = printing::KCMY;
+ else if (ppdFindChoice(color_model, printing::kCMY_K))
+ printer_color_space_for_color = printing::CMY_K;
+ } else {
+ disable_color_options = true;
+ }
+ }
+
+ // If this is a foomatic ppd, color values are present in
+ // PrintoutMode attribute.
+ ppd_attr_t* foomatic_id_attr = ppdFindAttr(ppd, kFoomaticId, NULL);
+ if (foomatic_id_attr && foomatic_id_attr->value) {
+ ppd_option_t* printout_mode = ppdFindOption(ppd, kPrintoutMode);
+ if (printout_mode) {
+ disable_color_options = false;
+ printer_color_space_for_color = printing::PRINTOUTMODE_NORMAL;
+ printer_color_space_for_black = printing::PRINTOUTMODE_NORMAL;
+
+ // Check to see if NORMAL_GRAY value is supported by PrintoutMode.
+ // If NORMAL_GRAY is not supported, NORMAL value is used to
+ // represent grayscale. If NORMAL_GRAY is supported, NORMAL is used to
+ // represent color.
+ if (ppdFindChoice(printout_mode, printing::kNormalGray))
+ printer_color_space_for_black = printing::PRINTOUTMODE_NORMAL_GRAY;
+
+ // Get the default marked choice to identify the default color setting
+ // value.
+ ppd_choice_t* printout_mode_choice =
+ ppdFindMarkedChoice(ppd, kPrintoutMode);
+ if (!printout_mode_choice) {
+ printout_mode_choice = ppdFindChoice(printout_mode,
+ printout_mode->defchoice);
+ }
+
+ if (printout_mode_choice) {
+ if ((base::strcasecmp(printout_mode_choice->choice,
+ printing::kNormalGray) == 0) ||
+ (base::strcasecmp(printout_mode_choice->choice,
+ kHighGray) == 0) ||
+ (base::strcasecmp(printout_mode_choice->choice,
+ kDraftGray) == 0)) {
+ printer_color_space_for_black =
+ printing::PRINTOUTMODE_NORMAL_GRAY;
+ set_color_as_default = false;
+ }
+ }
+ disable_color_options = printer_color_space_for_black ==
+ printing::PRINTOUTMODE_NORMAL;
+ }
+ }
+
+ // Samsung printers use "ColorMode" attribute in their ppds.
+ ppd_option_t* color_mode_option = ppdFindOption(ppd, kColorMode);
+ if (color_mode_option) {
+ disable_color_options = false;
+ printer_color_space_for_color = printing::COLORMODE_COLOR;
+ printer_color_space_for_black = printing::COLORMODE_MONOCHROME;
+ if (!(ppdFindChoice(color_mode_option, printing::kColor) &&
+ ppdFindChoice(color_mode_option, printing::kMonochrome))) {
+ disable_color_options = true;
+ }
+
+ ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
+ if (!mode_choice) {
+ mode_choice = ppdFindChoice(color_mode_option,
+ color_mode_option->defchoice);
+ }
+
+ if (mode_choice) {
+ set_color_as_default =
+ (base::strcasecmp(mode_choice->choice, printing::kColor) == 0);
+ }
+ }
+
+ // HP printers use "Color/Color Model" attribute in their ppds.
+ color_mode_option = ppdFindOption(ppd, printing::kColor);
+ if (color_mode_option) {
+ disable_color_options = false;
+ printer_color_space_for_color = printing::HP_COLOR_COLOR;
+ printer_color_space_for_black = printing::HP_COLOR_BLACK;
+ if (!(ppdFindChoice(color_mode_option, printing::kColor) &&
+ ppdFindChoice(color_mode_option, printing::kBlack))) {
+ disable_color_options = true;
+ }
+
+ ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
+ if (!mode_choice) {
+ mode_choice = ppdFindChoice(color_mode_option,
+ color_mode_option->defchoice);
+ }
+
+ if (mode_choice) {
+ set_color_as_default =
+ (base::strcasecmp(mode_choice->choice, printing::kColor) == 0);
+ }
+ }
+
+ // Canon printers use "ProcessColorModel" attribute in their ppds.
+ color_mode_option = ppdFindOption(ppd, kProcessColorModel);
+ if (color_mode_option) {
+ disable_color_options = false;
+ if (ppdFindChoice(color_mode_option, printing::kRGB))
+ printer_color_space_for_color = printing::PROCESSCOLORMODEL_RGB;
+ else if (ppdFindChoice(color_mode_option, printing::kCMYK))
+ printer_color_space_for_color = printing::PROCESSCOLORMODEL_CMYK;
+ else
+ disable_color_options = true;
+
+ if (ppdFindChoice(color_mode_option, printing::kGreyscale))
+ printer_color_space_for_black = printing::PROCESSCOLORMODEL_GREYSCALE;
+ else
+ disable_color_options = true;
+
+ ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd,
+ kProcessColorModel);
+ if (!mode_choice) {
+ mode_choice = ppdFindChoice(color_mode_option,
+ color_mode_option->defchoice);
+ }
+
+ if (mode_choice) {
+ set_color_as_default =
+ (base::strcasecmp(mode_choice->choice,
+ printing::kGreyscale) != 0);
}
}
ppdClose(ppd);
@@ -439,10 +603,16 @@ class PrintSystemTaskProxy
// Therefore we don't need to parse the whole XML file, we just need to
// search the string. The spec can be found at:
// http://msdn.microsoft.com/en-us/windows/hardware/gg463431.
+ bool supports_color = false;
+ bool supports_grayscale = true;
supports_color = (printer_info.printer_capabilities.find(kPskColor) !=
std::string::npos);
- if (supports_color)
- printer_color_space = printing::COLOR;
+
+ supports_grayscale =
+ (printer_info.printer_capabilities.find(kPskGray) !=
+ std::string::npos) ||
+ (printer_info.printer_capabilities.find(kPskMonochrome) !=
+ std::string::npos);
set_duplex_as_default =
(printer_info.printer_defaults.find(kPskDuplexFeature) !=
@@ -459,20 +629,24 @@ class PrintSystemTaskProxy
default_duplex_setting_value = printing::SIMPLEX;
}
}
+ disable_color_options = !supports_color || !supports_grayscale;
vandebo (ex-Chrome) 2011/10/07 18:23:30 Can you use this logic above?
kmadhusu 2011/10/10 23:34:26 Done.
+ set_color_as_default = supports_color;
#else
NOTIMPLEMENTED();
#endif
-
DictionaryValue settings_info;
- settings_info.SetBoolean(kDisableColorOption, !supports_color);
- if (!supports_color) {
- settings_info.SetBoolean(kSetColorAsDefault, false);
+ settings_info.SetBoolean(kDisableColorOption, disable_color_options);
+ if (disable_color_options) {
+ settings_info.SetBoolean(kSetColorAsDefault, set_color_as_default);
} else {
- settings_info.SetBoolean(kSetColorAsDefault,
- PrintPreviewHandler::last_used_color_setting_);
+ settings_info.SetBoolean(kSetColorAsDefault,
+ PrintPreviewHandler::last_used_color_setting_);
}
settings_info.SetBoolean(kSetDuplexAsDefault, set_duplex_as_default);
- settings_info.SetInteger(kPrinterColorModelForColor, printer_color_space);
+ settings_info.SetInteger(kPrinterColorModelForColor,
+ printer_color_space_for_color);
+ settings_info.SetInteger(kPrinterColorModelForBlack,
+ printer_color_space_for_black);
settings_info.SetInteger(kPrinterDefaultDuplexValue,
default_duplex_setting_value);
BrowserThread::PostTask(
@@ -722,7 +896,7 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
int color_mode;
if (!settings->GetInteger(printing::kSettingColor, &color_mode))
color_mode = printing::GRAY;
- last_used_color_setting_ = (color_mode != printing::GRAY);
+ last_used_color_setting_ = isColorModeSelected(color_mode);
bool print_to_pdf = false;
settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);

Powered by Google App Engine
This is Rietveld 408576698