190 lines
4.8 KiB
PHP
190 lines
4.8 KiB
PHP
<?php
|
|
/**
|
|
* @package php-font-lib
|
|
* @link https://github.com/PhenX/php-font-lib
|
|
* @author Fabien Ménager <fabien.menager@gmail.com>
|
|
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
|
|
*/
|
|
|
|
require_once dirname(__FILE__) . "/Font_Table_name_Record.php";
|
|
|
|
/**
|
|
* `name` font table.
|
|
*
|
|
* @package php-font-lib
|
|
*/
|
|
class Font_Table_name extends Font_Table {
|
|
private static $header_format = array(
|
|
"format" => self::uint16,
|
|
"count" => self::uint16,
|
|
"stringOffset" => self::uint16,
|
|
);
|
|
|
|
const NAME_COPYRIGHT = 0;
|
|
const NAME_NAME = 1;
|
|
const NAME_SUBFAMILY = 2;
|
|
const NAME_SUBFAMILY_ID = 3;
|
|
const NAME_FULL_NAME = 4;
|
|
const NAME_VERSION = 5;
|
|
const NAME_POSTSCRIPT_NAME = 6;
|
|
const NAME_TRADEMARK = 7;
|
|
const NAME_MANUFACTURER = 8;
|
|
const NAME_DESIGNER = 9;
|
|
const NAME_DESCRIPTION = 10;
|
|
const NAME_VENDOR_URL = 11;
|
|
const NAME_DESIGNER_URL = 12;
|
|
const NAME_LICENSE = 13;
|
|
const NAME_LICENSE_URL = 14;
|
|
const NAME_PREFERRE_FAMILY = 16;
|
|
const NAME_PREFERRE_SUBFAMILY = 17;
|
|
const NAME_COMPAT_FULL_NAME = 18;
|
|
const NAME_SAMPLE_TEXT = 19;
|
|
|
|
static $nameIdCodes = array(
|
|
0 => "Copyright",
|
|
1 => "FontName",
|
|
2 => "FontSubfamily",
|
|
3 => "UniqueID",
|
|
4 => "FullName",
|
|
5 => "Version",
|
|
6 => "PostScriptName",
|
|
7 => "Trademark",
|
|
8 => "Manufacturer",
|
|
9 => "Designer",
|
|
10 => "Description",
|
|
11 => "FontVendorURL",
|
|
12 => "FontDesignerURL",
|
|
13 => "LicenseDescription",
|
|
14 => "LicenseURL",
|
|
// 15
|
|
16 => "PreferredFamily",
|
|
17 => "PreferredSubfamily",
|
|
18 => "CompatibleFullName",
|
|
19 => "SampleText",
|
|
);
|
|
|
|
static $platforms = array(
|
|
0 => "Unicode",
|
|
1 => "Macintosh",
|
|
// 2 => Reserved
|
|
3 => "Microsoft",
|
|
);
|
|
|
|
static $plaformSpecific = array(
|
|
// Unicode
|
|
0 => array(
|
|
0 => "Default semantics",
|
|
1 => "Version 1.1 semantics",
|
|
2 => "ISO 10646 1993 semantics (deprecated)",
|
|
3 => "Unicode 2.0 or later semantics",
|
|
),
|
|
|
|
// Macintosh
|
|
1 => array(
|
|
0 => "Roman",
|
|
1 => "Japanese",
|
|
2 => "Traditional Chinese",
|
|
3 => "Korean",
|
|
4 => "Arabic",
|
|
5 => "Hebrew",
|
|
6 => "Greek",
|
|
7 => "Russian",
|
|
8 => "RSymbol",
|
|
9 => "Devanagari",
|
|
10 => "Gurmukhi",
|
|
11 => "Gujarati",
|
|
12 => "Oriya",
|
|
13 => "Bengali",
|
|
14 => "Tamil",
|
|
15 => "Telugu",
|
|
16 => "Kannada",
|
|
17 => "Malayalam",
|
|
18 => "Sinhalese",
|
|
19 => "Burmese",
|
|
20 => "Khmer",
|
|
21 => "Thai",
|
|
22 => "Laotian",
|
|
23 => "Georgian",
|
|
24 => "Armenian",
|
|
25 => "Simplified Chinese",
|
|
26 => "Tibetan",
|
|
27 => "Mongolian",
|
|
28 => "Geez",
|
|
29 => "Slavic",
|
|
30 => "Vietnamese",
|
|
31 => "Sindhi",
|
|
),
|
|
|
|
// Microsoft
|
|
3 => array(
|
|
0 => "Symbol",
|
|
1 => "Unicode BMP (UCS-2)",
|
|
2 => "ShiftJIS",
|
|
3 => "PRC",
|
|
4 => "Big5",
|
|
5 => "Wansung",
|
|
6 => "Johab",
|
|
// 7 => Reserved
|
|
// 8 => Reserved
|
|
// 9 => Reserved
|
|
10 => "Unicode UCS-4",
|
|
),
|
|
);
|
|
|
|
protected function _parse(){
|
|
$font = $this->getFont();
|
|
|
|
$tableOffset = $font->pos();
|
|
|
|
$data = $font->unpack(self::$header_format);
|
|
|
|
$records = array();
|
|
for($i = 0; $i < $data["count"]; $i++) {
|
|
$record = new Font_Table_name_Record();
|
|
$record_data = $font->unpack(Font_Table_name_Record::$format);
|
|
$record->map($record_data);
|
|
|
|
$records[] = $record;
|
|
}
|
|
|
|
$names = array();
|
|
foreach($records as $record) {
|
|
$font->seek($tableOffset + $data["stringOffset"] + $record->offset);
|
|
$s = $font->read($record->length);
|
|
$record->string = Font::UTF16ToUTF8($s);
|
|
$names[$record->nameID] = $record;
|
|
}
|
|
|
|
$data["records"] = $names;
|
|
|
|
$this->data = $data;
|
|
}
|
|
|
|
protected function _encode(){
|
|
$font = $this->getFont();
|
|
|
|
/** @var Font_Table_name_Record[] $records */
|
|
$records = $this->data["records"];
|
|
$count_records = count($records);
|
|
|
|
$this->data["count"] = $count_records;
|
|
$this->data["stringOffset"] = 6 + $count_records * 12; // 6 => uint16 * 3, 12 => sizeof self::$record_format
|
|
|
|
$length = $font->pack(self::$header_format, $this->data);
|
|
|
|
$offset = 0;
|
|
foreach($records as $record) {
|
|
$record->length = mb_strlen($record->getUTF16(), "8bit");
|
|
$record->offset = $offset;
|
|
$offset += $record->length;
|
|
$length += $font->pack(Font_Table_name_Record::$format, (array)$record);
|
|
}
|
|
|
|
foreach($records as $record) {
|
|
$str = $record->getUTF16();
|
|
$length += $font->write($str, mb_strlen($str, "8bit"));
|
|
}
|
|
|
|
return $length;
|
|
}
|
|
} |