Commit 805a022c authored by Nikita Podguzov's avatar Nikita Podguzov Committed by Commit Bot

Printing: Move ParsePaper() to printing utils

This allows to reuse this function for all platforms. We'll need it in
the follow-up CL with PrintingPaperSizeDefault policy.

Bug: 1015690
Change-Id: Ibb5daa2958e88b376556f3374b88ab8457d08402
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2144030Reviewed-by: default avatarSean Kau <skau@chromium.org>
Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Commit-Queue: Nikita Podguzov <nikitapodguzov@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759350}
parent 3f376d72
...@@ -13,14 +13,13 @@ ...@@ -13,14 +13,13 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h" #include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "printing/backend/cups_connection.h" #include "printing/backend/cups_connection.h"
#include "printing/backend/cups_ipp_constants.h" #include "printing/backend/cups_ipp_constants.h"
#include "printing/backend/cups_printer.h" #include "printing/backend/cups_printer.h"
#include "printing/backend/print_backend_consts.h" #include "printing/backend/print_backend_consts.h"
#include "printing/printing_utils.h"
#include "printing/units.h" #include "printing/units.h"
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -39,22 +38,9 @@ constexpr int kPinMinimumLength = 4; ...@@ -39,22 +38,9 @@ constexpr int kPinMinimumLength = 4;
namespace { namespace {
constexpr int kMicronsPerMM = 1000;
constexpr double kMMPerInch = 25.4; constexpr double kMMPerInch = 25.4;
constexpr double kMicronsPerInch = kMMPerInch * kMicronsPerMM;
constexpr double kCmPerInch = kMMPerInch * 0.1; constexpr double kCmPerInch = kMMPerInch * 0.1;
// Defines two prefixes of a special breed of media sizes not meant for
// users' eyes. CUPS incidentally returns these IPP values to us, but
// we have no use for them.
constexpr base::StringPiece kMediaCustomMinPrefix = "custom_min";
constexpr base::StringPiece kMediaCustomMaxPrefix = "custom_max";
enum Unit {
INCHES,
MILLIMETERS,
};
struct ColorMap { struct ColorMap {
const char* color; const char* color;
ColorModel model; ColorModel model;
...@@ -94,79 +80,6 @@ DuplexMode DuplexModeFromIpp(base::StringPiece ipp_duplex) { ...@@ -94,79 +80,6 @@ DuplexMode DuplexModeFromIpp(base::StringPiece ipp_duplex) {
return UNKNOWN_DUPLEX_MODE; return UNKNOWN_DUPLEX_MODE;
} }
gfx::Size DimensionsToMicrons(base::StringPiece value) {
Unit unit;
base::StringPiece dims;
size_t unit_position;
if ((unit_position = value.find("mm")) != base::StringPiece::npos) {
unit = MILLIMETERS;
dims = value.substr(0, unit_position);
} else if ((unit_position = value.find("in")) != base::StringPiece::npos) {
unit = INCHES;
dims = value.substr(0, unit_position);
} else {
LOG(WARNING) << "Could not parse paper dimensions";
return {0, 0};
}
double width;
double height;
std::vector<std::string> pieces = base::SplitString(
dims, "x", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
if (pieces.size() != 2 || !base::StringToDouble(pieces[0], &width) ||
!base::StringToDouble(pieces[1], &height)) {
return {0, 0};
}
int width_microns;
int height_microns;
switch (unit) {
case MILLIMETERS:
width_microns = width * kMicronsPerMM;
height_microns = height * kMicronsPerMM;
break;
case INCHES:
width_microns = width * kMicronsPerInch;
height_microns = height * kMicronsPerInch;
break;
default:
NOTREACHED();
break;
}
return gfx::Size{width_microns, height_microns};
}
// We read the media name expressed by |value| and return a Paper
// with the vendor_id and size_um members populated.
// We don't handle l10n here. We do populate the display_name member
// with the prettified vendor ID, but fully expect the caller to clobber
// this if a better localization exists.
PrinterSemanticCapsAndDefaults::Paper ParsePaper(base::StringPiece value) {
// <name>_<width>x<height>{in,mm}
// e.g. na_letter_8.5x11in, iso_a4_210x297mm
std::vector<base::StringPiece> pieces = base::SplitStringPiece(
value, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
// We expect at least a display string and a dimension string.
// Additionally, we drop the "custom_min*" and "custom_max*" special
// "sizes" (not for users' eyes).
if (pieces.size() < 2 || value.starts_with(kMediaCustomMinPrefix) ||
value.starts_with(kMediaCustomMaxPrefix))
return PrinterSemanticCapsAndDefaults::Paper();
base::StringPiece dimensions = pieces.back();
PrinterSemanticCapsAndDefaults::Paper paper;
paper.vendor_id = value.as_string();
paper.size_um = DimensionsToMicrons(dimensions);
// Omits the final token describing the media dimensions.
pieces.pop_back();
paper.display_name = base::JoinString(pieces, " ");
return paper;
}
ColorModel DefaultColorModel(const CupsOptionProvider& printer) { ColorModel DefaultColorModel(const CupsOptionProvider& printer) {
// default color // default color
ipp_attribute_t* attr = printer.GetDefaultOptionValue(kIppColor); ipp_attribute_t* attr = printer.GetDefaultOptionValue(kIppColor);
......
...@@ -11,6 +11,9 @@ ...@@ -11,6 +11,9 @@
#include <string> #include <string>
#include "base/logging.h" #include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "printing/units.h" #include "printing/units.h"
...@@ -25,6 +28,64 @@ namespace { ...@@ -25,6 +28,64 @@ namespace {
constexpr size_t kMaxDocumentTitleLength = 80; constexpr size_t kMaxDocumentTitleLength = 80;
constexpr gfx::Size kIsoA4Microns = gfx::Size(210000, 297000); constexpr gfx::Size kIsoA4Microns = gfx::Size(210000, 297000);
constexpr int kMicronsPerMM = 1000;
constexpr double kMMPerInch = 25.4;
constexpr double kMicronsPerInch = kMMPerInch * kMicronsPerMM;
// Defines two prefixes of a special breed of media sizes not meant for
// users' eyes. CUPS incidentally returns these IPP values to us, but
// we have no use for them.
constexpr base::StringPiece kMediaCustomMinPrefix = "custom_min";
constexpr base::StringPiece kMediaCustomMaxPrefix = "custom_max";
enum Unit {
INCHES,
MILLIMETERS,
};
gfx::Size DimensionsToMicrons(base::StringPiece value) {
Unit unit;
base::StringPiece dims;
size_t unit_position;
if ((unit_position = value.find("mm")) != base::StringPiece::npos) {
unit = MILLIMETERS;
dims = value.substr(0, unit_position);
} else if ((unit_position = value.find("in")) != base::StringPiece::npos) {
unit = INCHES;
dims = value.substr(0, unit_position);
} else {
LOG(WARNING) << "Could not parse paper dimensions";
return {0, 0};
}
double width;
double height;
std::vector<std::string> pieces = base::SplitString(
dims, "x", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
if (pieces.size() != 2 || !base::StringToDouble(pieces[0], &width) ||
!base::StringToDouble(pieces[1], &height)) {
return {0, 0};
}
int width_microns;
int height_microns;
switch (unit) {
case MILLIMETERS:
width_microns = width * kMicronsPerMM;
height_microns = height * kMicronsPerMM;
break;
case INCHES:
width_microns = width * kMicronsPerInch;
height_microns = height * kMicronsPerInch;
break;
default:
NOTREACHED();
break;
}
return gfx::Size{width_microns, height_microns};
}
} // namespace } // namespace
base::string16 SimplifyDocumentTitleWithLength(const base::string16& title, base::string16 SimplifyDocumentTitleWithLength(const base::string16& title,
...@@ -106,4 +167,34 @@ bool SizesEqualWithinEpsilon(const gfx::Size& lhs, ...@@ -106,4 +167,34 @@ bool SizesEqualWithinEpsilon(const gfx::Size& lhs,
std::abs(lhs.height() - rhs.height()) <= epsilon; std::abs(lhs.height() - rhs.height()) <= epsilon;
} }
// We read the media name expressed by |value| and return a Paper
// with the vendor_id and size_um members populated.
// We don't handle l10n here. We do populate the display_name member
// with the prettified vendor ID, but fully expect the caller to clobber
// this if a better localization exists.
PrinterSemanticCapsAndDefaults::Paper ParsePaper(base::StringPiece value) {
// <name>_<width>x<height>{in,mm}
// e.g. na_letter_8.5x11in, iso_a4_210x297mm
std::vector<base::StringPiece> pieces = base::SplitStringPiece(
value, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
// We expect at least a display string and a dimension string.
// Additionally, we drop the "custom_min*" and "custom_max*" special
// "sizes" (not for users' eyes).
if (pieces.size() < 2 || value.starts_with(kMediaCustomMinPrefix) ||
value.starts_with(kMediaCustomMaxPrefix))
return PrinterSemanticCapsAndDefaults::Paper();
base::StringPiece dimensions = pieces.back();
PrinterSemanticCapsAndDefaults::Paper paper;
paper.vendor_id = value.as_string();
paper.size_um = DimensionsToMicrons(dimensions);
// Omits the final token describing the media dimensions.
pieces.pop_back();
paper.display_name = base::JoinString(pieces, " ");
return paper;
}
} // namespace printing } // namespace printing
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/string_piece.h" #include "base/strings/string_piece.h"
#include "printing/backend/print_backend.h"
#include "printing/printing_export.h" #include "printing/printing_export.h"
namespace gfx { namespace gfx {
...@@ -45,6 +46,9 @@ PRINTING_EXPORT bool SizesEqualWithinEpsilon(const gfx::Size& lhs, ...@@ -45,6 +46,9 @@ PRINTING_EXPORT bool SizesEqualWithinEpsilon(const gfx::Size& lhs,
const gfx::Size& rhs, const gfx::Size& rhs,
int epsilon); int epsilon);
PRINTING_EXPORT PrinterSemanticCapsAndDefaults::Paper ParsePaper(
base::StringPiece value);
} // namespace printing } // namespace printing
#endif // PRINTING_PRINTING_UTILS_H_ #endif // PRINTING_PRINTING_UTILS_H_
...@@ -99,4 +99,18 @@ TEST(PrintingUtilsTest, SizesEqualWithinEpsilon) { ...@@ -99,4 +99,18 @@ TEST(PrintingUtilsTest, SizesEqualWithinEpsilon) {
SizesEqualWithinEpsilon(kIsoA4Microns, gfx::Size(210500, 296500), 500)); SizesEqualWithinEpsilon(kIsoA4Microns, gfx::Size(210500, 296500), 500));
} }
TEST(PrintingUtilsTest, ParsePaper) {
PrinterSemanticCapsAndDefaults::Paper paper_mm =
ParsePaper("iso_a4_210x297mm");
EXPECT_EQ(gfx::Size(210000, 297000), paper_mm.size_um);
EXPECT_EQ("iso_a4_210x297mm", paper_mm.vendor_id);
EXPECT_EQ("iso a4", paper_mm.display_name);
PrinterSemanticCapsAndDefaults::Paper paper_in =
ParsePaper("na_letter_8.5x11in");
EXPECT_EQ(gfx::Size(215900, 279400), paper_in.size_um);
EXPECT_EQ("na_letter_8.5x11in", paper_in.vendor_id);
EXPECT_EQ("na letter", paper_in.display_name);
}
} // namespace printing } // namespace printing
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