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