Skip to content

Commit

Permalink
Support Epson PPD color parsing
Browse files Browse the repository at this point in the history
Epson printers use the "Ink" attribute instead of other commonly used
attributes like "ColorModel".

Remove unnecessary scoping in some unit tests.

Bug: 1043255
Change-Id: I3a71c0354de266cf41b99d06372e883e8b200eb8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2014101
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Sean Kau <skau@chromium.org>
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
Cr-Commit-Position: refs/heads/master@{#734136}
  • Loading branch information
Daniel Hosseinian authored and Commit Bot committed Jan 22, 2020
1 parent d5252bd commit f42aff0
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 27 deletions.
42 changes: 35 additions & 7 deletions printing/backend/cups_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,14 @@ namespace printing {
// This section contains helper code for PPD parsing for semantic capabilities.
namespace {

const char kColorDevice[] = "ColorDevice";
const char kColorModel[] = "ColorModel";
const char kColorMode[] = "ColorMode";
const char kProcessColorModel[] = "ProcessColorModel";
const char kPrintoutMode[] = "PrintoutMode";
const char kDraftGray[] = "Draft.Gray";
const char kHighGray[] = "High.Gray";
constexpr char kColorDevice[] = "ColorDevice";
constexpr char kColorModel[] = "ColorModel";
constexpr char kColorMode[] = "ColorMode";
constexpr char kInk[] = "Ink";
constexpr char kProcessColorModel[] = "ProcessColorModel";
constexpr char kPrintoutMode[] = "PrintoutMode";
constexpr char kDraftGray[] = "Draft.Gray";
constexpr char kHighGray[] = "High.Gray";

constexpr char kDuplex[] = "Duplex";
constexpr char kDuplexNone[] = "None";
Expand Down Expand Up @@ -370,6 +371,32 @@ bool GetHPColorModeSettings(ppd_file_t* ppd,
return true;
}

bool GetEpsonInkSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
bool* color_is_default) {
// Epson printers use "Ink" attribute in their PPDs.
ppd_option_t* color_mode_option = ppdFindOption(ppd, kInk);
if (!color_mode_option)
return false;

if (ppdFindChoice(color_mode_option, kColor))
*color_model_for_color = EPSON_INK_COLOR;
if (ppdFindChoice(color_mode_option, kMono))
*color_model_for_black = EPSON_INK_MONO;

ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kInk);
if (!mode_choice) {
mode_choice =
ppdFindChoice(color_mode_option, color_mode_option->defchoice);
}

if (mode_choice) {
*color_is_default = EqualsCaseInsensitiveASCII(mode_choice->choice, kColor);
}
return true;
}

bool GetProcessColorModelSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
Expand Down Expand Up @@ -417,6 +444,7 @@ bool GetColorModelSettings(ppd_file_t* ppd,
GetHPColorSettings(ppd, cm_black, cm_color, is_color) ||
GetHPColorModeSettings(ppd, cm_black, cm_color, is_color) ||
GetBrotherColorSettings(ppd, cm_black, cm_color, is_color) ||
GetEpsonInkSettings(ppd, cm_black, cm_color, is_color) ||
GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color);
}

Expand Down
58 changes: 38 additions & 20 deletions printing/backend/cups_helper_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -319,9 +319,8 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingBrotherPrinters) {
}

TEST(PrintBackendCupsHelperTest, TestPpdParsingHpPrinters) {
{
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*ColorDevice: True
*OpenUI *HPColorMode/Mode: PickOne
*DefaultHPColorMode: ColorPrint
Expand All @@ -331,33 +330,52 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingHpPrinters) {
<< /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);
}
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, TestPpdParsingEpsonPrinters) {
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*ColorDevice: True
*OpenUI *Ink/Ink: PickOne
*DefaultInk: COLOR
*Ink COLOR/Color: "
<</cupsBitsPerColor 8 /cupsColorOrder 0
/cupsColorSpace 1 /cupsCompression 1>> setpagedevice"
*Ink MONO/Monochrome: "
<</cupsBitsPerColor 8 /cupsColorOrder 0
/cupsColorSpace 0 /cupsCompression 1>> setpagedevice"
*CloseUI: *Ink)";

PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.color_changeable);
EXPECT_TRUE(caps.color_default);
EXPECT_EQ(EPSON_INK_COLOR, caps.color_model);
EXPECT_EQ(EPSON_INK_MONO, caps.bw_model);
}

TEST(PrintBackendCupsHelperTest, TestPpdParsingSamsungPrinters) {
{
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*ColorDevice: True
*OpenUI *ColorMode/Color Mode: Boolean
*DefaultColorMode: True
*ColorMode False/Grayscale: ""
*ColorMode True/Color: ""
*CloseUI: *ColorMode)";

PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.color_changeable);
EXPECT_TRUE(caps.color_default);
EXPECT_EQ(COLORMODE_COLOR, caps.color_model);
EXPECT_EQ(COLORMODE_MONOCHROME, caps.bw_model);
}
PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.color_changeable);
EXPECT_TRUE(caps.color_default);
EXPECT_EQ(COLORMODE_COLOR, caps.color_model);
EXPECT_EQ(COLORMODE_MONOCHROME, caps.bw_model);
}

} // namespace printing
2 changes: 2 additions & 0 deletions printing/print_job_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ enum ColorModel {
BROTHER_CUPS_MONO, // Used in Brother color laser printer PPDs.
BROTHER_BRSCRIPT3_COLOR, // Used in Brother BRScript3 color printer PPDs.
BROTHER_BRSCRIPT3_BLACK, // Used in Brother BRScript3 color printer PPDs.
EPSON_INK_COLOR, // Used in Epson printer PPDs.
EPSON_INK_MONO, // Used in Epson printer PPDs.
};

// What kind of margins to use.
Expand Down
10 changes: 10 additions & 0 deletions printing/print_settings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@ void GetColorModelForMode(int color_mode,
constexpr char kCUPSColorModel[] = "ColorModel";
constexpr char kCUPSPrintoutMode[] = "PrintoutMode";
constexpr char kCUPSProcessColorModel[] = "ProcessColorModel";
constexpr char kCUPSInk[] = "Ink";
constexpr char kCUPSBrotherMonoColor[] = "BRMonoColor";
constexpr char kCUPSBrotherPrintQuality[] = "BRPrintQuality";
#else
constexpr char kCUPSColorMode[] = "cups-ColorMode";
constexpr char kCUPSColorModel[] = "cups-ColorModel";
constexpr char kCUPSPrintoutMode[] = "cups-PrintoutMode";
constexpr char kCUPSProcessColorModel[] = "cups-ProcessColorModel";
constexpr char kCUPSInk[] = "cups-Ink";
constexpr char kCUPSBrotherMonoColor[] = "cups-BRMonoColor";
constexpr char kCUPSBrotherPrintQuality[] = "cups-BRPrintQuality";
#endif // defined(OS_MACOSX)
Expand Down Expand Up @@ -129,6 +131,14 @@ void GetColorModelForMode(int color_mode,
color_setting_name->assign(kCUPSBrotherPrintQuality);
color_value->assign(kBlack);
break;
case EPSON_INK_COLOR:
color_setting_name->assign(kCUPSInk);
color_value->assign(kColor);
break;
case EPSON_INK_MONO:
color_setting_name->assign(kCUPSInk);
color_value->assign(kMono);
break;
default:
color_value->assign(kGrayscale);
break;
Expand Down

0 comments on commit f42aff0

Please sign in to comment.