// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/common/printing/print_media_l10n.h"
#include <string>
#include <string_view>
#include "base/containers/contains.h"
#include "base/containers/fixed_flat_map.h"
#include "base/i18n/number_formatting.h"
#include "base/i18n/string_compare.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "components/device_event_log/device_event_log.h"
#include "components/strings/grit/components_strings.h"
#include "printing/backend/print_backend_utils.h"
#include "printing/units.h"
#include "ui/base/l10n/l10n_util.h"
namespace printing {
namespace {
// Return the localized PWG name, display name, and sort group of a media name
// specified by `size` if any is found - else return an empty string in the
// named sizes group. The static map contained here is intended to reach all
// translated media names - see print_media_resources.grd.
MediaSizeInfo InfoForStandardSize(const gfx::Size& size) {
struct RegisteredMediaInfo {
std::string_view vendor_id;
int l10n_id;
MediaSizeGroup sort_group;
};
static constexpr auto kMediaMap = base::MakeFixedFlatMap<gfx::Size,
RegisteredMediaInfo>(
{
{{2600, 3700},
{"iso_a10_26x37mm", PRINT_PREVIEW_MEDIA_ISO_A10_26X37MM,
MediaSizeGroup::kSizeNamed}},
{{2800, 4000},
{"iso_c10_28x40mm", PRINT_PREVIEW_MEDIA_ISO_C10_28X40MM,
MediaSizeGroup::kSizeNamed}},
{{3100, 4400},
{"iso_b10_31x44mm", PRINT_PREVIEW_MEDIA_ISO_B10_31X44MM,
MediaSizeGroup::kSizeNamed}},
{{3200, 4500},
{"jis_b10_32x45mm", PRINT_PREVIEW_MEDIA_JIS_B10_32X45MM,
MediaSizeGroup::kSizeNamed}},
{{3700, 5200},
{"iso_a9_37x52mm", PRINT_PREVIEW_MEDIA_ISO_A9_37X52MM,
MediaSizeGroup::kSizeNamed}},
{{4000, 5700},
{"iso_c9_40x57mm", PRINT_PREVIEW_MEDIA_ISO_C9_40X57MM,
MediaSizeGroup::kSizeNamed}},
{{4400, 6200},
{"iso_b9_44x62mm", PRINT_PREVIEW_MEDIA_ISO_B9_44X62MM,
MediaSizeGroup::kSizeNamed}},
{{4500, 6400},
{"jis_b9_45x64mm", PRINT_PREVIEW_MEDIA_JIS_B9_45X64MM,
MediaSizeGroup::kSizeNamed}},
{{5080, 8890},
{"oe_business-card_2x3.5in",
PRINT_PREVIEW_MEDIA_OE_BUSINESS_CARD_2X3_5IN,
MediaSizeGroup::kSizeIn}},
{{5200, 7400},
{"iso_a8_52x74mm", PRINT_PREVIEW_MEDIA_ISO_A8_52X74MM,
MediaSizeGroup::kSizeNamed}},
{{5398, 8560},
{"iso_id-1_53.98x85.6mm", PRINT_PREVIEW_MEDIA_ISO_ID_1_53_98X85_6MM,
MediaSizeGroup::kSizeNamed}},
{{5400, 8600},
{"om_card_54x86mm", PRINT_PREVIEW_MEDIA_OM_CARD_54X86MM,
MediaSizeGroup::kSizeMm}},
{{5500, 8500},
{"om_business-card_55x85mm",
PRINT_PREVIEW_MEDIA_OM_BUSINESS_CARD_55X85MM,
MediaSizeGroup::kSizeMm}},
{{5500, 9100},
{"om_business-card_55x91mm",
PRINT_PREVIEW_MEDIA_OM_BUSINESS_CARD_55X91MM,
MediaSizeGroup::kSizeMm}},
{{5700, 8100},
{"iso_c8_57x81mm", PRINT_PREVIEW_MEDIA_ISO_C8_57X81MM,
MediaSizeGroup::kSizeNamed}},
{{6200, 8800},
{"iso_b8_62x88mm", PRINT_PREVIEW_MEDIA_ISO_B8_62X88MM,
MediaSizeGroup::kSizeNamed}},
{{6400, 9100},
{"jis_b8_64x91mm", PRINT_PREVIEW_MEDIA_JIS_B8_64X91MM,
MediaSizeGroup::kSizeNamed}},
{{7400, 10500},
{"iso_a7_74x105mm", PRINT_PREVIEW_MEDIA_ISO_A7_74X105MM,
MediaSizeGroup::kSizeNamed}},
{{7620, 12700},
{"na_index-3x5_3x5in", PRINT_PREVIEW_MEDIA_NA_INDEX_3X5_3X5IN,
MediaSizeGroup::kSizeIn}},
{{8100, 11400},
{"iso_c7_81x114mm", PRINT_PREVIEW_MEDIA_ISO_C7_81X114MM,
MediaSizeGroup::kSizeNamed}},
{{8100, 16200},
{"iso_c7c6_81x162mm", PRINT_PREVIEW_MEDIA_ISO_C7C6_81X162MM,
MediaSizeGroup::kSizeNamed}},
{{8800, 12500},
{"iso_b7_88x125mm", PRINT_PREVIEW_MEDIA_ISO_B7_88X125MM,
MediaSizeGroup::kSizeNamed}},
{{8890, 12700},
{"oe_photo-l_3.5x5in", PRINT_PREVIEW_MEDIA_OE_PHOTO_L_3_5X5IN,
MediaSizeGroup::kSizeIn}},
{{8900, 8900},
{"om_square-photo_89x89mm",
PRINT_PREVIEW_MEDIA_OM_SQUARE_PHOTO_89X89MM,
MediaSizeGroup::kSizeMm}},
{{8900, 11900},
{"om_dsc-photo_89x119mm", PRINT_PREVIEW_MEDIA_OM_DSC_PHOTO_89X119MM,
MediaSizeGroup::kSizeNamed}},
{{9000, 20500},
{"jpn_chou4_90x205mm", PRINT_PREVIEW_MEDIA_JPN_CHOU4_90X205MM,
MediaSizeGroup::kSizeNamed}},
{{9000, 22500},
{"jpn_chou40_90x225mm", PRINT_PREVIEW_MEDIA_JPN_CHOU40_90X225MM,
MediaSizeGroup::kSizeNamed}},
{{9100, 12800},
{"jis_b7_91x128mm", PRINT_PREVIEW_MEDIA_JIS_B7_91X128MM,
MediaSizeGroup::kSizeNamed}},
{{9207, 16510},
{"na_personal_3.625x6.5in",
PRINT_PREVIEW_MEDIA_NA_PERSONAL_3_625X6_5IN,
MediaSizeGroup::kSizeNamed}},
{{9700, 15100},
{"prc_32k_97x151mm", PRINT_PREVIEW_MEDIA_PRC_32K_97X151MM,
MediaSizeGroup::kSizeNamed}},
{{9800, 19000},
{"jpn_you6_98x190mm", PRINT_PREVIEW_MEDIA_JPN_YOU6_98X190MM,
MediaSizeGroup::kSizeNamed}},
{{9842, 19050},
{"na_monarch_3.875x7.5in",
PRINT_PREVIEW_MEDIA_NA_MONARCH_3_875X7_5IN,
MediaSizeGroup::kSizeNamed}},
{{9842, 22542},
{"na_number-9_3.875x8.875in",
PRINT_PREVIEW_MEDIA_NA_NUMBER_9_3_875X8_875IN,
MediaSizeGroup::kSizeNamed}},
{{10000, 14800},
{"jpn_hagaki_100x148mm", PRINT_PREVIEW_MEDIA_JPN_HAGAKI_100X148MM,
MediaSizeGroup::kSizeNamed}},
{{10000, 15000},
{"om_small-photo_100x150mm",
PRINT_PREVIEW_MEDIA_OM_SMALL_PHOTO_100X150MM,
MediaSizeGroup::kSizeMm}},
{{10000, 20000},
{"om_wide-photo_100x200mm",
PRINT_PREVIEW_MEDIA_OM_WIDE_PHOTO_100X200MM,
MediaSizeGroup::kSizeMm}},
{{10160, 10160},
{"oe_square-photo_4x4in", PRINT_PREVIEW_MEDIA_OE_SQUARE_PHOTO_4X4IN,
MediaSizeGroup::kSizeIn}},
{{10160, 15240},
{"na_index-4x6_4x6in", PRINT_PREVIEW_MEDIA_NA_INDEX_4X6_4X6IN,
MediaSizeGroup::kSizeIn}},
{{10200, 16500},
{"prc_1_102x165mm", PRINT_PREVIEW_MEDIA_PRC_1_102X165MM,
MediaSizeGroup::kSizeNamed}},
{{10200, 17600},
{"prc_2_102x176mm", PRINT_PREVIEW_MEDIA_PRC_2_102X176MM,
MediaSizeGroup::kSizeNamed}},
{{10477, 24130},
{"na_number-10_4.125x9.5in",
PRINT_PREVIEW_MEDIA_NA_NUMBER_10_4_125X9_5IN,
MediaSizeGroup::kSizeNamed}},
{{10500, 14800},
{"iso_a6_105x148mm", PRINT_PREVIEW_MEDIA_ISO_A6_105X148MM,
MediaSizeGroup::kSizeNamed}},
{{10500, 23500},
{"jpn_you4_105x235mm", PRINT_PREVIEW_MEDIA_JPN_YOU4_105X235MM,
MediaSizeGroup::kSizeNamed}},
{{11000, 20800},
{"prc_4_110x208mm", PRINT_PREVIEW_MEDIA_PRC_4_110X208MM,
MediaSizeGroup::kSizeNamed}},
{{11000, 22000},
{"iso_dl_110x220mm", PRINT_PREVIEW_MEDIA_ISO_DL_110X220MM,
MediaSizeGroup::kSizeNamed}},
{{11000, 23000},
{"om_italian_110x230mm", PRINT_PREVIEW_MEDIA_OM_ITALIAN_110X230MM,
MediaSizeGroup::kSizeNamed}},
{{11110, 14600},
{"jpn_chou2_111.1x146mm", PRINT_PREVIEW_MEDIA_JPN_CHOU2_111_1X146MM,
MediaSizeGroup::kSizeNamed}},
{{11112, 14605},
{"na_a2_4.375x5.75in", PRINT_PREVIEW_MEDIA_NA_A2_4_375X5_75IN,
MediaSizeGroup::kSizeNamed}},
{{11400, 16200},
{"iso_c6_114x162mm", PRINT_PREVIEW_MEDIA_ISO_C6_114X162MM,
MediaSizeGroup::kSizeNamed}},
{{11400, 22900},
{"iso_c6c5_114x229mm", PRINT_PREVIEW_MEDIA_ISO_C6C5_114X229MM,
MediaSizeGroup::kSizeNamed}},
{{11430, 26352},
{"na_number-11_4.5x10.375in",
PRINT_PREVIEW_MEDIA_NA_NUMBER_11_4_5X10_375IN,
MediaSizeGroup::kSizeNamed}},
{{11900, 19700},
{"jpn_kaku8_119x197mm", PRINT_PREVIEW_MEDIA_JPN_KAKU8_119X197MM,
MediaSizeGroup::kSizeNamed}},
{{12000, 23500},
{"jpn_chou3_120x235mm", PRINT_PREVIEW_MEDIA_JPN_CHOU3_120X235MM,
MediaSizeGroup::kSizeNamed}},
{{12000, 30900},
{"prc_8_120x309mm", PRINT_PREVIEW_MEDIA_PRC_8_120X309MM,
MediaSizeGroup::kSizeNamed}},
{{12000, 32000},
{"prc_6_120x320mm", PRINT_PREVIEW_MEDIA_PRC_6_120X320MM,
MediaSizeGroup::kSizeNamed}},
{{12065, 27940},
{"na_number-12_4.75x11in",
PRINT_PREVIEW_MEDIA_NA_NUMBER_12_4_75X11IN,
MediaSizeGroup::kSizeNamed}},
{{12500, 17600},
{"iso_b6_125x176mm", PRINT_PREVIEW_MEDIA_ISO_B6_125X176MM,
MediaSizeGroup::kSizeNamed}},
{{12500, 32400},
{"iso_b6c4_125x324mm", PRINT_PREVIEW_MEDIA_ISO_B6C4_125X324MM,
MediaSizeGroup::kSizeNamed}},
{{12700, 12700},
{"oe_square-photo_5x5in", PRINT_PREVIEW_MEDIA_OE_SQUARE_PHOTO_5X5IN,
MediaSizeGroup::kSizeIn}},
{{12700, 17780},
{"na_5x7_5x7in", PRINT_PREVIEW_MEDIA_NA_5X7_5X7IN,
MediaSizeGroup::kSizeIn}},
{{12700, 20320},
{"na_index-5x8_5x8in", PRINT_PREVIEW_MEDIA_NA_INDEX_5X8_5X8IN,
MediaSizeGroup::kSizeIn}},
{{12700, 29210},
{"na_number-14_5x11.5in", PRINT_PREVIEW_MEDIA_NA_NUMBER_14_5X11_5IN,
MediaSizeGroup::kSizeNamed}},
{{12800, 18200},
{"jis_b6_128x182mm", PRINT_PREVIEW_MEDIA_JIS_B6_128X182MM,
MediaSizeGroup::kSizeNamed}},
{{13000, 18000},
{"om_medium-photo_130x180mm",
PRINT_PREVIEW_MEDIA_OM_MEDIUM_PHOTO_130X180MM,
MediaSizeGroup::kSizeMm}},
{{13970, 21590},
{"na_invoice_5.5x8.5in", PRINT_PREVIEW_MEDIA_NA_INVOICE_5_5X8_5IN,
MediaSizeGroup::kSizeNamed}},
{{14200, 20500},
{"jpn_kaku7_142x205mm", PRINT_PREVIEW_MEDIA_JPN_KAKU7_142X205MM,
MediaSizeGroup::kSizeNamed}},
{{14600, 21500},
{"prc_16k_146x215mm", PRINT_PREVIEW_MEDIA_PRC_16K_146X215MM,
MediaSizeGroup::kSizeNamed}},
{{14800, 20000},
{"jpn_oufuku_148x200mm", PRINT_PREVIEW_MEDIA_JPN_OUFUKU_148X200MM,
MediaSizeGroup::kSizeNamed}},
{{14800, 21000},
{"iso_a5_148x210mm", PRINT_PREVIEW_MEDIA_ISO_A5_148X210MM,
MediaSizeGroup::kSizeNamed}},
{{15240, 20320},
{"na_index-4x6-ext_6x8in",
PRINT_PREVIEW_MEDIA_NA_INDEX_4X6_EXT_6X8IN,
MediaSizeGroup::kSizeIn}},
{{15240, 22860},
{"na_6x9_6x9in", PRINT_PREVIEW_MEDIA_NA_6X9_6X9IN,
MediaSizeGroup::kSizeNamed}},
{{16000, 23000},
{"prc_7_160x230mm", PRINT_PREVIEW_MEDIA_PRC_7_160X230MM,
MediaSizeGroup::kSizeNamed}},
{{16200, 22900},
{"iso_c5_162x229mm", PRINT_PREVIEW_MEDIA_ISO_C5_162X229MM,
MediaSizeGroup::kSizeNamed}},
{{16510, 24130},
{"na_c5_6.5x9.5in", PRINT_PREVIEW_MEDIA_NA_C5_6_5X9_5IN,
MediaSizeGroup::kSizeNamed}},
{{17400, 23500},
{"iso_a5-extra_174x235mm",
PRINT_PREVIEW_MEDIA_ISO_A5_EXTRA_174X235MM,
MediaSizeGroup::kSizeNamed}},
{{17600, 25000},
{"iso_b5_176x250mm", PRINT_PREVIEW_MEDIA_ISO_B5_176X250MM,
MediaSizeGroup::kSizeNamed}},
{{17780, 22860},
{"na_7x9_7x9in", PRINT_PREVIEW_MEDIA_NA_7X9_7X9IN,
MediaSizeGroup::kSizeNamed}},
{{18200, 25700},
{"jis_b5_182x257mm", PRINT_PREVIEW_MEDIA_JIS_B5_182X257MM,
MediaSizeGroup::kSizeNamed}},
{{18400, 26000},
{"om_16k_184x260mm", PRINT_PREVIEW_MEDIA_OM_16K_184X260MM,
MediaSizeGroup::kSizeMm}},
{{18415, 26670},
{"na_executive_7.25x10.5in",
PRINT_PREVIEW_MEDIA_NA_EXECUTIVE_7_25X10_5IN,
MediaSizeGroup::kSizeNamed}},
{{19000, 24000},
{"jpn_kaku5_190x240mm", PRINT_PREVIEW_MEDIA_JPN_KAKU5_190X240MM,
MediaSizeGroup::kSizeNamed}},
{{19500, 27000},
{"om_16k_195x270mm", PRINT_PREVIEW_MEDIA_OM_16K_195X270MM,
MediaSizeGroup::kSizeMm}},
{{19685, 27305},
{"roc_16k_7.75x10.75in", PRINT_PREVIEW_MEDIA_ROC_16K_7_75X10_75IN,
MediaSizeGroup::kSizeNamed}},
{{19700, 26700},
{"jpn_kaku4_197x267mm", PRINT_PREVIEW_MEDIA_JPN_KAKU4_197X267MM,
MediaSizeGroup::kSizeNamed}},
{{19800, 27500},
{"om_juuro-ku-kai_198x275mm",
PRINT_PREVIEW_MEDIA_OM_JUURO_KU_KAI_198X275MM,
MediaSizeGroup::kSizeMm}},
{{20000, 30000},
{"om_large-photo_200x300mm",
PRINT_PREVIEW_MEDIA_OM_LARGE_PHOTO_200X300,
MediaSizeGroup::kSizeMm}},
{{20100, 27600},
{"iso_b5-extra_201x276mm",
PRINT_PREVIEW_MEDIA_ISO_B5_EXTRA_201X276MM,
MediaSizeGroup::kSizeNamed}},
{{20320, 25400},
{"na_govt-letter_8x10in", PRINT_PREVIEW_MEDIA_NA_GOVT_LETTER_8X10IN,
MediaSizeGroup::kSizeIn}},
{{20320, 30480},
{"oe_photo-s8r_8x12in", PRINT_PREVIEW_MEDIA_OE_PHOTO_S8R_8X12IN,
MediaSizeGroup::kSizeIn}},
{{20320, 33020},
{"na_govt-legal_8x13in", PRINT_PREVIEW_MEDIA_NA_GOVT_LEGAL_8X13IN,
MediaSizeGroup::kSizeIn}},
{{21000, 29700},
{"iso_a4_210x297mm", PRINT_PREVIEW_MEDIA_ISO_A4_210X297MM,
MediaSizeGroup::kSizeNamed}},
{{21000, 33000},
{"om_folio_210x330mm", PRINT_PREVIEW_MEDIA_OM_FOLIO_210X330MM,
MediaSizeGroup::kSizeMm}},
{{21500, 30500},
{"iso_ra4_215x305mm", PRINT_PREVIEW_MEDIA_ISO_RA4_215X305MM,
MediaSizeGroup::kSizeNamed}},
{{21500, 31500},
{"om_folio-sp_215x315mm", PRINT_PREVIEW_MEDIA_OM_FOLIO_SP_215X315MM,
MediaSizeGroup::kSizeMm}},
{{21590, 27508},
{"na_quarto_8.5x10.83in", PRINT_PREVIEW_MEDIA_NA_QUARTO_8_5X10_83IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 27940},
{"na_letter_8.5x11in", PRINT_PREVIEW_MEDIA_NA_LETTER_8_5X11IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 30480},
{"na_fanfold-eur_8.5x12in",
PRINT_PREVIEW_MEDIA_NA_FANFOLD_EUR_8_5X12IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 32232},
{"na_letter-plus_8.5x12.69in",
PRINT_PREVIEW_MEDIA_NA_LETTER_PLUS_8_5X12_69IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 33020},
{"na_foolscap_8.5x13in", PRINT_PREVIEW_MEDIA_NA_FOOLSCAP_8_5X13IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 34036},
{"na_oficio_8.5x13.4in", PRINT_PREVIEW_MEDIA_NA_OFICIO_8_5X13_4IN,
MediaSizeGroup::kSizeNamed}},
{{21590, 35560},
{"na_legal_8.5x14in", PRINT_PREVIEW_MEDIA_NA_LEGAL_8_5X14IN,
MediaSizeGroup::kSizeNamed}},
{{21600, 27700},
{"jpn_kaku3_216x277mm", PRINT_PREVIEW_MEDIA_JPN_KAKU3_216X277MM,
MediaSizeGroup::kSizeNamed}},
{{21600, 33000},
{"jis_exec_216x330mm", PRINT_PREVIEW_MEDIA_JIS_EXEC_216X330MM,
MediaSizeGroup::kSizeNamed}},
{{22000, 22000},
{"om_invite_220x220mm", PRINT_PREVIEW_MEDIA_OM_INVITE_220X220MM,
MediaSizeGroup::kSizeNamed}},
{{22500, 29700},
{"iso_a4-tab_225x297mm", PRINT_PREVIEW_MEDIA_ISO_A4_TAB_225X297MM,
MediaSizeGroup::kSizeNamed}},
{{22500, 32000},
{"iso_sra4_225x320mm", PRINT_PREVIEW_MEDIA_ISO_SRA4_225X320MM,
MediaSizeGroup::kSizeNamed}},
{{22707, 35560},
{"na_super-a_8.94x14in", PRINT_PREVIEW_MEDIA_NA_SUPER_A_8_94X14IN,
MediaSizeGroup::kSizeNamed}},
{{22860, 27940},
{"na_9x11_9x11in", PRINT_PREVIEW_MEDIA_NA_9X11_9X11IN,
MediaSizeGroup::kSizeNamed}},
{{22860, 30480},
{"na_arch-a_9x12in", PRINT_PREVIEW_MEDIA_NA_ARCH_A_9X12IN,
MediaSizeGroup::kSizeNamed}},
{{22900, 32400},
{"iso_c4_229x324mm", PRINT_PREVIEW_MEDIA_ISO_C4_229X324MM,
MediaSizeGroup::kSizeNamed}},
{{23550, 32230},
{"iso_a4-extra_235.5x322.3mm",
PRINT_PREVIEW_MEDIA_ISO_A4_EXTRA_235_5X322_3MM,
MediaSizeGroup::kSizeNamed}},
{{24000, 32210},
{"jpn_kahu_240x322.1mm", PRINT_PREVIEW_MEDIA_JPN_KAHU_240X322_1MM,
MediaSizeGroup::kSizeNamed}},
{{24000, 33200},
{"jpn_kaku2_240x332mm", PRINT_PREVIEW_MEDIA_JPN_KAKU2_240X332MM,
MediaSizeGroup::kSizeNamed}},
{{24130, 30480},
{"na_letter-extra_9.5x12in",
PRINT_PREVIEW_MEDIA_NA_LETTER_EXTRA_9_5X12IN,
MediaSizeGroup::kSizeNamed}},
{{24130, 38100},
{"na_legal-extra_9.5x15in",
PRINT_PREVIEW_MEDIA_NA_LEGAL_EXTRA_9_5X15IN,
MediaSizeGroup::kSizeNamed}},
{{25000, 35300},
{"iso_b4_250x353mm", PRINT_PREVIEW_MEDIA_ISO_B4_250X353MM,
MediaSizeGroup::kSizeNamed}},
{{25400, 27940},
{"na_10x11_10x11in", PRINT_PREVIEW_MEDIA_NA_10X11_10X11IN,
MediaSizeGroup::kSizeIn}},
{{25400, 30480},
{"oe_photo-10r_10x12in", PRINT_PREVIEW_MEDIA_OE_PHOTO_10R_10X12IN,
MediaSizeGroup::kSizeIn}},
{{25400, 33020},
{"na_10x13_10x13in", PRINT_PREVIEW_MEDIA_NA_10X13_10X13IN,
MediaSizeGroup::kSizeIn}},
{{25400, 35560},
{"na_10x14_10x14in", PRINT_PREVIEW_MEDIA_NA_10X14_10X14IN,
MediaSizeGroup::kSizeIn}},
{{25400, 38100},
{"na_10x15_10x15in", PRINT_PREVIEW_MEDIA_NA_10X15_10X15IN,
MediaSizeGroup::kSizeIn}},
{{25700, 36400},
{"jis_b4_257x364mm", PRINT_PREVIEW_MEDIA_JIS_B4_257X364MM,
MediaSizeGroup::kSizeNamed}},
{{26700, 38900},
{"om_pa-kai_267x389mm", PRINT_PREVIEW_MEDIA_OM_PA_KAI_267X389MM,
MediaSizeGroup::kSizeMm}},
{{27000, 38200},
{"jpn_kaku1_270x382mm", PRINT_PREVIEW_MEDIA_JPN_KAKU1_270X382MM,
MediaSizeGroup::kSizeNamed}},
{{27305, 39370},
{"roc_8k_10.75x15.5in", PRINT_PREVIEW_MEDIA_ROC_8K_10_75X15_5IN,
MediaSizeGroup::kSizeNamed}},
{{27500, 39500},
{"om_dai-pa-kai_275x395mm",
PRINT_PREVIEW_MEDIA_OM_DAI_PA_KAI_275X395MM,
MediaSizeGroup::kSizeMm}},
{{27940, 30480},
{"na_11x12_11x12in", PRINT_PREVIEW_MEDIA_NA_11X12_11X12IN,
MediaSizeGroup::kSizeIn}},
{{27940, 35560},
{"na_edp_11x14in", PRINT_PREVIEW_MEDIA_NA_EDP_11X14IN,
MediaSizeGroup::kSizeNamed}},
{{27940, 37782},
{"na_fanfold-us_11x14.875in",
PRINT_PREVIEW_MEDIA_NA_FANFOLD_US_11X14_875IN,
MediaSizeGroup::kSizeNamed}},
{{27940, 38100},
{"na_11x15_11x15in", PRINT_PREVIEW_MEDIA_NA_11X15_11X15IN,
MediaSizeGroup::kSizeIn}},
{{27940, 43180},
{"na_ledger_11x17in", PRINT_PREVIEW_MEDIA_NA_LEDGER_11X17IN,
MediaSizeGroup::kSizeNamed}},
{{29700, 42000},
{"iso_a3_297x420mm", PRINT_PREVIEW_MEDIA_ISO_A3_297X420MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 63000},
{"iso_a4x3_297x630mm", PRINT_PREVIEW_MEDIA_ISO_A4X3_297X630MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 84100},
{"iso_a4x4_297x841mm", PRINT_PREVIEW_MEDIA_ISO_A4X4_297X841MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 105100},
{"iso_a4x5_297x1051mm", PRINT_PREVIEW_MEDIA_ISO_A4X5_297X1051MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 126100},
{"iso_a4x6_297x1261mm", PRINT_PREVIEW_MEDIA_ISO_A4X6_297X1261MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 147100},
{"iso_a4x7_297x1471mm", PRINT_PREVIEW_MEDIA_ISO_A4X7_297X1471MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 168200},
{"iso_a4x8_297x1682mm", PRINT_PREVIEW_MEDIA_ISO_A4X8_297X1682MM,
MediaSizeGroup::kSizeNamed}},
{{29700, 189200},
{"iso_a4x9_297x1892mm", PRINT_PREVIEW_MEDIA_ISO_A4X9_297X1892MM,
MediaSizeGroup::kSizeNamed}},
{{30000, 40000},
{"om_photo-30x40_300x400mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_30X40_300X400MM,
MediaSizeGroup::kSizeMm}},
{{30000, 45000},
{"om_photo-30x45_300x450mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_30X45_300X450MM,
MediaSizeGroup::kSizeMm}},
{{30480, 35560},
{"na_eur-edp_12x14in", PRINT_PREVIEW_MEDIA_NA_EUR_EDP_12X14IN,
MediaSizeGroup::kSizeNamed}},
{{30480, 38100},
{"oe_photo-12r_12x15in", PRINT_PREVIEW_MEDIA_OE_PHOTO_12R_12X15IN,
MediaSizeGroup::kSizeIn}},
{{30480, 40640},
{"oe_12x16_12x16in", PRINT_PREVIEW_MEDIA_OE_12X16_12X16IN,
MediaSizeGroup::kSizeIn}},
{{30480, 45720},
{"na_arch-b_12x18in", PRINT_PREVIEW_MEDIA_NA_ARCH_B_12X18IN,
MediaSizeGroup::kSizeIn}},
{{30480, 48260},
{"na_12x19_12x19in", PRINT_PREVIEW_MEDIA_NA_12X19_12X19IN,
MediaSizeGroup::kSizeIn}},
{{30480, 48691},
{"na_b-plus_12x19.17in", PRINT_PREVIEW_MEDIA_NA_B_PLUS_12X19_17IN,
MediaSizeGroup::kSizeNamed}},
{{30500, 43000},
{"iso_ra3_305x430mm", PRINT_PREVIEW_MEDIA_ISO_RA3_305X430MM,
MediaSizeGroup::kSizeNamed}},
{{32000, 45000},
{"iso_sra3_320x450mm", PRINT_PREVIEW_MEDIA_ISO_SRA3_320X450MM,
MediaSizeGroup::kSizeNamed}},
{{32200, 44500},
{"iso_a3-extra_322x445mm",
PRINT_PREVIEW_MEDIA_ISO_A3_EXTRA_322X445MM,
MediaSizeGroup::kSizeNamed}},
{{32400, 45800},
{"iso_c3_324x458mm", PRINT_PREVIEW_MEDIA_ISO_C3_324X458MM,
MediaSizeGroup::kSizeNamed}},
{{33020, 48260},
{"na_super-b_13x19in", PRINT_PREVIEW_MEDIA_NA_SUPER_B_13X19IN,
MediaSizeGroup::kSizeNamed}},
{{35000, 46000},
{"om_photo-35x46_350x460mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_35X46_350X460MM,
MediaSizeGroup::kSizeMm}},
{{35300, 50000},
{"iso_b3_353x500mm", PRINT_PREVIEW_MEDIA_ISO_B3_353X500MM,
MediaSizeGroup::kSizeNamed}},
{{35560, 43180},
{"oe_14x17_14x17in", PRINT_PREVIEW_MEDIA_OE_14X17_14X17IN,
MediaSizeGroup::kSizeIn}},
{{35560, 45720},
{"oe_photo-14x18_14x18in",
PRINT_PREVIEW_MEDIA_OE_PHOTO_14X18_14X18IN,
MediaSizeGroup::kSizeIn}},
{{36400, 51500},
{"jis_b3_364x515mm", PRINT_PREVIEW_MEDIA_JIS_B3_364X515MM,
MediaSizeGroup::kSizeNamed}},
{{40000, 60000},
{"om_photo-40x60_400x600mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_40X60_400X600MM,
MediaSizeGroup::kSizeMm}},
{{40640, 50800},
{"oe_photo-16r_16x20in", PRINT_PREVIEW_MEDIA_OE_PHOTO_16R_16X20IN,
MediaSizeGroup::kSizeIn}},
{{42000, 59400},
{"iso_a2_420x594mm", PRINT_PREVIEW_MEDIA_ISO_A2_420X594MM,
MediaSizeGroup::kSizeNamed}},
{{42000, 89100},
{"iso_a3x3_420x891mm", PRINT_PREVIEW_MEDIA_ISO_A3X3_420X891MM,
MediaSizeGroup::kSizeNamed}},
{{42000, 118900},
{"iso_a3x4_420x1189mm", PRINT_PREVIEW_MEDIA_ISO_A3X4_420X1189MM,
MediaSizeGroup::kSizeNamed}},
{{42000, 148600},
{"iso_a3x5_420x1486mm", PRINT_PREVIEW_MEDIA_ISO_A3X5_420X1486MM,
MediaSizeGroup::kSizeNamed}},
{{42000, 178300},
{"iso_a3x6_420x1783mm", PRINT_PREVIEW_MEDIA_ISO_A3X6_420X1783MM,
MediaSizeGroup::kSizeNamed}},
{{42000, 208000},
{"iso_a3x7_420x2080mm", PRINT_PREVIEW_MEDIA_ISO_A3X7_420X2080MM,
MediaSizeGroup::kSizeNamed}},
{{43000, 61000},
{"iso_ra2_430x610mm", PRINT_PREVIEW_MEDIA_ISO_RA2_430X610MM,
MediaSizeGroup::kSizeNamed}},
{{43180, 55880},
{"na_c_17x22in", PRINT_PREVIEW_MEDIA_NA_C_17X22IN,
MediaSizeGroup::kSizeIn}},
{{43180, 60960},
{"oe_a2plus_17x24in", PRINT_PREVIEW_MEDIA_OE_A2PLUS_17X24IN,
MediaSizeGroup::kSizeIn}},
{{45000, 64000},
{"iso_sra2_450x640mm", PRINT_PREVIEW_MEDIA_ISO_SRA2_450X640MM,
MediaSizeGroup::kSizeNamed}},
{{45720, 55880},
{"oe_18x22_18x22in", PRINT_PREVIEW_MEDIA_OE_18X22_18X22IN,
MediaSizeGroup::kSizeIn}},
{{45720, 60960},
{"na_arch-c_18x24in", PRINT_PREVIEW_MEDIA_NA_ARCH_C_18X24IN,
MediaSizeGroup::kSizeIn}},
{{45800, 64800},
{"iso_c2_458x648mm", PRINT_PREVIEW_MEDIA_ISO_C2_458X648MM,
MediaSizeGroup::kSizeNamed}},
{{50000, 70700},
{"iso_b2_500x707mm", PRINT_PREVIEW_MEDIA_ISO_B2_500X707MM,
MediaSizeGroup::kSizeNamed}},
{{50000, 75000},
{"om_photo-50x75_500x750mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_50X75_500X750MM,
MediaSizeGroup::kSizeMm}},
{{50000, 76000},
{"om_photo-50x76_500x760mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_50X76_500X760MM,
MediaSizeGroup::kSizeMm}},
{{50800, 60960},
{"oe_photo-20r_20x24in", PRINT_PREVIEW_MEDIA_OE_PHOTO_20R_20X24IN,
MediaSizeGroup::kSizeIn}},
{{51500, 72800},
{"jis_b2_515x728mm", PRINT_PREVIEW_MEDIA_JIS_B2_515X728MM,
MediaSizeGroup::kSizeNamed}},
{{55880, 71120},
{"oe_photo-22x28_22x28in",
PRINT_PREVIEW_MEDIA_OE_PHOTO_22X28_22X28IN,
MediaSizeGroup::kSizeIn}},
{{55880, 74930},
{"oe_photo-22r_22x29.5in",
PRINT_PREVIEW_MEDIA_OE_PHOTO_22R_22X29_5IN,
MediaSizeGroup::kSizeIn}},
{{55880, 86360},
{"na_d_22x34in", PRINT_PREVIEW_MEDIA_NA_D_22X34IN,
MediaSizeGroup::kSizeIn}},
{{59400, 84100},
{"iso_a1_594x841mm", PRINT_PREVIEW_MEDIA_ISO_A1_594X841MM,
MediaSizeGroup::kSizeNamed}},
{{59400, 126100},
{"iso_a2x3_594x1261mm", PRINT_PREVIEW_MEDIA_ISO_A2X3_594X1261MM,
MediaSizeGroup::kSizeNamed}},
{{59400, 168200},
{"iso_a2x4_594x1682mm", PRINT_PREVIEW_MEDIA_ISO_A2X4_594X1682MM,
MediaSizeGroup::kSizeNamed}},
{{59400, 210200},
{"iso_a2x5_594x2102mm", PRINT_PREVIEW_MEDIA_ISO_A2X5_594X2102MM,
MediaSizeGroup::kSizeNamed}},
{{60000, 90000},
{"om_photo-60x90_600x900mm",
PRINT_PREVIEW_MEDIA_OM_PHOTO_60X90_600X900MM,
MediaSizeGroup::kSizeMm}},
{{60960, 76200},
{"oe_photo-24x30_24x30in",
PRINT_PREVIEW_MEDIA_OE_PHOTO_24X30_24X30IN,
MediaSizeGroup::kSizeIn}},
{{60960, 80010},
{"oe_photo-24r_24x31.5in",
PRINT_PREVIEW_MEDIA_OE_PHOTO_24R_24X31_5IN,
MediaSizeGroup::kSizeIn}},
{{60960, 91440},
{"na_arch-d_24x36in", PRINT_PREVIEW_MEDIA_NA_ARCH_D_24X36IN,
MediaSizeGroup::kSizeIn}},
{{61000, 86000},
{"iso_ra1_610x860mm", PRINT_PREVIEW_MEDIA_ISO_RA1_610X860MM,
MediaSizeGroup::kSizeNamed}},
{{64000, 90000},
{"iso_sra1_640x900mm", PRINT_PREVIEW_MEDIA_ISO_SRA1_640X900MM,
MediaSizeGroup::kSizeNamed}},
{{64800, 91700},
{"iso_c1_648x917mm", PRINT_PREVIEW_MEDIA_ISO_C1_648X917MM,
MediaSizeGroup::kSizeNamed}},
{{66040, 96520},
{"na_arch-e2_26x38in", PRINT_PREVIEW_MEDIA_NA_ARCH_E2_26X38IN,
MediaSizeGroup::kSizeIn}},
{{68580, 99060},
{"na_arch-e3_27x39in", PRINT_PREVIEW_MEDIA_NA_ARCH_E3_27X39IN,
MediaSizeGroup::kSizeIn}},
{{70700, 100000},
{"iso_b1_707x1000mm", PRINT_PREVIEW_MEDIA_ISO_B1_707X1000MM,
MediaSizeGroup::kSizeNamed}},
{{71120, 101600},
{"asme_f_28x40in", PRINT_PREVIEW_MEDIA_ASME_F_28X40IN,
MediaSizeGroup::kSizeIn}},
{{72800, 103000},
{"jis_b1_728x1030mm", PRINT_PREVIEW_MEDIA_JIS_B1_728X1030MM,
MediaSizeGroup::kSizeNamed}},
{{76200, 101600},
{"oe_photo-30r_30x40in", PRINT_PREVIEW_MEDIA_OE_PHOTO_30R_30X40IN,
MediaSizeGroup::kSizeIn}},
{{76200, 106680},
{"na_wide-format_30x42in",
PRINT_PREVIEW_MEDIA_NA_WIDE_FORMAT_30X42IN,
MediaSizeGroup::kSizeIn}},
{{84100, 118900},
{"iso_a0_841x1189mm", PRINT_PREVIEW_MEDIA_ISO_A0_841X1189MM,
MediaSizeGroup::kSizeNamed}},
{{84100, 178300},
{"iso_a1x3_841x1783mm", PRINT_PREVIEW_MEDIA_ISO_A1X3_841X1783MM,
MediaSizeGroup::kSizeNamed}},
{{84100, 237800},
{"iso_a1x4_841x2378mm", PRINT_PREVIEW_MEDIA_ISO_A1X4_841X2378MM,
MediaSizeGroup::kSizeNamed}},
{{86000, 122000},
{"iso_ra0_860x1220mm", PRINT_PREVIEW_MEDIA_ISO_RA0_860X1220MM,
MediaSizeGroup::kSizeNamed}},
{{86360, 111760},
{"na_e_34x44in", PRINT_PREVIEW_MEDIA_NA_E_34X44IN,
MediaSizeGroup::kSizeIn}},
{{90000, 128000},
{"iso_sra0_900x1280mm", PRINT_PREVIEW_MEDIA_ISO_SRA0_900X1280MM,
MediaSizeGroup::kSizeNamed}},
{{91440, 121920},
{"na_arch-e_36x48in", PRINT_PREVIEW_MEDIA_NA_ARCH_E_36X48IN,
MediaSizeGroup::kSizeIn}},
{{91700, 129700},
{"iso_c0_917x1297mm", PRINT_PREVIEW_MEDIA_ISO_C0_917X1297MM,
MediaSizeGroup::kSizeNamed}},
{{100000, 141400},
{"iso_b0_1000x1414mm", PRINT_PREVIEW_MEDIA_ISO_B0_1000X1414MM,
MediaSizeGroup::kSizeNamed}},
{{103000, 145600},
{"jis_b0_1030x1456mm", PRINT_PREVIEW_MEDIA_JIS_B0_1030X1456MM,
MediaSizeGroup::kSizeNamed}},
{{111760, 172720},
{"na_f_44x68in", PRINT_PREVIEW_MEDIA_NA_F_44X68IN,
MediaSizeGroup::kSizeIn}},
{{118900, 168200},
{"iso_2a0_1189x1682mm", PRINT_PREVIEW_MEDIA_ISO_2A0_1189X1682MM,
MediaSizeGroup::kSizeNamed}},
{{118900, 252300},
{"iso_a0x3_1189x2523mm", PRINT_PREVIEW_MEDIA_ISO_A0X3_1189X2523MM,
MediaSizeGroup::kSizeNamed}},
},
[](const gfx::Size& a, const gfx::Size& b) {
auto result = a.width() - b.width();
if (result == 0) {
result = a.height() - b.height();
}
return result < 0;
});
auto it = kMediaMap.find(
{size.width() / kMicronsPerPwgUnit, size.height() / kMicronsPerPwgUnit});
return it != kMediaMap.end()
? MediaSizeInfo{std::string(it->second.vendor_id),
l10n_util::GetStringUTF16(it->second.l10n_id),
it->second.sort_group}
: MediaSizeInfo{"", u"", MediaSizeGroup::kSizeNamed};
}
// Generate a vendor ID, human-readable name, and sort group from size
// information.
MediaSizeInfo InfoForUnregisteredSize(const gfx::Size& size_um) {
int width_um = size_um.width();
int height_um = size_um.height();
// Generate a vendor ID so we have something to populate the field with.
std::string vendor_id =
base::StrCat({"om_", base::NumberToString(width_um), "x",
base::NumberToString(height_um), "um_",
base::NumberToString(width_um / kMicronsPerMm), "x",
base::NumberToString(height_um / kMicronsPerMm), "mm"});
MediaSizeGroup group = MediaSizeGroup::kSizeMm;
int message_id = PRINT_PREVIEW_MEDIA_DIMENSIONS_MM;
int conversion_factor = kMicronsPerMm;
int max_fractional_digits = 0;
// Try converting to inches. If either width or height is a multiple of
// 1/4 inch, display the size as inches. Otherwise, display the size as
// millimeters.
if (width_um % (kMicronsPerInch / 4) == 0 ||
height_um % (kMicronsPerInch / 4) == 0) {
group = MediaSizeGroup::kSizeIn;
message_id = PRINT_PREVIEW_MEDIA_DIMENSIONS_INCHES;
conversion_factor = kMicronsPerInch;
max_fractional_digits = 3;
}
// If the width and height are in inches, display them with up to 3 digits
// after the decimal point. 3 digits is the sweet spot where even unusual
// fractions like sixths, eighths, and ninths are legible without showing the
// rounding errors from their conversion to PWG units. The "up to" is
// important since even many unregistered sizes include integer dimensions,
// and "5 x 6.5 in" is more legible than "5.000 x 6.500 in". Even more
// importantly, it matches how registered but unnamed sizes like "3 x 5 in"
// are written. For millimeter sizes, round to the nearest integer, since any
// fractional part is probably a rounding error from the mm->pt->mm conversion
// imposed by the PPD format.
return {vendor_id,
l10n_util::GetStringFUTF16(
message_id,
base::FormatDouble(static_cast<double>(width_um) /
static_cast<double>(conversion_factor),
0, max_fractional_digits),
base::FormatDouble(static_cast<double>(height_um) /
static_cast<double>(conversion_factor),
0, max_fractional_digits)),
group};
}
} // namespace
PaperWithSizeInfo::PaperWithSizeInfo(MediaSizeInfo msi,
PrinterSemanticCapsAndDefaults::Paper p)
: size_info(msi), paper(p) {}
MediaSizeInfo LocalizePaperDisplayName(const gfx::Size& size_um) {
MediaSizeInfo size_info = InfoForStandardSize(size_um);
return size_info.display_name.empty() ? InfoForUnregisteredSize(size_um)
: size_info;
}
void SortPaperDisplayNames(std::vector<PaperWithSizeInfo>& papers) {
std::vector<PaperWithSizeInfo> mm_sizes;
std::vector<PaperWithSizeInfo> in_sizes;
std::vector<PaperWithSizeInfo> named_sizes;
// Break apart the list into separate sort groups.
for (auto& p : papers) {
switch (p.size_info.sort_group) {
case MediaSizeGroup::kSizeMm:
mm_sizes.emplace_back(p);
break;
case MediaSizeGroup::kSizeIn:
in_sizes.emplace_back(p);
break;
case MediaSizeGroup::kSizeNamed:
named_sizes.emplace_back(p);
break;
}
}
UErrorCode error = U_ZERO_ERROR;
std::unique_ptr<icu::Collator> collator(icu::Collator::createInstance(error));
DCHECK(U_SUCCESS(error));
// Sort dimensional sizes (inch and mm) by width, then height.
auto size_sort = [](const PaperWithSizeInfo& a, const PaperWithSizeInfo& b) {
const gfx::Size& size_a = a.paper.size_um();
const gfx::Size& size_b = b.paper.size_um();
if (size_a.width() != size_b.width())
return size_a.width() < size_b.width();
return size_a.height() < size_b.height();
};
std::sort(mm_sizes.begin(), mm_sizes.end(), size_sort);
std::sort(in_sizes.begin(), in_sizes.end(), size_sort);
// Sort named sizes by name, then width, then height.
auto name_sort = [&collator](const PaperWithSizeInfo& a,
const PaperWithSizeInfo& b) {
const gfx::Size& size_a = a.paper.size_um();
const gfx::Size& size_b = b.paper.size_um();
UCollationResult comp = base::i18n::CompareString16WithCollator(
*collator, a.size_info.display_name, b.size_info.display_name);
if (comp != UCOL_EQUAL)
return comp == UCOL_LESS;
// Same name. Sort by width, then height.
if (size_a.width() != size_b.width())
return size_a.width() < size_b.width();
return size_a.height() < size_b.height();
};
std::sort(named_sizes.begin(), named_sizes.end(), name_sort);
// Replace the original list with the newly sorted groups.
papers.clear();
papers.insert(papers.end(), in_sizes.begin(), in_sizes.end());
papers.insert(papers.end(), mm_sizes.begin(), mm_sizes.end());
papers.insert(papers.end(), named_sizes.begin(), named_sizes.end());
}
} // namespace printing