| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Class with Font related methods.
- *
- * @package PhpMyAdmin
- */
- declare(strict_types=1);
- namespace PhpMyAdmin;
- /**
- * Class with Font related methods.
- *
- * @package PhpMyAdmin
- */
- class Font
- {
- /**
- * Get list with characters and the corresponding width modifiers.
- *
- * @return array with characters and corresponding width modifier
- * @access public
- */
- public function getCharLists(): array
- {
- // list of characters and their width modifiers
- $charLists = [];
- //ijl
- $charLists[] = [
- "chars" => [
- "i",
- "j",
- "l",
- ], "modifier" => 0.23,
- ];
- //f
- $charLists[] = [
- "chars" => ["f"],
- "modifier" => 0.27,
- ];
- //tI
- $charLists[] = [
- "chars" => [
- "t",
- "I",
- ], "modifier" => 0.28,
- ];
- //r
- $charLists[] = [
- "chars" => ["r"],
- "modifier" => 0.34,
- ];
- //1
- $charLists[] = [
- "chars" => ["1"],
- "modifier" => 0.49,
- ];
- //cksvxyzJ
- $charLists[] = [
- "chars" => [
- "c",
- "k",
- "s",
- "v",
- "x",
- "y",
- "z",
- "J",
- ],
- "modifier" => 0.5,
- ];
- //abdeghnopquL023456789
- $charLists[] = [
- "chars" => [
- "a",
- "b",
- "d",
- "e",
- "g",
- "h",
- "n",
- "o",
- "p",
- "q",
- "u",
- "L",
- "0",
- "2",
- "3",
- "4",
- "5",
- "6",
- "7",
- "8",
- "9",
- ],
- "modifier" => 0.56,
- ];
- //FTZ
- $charLists[] = [
- "chars" => [
- "F",
- "T",
- "Z",
- ], "modifier" => 0.61,
- ];
- //ABEKPSVXY
- $charLists[] = [
- "chars" => [
- "A",
- "B",
- "E",
- "K",
- "P",
- "S",
- "V",
- "X",
- "Y",
- ],
- "modifier" => 0.67,
- ];
- //wCDHNRU
- $charLists[] = [
- "chars" => [
- "w",
- "C",
- "D",
- "H",
- "N",
- "R",
- "U",
- ],
- "modifier" => 0.73,
- ];
- //GOQ
- $charLists[] = [
- "chars" => [
- "G",
- "O",
- "Q",
- ], "modifier" => 0.78,
- ];
- //mM
- $charLists[] = [
- "chars" => [
- "m",
- "M",
- ], "modifier" => 0.84,
- ];
- //W
- $charLists[] = [
- "chars" => ["W"],
- "modifier" => 0.95,
- ];
- //" "
- $charLists[] = [
- "chars" => [" "],
- "modifier" => 0.28,
- ];
- return $charLists;
- }
- /**
- * Get width of string/text
- *
- * The text element width is calculated depending on font name
- * and font size.
- *
- * @param string $text string of which the width will be calculated
- * @param string $font name of the font like Arial,sans-serif etc
- * @param integer $fontSize size of font
- * @param array|null $charLists list of characters and their width modifiers
- *
- * @return integer width of the text
- * @access public
- */
- public function getStringWidth(
- string $text,
- string $font,
- int $fontSize,
- ?array $charLists = null
- ): int {
- if (empty($charLists)
- || ! isset($charLists[0]["chars"]) || ! is_array($charLists[0]["chars"])
- || ! isset($charLists[0]["modifier"])
- ) {
- $charLists = $this->getCharLists();
- }
- /*
- * Start by counting the width, giving each character a modifying value
- */
- $count = 0;
- foreach ($charLists as $charList) {
- $count += ((mb_strlen($text)
- - mb_strlen(str_replace($charList["chars"], "", $text))
- ) * $charList["modifier"]);
- }
- $text = str_replace(" ", "", $text);//remove the " "'s
- //all other chars
- $count += (mb_strlen(preg_replace("/[a-z0-9]/i", "", $text)) * 0.3);
- $modifier = 1;
- $font = mb_strtolower($font);
- switch ($font) {
- /*
- * no modifier for arial and sans-serif
- */
- case 'arial':
- case 'sans-serif':
- break;
- /*
- * .92 modifier for time, serif, brushscriptstd, and californian fb
- */
- case 'times':
- case 'serif':
- case 'brushscriptstd':
- case 'californian fb':
- $modifier = .92;
- break;
- /*
- * 1.23 modifier for broadway
- */
- case 'broadway':
- $modifier = 1.23;
- break;
- }
- $textWidth = $count * $fontSize;
- return (int) ceil($textWidth * $modifier);
- }
- }
|