ImgURL Pro容器部署
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
5.5 KiB

2 years ago
<?php
/**
* Class with Font related methods.
*/
declare(strict_types=1);
namespace PhpMyAdmin;
use function ceil;
use function is_array;
use function mb_strlen;
use function mb_strtolower;
use function preg_replace;
use function str_replace;
/**
* Class with Font related methods.
*/
class Font
{
/**
* Get list with characters and the corresponding width modifiers.
*
* @return array with characters and corresponding width modifier
*/
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 int $fontSize size of font
* @param array|null $charLists list of characters and their width modifiers
*
* @return int width of the text
*/
public function getStringWidth(
string $text,
string $font,
int $fontSize,
?array $charLists = null
): int {
if (
! isset($charLists[0]['chars'], $charLists[0]['modifier']) || empty($charLists)
|| ! is_array($charLists[0]['chars'])
) {
$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((string) 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);
}
}