Commit 5ac24882 authored by Daniel Hosseinian's avatar Daniel Hosseinian Committed by Commit Bot

Support Xerox PPD color parsing

Some Xerox printers use the "XRXColor" attribute instead of other
commonly used attributes like "ColorModel".

Bug: 1044811
Change-Id: Ib334039ef98802140ee923c09d96426a631641d5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2018333
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: default avatarSean Kau <skau@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737594}
parent af65c984
......@@ -65,6 +65,11 @@ constexpr char kSharpARCMode[] = "ARCMode";
constexpr char kSharpCMColor[] = "CMColor";
constexpr char kSharpCMBW[] = "CMBW";
// Xerox printer specific options.
constexpr char kXeroxXRXColor[] = "XRXColor";
constexpr char kXeroxAutomatic[] = "Automatic";
constexpr char kXeroxBW[] = "BW";
void ParseLpOptions(const base::FilePath& filepath,
base::StringPiece printer_name,
int* num_options,
......@@ -430,6 +435,34 @@ bool GetSharpARCModeSettings(ppd_file_t* ppd,
return true;
}
bool GetXeroxColorSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
bool* color_is_default) {
// Some Xerox printers use "XRXColor" attribute in their PPDs.
ppd_option_t* color_mode_option = ppdFindOption(ppd, kXeroxXRXColor);
if (!color_mode_option)
return false;
if (ppdFindChoice(color_mode_option, kXeroxAutomatic))
*color_model_for_color = XEROX_XRXCOLOR_AUTOMATIC;
if (ppdFindChoice(color_mode_option, kXeroxBW))
*color_model_for_black = XEROX_XRXCOLOR_BW;
ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kXeroxXRXColor);
if (!mode_choice) {
mode_choice =
ppdFindChoice(color_mode_option, color_mode_option->defchoice);
}
if (mode_choice) {
// Many Xerox printers use "Automatic" as the default color mode.
*color_is_default =
!EqualsCaseInsensitiveASCII(mode_choice->choice, kXeroxBW);
}
return true;
}
bool GetProcessColorModelSettings(ppd_file_t* ppd,
ColorModel* color_model_for_black,
ColorModel* color_model_for_color,
......@@ -479,6 +512,7 @@ bool GetColorModelSettings(ppd_file_t* ppd,
GetBrotherColorSettings(ppd, cm_black, cm_color, is_color) ||
GetEpsonInkSettings(ppd, cm_black, cm_color, is_color) ||
GetSharpARCModeSettings(ppd, cm_black, cm_color, is_color) ||
GetXeroxColorSettings(ppd, cm_black, cm_color, is_color) ||
GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color);
}
......
......@@ -401,4 +401,25 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingSharpPrinters) {
EXPECT_EQ(SHARP_ARCMODE_CMBW, caps.bw_model);
}
TEST(PrintBackendCupsHelperTest, TestPpdParsingXeroxPrinters) {
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*ColorDevice: True
*OpenUI *XRXColor/Color Correction: PickOne
*OrderDependency: 48.0 AnySetup *XRXColor
*DefaultXRXColor: Automatic
*XRXColor Automatic/Automatic: "
<</ProcessColorModel /DeviceCMYK>> setpagedevice"
*XRXColor BW/Black and White: "
<</ProcessColorModel /DeviceGray>> setpagedevice"
*CloseUI: *XRXColor)";
PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.color_changeable);
EXPECT_TRUE(caps.color_default);
EXPECT_EQ(XEROX_XRXCOLOR_AUTOMATIC, caps.color_model);
EXPECT_EQ(XEROX_XRXCOLOR_BW, caps.bw_model);
}
} // namespace printing
......@@ -229,6 +229,8 @@ const char kRGBA[] = "RGBA";
const char kRGB16[] = "RGB16";
const char kSharpCMColor[] = "CMColor";
const char kSharpCMBW[] = "CMBW";
const char kXeroxAutomatic[] = "Automatic";
const char kXeroxBW[] = "BW";
#endif
} // namespace printing
......@@ -101,6 +101,8 @@ PRINTING_EXPORT extern const char kRGBA[];
PRINTING_EXPORT extern const char kRGB16[];
PRINTING_EXPORT extern const char kSharpCMColor[];
PRINTING_EXPORT extern const char kSharpCMBW[];
PRINTING_EXPORT extern const char kXeroxAutomatic[];
PRINTING_EXPORT extern const char kXeroxBW[];
#endif
// Print job duplex mode values.
......@@ -148,6 +150,8 @@ enum ColorModel {
EPSON_INK_MONO, // Used in Epson printer PPDs.
SHARP_ARCMODE_CMCOLOR, // Used in Sharp printer PPDs.
SHARP_ARCMODE_CMBW, // Used in Sharp printer PPDs.
XEROX_XRXCOLOR_AUTOMATIC, // Used in Xerox printer PPDs.
XEROX_XRXCOLOR_BW, // Used in Xerox printer PPDs.
};
// What kind of margins to use.
......
......@@ -35,6 +35,7 @@ void GetColorModelForMode(int color_mode,
constexpr char kCUPSBrotherMonoColor[] = "BRMonoColor";
constexpr char kCUPSBrotherPrintQuality[] = "BRPrintQuality";
constexpr char kCUPSSharpARCMode[] = "ARCMode";
constexpr char kCUPSXeroxXRXColor[] = "XRXColor";
#else
constexpr char kCUPSColorMode[] = "cups-ColorMode";
constexpr char kCUPSColorModel[] = "cups-ColorModel";
......@@ -44,6 +45,7 @@ void GetColorModelForMode(int color_mode,
constexpr char kCUPSBrotherMonoColor[] = "cups-BRMonoColor";
constexpr char kCUPSBrotherPrintQuality[] = "cups-BRPrintQuality";
constexpr char kCUPSSharpARCMode[] = "cups-ARCMode";
constexpr char kCUPSXeroxXRXColor[] = "cups-XRXColor";
#endif // defined(OS_MACOSX)
color_setting_name->assign(kCUPSColorModel);
......@@ -149,6 +151,14 @@ void GetColorModelForMode(int color_mode,
color_setting_name->assign(kCUPSSharpARCMode);
color_value->assign(kSharpCMBW);
break;
case XEROX_XRXCOLOR_AUTOMATIC:
color_setting_name->assign(kCUPSXeroxXRXColor);
color_value->assign(kXeroxAutomatic);
break;
case XEROX_XRXCOLOR_BW:
color_setting_name->assign(kCUPSXeroxXRXColor);
color_value->assign(kXeroxBW);
break;
default:
color_value->assign(kGrayscale);
break;
......@@ -175,6 +185,7 @@ base::Optional<bool> IsColorModelSelected(int color_mode) {
case BROTHER_BRSCRIPT3_COLOR:
case EPSON_INK_COLOR:
case SHARP_ARCMODE_CMCOLOR:
case XEROX_XRXCOLOR_AUTOMATIC:
return true;
case GRAY:
case BLACK:
......@@ -187,6 +198,7 @@ base::Optional<bool> IsColorModelSelected(int color_mode) {
case BROTHER_BRSCRIPT3_BLACK:
case EPSON_INK_MONO:
case SHARP_ARCMODE_CMBW:
case XEROX_XRXCOLOR_BW:
return false;
default:
NOTREACHED();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment