xref: /plugin/dw2pdf/vendor/mpdf/mpdf/src/SizeConverter.php (revision d919a4deb87559e4dc9eca64d18065baaefd31a9)
1<?php
2
3namespace Mpdf;
4
5class SizeConverter
6{
7
8	private $dpi;
9
10	private $defaultFontSize;
11
12	public function __construct($dpi, $defaultFontSize)
13	{
14		$this->dpi = $dpi;
15		$this->defaultFontSize = $defaultFontSize;
16	}
17
18	/**
19	 * Depends of maxsize value to make % work properly. Usually maxsize == pagewidth
20	 * For text $maxsize = $fontsize
21	 * Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize
22	 *
23	 * @param mixed $size
24	 * @param mixed $maxsize
25	 * @param mixed $fontsize
26	 * @param mixed $usefontsize Set false for e.g. margins - will ignore fontsize for % values
27	 *
28	 * @return float Final size in mm
29	 */
30	public function convert($size = 5, $maxsize = 0, $fontsize = false, $usefontsize = true)
31	{
32		$size = trim(strtolower($size));
33		$res = preg_match('/^(?P<size>[-0-9.,]+)?(?P<unit>[%a-z-]+)?$/', $size, $parts);
34		if (!$res) {
35			throw new \Mpdf\MpdfException(sprintf('Invalid size representation "%s"', $size));
36		}
37
38		$unit = !empty($parts['unit']) ? $parts['unit'] : null;
39		$size = !empty($parts['size']) ? (float) $parts['size'] : 0.0;
40
41		switch ($unit) {
42			case 'mm':
43				// do nothing
44				break;
45
46			case 'cm':
47				$size *= 10;
48				break;
49
50			case 'pt':
51				$size *= 1 / Mpdf::SCALE;
52				break;
53
54			case 'rem':
55				$size *= ($this->defaultFontSize / (1 / Mpdf::SCALE));
56				break;
57
58			case '%':
59				if ($fontsize && $usefontsize) {
60					$size *= $fontsize / 100;
61				} else {
62					$size *= $maxsize / 100;
63				}
64				break;
65
66			case 'in':
67				// mm in an inch
68				$size *= 25.4;
69				break;
70
71			case 'pc':
72				// PostScript picas
73				$size *= 38.1 / 9;
74				break;
75
76			case 'ex':
77				// Approximates "ex" as half of font height
78				$size *= $this->multiplyFontSize($fontsize, $maxsize, 0.5);
79				break;
80
81			case 'em':
82				$size *= $this->multiplyFontSize($fontsize, $maxsize, 1);
83				break;
84
85			case 'thin':
86				$size = 1 * (25.4 / $this->dpi);
87				break;
88
89			case 'medium':
90				$size = 3 * (25.4 / $this->dpi);
91				// Commented-out dead code from legacy method
92				// $size *= $this->multiplyFontSize($fontsize, $maxsize, 1);
93				break;
94
95			case 'thick':
96				$size = 5 * (25.4 / $this->dpi); // 5 pixel width for table borders
97				break;
98
99			case 'xx-small':
100				$size *= $this->multiplyFontSize($fontsize, $maxsize, 0.7);
101				break;
102
103			case 'x-small':
104				$size *= $this->multiplyFontSize($fontsize, $maxsize, 0.77);
105				break;
106
107			case 'small':
108				$size *= $this->multiplyFontSize($fontsize, $maxsize, 0.86);
109				break;
110
111			case 'large':
112				$size *= $this->multiplyFontSize($fontsize, $maxsize, 1.2);
113				break;
114
115			case 'x-large':
116				$size *= $this->multiplyFontSize($fontsize, $maxsize, 1.5);
117				break;
118
119			case 'xx-large':
120				$size *= $this->multiplyFontSize($fontsize, $maxsize, 2);
121				break;
122
123			case 'px':
124			default:
125				$size *= (25.4 / $this->dpi);
126				break;
127		}
128
129		return $size;
130	}
131
132	private function multiplyFontSize($fontsize, $maxsize, $ratio)
133	{
134		if ($fontsize) {
135			return $fontsize * $ratio;
136		}
137
138		return $maxsize * $ratio;
139	}
140}
141