pub const COURIER_WIDTH: u16 = 600;
const TIMES_ROMAN: [(u32, u16); 315] = [
(32, 250),
(33, 333),
(34, 408),
(35, 500),
(36, 500),
(37, 833),
(38, 778),
(39, 180),
(40, 333),
(41, 333),
(42, 500),
(43, 564),
(44, 250),
(45, 333),
(46, 250),
(47, 278),
(48, 500),
(49, 500),
(50, 500),
(51, 500),
(52, 500),
(53, 500),
(54, 500),
(55, 500),
(56, 500),
(57, 500),
(58, 278),
(59, 278),
(60, 564),
(61, 564),
(62, 564),
(63, 444),
(64, 921),
(65, 722),
(66, 667),
(67, 667),
(68, 722),
(69, 611),
(70, 556),
(71, 722),
(72, 722),
(73, 333),
(74, 389),
(75, 722),
(76, 611),
(77, 889),
(78, 722),
(79, 722),
(80, 556),
(81, 722),
(82, 667),
(83, 556),
(84, 611),
(85, 722),
(86, 722),
(87, 944),
(88, 722),
(89, 722),
(90, 611),
(91, 333),
(92, 278),
(93, 333),
(94, 469),
(95, 500),
(96, 333),
(97, 444),
(98, 500),
(99, 444),
(100, 500),
(101, 444),
(102, 333),
(103, 500),
(104, 500),
(105, 278),
(106, 278),
(107, 500),
(108, 278),
(109, 778),
(110, 500),
(111, 500),
(112, 500),
(113, 500),
(114, 333),
(115, 389),
(116, 278),
(117, 500),
(118, 500),
(119, 722),
(120, 500),
(121, 500),
(122, 444),
(123, 480),
(124, 200),
(125, 480),
(126, 541),
(161, 333),
(162, 500),
(163, 500),
(164, 500),
(165, 500),
(166, 200),
(167, 500),
(168, 333),
(169, 760),
(170, 276),
(171, 500),
(172, 564),
(174, 760),
(175, 333),
(176, 400),
(177, 564),
(178, 300),
(179, 300),
(180, 333),
(181, 500),
(182, 453),
(183, 250),
(184, 333),
(185, 300),
(186, 310),
(187, 500),
(188, 750),
(189, 750),
(190, 750),
(191, 444),
(192, 722),
(193, 722),
(194, 722),
(195, 722),
(196, 722),
(197, 722),
(198, 889),
(199, 667),
(200, 611),
(201, 611),
(202, 611),
(203, 611),
(204, 333),
(205, 333),
(206, 333),
(207, 333),
(208, 722),
(209, 722),
(210, 722),
(211, 722),
(212, 722),
(213, 722),
(214, 722),
(215, 564),
(216, 722),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 722),
(222, 556),
(223, 500),
(224, 444),
(225, 444),
(226, 444),
(227, 444),
(228, 444),
(229, 444),
(230, 667),
(231, 444),
(232, 444),
(233, 444),
(234, 444),
(235, 444),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 500),
(241, 500),
(242, 500),
(243, 500),
(244, 500),
(245, 500),
(246, 500),
(247, 564),
(248, 500),
(249, 500),
(250, 500),
(251, 500),
(252, 500),
(253, 500),
(254, 500),
(255, 500),
(256, 722),
(257, 444),
(258, 722),
(259, 444),
(260, 722),
(261, 444),
(262, 667),
(263, 444),
(268, 667),
(269, 444),
(270, 722),
(271, 588),
(272, 722),
(273, 500),
(274, 611),
(275, 444),
(278, 611),
(279, 444),
(280, 611),
(281, 444),
(282, 611),
(283, 444),
(286, 722),
(287, 500),
(290, 722),
(291, 500),
(298, 333),
(299, 278),
(302, 333),
(303, 278),
(304, 333),
(305, 278),
(310, 722),
(311, 500),
(313, 611),
(314, 278),
(315, 611),
(316, 278),
(317, 611),
(318, 344),
(321, 611),
(322, 278),
(323, 722),
(324, 500),
(325, 722),
(326, 500),
(327, 722),
(328, 500),
(332, 722),
(333, 500),
(336, 722),
(337, 500),
(338, 889),
(339, 722),
(340, 667),
(341, 333),
(342, 667),
(343, 333),
(344, 667),
(345, 333),
(346, 556),
(347, 389),
(350, 556),
(351, 389),
(352, 556),
(353, 389),
(354, 611),
(355, 278),
(356, 611),
(357, 326),
(362, 722),
(363, 500),
(366, 722),
(367, 500),
(368, 722),
(369, 500),
(370, 722),
(371, 500),
(376, 722),
(377, 611),
(378, 444),
(379, 611),
(380, 444),
(381, 611),
(382, 444),
(402, 500),
(536, 556),
(537, 389),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 500),
(8212, 1000),
(8216, 333),
(8217, 333),
(8218, 333),
(8220, 444),
(8221, 444),
(8222, 444),
(8224, 500),
(8225, 500),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 500),
(8482, 980),
(8706, 476),
(8710, 612),
(8721, 600),
(8722, 564),
(8730, 453),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 471),
(63171, 250),
(64257, 556),
(64258, 556),
];
const TIMES_BOLD: [(u32, u16); 315] = [
(32, 250),
(33, 333),
(34, 555),
(35, 500),
(36, 500),
(37, 1000),
(38, 833),
(39, 278),
(40, 333),
(41, 333),
(42, 500),
(43, 570),
(44, 250),
(45, 333),
(46, 250),
(47, 278),
(48, 500),
(49, 500),
(50, 500),
(51, 500),
(52, 500),
(53, 500),
(54, 500),
(55, 500),
(56, 500),
(57, 500),
(58, 333),
(59, 333),
(60, 570),
(61, 570),
(62, 570),
(63, 500),
(64, 930),
(65, 722),
(66, 667),
(67, 722),
(68, 722),
(69, 667),
(70, 611),
(71, 778),
(72, 778),
(73, 389),
(74, 500),
(75, 778),
(76, 667),
(77, 944),
(78, 722),
(79, 778),
(80, 611),
(81, 778),
(82, 722),
(83, 556),
(84, 667),
(85, 722),
(86, 722),
(87, 1000),
(88, 722),
(89, 722),
(90, 667),
(91, 333),
(92, 278),
(93, 333),
(94, 581),
(95, 500),
(96, 333),
(97, 500),
(98, 556),
(99, 444),
(100, 556),
(101, 444),
(102, 333),
(103, 500),
(104, 556),
(105, 278),
(106, 333),
(107, 556),
(108, 278),
(109, 833),
(110, 556),
(111, 500),
(112, 556),
(113, 556),
(114, 444),
(115, 389),
(116, 333),
(117, 556),
(118, 500),
(119, 722),
(120, 500),
(121, 500),
(122, 444),
(123, 394),
(124, 220),
(125, 394),
(126, 520),
(161, 333),
(162, 500),
(163, 500),
(164, 500),
(165, 500),
(166, 220),
(167, 500),
(168, 333),
(169, 747),
(170, 300),
(171, 500),
(172, 570),
(174, 747),
(175, 333),
(176, 400),
(177, 570),
(178, 300),
(179, 300),
(180, 333),
(181, 556),
(182, 540),
(183, 250),
(184, 333),
(185, 300),
(186, 330),
(187, 500),
(188, 750),
(189, 750),
(190, 750),
(191, 500),
(192, 722),
(193, 722),
(194, 722),
(195, 722),
(196, 722),
(197, 722),
(198, 1000),
(199, 722),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 389),
(205, 389),
(206, 389),
(207, 389),
(208, 722),
(209, 722),
(210, 778),
(211, 778),
(212, 778),
(213, 778),
(214, 778),
(215, 570),
(216, 778),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 722),
(222, 611),
(223, 556),
(224, 500),
(225, 500),
(226, 500),
(227, 500),
(228, 500),
(229, 500),
(230, 722),
(231, 444),
(232, 444),
(233, 444),
(234, 444),
(235, 444),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 500),
(241, 556),
(242, 500),
(243, 500),
(244, 500),
(245, 500),
(246, 500),
(247, 570),
(248, 500),
(249, 556),
(250, 556),
(251, 556),
(252, 556),
(253, 500),
(254, 556),
(255, 500),
(256, 722),
(257, 500),
(258, 722),
(259, 500),
(260, 722),
(261, 500),
(262, 722),
(263, 444),
(268, 722),
(269, 444),
(270, 722),
(271, 672),
(272, 722),
(273, 556),
(274, 667),
(275, 444),
(278, 667),
(279, 444),
(280, 667),
(281, 444),
(282, 667),
(283, 444),
(286, 778),
(287, 500),
(290, 778),
(291, 500),
(298, 389),
(299, 278),
(302, 389),
(303, 278),
(304, 389),
(305, 278),
(310, 778),
(311, 556),
(313, 667),
(314, 278),
(315, 667),
(316, 278),
(317, 667),
(318, 394),
(321, 667),
(322, 278),
(323, 722),
(324, 556),
(325, 722),
(326, 556),
(327, 722),
(328, 556),
(332, 778),
(333, 500),
(336, 778),
(337, 500),
(338, 1000),
(339, 722),
(340, 722),
(341, 444),
(342, 722),
(343, 444),
(344, 722),
(345, 444),
(346, 556),
(347, 389),
(350, 556),
(351, 389),
(352, 556),
(353, 389),
(354, 667),
(355, 333),
(356, 667),
(357, 416),
(362, 722),
(363, 556),
(366, 722),
(367, 556),
(368, 722),
(369, 556),
(370, 722),
(371, 556),
(376, 722),
(377, 667),
(378, 444),
(379, 667),
(380, 444),
(381, 667),
(382, 444),
(402, 500),
(536, 556),
(537, 389),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 500),
(8212, 1000),
(8216, 333),
(8217, 333),
(8218, 333),
(8220, 500),
(8221, 500),
(8222, 500),
(8224, 500),
(8225, 500),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 500),
(8482, 1000),
(8706, 494),
(8710, 612),
(8721, 600),
(8722, 570),
(8730, 549),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 494),
(63171, 250),
(64257, 556),
(64258, 556),
];
const TIMES_ITALIC: [(u32, u16); 315] = [
(32, 250),
(33, 333),
(34, 420),
(35, 500),
(36, 500),
(37, 833),
(38, 778),
(39, 214),
(40, 333),
(41, 333),
(42, 500),
(43, 675),
(44, 250),
(45, 333),
(46, 250),
(47, 278),
(48, 500),
(49, 500),
(50, 500),
(51, 500),
(52, 500),
(53, 500),
(54, 500),
(55, 500),
(56, 500),
(57, 500),
(58, 333),
(59, 333),
(60, 675),
(61, 675),
(62, 675),
(63, 500),
(64, 920),
(65, 611),
(66, 611),
(67, 667),
(68, 722),
(69, 611),
(70, 611),
(71, 722),
(72, 722),
(73, 333),
(74, 444),
(75, 667),
(76, 556),
(77, 833),
(78, 667),
(79, 722),
(80, 611),
(81, 722),
(82, 611),
(83, 500),
(84, 556),
(85, 722),
(86, 611),
(87, 833),
(88, 611),
(89, 556),
(90, 556),
(91, 389),
(92, 278),
(93, 389),
(94, 422),
(95, 500),
(96, 333),
(97, 500),
(98, 500),
(99, 444),
(100, 500),
(101, 444),
(102, 278),
(103, 500),
(104, 500),
(105, 278),
(106, 278),
(107, 444),
(108, 278),
(109, 722),
(110, 500),
(111, 500),
(112, 500),
(113, 500),
(114, 389),
(115, 389),
(116, 278),
(117, 500),
(118, 444),
(119, 667),
(120, 444),
(121, 444),
(122, 389),
(123, 400),
(124, 275),
(125, 400),
(126, 541),
(161, 389),
(162, 500),
(163, 500),
(164, 500),
(165, 500),
(166, 275),
(167, 500),
(168, 333),
(169, 760),
(170, 276),
(171, 500),
(172, 675),
(174, 760),
(175, 333),
(176, 400),
(177, 675),
(178, 300),
(179, 300),
(180, 333),
(181, 500),
(182, 523),
(183, 250),
(184, 333),
(185, 300),
(186, 310),
(187, 500),
(188, 750),
(189, 750),
(190, 750),
(191, 500),
(192, 611),
(193, 611),
(194, 611),
(195, 611),
(196, 611),
(197, 611),
(198, 889),
(199, 667),
(200, 611),
(201, 611),
(202, 611),
(203, 611),
(204, 333),
(205, 333),
(206, 333),
(207, 333),
(208, 722),
(209, 667),
(210, 722),
(211, 722),
(212, 722),
(213, 722),
(214, 722),
(215, 675),
(216, 722),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 556),
(222, 611),
(223, 500),
(224, 500),
(225, 500),
(226, 500),
(227, 500),
(228, 500),
(229, 500),
(230, 667),
(231, 444),
(232, 444),
(233, 444),
(234, 444),
(235, 444),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 500),
(241, 500),
(242, 500),
(243, 500),
(244, 500),
(245, 500),
(246, 500),
(247, 675),
(248, 500),
(249, 500),
(250, 500),
(251, 500),
(252, 500),
(253, 444),
(254, 500),
(255, 444),
(256, 611),
(257, 500),
(258, 611),
(259, 500),
(260, 611),
(261, 500),
(262, 667),
(263, 444),
(268, 667),
(269, 444),
(270, 722),
(271, 544),
(272, 722),
(273, 500),
(274, 611),
(275, 444),
(278, 611),
(279, 444),
(280, 611),
(281, 444),
(282, 611),
(283, 444),
(286, 722),
(287, 500),
(290, 722),
(291, 500),
(298, 333),
(299, 278),
(302, 333),
(303, 278),
(304, 333),
(305, 278),
(310, 667),
(311, 444),
(313, 556),
(314, 278),
(315, 556),
(316, 278),
(317, 611),
(318, 300),
(321, 556),
(322, 278),
(323, 667),
(324, 500),
(325, 667),
(326, 500),
(327, 667),
(328, 500),
(332, 722),
(333, 500),
(336, 722),
(337, 500),
(338, 944),
(339, 667),
(340, 611),
(341, 389),
(342, 611),
(343, 389),
(344, 611),
(345, 389),
(346, 500),
(347, 389),
(350, 500),
(351, 389),
(352, 500),
(353, 389),
(354, 556),
(355, 278),
(356, 556),
(357, 300),
(362, 722),
(363, 500),
(366, 722),
(367, 500),
(368, 722),
(369, 500),
(370, 722),
(371, 500),
(376, 556),
(377, 556),
(378, 389),
(379, 556),
(380, 389),
(381, 556),
(382, 389),
(402, 500),
(536, 500),
(537, 389),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 500),
(8212, 889),
(8216, 333),
(8217, 333),
(8218, 333),
(8220, 556),
(8221, 556),
(8222, 556),
(8224, 500),
(8225, 500),
(8226, 350),
(8230, 889),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 500),
(8482, 980),
(8706, 476),
(8710, 612),
(8721, 600),
(8722, 675),
(8730, 453),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 471),
(63171, 250),
(64257, 500),
(64258, 500),
];
const TIMES_BOLD_ITALIC: [(u32, u16); 315] = [
(32, 250),
(33, 389),
(34, 555),
(35, 500),
(36, 500),
(37, 833),
(38, 778),
(39, 278),
(40, 333),
(41, 333),
(42, 500),
(43, 570),
(44, 250),
(45, 333),
(46, 250),
(47, 278),
(48, 500),
(49, 500),
(50, 500),
(51, 500),
(52, 500),
(53, 500),
(54, 500),
(55, 500),
(56, 500),
(57, 500),
(58, 333),
(59, 333),
(60, 570),
(61, 570),
(62, 570),
(63, 500),
(64, 832),
(65, 667),
(66, 667),
(67, 667),
(68, 722),
(69, 667),
(70, 667),
(71, 722),
(72, 778),
(73, 389),
(74, 500),
(75, 667),
(76, 611),
(77, 889),
(78, 722),
(79, 722),
(80, 611),
(81, 722),
(82, 667),
(83, 556),
(84, 611),
(85, 722),
(86, 667),
(87, 889),
(88, 667),
(89, 611),
(90, 611),
(91, 333),
(92, 278),
(93, 333),
(94, 570),
(95, 500),
(96, 333),
(97, 500),
(98, 500),
(99, 444),
(100, 500),
(101, 444),
(102, 333),
(103, 500),
(104, 556),
(105, 278),
(106, 278),
(107, 500),
(108, 278),
(109, 778),
(110, 556),
(111, 500),
(112, 500),
(113, 500),
(114, 389),
(115, 389),
(116, 278),
(117, 556),
(118, 444),
(119, 667),
(120, 500),
(121, 444),
(122, 389),
(123, 348),
(124, 220),
(125, 348),
(126, 570),
(161, 389),
(162, 500),
(163, 500),
(164, 500),
(165, 500),
(166, 220),
(167, 500),
(168, 333),
(169, 747),
(170, 266),
(171, 500),
(172, 606),
(174, 747),
(175, 333),
(176, 400),
(177, 570),
(178, 300),
(179, 300),
(180, 333),
(181, 576),
(182, 500),
(183, 250),
(184, 333),
(185, 300),
(186, 300),
(187, 500),
(188, 750),
(189, 750),
(190, 750),
(191, 500),
(192, 667),
(193, 667),
(194, 667),
(195, 667),
(196, 667),
(197, 667),
(198, 944),
(199, 667),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 389),
(205, 389),
(206, 389),
(207, 389),
(208, 722),
(209, 722),
(210, 722),
(211, 722),
(212, 722),
(213, 722),
(214, 722),
(215, 570),
(216, 722),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 611),
(222, 611),
(223, 500),
(224, 500),
(225, 500),
(226, 500),
(227, 500),
(228, 500),
(229, 500),
(230, 722),
(231, 444),
(232, 444),
(233, 444),
(234, 444),
(235, 444),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 500),
(241, 556),
(242, 500),
(243, 500),
(244, 500),
(245, 500),
(246, 500),
(247, 570),
(248, 500),
(249, 556),
(250, 556),
(251, 556),
(252, 556),
(253, 444),
(254, 500),
(255, 444),
(256, 667),
(257, 500),
(258, 667),
(259, 500),
(260, 667),
(261, 500),
(262, 667),
(263, 444),
(268, 667),
(269, 444),
(270, 722),
(271, 608),
(272, 722),
(273, 500),
(274, 667),
(275, 444),
(278, 667),
(279, 444),
(280, 667),
(281, 444),
(282, 667),
(283, 444),
(286, 722),
(287, 500),
(290, 722),
(291, 500),
(298, 389),
(299, 278),
(302, 389),
(303, 278),
(304, 389),
(305, 278),
(310, 667),
(311, 500),
(313, 611),
(314, 278),
(315, 611),
(316, 278),
(317, 611),
(318, 382),
(321, 611),
(322, 278),
(323, 722),
(324, 556),
(325, 722),
(326, 556),
(327, 722),
(328, 556),
(332, 722),
(333, 500),
(336, 722),
(337, 500),
(338, 944),
(339, 722),
(340, 667),
(341, 389),
(342, 667),
(343, 389),
(344, 667),
(345, 389),
(346, 556),
(347, 389),
(350, 556),
(351, 389),
(352, 556),
(353, 389),
(354, 611),
(355, 278),
(356, 611),
(357, 366),
(362, 722),
(363, 556),
(366, 722),
(367, 556),
(368, 722),
(369, 556),
(370, 722),
(371, 556),
(376, 611),
(377, 611),
(378, 389),
(379, 611),
(380, 389),
(381, 611),
(382, 389),
(402, 500),
(536, 556),
(537, 389),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 500),
(8212, 1000),
(8216, 333),
(8217, 333),
(8218, 333),
(8220, 500),
(8221, 500),
(8222, 500),
(8224, 500),
(8225, 500),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 500),
(8482, 1000),
(8706, 494),
(8710, 612),
(8721, 600),
(8722, 606),
(8730, 549),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 494),
(63171, 250),
(64257, 556),
(64258, 556),
];
const HELVETICA: [(u32, u16); 315] = [
(32, 278),
(33, 278),
(34, 355),
(35, 556),
(36, 556),
(37, 889),
(38, 667),
(39, 191),
(40, 333),
(41, 333),
(42, 389),
(43, 584),
(44, 278),
(45, 333),
(46, 278),
(47, 278),
(48, 556),
(49, 556),
(50, 556),
(51, 556),
(52, 556),
(53, 556),
(54, 556),
(55, 556),
(56, 556),
(57, 556),
(58, 278),
(59, 278),
(60, 584),
(61, 584),
(62, 584),
(63, 556),
(64, 1015),
(65, 667),
(66, 667),
(67, 722),
(68, 722),
(69, 667),
(70, 611),
(71, 778),
(72, 722),
(73, 278),
(74, 500),
(75, 667),
(76, 556),
(77, 833),
(78, 722),
(79, 778),
(80, 667),
(81, 778),
(82, 722),
(83, 667),
(84, 611),
(85, 722),
(86, 667),
(87, 944),
(88, 667),
(89, 667),
(90, 611),
(91, 278),
(92, 278),
(93, 278),
(94, 469),
(95, 556),
(96, 333),
(97, 556),
(98, 556),
(99, 500),
(100, 556),
(101, 556),
(102, 278),
(103, 556),
(104, 556),
(105, 222),
(106, 222),
(107, 500),
(108, 222),
(109, 833),
(110, 556),
(111, 556),
(112, 556),
(113, 556),
(114, 333),
(115, 500),
(116, 278),
(117, 556),
(118, 500),
(119, 722),
(120, 500),
(121, 500),
(122, 500),
(123, 334),
(124, 260),
(125, 334),
(126, 584),
(161, 333),
(162, 556),
(163, 556),
(164, 556),
(165, 556),
(166, 260),
(167, 556),
(168, 333),
(169, 737),
(170, 370),
(171, 556),
(172, 584),
(174, 737),
(175, 333),
(176, 400),
(177, 584),
(178, 333),
(179, 333),
(180, 333),
(181, 556),
(182, 537),
(183, 278),
(184, 333),
(185, 333),
(186, 365),
(187, 556),
(188, 834),
(189, 834),
(190, 834),
(191, 611),
(192, 667),
(193, 667),
(194, 667),
(195, 667),
(196, 667),
(197, 667),
(198, 1000),
(199, 722),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 278),
(205, 278),
(206, 278),
(207, 278),
(208, 722),
(209, 722),
(210, 778),
(211, 778),
(212, 778),
(213, 778),
(214, 778),
(215, 584),
(216, 778),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 667),
(222, 667),
(223, 611),
(224, 556),
(225, 556),
(226, 556),
(227, 556),
(228, 556),
(229, 556),
(230, 889),
(231, 500),
(232, 556),
(233, 556),
(234, 556),
(235, 556),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 556),
(241, 556),
(242, 556),
(243, 556),
(244, 556),
(245, 556),
(246, 556),
(247, 584),
(248, 611),
(249, 556),
(250, 556),
(251, 556),
(252, 556),
(253, 500),
(254, 556),
(255, 500),
(256, 667),
(257, 556),
(258, 667),
(259, 556),
(260, 667),
(261, 556),
(262, 722),
(263, 500),
(268, 722),
(269, 500),
(270, 722),
(271, 643),
(272, 722),
(273, 556),
(274, 667),
(275, 556),
(278, 667),
(279, 556),
(280, 667),
(281, 556),
(282, 667),
(283, 556),
(286, 778),
(287, 556),
(290, 778),
(291, 556),
(298, 278),
(299, 278),
(302, 278),
(303, 222),
(304, 278),
(305, 278),
(310, 667),
(311, 500),
(313, 556),
(314, 222),
(315, 556),
(316, 222),
(317, 556),
(318, 299),
(321, 556),
(322, 222),
(323, 722),
(324, 556),
(325, 722),
(326, 556),
(327, 722),
(328, 556),
(332, 778),
(333, 556),
(336, 778),
(337, 556),
(338, 1000),
(339, 944),
(340, 722),
(341, 333),
(342, 722),
(343, 333),
(344, 722),
(345, 333),
(346, 667),
(347, 500),
(350, 667),
(351, 500),
(352, 667),
(353, 500),
(354, 611),
(355, 278),
(356, 611),
(357, 317),
(362, 722),
(363, 556),
(366, 722),
(367, 556),
(368, 722),
(369, 556),
(370, 722),
(371, 556),
(376, 667),
(377, 611),
(378, 500),
(379, 611),
(380, 500),
(381, 611),
(382, 500),
(402, 556),
(536, 667),
(537, 500),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 556),
(8212, 1000),
(8216, 222),
(8217, 222),
(8218, 222),
(8220, 333),
(8221, 333),
(8222, 333),
(8224, 556),
(8225, 556),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 556),
(8482, 1000),
(8706, 476),
(8710, 612),
(8721, 600),
(8722, 584),
(8730, 453),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 471),
(63171, 250),
(64257, 500),
(64258, 500),
];
const HELVETICA_BOLD: [(u32, u16); 315] = [
(32, 278),
(33, 333),
(34, 474),
(35, 556),
(36, 556),
(37, 889),
(38, 722),
(39, 238),
(40, 333),
(41, 333),
(42, 389),
(43, 584),
(44, 278),
(45, 333),
(46, 278),
(47, 278),
(48, 556),
(49, 556),
(50, 556),
(51, 556),
(52, 556),
(53, 556),
(54, 556),
(55, 556),
(56, 556),
(57, 556),
(58, 333),
(59, 333),
(60, 584),
(61, 584),
(62, 584),
(63, 611),
(64, 975),
(65, 722),
(66, 722),
(67, 722),
(68, 722),
(69, 667),
(70, 611),
(71, 778),
(72, 722),
(73, 278),
(74, 556),
(75, 722),
(76, 611),
(77, 833),
(78, 722),
(79, 778),
(80, 667),
(81, 778),
(82, 722),
(83, 667),
(84, 611),
(85, 722),
(86, 667),
(87, 944),
(88, 667),
(89, 667),
(90, 611),
(91, 333),
(92, 278),
(93, 333),
(94, 584),
(95, 556),
(96, 333),
(97, 556),
(98, 611),
(99, 556),
(100, 611),
(101, 556),
(102, 333),
(103, 611),
(104, 611),
(105, 278),
(106, 278),
(107, 556),
(108, 278),
(109, 889),
(110, 611),
(111, 611),
(112, 611),
(113, 611),
(114, 389),
(115, 556),
(116, 333),
(117, 611),
(118, 556),
(119, 778),
(120, 556),
(121, 556),
(122, 500),
(123, 389),
(124, 280),
(125, 389),
(126, 584),
(161, 333),
(162, 556),
(163, 556),
(164, 556),
(165, 556),
(166, 280),
(167, 556),
(168, 333),
(169, 737),
(170, 370),
(171, 556),
(172, 584),
(174, 737),
(175, 333),
(176, 400),
(177, 584),
(178, 333),
(179, 333),
(180, 333),
(181, 611),
(182, 556),
(183, 278),
(184, 333),
(185, 333),
(186, 365),
(187, 556),
(188, 834),
(189, 834),
(190, 834),
(191, 611),
(192, 722),
(193, 722),
(194, 722),
(195, 722),
(196, 722),
(197, 722),
(198, 1000),
(199, 722),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 278),
(205, 278),
(206, 278),
(207, 278),
(208, 722),
(209, 722),
(210, 778),
(211, 778),
(212, 778),
(213, 778),
(214, 778),
(215, 584),
(216, 778),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 667),
(222, 667),
(223, 611),
(224, 556),
(225, 556),
(226, 556),
(227, 556),
(228, 556),
(229, 556),
(230, 889),
(231, 556),
(232, 556),
(233, 556),
(234, 556),
(235, 556),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 611),
(241, 611),
(242, 611),
(243, 611),
(244, 611),
(245, 611),
(246, 611),
(247, 584),
(248, 611),
(249, 611),
(250, 611),
(251, 611),
(252, 611),
(253, 556),
(254, 611),
(255, 556),
(256, 722),
(257, 556),
(258, 722),
(259, 556),
(260, 722),
(261, 556),
(262, 722),
(263, 556),
(268, 722),
(269, 556),
(270, 722),
(271, 743),
(272, 722),
(273, 611),
(274, 667),
(275, 556),
(278, 667),
(279, 556),
(280, 667),
(281, 556),
(282, 667),
(283, 556),
(286, 778),
(287, 611),
(290, 778),
(291, 611),
(298, 278),
(299, 278),
(302, 278),
(303, 278),
(304, 278),
(305, 278),
(310, 722),
(311, 556),
(313, 611),
(314, 278),
(315, 611),
(316, 278),
(317, 611),
(318, 400),
(321, 611),
(322, 278),
(323, 722),
(324, 611),
(325, 722),
(326, 611),
(327, 722),
(328, 611),
(332, 778),
(333, 611),
(336, 778),
(337, 611),
(338, 1000),
(339, 944),
(340, 722),
(341, 389),
(342, 722),
(343, 389),
(344, 722),
(345, 389),
(346, 667),
(347, 556),
(350, 667),
(351, 556),
(352, 667),
(353, 556),
(354, 611),
(355, 333),
(356, 611),
(357, 389),
(362, 722),
(363, 611),
(366, 722),
(367, 611),
(368, 722),
(369, 611),
(370, 722),
(371, 611),
(376, 667),
(377, 611),
(378, 500),
(379, 611),
(380, 500),
(381, 611),
(382, 500),
(402, 556),
(536, 667),
(537, 556),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 556),
(8212, 1000),
(8216, 278),
(8217, 278),
(8218, 278),
(8220, 500),
(8221, 500),
(8222, 500),
(8224, 556),
(8225, 556),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 556),
(8482, 1000),
(8706, 494),
(8710, 612),
(8721, 600),
(8722, 584),
(8730, 549),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 494),
(63171, 250),
(64257, 611),
(64258, 611),
];
const HELVETICA_OBLIQUE: [(u32, u16); 315] = [
(32, 278),
(33, 278),
(34, 355),
(35, 556),
(36, 556),
(37, 889),
(38, 667),
(39, 191),
(40, 333),
(41, 333),
(42, 389),
(43, 584),
(44, 278),
(45, 333),
(46, 278),
(47, 278),
(48, 556),
(49, 556),
(50, 556),
(51, 556),
(52, 556),
(53, 556),
(54, 556),
(55, 556),
(56, 556),
(57, 556),
(58, 278),
(59, 278),
(60, 584),
(61, 584),
(62, 584),
(63, 556),
(64, 1015),
(65, 667),
(66, 667),
(67, 722),
(68, 722),
(69, 667),
(70, 611),
(71, 778),
(72, 722),
(73, 278),
(74, 500),
(75, 667),
(76, 556),
(77, 833),
(78, 722),
(79, 778),
(80, 667),
(81, 778),
(82, 722),
(83, 667),
(84, 611),
(85, 722),
(86, 667),
(87, 944),
(88, 667),
(89, 667),
(90, 611),
(91, 278),
(92, 278),
(93, 278),
(94, 469),
(95, 556),
(96, 333),
(97, 556),
(98, 556),
(99, 500),
(100, 556),
(101, 556),
(102, 278),
(103, 556),
(104, 556),
(105, 222),
(106, 222),
(107, 500),
(108, 222),
(109, 833),
(110, 556),
(111, 556),
(112, 556),
(113, 556),
(114, 333),
(115, 500),
(116, 278),
(117, 556),
(118, 500),
(119, 722),
(120, 500),
(121, 500),
(122, 500),
(123, 334),
(124, 260),
(125, 334),
(126, 584),
(161, 333),
(162, 556),
(163, 556),
(164, 556),
(165, 556),
(166, 260),
(167, 556),
(168, 333),
(169, 737),
(170, 370),
(171, 556),
(172, 584),
(174, 737),
(175, 333),
(176, 400),
(177, 584),
(178, 333),
(179, 333),
(180, 333),
(181, 556),
(182, 537),
(183, 278),
(184, 333),
(185, 333),
(186, 365),
(187, 556),
(188, 834),
(189, 834),
(190, 834),
(191, 611),
(192, 667),
(193, 667),
(194, 667),
(195, 667),
(196, 667),
(197, 667),
(198, 1000),
(199, 722),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 278),
(205, 278),
(206, 278),
(207, 278),
(208, 722),
(209, 722),
(210, 778),
(211, 778),
(212, 778),
(213, 778),
(214, 778),
(215, 584),
(216, 778),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 667),
(222, 667),
(223, 611),
(224, 556),
(225, 556),
(226, 556),
(227, 556),
(228, 556),
(229, 556),
(230, 889),
(231, 500),
(232, 556),
(233, 556),
(234, 556),
(235, 556),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 556),
(241, 556),
(242, 556),
(243, 556),
(244, 556),
(245, 556),
(246, 556),
(247, 584),
(248, 611),
(249, 556),
(250, 556),
(251, 556),
(252, 556),
(253, 500),
(254, 556),
(255, 500),
(256, 667),
(257, 556),
(258, 667),
(259, 556),
(260, 667),
(261, 556),
(262, 722),
(263, 500),
(268, 722),
(269, 500),
(270, 722),
(271, 643),
(272, 722),
(273, 556),
(274, 667),
(275, 556),
(278, 667),
(279, 556),
(280, 667),
(281, 556),
(282, 667),
(283, 556),
(286, 778),
(287, 556),
(290, 778),
(291, 556),
(298, 278),
(299, 278),
(302, 278),
(303, 222),
(304, 278),
(305, 278),
(310, 667),
(311, 500),
(313, 556),
(314, 222),
(315, 556),
(316, 222),
(317, 556),
(318, 299),
(321, 556),
(322, 222),
(323, 722),
(324, 556),
(325, 722),
(326, 556),
(327, 722),
(328, 556),
(332, 778),
(333, 556),
(336, 778),
(337, 556),
(338, 1000),
(339, 944),
(340, 722),
(341, 333),
(342, 722),
(343, 333),
(344, 722),
(345, 333),
(346, 667),
(347, 500),
(350, 667),
(351, 500),
(352, 667),
(353, 500),
(354, 611),
(355, 278),
(356, 611),
(357, 317),
(362, 722),
(363, 556),
(366, 722),
(367, 556),
(368, 722),
(369, 556),
(370, 722),
(371, 556),
(376, 667),
(377, 611),
(378, 500),
(379, 611),
(380, 500),
(381, 611),
(382, 500),
(402, 556),
(536, 667),
(537, 500),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 556),
(8212, 1000),
(8216, 222),
(8217, 222),
(8218, 222),
(8220, 333),
(8221, 333),
(8222, 333),
(8224, 556),
(8225, 556),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 556),
(8482, 1000),
(8706, 476),
(8710, 612),
(8721, 600),
(8722, 584),
(8730, 453),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 471),
(63171, 250),
(64257, 500),
(64258, 500),
];
const HELVETICA_BOLD_OBLIQUE: [(u32, u16); 315] = [
(32, 278),
(33, 333),
(34, 474),
(35, 556),
(36, 556),
(37, 889),
(38, 722),
(39, 238),
(40, 333),
(41, 333),
(42, 389),
(43, 584),
(44, 278),
(45, 333),
(46, 278),
(47, 278),
(48, 556),
(49, 556),
(50, 556),
(51, 556),
(52, 556),
(53, 556),
(54, 556),
(55, 556),
(56, 556),
(57, 556),
(58, 333),
(59, 333),
(60, 584),
(61, 584),
(62, 584),
(63, 611),
(64, 975),
(65, 722),
(66, 722),
(67, 722),
(68, 722),
(69, 667),
(70, 611),
(71, 778),
(72, 722),
(73, 278),
(74, 556),
(75, 722),
(76, 611),
(77, 833),
(78, 722),
(79, 778),
(80, 667),
(81, 778),
(82, 722),
(83, 667),
(84, 611),
(85, 722),
(86, 667),
(87, 944),
(88, 667),
(89, 667),
(90, 611),
(91, 333),
(92, 278),
(93, 333),
(94, 584),
(95, 556),
(96, 333),
(97, 556),
(98, 611),
(99, 556),
(100, 611),
(101, 556),
(102, 333),
(103, 611),
(104, 611),
(105, 278),
(106, 278),
(107, 556),
(108, 278),
(109, 889),
(110, 611),
(111, 611),
(112, 611),
(113, 611),
(114, 389),
(115, 556),
(116, 333),
(117, 611),
(118, 556),
(119, 778),
(120, 556),
(121, 556),
(122, 500),
(123, 389),
(124, 280),
(125, 389),
(126, 584),
(161, 333),
(162, 556),
(163, 556),
(164, 556),
(165, 556),
(166, 280),
(167, 556),
(168, 333),
(169, 737),
(170, 370),
(171, 556),
(172, 584),
(174, 737),
(175, 333),
(176, 400),
(177, 584),
(178, 333),
(179, 333),
(180, 333),
(181, 611),
(182, 556),
(183, 278),
(184, 333),
(185, 333),
(186, 365),
(187, 556),
(188, 834),
(189, 834),
(190, 834),
(191, 611),
(192, 722),
(193, 722),
(194, 722),
(195, 722),
(196, 722),
(197, 722),
(198, 1000),
(199, 722),
(200, 667),
(201, 667),
(202, 667),
(203, 667),
(204, 278),
(205, 278),
(206, 278),
(207, 278),
(208, 722),
(209, 722),
(210, 778),
(211, 778),
(212, 778),
(213, 778),
(214, 778),
(215, 584),
(216, 778),
(217, 722),
(218, 722),
(219, 722),
(220, 722),
(221, 667),
(222, 667),
(223, 611),
(224, 556),
(225, 556),
(226, 556),
(227, 556),
(228, 556),
(229, 556),
(230, 889),
(231, 556),
(232, 556),
(233, 556),
(234, 556),
(235, 556),
(236, 278),
(237, 278),
(238, 278),
(239, 278),
(240, 611),
(241, 611),
(242, 611),
(243, 611),
(244, 611),
(245, 611),
(246, 611),
(247, 584),
(248, 611),
(249, 611),
(250, 611),
(251, 611),
(252, 611),
(253, 556),
(254, 611),
(255, 556),
(256, 722),
(257, 556),
(258, 722),
(259, 556),
(260, 722),
(261, 556),
(262, 722),
(263, 556),
(268, 722),
(269, 556),
(270, 722),
(271, 743),
(272, 722),
(273, 611),
(274, 667),
(275, 556),
(278, 667),
(279, 556),
(280, 667),
(281, 556),
(282, 667),
(283, 556),
(286, 778),
(287, 611),
(290, 778),
(291, 611),
(298, 278),
(299, 278),
(302, 278),
(303, 278),
(304, 278),
(305, 278),
(310, 722),
(311, 556),
(313, 611),
(314, 278),
(315, 611),
(316, 278),
(317, 611),
(318, 400),
(321, 611),
(322, 278),
(323, 722),
(324, 611),
(325, 722),
(326, 611),
(327, 722),
(328, 611),
(332, 778),
(333, 611),
(336, 778),
(337, 611),
(338, 1000),
(339, 944),
(340, 722),
(341, 389),
(342, 722),
(343, 389),
(344, 722),
(345, 389),
(346, 667),
(347, 556),
(350, 667),
(351, 556),
(352, 667),
(353, 556),
(354, 611),
(355, 333),
(356, 611),
(357, 389),
(362, 722),
(363, 611),
(366, 722),
(367, 611),
(368, 722),
(369, 611),
(370, 722),
(371, 611),
(376, 667),
(377, 611),
(378, 500),
(379, 611),
(380, 500),
(381, 611),
(382, 500),
(402, 556),
(536, 667),
(537, 556),
(710, 333),
(711, 333),
(728, 333),
(729, 333),
(730, 333),
(731, 333),
(732, 333),
(733, 333),
(8211, 556),
(8212, 1000),
(8216, 278),
(8217, 278),
(8218, 278),
(8220, 500),
(8221, 500),
(8222, 500),
(8224, 556),
(8225, 556),
(8226, 350),
(8230, 1000),
(8240, 1000),
(8249, 333),
(8250, 333),
(8260, 167),
(8364, 556),
(8482, 1000),
(8706, 494),
(8710, 612),
(8721, 600),
(8722, 584),
(8730, 549),
(8800, 549),
(8804, 549),
(8805, 549),
(9674, 494),
(63171, 250),
(64257, 611),
(64258, 611),
];
const SYMBOL: [(u32, u16); 190] = [
(32, 250),
(33, 333),
(35, 500),
(37, 833),
(38, 778),
(40, 333),
(41, 333),
(43, 549),
(44, 250),
(46, 250),
(47, 278),
(48, 500),
(49, 500),
(50, 500),
(51, 500),
(52, 500),
(53, 500),
(54, 500),
(55, 500),
(56, 500),
(57, 500),
(58, 278),
(59, 278),
(60, 549),
(61, 549),
(62, 549),
(63, 444),
(91, 333),
(93, 333),
(95, 500),
(123, 480),
(124, 200),
(125, 480),
(172, 713),
(176, 400),
(177, 549),
(181, 576),
(215, 549),
(247, 549),
(402, 500),
(913, 722),
(914, 667),
(915, 603),
(917, 611),
(918, 611),
(919, 722),
(920, 741),
(921, 333),
(922, 722),
(923, 686),
(924, 889),
(925, 722),
(926, 645),
(927, 722),
(928, 768),
(929, 556),
(931, 592),
(932, 611),
(933, 690),
(934, 763),
(935, 722),
(936, 795),
(945, 631),
(946, 549),
(947, 411),
(948, 494),
(949, 439),
(950, 494),
(951, 603),
(952, 521),
(953, 329),
(954, 549),
(955, 549),
(957, 521),
(958, 493),
(959, 549),
(960, 549),
(961, 549),
(962, 439),
(963, 603),
(964, 439),
(965, 576),
(966, 521),
(967, 549),
(968, 686),
(969, 686),
(977, 631),
(978, 620),
(981, 603),
(982, 713),
(8226, 460),
(8230, 1000),
(8242, 247),
(8243, 411),
(8260, 167),
(8364, 750),
(8465, 686),
(8472, 987),
(8476, 795),
(8486, 768),
(8501, 823),
(8592, 987),
(8593, 603),
(8594, 987),
(8595, 603),
(8596, 1042),
(8629, 658),
(8656, 987),
(8657, 603),
(8658, 987),
(8659, 603),
(8660, 1042),
(8704, 713),
(8706, 494),
(8707, 549),
(8709, 823),
(8710, 612),
(8711, 713),
(8712, 713),
(8713, 713),
(8715, 439),
(8719, 823),
(8721, 713),
(8722, 549),
(8727, 500),
(8730, 549),
(8733, 713),
(8734, 713),
(8736, 768),
(8743, 603),
(8744, 603),
(8745, 768),
(8746, 768),
(8747, 274),
(8756, 863),
(8764, 549),
(8773, 549),
(8776, 549),
(8800, 549),
(8801, 549),
(8804, 549),
(8805, 549),
(8834, 713),
(8835, 713),
(8836, 713),
(8838, 713),
(8839, 713),
(8853, 768),
(8855, 768),
(8869, 658),
(8901, 250),
(8992, 686),
(8993, 686),
(9001, 329),
(9002, 329),
(9674, 494),
(9824, 753),
(9827, 753),
(9829, 753),
(9830, 753),
(63193, 790),
(63194, 790),
(63195, 890),
(63717, 500),
(63718, 603),
(63719, 1000),
(63720, 790),
(63721, 790),
(63722, 786),
(63723, 384),
(63724, 384),
(63725, 384),
(63726, 384),
(63727, 384),
(63728, 384),
(63729, 494),
(63730, 494),
(63731, 494),
(63732, 494),
(63733, 686),
(63734, 384),
(63735, 384),
(63736, 384),
(63737, 384),
(63738, 384),
(63739, 384),
(63740, 494),
(63741, 494),
(63742, 494),
(63743, 790),
];
const ZAPF_DINGBATS: [(u32, u16); 1] = [
(32, 278),
];
pub fn widths_for(base_font: &str) -> Option<Base14> {
let name = base_font.rsplit('+').next().unwrap_or(base_font);
let lower = name.to_ascii_lowercase().replace([' ', '_', '-', ','], "");
let bold = lower.contains("bold");
let italic = lower.contains("italic") || lower.contains("oblique");
if lower.starts_with("courier") {
return Some(Base14::Monospaced(COURIER_WIDTH));
}
if lower.starts_with("symbol") {
return Some(Base14::Table(&SYMBOL));
}
if lower.starts_with("zapfdingbats") || lower.starts_with("dingbats") {
return Some(Base14::Table(&ZAPF_DINGBATS));
}
if lower.starts_with("times") {
return Some(Base14::Table(match (bold, italic) {
(true, true) => &TIMES_BOLD_ITALIC,
(true, false) => &TIMES_BOLD,
(false, true) => &TIMES_ITALIC,
(false, false) => &TIMES_ROMAN,
}));
}
if lower.starts_with("helvetica") || lower.starts_with("arial") {
return Some(Base14::Table(match (bold, italic) {
(true, true) => &HELVETICA_BOLD_OBLIQUE,
(true, false) => &HELVETICA_BOLD,
(false, true) => &HELVETICA_OBLIQUE,
(false, false) => &HELVETICA,
}));
}
None
}
pub enum Base14 {
Monospaced(u16),
Table(&'static [(u32, u16)]),
}
impl Base14 {
pub fn width(&self, ch: char) -> Option<f32> {
match self {
Base14::Monospaced(w) => Some(*w as f32 / 1000.0),
Base14::Table(table) => table
.binary_search_by_key(&(ch as u32), |(cp, _)| *cp)
.ok()
.map(|i| table[i].1 as f32 / 1000.0),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn times_roman_matches_adobes_metrics() {
let t = widths_for("Times-Roman").unwrap();
assert_eq!(t.width(' '), Some(0.250));
assert_eq!(t.width('M'), Some(0.889));
assert_eq!(t.width('W'), Some(0.944));
assert_eq!(t.width('I'), Some(0.333));
assert_eq!(t.width('i'), Some(0.278));
assert_eq!(t.width('m'), Some(0.778));
}
#[test]
fn every_courier_face_is_monospaced() {
for name in ["Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique"] {
let t = widths_for(name).unwrap();
assert_eq!(t.width('i'), Some(0.6));
assert_eq!(t.width('M'), Some(0.6));
}
}
#[test]
fn standard_aliases_and_subset_prefixes_resolve() {
assert_eq!(widths_for("ABCDEF+Times-Roman").unwrap().width('M'), Some(0.889));
assert_eq!(
widths_for("Arial").unwrap().width('M'),
widths_for("Helvetica").unwrap().width('M')
);
assert_eq!(widths_for("TimesNewRomanPSMT").unwrap().width('M'), Some(0.889));
assert_eq!(widths_for("CourierNew").unwrap().width('x'), Some(0.6));
}
#[test]
fn styles_are_distinguished() {
let roman = widths_for("Times-Roman").unwrap().width('M').unwrap();
let bold = widths_for("Times-Bold").unwrap().width('M').unwrap();
assert_ne!(roman, bold, "Times-Bold must not reuse Times-Roman metrics");
assert_eq!(
widths_for("Helvetica-BoldOblique").unwrap().width('M'),
widths_for("Helvetica-Bold").unwrap().width('M')
);
}
#[test]
fn an_embedded_font_is_not_claimed() {
assert!(widths_for("NimbusRomNo9L-Regu").is_none());
assert!(widths_for("EMMOLK+Cambria").is_none());
assert!(widths_for("").is_none());
}
#[test]
fn tables_are_sorted() {
for name in ["Times-Roman", "Helvetica", "Symbol", "ZapfDingbats"] {
if let Some(Base14::Table(t)) = widths_for(name) {
assert!(t.windows(2).all(|w| w[0].0 < w[1].0), "{name} table is unsorted");
}
}
}
}