Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN)
$bytes[] = ($o - 0xC0) << 0x06;
$numbytes = 2;
} elseif (($o >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN)
$bytes[] = ($o - 0xE0) << 0x0C;
$numbytes = 3;
} elseif (($o >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN)
$bytes[] = ($o - 0xF0) << 0x12;
$numbytes = 4;
} else {
$ord = false;
break;
}
} elseif (($o >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN
$bytes[] = $o - 0x80;
if (\count($bytes) === $numbytes) {
// compose UTF-8 bytes to a single unicode value
$o = $bytes[0];
for ($j = 1; $j < $numbytes; $j++) {
$o += ($bytes[$j] << (($numbytes - $j - 1) * 0x06));
}
if ((($o >= 0xD800) and ($o <= 0xDFFF)) or ($o >= 0x10FFFF)) {
// The definition of UTF-8 prohibits encoding character numbers between
// U+D800 and U+DFFF, which are reserved for use with the UTF-16
// encoding form (as surrogate pairs) and do not directly represent
// characters.
return false;
} else {
$ord = $o; // add char to array
}
// reset data for next char
$bytes = [];
$numbytes = 1;
}
} else {
$ord = false;
break;
}
}
return $ord;
}
function getTable() {
$this->parseTableEntries();
return $this->directory;
}
function setTableOffset($offset) {
$this->tableOffset = $offset;
}
function parse() {
$this->parseTableEntries();
$this->data = array();
foreach ($this->directory as $tag => $table) {
if (empty($this->data[$tag])) {
$this->readTable($tag);
}
}
}
function utf8toUnicode($str) {
$len = mb_strlen($str, '8bit');
$out = array();
for ($i = 0; $i < $len; $i++) {
$uni = -1;
$h = ord($str[$i]);
if ($h <= 0x7F) {
$uni = $h;
}
elseif ($h >= 0xC2) {
if (($h <= 0xDF) && ($i < $len - 1)) {
$uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F);
}
elseif (($h <= 0xEF) && ($i < $len - 2)) {
$uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F);
}
elseif (($h <= 0xF4) && ($i < $len - 3)) {
$uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F);
}
}
if ($uni >= 0) {
$out[] = $uni;
}
}
return $out;
}
function getUnicodeCharMap() {
$subtable = null;
foreach ($this->getData("cmap", "subtables") as $_subtable) {
if ($_subtable["platformID"] == 0 || ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1)) {
$subtable = $_subtable;
break;
}
}
if ($subtable) {
return $subtable["glyphIndexArray"];
}
$system_encodings = mb_list_encodings();
$system_encodings = array_change_key_case(array_fill_keys($system_encodings, true), CASE_UPPER);
foreach ($this->getData("cmap", "subtables") as $_subtable) {
$encoding = null;
switch ($_subtable["platformID"]) {
case 3:
switch ($_subtable["platformSpecificID"]) {
case 2:
if (\array_key_exists("SJIS", $system_encodings)) {
$encoding = "SJIS";
}
break;
case 3:
if (\array_key_exists("GB18030", $system_encodings)) {
$encoding = "GB18030";
}
break;
case 4:
if (\array_key_exists("BIG-5", $system_encodings)) {
$encoding = "BIG-5";
}
break;
case 5:
if (\array_key_exists("UHC", $system_encodings)) {
$encoding = "UHC";
}
break;
}
break;
}
if ($encoding) {
$glyphIndexArray = array();
foreach ($_subtable["glyphIndexArray"] as $c => $gid) {
$str = trim(pack("N", $c));
if (\strlen($str) > 0) {
$ord = $this->uniord($str, $encoding);
if ($ord > 0) {
$glyphIndexArray[$ord] = $gid;
}
}
}
return $glyphIndexArray;
}
}
return null;
}
function setSubset($subset) {
if (!is_array($subset)) {
$subset = $this->utf8toUnicode($subset);
}
$subset = array_unique($subset);
$glyphIndexArray = $this->getUnicodeCharMap();
if (!$glyphIndexArray) {
return;
}
$gids = array(
0, // .notdef
1, // .null
);
foreach ($subset as $code) {
if (!isset($glyphIndexArray[$code])) {
continue;
}
$gid = $glyphIndexArray[$code];
$gids[$gid] = $gid;
}
/** @var glyf $glyf */
$glyf = $this->getTableObject("glyf");
if ($glyf) {
$gids = $glyf->getGlyphIDs($gids);
sort($gids);
$this->glyph_subset = $gids;
}
$this->glyph_all = array_values($glyphIndexArray); // FIXME
}
function getSubset() {
if (empty($this->glyph_subset)) {
return $this->glyph_all;
}
return $this->glyph_subset;
}
function encode($tags = array()) {
if (!self::$raw) {
$tags = array_merge(array("head", "hhea", "cmap", "hmtx", "maxp", "glyf", "loca", "name", "post", "cvt ", "fpgm", "prep"), $tags);
}
else {
$tags = array_keys($this->directory);
}
$n = 16; // @todo
Font::d("Tables : " . implode(", ", $tags));
/** @var DirectoryEntry[] $entries */
$entries = array();
foreach ($tags as $tag) {
if (!isset($this->directory[$tag])) {
Font::d(" >> '$tag' table doesn't exist");
continue;
}
$entries[$tag] = $this->directory[$tag];
}
$num_tables = count($entries);
$exponent = floor(log($num_tables, 2));
$power_of_two = pow(2, $exponent);
$this->header->data["numTables"] = $num_tables;
$this->header->data["searchRange"] = $power_of_two * 16;
$this->header->data["entrySelector"] = log($power_of_two, 2);
$this->header->data["rangeShift"] = $num_tables * 16 - $this->header->data["searchRange"];
$this->header->encode();
$directory_offset = $this->pos();
$offset = $directory_offset + $num_tables * $n;
$this->seek($offset);
$i = 0;
foreach ($entries as $entry) {
$entry->encode($directory_offset + $i * $n);
$i++;
}
}
function parseHeader() {
if (!empty($this->header)) {
return;
}
$this->seek($this->tableOffset);
$this->header = new Header($this);
$this->header->parse();
}
function getFontType(){
$class_parts = explode("\\", get_class($this));
return $class_parts[1];
}
function parseTableEntries() {
$this->parseHeader();
if (!empty($this->directory)) {
return;
}
if (empty($this->header->data["numTables"])) {
return;
}
$type = $this->getFontType();
$class = "FontLib\\$type\\TableDirectoryEntry";
for ($i = 0; $i < $this->header->data["numTables"]; $i++) {
/** @var TableDirectoryEntry $entry */
$entry = new $class($this);
$entry->parse();
$this->directory[$entry->tag] = $entry;
}
}
function normalizeFUnit($value, $base = 1000) {
return round($value * ($base / $this->getData("head", "unitsPerEm")));
}
protected function readTable($tag) {
$this->parseTableEntries();
if (!self::$raw) {
$name_canon = preg_replace("/[^a-z0-9]/", "", strtolower($tag));
$class = "FontLib\\Table\\Type\\$name_canon";
if (!isset($this->directory[$tag]) || !@class_exists($class)) {
return;
}
}
else {
$class = "FontLib\\Table\\Table";
}
/** @var Table $table */
$table = new $class($this->directory[$tag]);
$table->parse();
$this->data[$tag] = $table;
}
/**
* @param $name
*
* @return Table
*/
public function getTableObject($name) {
if (\array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return null;
}
public function setTableObject($name, Table $data) {
$this->data[$name] = $data;
}
public function getData($name, $key = null) {
$this->parseTableEntries();
if (empty($this->data[$name])) {
$this->readTable($name);
}
if (!isset($this->data[$name])) {
return null;
}
if (!$key) {
return $this->data[$name]->data;
}
else {
return $this->data[$name]->data[$key];
}
}
function addDirectoryEntry(DirectoryEntry $entry) {
$this->directory[$entry->tag] = $entry;
}
function saveAdobeFontMetrics($file, $encoding = null) {
$afm = new AdobeFontMetrics($this);
$afm->write($file, $encoding);
}
/**
* Get a specific name table string value from its ID
*
* @param int $nameID The name ID
*
* @return string|null
*/
function getNameTableString($nameID) {
/** @var nameRecord[] $records */
$records = $this->getData("name", "records");
if (!isset($records[$nameID])) {
return null;
}
return $records[$nameID]->string;
}
/**
* Get font copyright
*
* @return string|null
*/
function getFontCopyright() {
return $this->getNameTableString(name::NAME_COPYRIGHT);
}
/**
* Get font name
*
* @return string|null
*/
function getFontName() {
return $this->getNameTableString(name::NAME_NAME);
}
/**
* Get font subfamily
*
* @return string|null
*/
function getFontSubfamily() {
return $this->getNameTableString(name::NAME_SUBFAMILY);
}
/**
* Get font subfamily ID
*
* @return string|null
*/
function getFontSubfamilyID() {
return $this->getNameTableString(name::NAME_SUBFAMILY_ID);
}
/**
* Get font full name
*
* @return string|null
*/
function getFontFullName() {
return $this->getNameTableString(name::NAME_FULL_NAME);
}
/**
* Get font version
*
* @return string|null
*/
function getFontVersion() {
return $this->getNameTableString(name::NAME_VERSION);
}
/**
* Get font weight
*
* @return string|null
*/
function getFontWeight() {
return $this->getTableObject("OS/2")->data["usWeightClass"];
}
/**
* Get font Postscript name
*
* @return string|null
*/
function getFontPostscriptName() {
return $this->getNameTableString(name::NAME_POSTSCRIPT_NAME);
}
function reduce() {
$names_to_keep = array(
name::NAME_COPYRIGHT,
name::NAME_NAME,
name::NAME_SUBFAMILY,
name::NAME_SUBFAMILY_ID,
name::NAME_FULL_NAME,
name::NAME_VERSION,
name::NAME_POSTSCRIPT_NAME,
);
foreach ($this->data["name"]->data["records"] as $id => $rec) {
if (!in_array($id, $names_to_keep)) {
unset($this->data["name"]->data["records"][$id]);
}
}
}
}