phpmyadmin/libraries/classes/Font.php
Maurício Meneghini Fauth b9c0463d96 Use short array syntax instead of long array syntax
Replaces array() with [].

Signed-off-by: Maurício Meneghini Fauth <mauriciofauth@gmail.com>
2018-05-30 01:42:21 -03:00

149 lines
4.2 KiB
PHP

<?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 = $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);
}
}