0

Improve PPD color parsing for some HP printers.

Some HP printers use the "HPColorMode" attribute instead of the "Color"
attribute.

Bug: 1035009
Change-Id: I75804e86680e3e50f9456f414bfc5bb13ef3956a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1972057
Reviewed-by: Luum Habtemariam <luum@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#729538}
This commit is contained in:
Lei Zhang
2020-01-08 23:30:10 +00:00
committed by Commit Bot
parent b6bcac1ad0
commit ced128f424
2 changed files with 55 additions and 1 deletions

@ -50,6 +50,11 @@ constexpr char kBrotherDuplex[] = "BRDuplex";
constexpr char kBrotherMonoColor[] = "BRMonoColor";
constexpr char kBrotherPrintQuality[] = "BRPrintQuality";
// HP printer specific options.
constexpr char kHpColorMode[] = "HPColorMode";
constexpr char kHpColorPrint[] = "ColorPrint";
constexpr char kHpGrayscalePrint[] = "GrayscalePrint";
// Samsung printer specific options.
constexpr char kSamsungColorTrue[] = "True";
constexpr char kSamsungColorFalse[] = "False";
@ -318,7 +323,7 @@ bool GetHPColorSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
bool* color_is_default) {
// HP printers use "Color/Color Model" attribute in their PPDs.
// Some HP printers use "Color/Color Model" attribute in their PPDs.
ppd_option_t* color_mode_option = ppdFindOption(ppd, kColor);
if (!color_mode_option)
return false;
@ -339,6 +344,32 @@ bool GetHPColorSettings(ppd_file_t* ppd,
return true;
}
bool GetHPColorModeSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
bool* color_is_default) {
// Some HP printers use "HPColorMode/Mode" attribute in their PPDs.
ppd_option_t* color_mode_option = ppdFindOption(ppd, kHpColorMode);
if (!color_mode_option)
return false;
if (ppdFindChoice(color_mode_option, kHpColorPrint))
*color_model_for_color = HP_COLOR_COLOR;
if (ppdFindChoice(color_mode_option, kHpGrayscalePrint))
*color_model_for_black = HP_COLOR_BLACK;
ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kHpColorMode);
if (!mode_choice) {
mode_choice =
ppdFindChoice(color_mode_option, color_mode_option->defchoice);
}
if (mode_choice) {
*color_is_default =
EqualsCaseInsensitiveASCII(mode_choice->choice, kHpColorPrint);
}
return true;
}
bool GetProcessColorModelSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
@ -384,6 +415,7 @@ bool GetColorModelSettings(ppd_file_t* ppd,
GetPrintOutModeColorSettings(ppd, cm_black, cm_color, is_color) ||
GetColorModeSettings(ppd, cm_black, cm_color, is_color) ||
GetHPColorSettings(ppd, cm_black, cm_color, is_color) ||
GetHPColorModeSettings(ppd, cm_black, cm_color, is_color) ||
GetBrotherColorSettings(ppd, cm_black, cm_color, is_color) ||
GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color);
}

@ -318,6 +318,28 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingBrotherPrinters) {
}
}
TEST(PrintBackendCupsHelperTest, TestPpdParsingHpPrinters) {
{
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*ColorDevice: True
*OpenUI *HPColorMode/Mode: PickOne
*DefaultHPColorMode: ColorPrint
*HPColorMode ColorPrint/Color: "
<< /ProcessColorModel /DeviceCMYK >> setpagedevice"
*HPColorMode GrayscalePrint/Grayscale: "
<< /ProcessColorModel /DeviceGray >> setpagedevice"
*CloseUI: *HPColorMode)";
PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.color_changeable);
EXPECT_TRUE(caps.color_default);
EXPECT_EQ(HP_COLOR_COLOR, caps.color_model);
EXPECT_EQ(HP_COLOR_BLACK, caps.bw_model);
}
}
TEST(PrintBackendCupsHelperTest, TestPpdParsingSamsungPrinters) {
{
constexpr char kTestPpdData[] =