diff -Nru php-font-lib-0.2.2+dfsg/classes/Adobe_Font_Metrics.php php-font-lib-0.3.1+dfsg/classes/Adobe_Font_Metrics.php
--- php-font-lib-0.2.2+dfsg/classes/Adobe_Font_Metrics.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Adobe_Font_Metrics.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,202 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Encoding_Map.php";
-
-/**
- * Adobe Font Metrics file creation utility class.
- *
- * @package php-font-lib
- */
-class Adobe_Font_Metrics {
- private $f;
-
- /**
- * @var Font_TrueType
- */
- private $font;
-
- function __construct(Font_TrueType $font) {
- $this->font = $font;
- }
-
- function write($file, $encoding = null){
- $map_data = array();
-
- if ($encoding) {
- $encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding);
- $map_file = dirname(__FILE__)."/../maps/$encoding.map";
- if (!file_exists($map_file)) {
- throw new Exception("Unkown encoding ($encoding)");
- }
-
- $map = new Encoding_Map($map_file);
- $map_data = $map->parse();
- }
-
- $this->f = fopen($file, "w+");
-
- $font = $this->font;
-
- $this->startSection("FontMetrics", 4.1);
- $this->addPair("Notice", "Converted by PHP-font-lib");
- $this->addPair("Comment", "https://github.com/PhenX/php-font-lib");
-
- $encoding_scheme = ($encoding ? $encoding : "FontSpecific");
- $this->addPair("EncodingScheme", $encoding_scheme);
-
- $records = $font->getData("name", "records");
- foreach($records as $id => $record) {
- if (!isset(Font_Table_name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) {
- continue;
- }
-
- $this->addPair(Font_Table_name::$nameIdCodes[$id], $record->string);
- }
-
- $os2 = $font->getData("OS/2");
- $this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium"));
-
- $post = $font->getData("post");
- $this->addPair("ItalicAngle", $post["italicAngle"]);
- $this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false"));
- $this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"]));
- $this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"]));
-
- $hhea = $font->getData("hhea");
-
- if (isset($hhea["ascent"])) {
- $this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"]));
- $this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"]));
- $this->addPair("Descender", $font->normalizeFUnit($hhea["descent"]));
- }
- else {
- $this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"]));
- $this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"]));
- $this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"])));
- }
-
- $head = $font->getData("head");
- $this->addArray("FontBBox", array(
- $font->normalizeFUnit($head["xMin"]),
- $font->normalizeFUnit($head["yMin"]),
- $font->normalizeFUnit($head["xMax"]),
- $font->normalizeFUnit($head["yMax"]),
- ));
-
- $glyphIndexArray = $font->getUnicodeCharMap();
-
- if ($glyphIndexArray) {
- $hmtx = $font->getData("hmtx");
- $names = $font->getData("post", "names");
-
- $this->startSection("CharMetrics", count($hmtx));
-
- if ($encoding) {
- foreach($map_data as $code => $value) {
- list($c, $name) = $value;
-
- if (!isset($glyphIndexArray[$c])) continue;
-
- $g = $glyphIndexArray[$c];
-
- if (!isset($hmtx[$g])) {
- $hmtx[$g] = $hmtx[0];
- }
-
- $this->addMetric(array(
- "C" => ($code > 255 ? -1 : $code),
- "WX" => $font->normalizeFUnit($hmtx[$g][0]),
- "N" => $name,
- ));
- }
- }
- else {
- foreach($glyphIndexArray as $c => $g) {
- if (!isset($hmtx[$g])) {
- $hmtx[$g] = $hmtx[0];
- }
-
- $this->addMetric(array(
- "U" => $c,
- "WX" => $font->normalizeFUnit($hmtx[$g][0]),
- "N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)),
- "G" => $g,
- ));
- }
- }
-
- $this->endSection("CharMetrics");
-
- $kern = $font->getData("kern", "subtable");
- $tree = $kern["tree"];
-
- if (!$encoding && is_array($tree)) {
- $this->startSection("KernData");
- $this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree));
-
- foreach($tree as $left => $values) {
- if (!is_array($values)) continue;
- if (!isset($glyphIndexArray[$left])) continue;
-
- $left_gid = $glyphIndexArray[$left];
-
- if (!isset($names[$left_gid])) continue;
-
- $left_name = $names[$left_gid];
-
- $this->addLine("");
-
- foreach($values as $right => $value) {
- if (!isset($glyphIndexArray[$right])) continue;
-
- $right_gid = $glyphIndexArray[$right];
-
- if (!isset($names[$right_gid])) continue;
-
- $right_name = $names[$right_gid];
- $this->addPair("KPX", "$left_name $right_name $value");
- }
- }
-
- $this->endSection("KernPairs");
- $this->endSection("KernData");
- }
- }
-
- $this->endSection("FontMetrics");
- }
-
- function addLine($line) {
- fwrite($this->f, "$line\n");
- }
-
- function addPair($key, $value) {
- $this->addLine("$key $value");
- }
-
- function addArray($key, $array) {
- $this->addLine("$key ".implode(" ", $array));
- }
-
- function addMetric($data) {
- $array = array();
- foreach($data as $key => $value) {
- $array[] = "$key $value";
- }
- $this->addLine(implode(" ; ", $array));
- }
-
- function startSection($name, $value = "") {
- $this->addLine("Start$name $value");
- }
-
- function endSection($name) {
- $this->addLine("End$name");
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Encoding_Map.php php-font-lib-0.3.1+dfsg/classes/Encoding_Map.php
--- php-font-lib-0.2.2+dfsg/classes/Encoding_Map.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Encoding_Map.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Encoding map used to map a code point to a Unicode char.
- *
- * @package php-font-lib
- */
-class Encoding_Map {
- private $f;
-
- function __construct($file) {
- $this->f = fopen($file, "r");
- }
-
- function parse(){
- $map = array();
-
- while($line = fgets($this->f)) {
- if (preg_match("/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/", $line, $matches)) {
- $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]);
- $map[hexdec($matches[1])] = array($unicode, $matches[4]);
- }
- }
-
- ksort($map);
-
- return $map;
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Binary_Stream.php php-font-lib-0.3.1+dfsg/classes/Font_Binary_Stream.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Binary_Stream.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Binary_Stream.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,364 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Generic font file binary stream.
- *
- * @package php-font-lib
- */
-class Font_Binary_Stream {
- /**
- * @var resource The file pointer
- */
- protected $f;
-
- const uint8 = 1;
- const int8 = 2;
- const uint16 = 3;
- const int16 = 4;
- const uint32 = 5;
- const int32 = 6;
- const shortFrac = 7;
- const Fixed = 8;
- const FWord = 9;
- const uFWord = 10;
- const F2Dot14 = 11;
- const longDateTime = 12;
- const char = 13;
-
- const modeRead = "rb";
- const modeWrite = "wb";
- const modeReadWrite = "rb+";
-
- static function backtrace(){
- var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
- }
-
- /**
- * Open a font file in read mode
- *
- * @param string $filename The file name of the font to open
- *
- * @return bool
- */
- public function load($filename) {
- return $this->open($filename, self::modeRead);
- }
-
- /**
- * Open a font file in a chosen mode
- *
- * @param string $filename The file name of the font to open
- * @param string $mode The opening mode
- *
- * @throws Exception
- * @return bool
- */
- public function open($filename, $mode = self::modeRead) {
- if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) {
- throw new Exception("Unkown file open mode");
- }
-
- $this->f = fopen($filename, $mode);
- return $this->f != false;
- }
-
- /**
- * Close the internal file pointer
- */
- public function close() {
- return fclose($this->f) != false;
- }
-
- /**
- * Change the internal file pointer
- *
- * @param resource $fp
- *
- * @throws Exception
- */
- public function setFile($fp) {
- if (!is_resource($fp)) {
- throw new Exception('$fp is not a valid resource');
- }
-
- $this->f = $fp;
- }
-
- /**
- * Create a temporary file in write mode
- *
- * @param bool $allow_memory Allow in-memory files
- *
- * @return resource the temporary file pointer resource
- */
- public static function getTempFile($allow_memory = true) {
- $f = null;
-
- if ($allow_memory) {
- // PHP 5.1+
- @fopen("php://temp", "rb+");
- }
-
- if (!$f) {
- $f = fopen(tempnam(sys_get_temp_dir(), "fnt"), "rb+");
- }
-
- return $f;
- }
-
- /**
- * Move the internal file pinter to $offset bytes
- *
- * @param int $offset
- *
- * @return bool True if the $offset position exists in the file
- */
- public function seek($offset) {
- return fseek($this->f, $offset, SEEK_SET) == 0;
- }
-
- /**
- * Gives the current position in the file
- *
- * @return int The current position
- */
- public function pos() {
- return ftell($this->f);
- }
-
- public function skip($n) {
- fseek($this->f, $n, SEEK_CUR);
- }
-
- public function read($n) {
- if ($n < 1) {
- return "";
- }
-
- return fread($this->f, $n);
- }
-
- public function write($data, $length = null) {
- if ($data === null || $data === "") {
- return 0;
- }
-
- return fwrite($this->f, $data, $length);
- }
-
- public function readUInt8() {
- return ord($this->read(1));
- }
-
- public function writeUInt8($data) {
- return $this->write(chr($data), 1);
- }
-
- public function readInt8() {
- $v = $this->readUInt8();
-
- if ($v >= 0x80) {
- $v -= 0x100;
- }
-
- return $v;
- }
-
- public function writeInt8($data) {
- if ($data < 0) {
- $data += 0x100;
- }
-
- return $this->writeUInt8($data);
- }
-
- public function readUInt16() {
- $a = unpack("nn", $this->read(2));
- return $a["n"];
- }
-
- public function readUFWord(){
- return $this->readUInt16();
- }
-
- public function writeUInt16($data) {
- return $this->write(pack("n", $data), 2);
- }
-
- public function writeUFWord($data){
- return $this->writeUInt16($data);
- }
-
- public function readInt16() {
- $v = $this->readUInt16();
-
- if ($v >= 0x8000) {
- $v -= 0x10000;
- }
-
- return $v;
- }
-
- public function readFWord(){
- return $this->readInt16();
- }
-
- public function writeInt16($data) {
- if ($data < 0) {
- $data += 0x10000;
- }
-
- return $this->writeUInt16($data);
- }
-
- public function writeFWord($data){
- return $this->writeInt16($data);
- }
-
- public function readUInt32() {
- $a = unpack("NN", $this->read(4));
- return $a["N"];
- }
-
- public function writeUInt32($data) {
- return $this->write(pack("N", $data), 4);
- }
-
- public function readFixed() {
- $d = $this->readInt16();
- $d2 = $this->readUInt16();
- return round($d + $d2 / 0x10000, 4);
- }
-
- public function writeFixed($data) {
- $left = floor($data);
- $right = ($data - $left) * 0x10000;
- return $this->writeInt16($left) + $this->writeUInt16($right);
- }
-
- public function readLongDateTime() {
- $this->readUInt32(); // ignored
- $date = $this->readUInt32() - 2082844800;
-
- return strftime("%Y-%m-%d %H:%M:%S", $date);
- }
-
- public function writeLongDateTime($data) {
- $date = strtotime($data);
- $date += 2082844800;
-
- return $this->writeUInt32(0) + $this->writeUInt32($date);
- }
-
- public function unpack($def) {
- $d = array();
- foreach($def as $name => $type) {
- $d[$name] = $this->r($type);
- }
- return $d;
- }
-
- public function pack($def, $data) {
- $bytes = 0;
- foreach($def as $name => $type) {
- $bytes += $this->w($type, $data[$name]);
- }
- return $bytes;
- }
-
- /**
- * Read a data of type $type in the file from the current position
- *
- * @param mixed $type The data type to read
- *
- * @return mixed The data that was read
- */
- public function r($type) {
- switch($type) {
- case self::uint8: return $this->readUInt8();
- case self::int8: return $this->readInt8();
- case self::uint16: return $this->readUInt16();
- case self::int16: return $this->readInt16();
- case self::uint32: return $this->readUInt32();
- case self::int32: return $this->readUInt32();
- case self::shortFrac: return $this->readFixed();
- case self::Fixed: return $this->readFixed();
- case self::FWord: return $this->readInt16();
- case self::uFWord: return $this->readUInt16();
- case self::F2Dot14: return $this->readInt16();
- case self::longDateTime: return $this->readLongDateTime();
- case self::char: return $this->read(1);
- default:
- if ( is_array($type) ) {
- if ($type[0] == self::char) {
- return $this->read($type[1]);
- }
-
- $ret = array();
- for($i = 0; $i < $type[1]; $i++) {
- $ret[] = $this->r($type[0]);
- }
- return $ret;
- }
-
- return null;
- }
- }
-
- /**
- * Write $data of type $type in the file from the current position
- *
- * @param mixed $type The data type to write
- * @param mixed $data The data to write
- *
- * @return int The number of bytes read
- */
- public function w($type, $data) {
- switch($type) {
- case self::uint8: return $this->writeUInt8($data);
- case self::int8: return $this->writeInt8($data);
- case self::uint16: return $this->writeUInt16($data);
- case self::int16: return $this->writeInt16($data);
- case self::uint32: return $this->writeUInt32($data);
- case self::int32: return $this->writeUInt32($data);
- case self::shortFrac: return $this->writeFixed($data);
- case self::Fixed: return $this->writeFixed($data);
- case self::FWord: return $this->writeInt16($data);
- case self::uFWord: return $this->writeUInt16($data);
- case self::F2Dot14: return $this->writeInt16($data);
- case self::longDateTime: return $this->writeLongDateTime($data);
- case self::char: return $this->write($data, 1);
- default:
- if ( is_array($type) ) {
- if ($type[0] == self::char) {
- return $this->write($data, $type[1]);
- }
-
- $ret = 0;
- for($i = 0; $i < $type[1]; $i++) {
- $ret += $this->w($type[0], $data[$i]);
- }
- return $ret;
- }
-
- return null;
- }
- }
-
- /**
- * Converts a Uint32 value to string
- *
- * @param int $uint32
- *
- * @return string The string
- */
- public function convertUInt32ToStr($uint32) {
- return chr(($uint32 >> 24) & 0xFF).chr(($uint32 >> 16) & 0xFF).chr(($uint32 >> 8) & 0xFF).chr($uint32 & 0xFF);
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/font.cls.php php-font-lib-0.3.1+dfsg/classes/font.cls.php
--- php-font-lib-0.2.2+dfsg/classes/font.cls.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/font.cls.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Header.php";
-
-/**
- * TrueType font file header.
- *
- * @package php-font-lib
- *
- * @property Font_EOT $font
- */
-class Font_EOT_Header extends Font_Header {
- protected $def = array(
- "format" => self::uint32,
- "numTables" => self::uint16,
- "searchRange" => self::uint16,
- "entrySelector" => self::uint16,
- "rangeShift" => self::uint16,
- );
-
- public function parse(){
- $font = $this->font;
-
- $this->data = $font->unpack(array(
- "EOTSize" => self::uint32,
- "FontDataSize" => self::uint32,
- "Version" => self::uint32,
- "Flags" => self::uint32,
- "FontPANOSE" => array(self::uint8, 10),
- "Charset" => self::uint8,
- "Italic" => self::uint8,
- "Weight" => self::uint32,
- "fsType" => self::uint16,
- "MagicNumber" => self::uint16,
- "UnicodeRange1" => self::uint32,
- "UnicodeRange2" => self::uint32,
- "UnicodeRange3" => self::uint32,
- "UnicodeRange4" => self::uint32,
- "CodePageRange1" => self::uint32,
- "CodePageRange2" => self::uint32,
- "CheckSumAdjustment" => self::uint32,
- "Reserved1" => self::uint32,
- "Reserved2" => self::uint32,
- "Reserved3" => self::uint32,
- "Reserved4" => self::uint32,
- ));
-
- $this->data["Padding1"] = $font->readUInt16();
- $this->readString("FamilyName");
-
- $this->data["Padding2"] = $font->readUInt16();
- $this->readString("StyleName");
-
- $this->data["Padding3"] = $font->readUInt16();
- $this->readString("VersionName");
-
- $this->data["Padding4"] = $font->readUInt16();
- $this->readString("FullName");
-
- switch ($this->data["Version"]) {
- default:
- throw new Exception("Unknown EOT version ".$this->data["Version"]);
-
- case 0x00010000:
- // Nothing to do more
- break;
-
- case 0x00020001:
- $this->data["Padding5"] = $font->readUInt16();
- $this->readString("RootString");
- break;
-
- case 0x00020002:
- $this->data["Padding5"] = $font->readUInt16();
- $this->readString("RootString");
-
- $this->data["RootStringCheckSum"] = $font->readUInt32();
- $this->data["EUDCCodePage"] = $font->readUInt32();
-
- $this->data["Padding6"] = $font->readUInt16();
- $this->readString("Signature");
-
- $this->data["EUDCFlags"] = $font->readUInt32();
- $this->data["EUDCFontSize"] = $font->readUInt32();
- break;
- }
-
- if (!empty($this->data["RootString"])) {
- $this->data["RootString"] = explode("\0", $this->data["RootString"]);
- }
- }
-
- private function readString($name) {
- $font = $this->font;
- $size = $font->readUInt16();
-
- $this->data["{$name}Size"] = $size;
- $this->data[$name] = Font::UTF16ToUTF8($font->read($size));
- }
-
- public function encode(){
- //return $this->font->pack($this->def, $this->data);
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_EOT.php php-font-lib-0.3.1+dfsg/classes/Font_EOT.php
--- php-font-lib-0.2.2+dfsg/classes/Font_EOT.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_EOT.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,158 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_TrueType.php";
-require_once dirname(__FILE__) . "/Font_EOT_Header.php";
-
-/**
- * EOT font file.
- *
- * @package php-font-lib
- */
-class Font_EOT extends Font_TrueType {
- const TTEMBED_SUBSET = 0x00000001;
- const TTEMBED_TTCOMPRESSED = 0x00000004;
- const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010;
- const TTMBED_EMBEDEUDC = 0x00000020;
- const TTEMBED_VALIDATIONTESTS = 0x00000040; // Deprecated
- const TTEMBED_WEBOBJECT = 0x00000080;
- const TTEMBED_XORENCRYPTDATA = 0x10000000;
-
- /**
- * @var Font_EOT_Header
- */
- public $header;
-
- function parseHeader(){
- if (!empty($this->header)) {
- return;
- }
-
- $this->header = new Font_EOT_Header($this);
- $this->header->parse();
- }
-
- function parse() {
- $this->parseHeader();
-
- $flags = $this->header->data["Flags"];
-
- if ($flags & self::TTEMBED_TTCOMPRESSED) {
- $mtx_version = $this->readUInt8();
- $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
- $mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
- $mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
-
- /*
- var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2");
-
- $pos = $this->pos();
- $size = $mtx_offset_1 - $pos;
- var_dump("pos: $pos");
- var_dump("size: $size");*/
- }
-
- if ($flags & self::TTEMBED_XORENCRYPTDATA) {
- // Process XOR
- }
-
- // TODO Read font data ...
- }
-
- /**
- * Little endian version of the read method
- */
- public function read($n) {
- if ($n < 1) {
- return "";
- }
-
- $string = fread($this->f, $n);
- $chunks = str_split($string, 2);
- $chunks = array_map("strrev", $chunks);
-
- return implode("", $chunks);
- }
-
- public function readUInt32(){
- $uint32 = parent::readUInt32();
- return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000;
- }
-
- /**
- * Get font copyright
- *
- * @return string|null
- */
- function getFontCopyright(){
- return null;
- }
-
- /**
- * Get font name
- *
- * @return string|null
- */
- function getFontName(){
- return $this->header->data["FamilyName"];
- }
-
- /**
- * Get font subfamily
- *
- * @return string|null
- */
- function getFontSubfamily(){
- return $this->header->data["StyleName"];
- }
-
- /**
- * Get font subfamily ID
- *
- * @return string|null
- */
- function getFontSubfamilyID(){
- return $this->header->data["StyleName"];
- }
-
- /**
- * Get font full name
- *
- * @return string|null
- */
- function getFontFullName(){
- return $this->header->data["FullName"];
- }
-
- /**
- * Get font version
- *
- * @return string|null
- */
- function getFontVersion(){
- return $this->header->data["VersionName"];
- }
-
- /**
- * Get font weight
- *
- * @return string|null
- */
- function getFontWeight(){
- return $this->header->data["Weight"];
- }
-
- /**
- * Get font Postscript name
- *
- * @return string|null
- */
- function getFontPostscriptName(){
- return null;
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Component.php php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Component.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Component.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Component.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,30 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
- */
-
-/**
- * Glyph outline component
- *
- * @package php-font-lib
- */
-class Font_Glyph_Outline_Component {
- public $flags;
- public $glyphIndex;
- public $a, $b, $c, $d, $e, $f;
- public $point_compound;
- public $point_component;
- public $instructions;
-
- function getMatrix(){
- return array(
- $this->a, $this->b,
- $this->c, $this->d,
- $this->e, $this->f,
- );
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Composite.php php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Composite.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Composite.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Composite.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,233 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
- */
-
-require_once dirname(__FILE__) . "/Font_Glyph_Outline_Component.php";
-
-/**
- * Composite glyph outline
- *
- * @package php-font-lib
- */
-class Font_Glyph_Outline_Composite extends Font_Glyph_Outline {
- const ARG_1_AND_2_ARE_WORDS = 0x0001;
- const ARGS_ARE_XY_VALUES = 0x0002;
- const ROUND_XY_TO_GRID = 0x0004;
- const WE_HAVE_A_SCALE = 0x0008;
- const MORE_COMPONENTS = 0x0020;
- const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040;
- const WE_HAVE_A_TWO_BY_TWO = 0x0080;
- const WE_HAVE_INSTRUCTIONS = 0x0100;
- const USE_MY_METRICS = 0x0200;
- const OVERLAP_COMPOUND = 0x0400;
-
- /**
- * @var Font_Glyph_Outline_Component[]
- */
- public $components = array();
-
- function getGlyphIDs(){
- if (empty($this->components)) {
- $this->parseData();
- }
-
- $glyphIDs = array();
- foreach ($this->components as $_component) {
- $glyphIDs[] = $_component->glyphIndex;
-
- $_glyph = $this->table->data[$_component->glyphIndex];
- $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());
- }
-
- return $glyphIDs;
- }
-
- /*function parse() {
- //$this->parseData();
- }*/
-
- function parseData(){
- parent::parseData();
-
- $font = $this->getFont();
-
- do {
- $flags = $font->readUInt16();
- $glyphIndex = $font->readUInt16();
-
- $a = 1.0; $b = 0.0;
- $c = 0.0; $d = 1.0;
- $e = 0.0; $f = 0.0;
-
- $point_compound = null;
- $point_component = null;
-
- $instructions = null;
-
- if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
- if ($flags & self::ARGS_ARE_XY_VALUES) {
- $e = $font->readInt16();
- $f = $font->readInt16();
- }
- else {
- $point_compound = $font->readUInt16();
- $point_component = $font->readUInt16();
- }
- }
- else {
- if ($flags & self::ARGS_ARE_XY_VALUES) {
- $e = $font->readInt8();
- $f = $font->readInt8();
- }
- else {
- $point_compound = $font->readUInt8();
- $point_component = $font->readUInt8();
- }
- }
-
- if ($flags & self::WE_HAVE_A_SCALE) {
- $a = $d = $font->readInt16();
- }
- elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
- $a = $font->readInt16();
- $d = $font->readInt16();
- }
- elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
- $a = $font->readInt16();
- $b = $font->readInt16();
- $c = $font->readInt16();
- $d = $font->readInt16();
- }
-
- //if ($flags & self::WE_HAVE_INSTRUCTIONS) {
- //
- //}
-
- $component = new Font_Glyph_Outline_Component();
- $component->flags = $flags;
- $component->glyphIndex = $glyphIndex;
- $component->a = $a;
- $component->b = $b;
- $component->c = $c;
- $component->d = $d;
- $component->e = $e;
- $component->f = $f;
- $component->point_compound = $point_compound;
- $component->point_component = $point_component;
- $component->instructions = $instructions;
-
- $this->components[] = $component;
-
- } while ($flags & self::MORE_COMPONENTS);
- }
-
- function encode(){
- $font = $this->getFont();
-
- $gids = $font->getSubset();
-
- $size = $font->writeInt16(-1);
- $size += $font->writeFWord($this->xMin);
- $size += $font->writeFWord($this->yMin);
- $size += $font->writeFWord($this->xMax);
- $size += $font->writeFWord($this->yMax);
-
- foreach ($this->components as $_i => $_component) {
- $flags = 0;
- if ($_component->point_component === null && $_component->point_compound === null) {
- $flags |= self::ARGS_ARE_XY_VALUES;
-
- if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) {
- $flags |= self::ARG_1_AND_2_ARE_WORDS;
- }
- }
- elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) {
- $flags |= self::ARG_1_AND_2_ARE_WORDS;
- }
-
- if ($_component->b == 0 && $_component->c == 0) {
- if ($_component->a == $_component->d) {
- if ($_component->a != 1.0) {
- $flags |= self::WE_HAVE_A_SCALE;
- }
- }
- else {
- $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE;
- }
- }
- else {
- $flags |= self::WE_HAVE_A_TWO_BY_TWO;
- }
-
- if ($_i < count($this->components)-1) {
- $flags |= self::MORE_COMPONENTS;
- }
-
- $size += $font->writeUInt16($flags);
-
- $new_gid = array_search($_component->glyphIndex, $gids);
- $size += $font->writeUInt16($new_gid);
-
- if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
- if ($flags & self::ARGS_ARE_XY_VALUES) {
- $size += $font->writeInt16($_component->e);
- $size += $font->writeInt16($_component->f);
- }
- else {
- $size += $font->writeUInt16($_component->point_compound);
- $size += $font->writeUInt16($_component->point_component);
- }
- }
- else {
- if ($flags & self::ARGS_ARE_XY_VALUES) {
- $size += $font->writeInt8($_component->e);
- $size += $font->writeInt8($_component->f);
- }
- else {
- $size += $font->writeUInt8($_component->point_compound);
- $size += $font->writeUInt8($_component->point_component);
- }
- }
-
- if ($flags & self::WE_HAVE_A_SCALE) {
- $size += $font->writeInt16($_component->a);
- }
- elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
- $size += $font->writeInt16($_component->a);
- $size += $font->writeInt16($_component->d);
- }
- elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
- $size += $font->writeInt16($_component->a);
- $size += $font->writeInt16($_component->b);
- $size += $font->writeInt16($_component->c);
- $size += $font->writeInt16($_component->d);
- }
- }
-
- return $size;
- }
-
- public function getSVGContours(){
- $contours = array();
-
- /** @var Font_Table_glyf $glyph_data */
- $glyph_data = $this->getFont()->getTableObject("glyf");
-
- /** @var Font_Glyph_Outline[] $glyphs */
- $glyphs = $glyph_data->data;
-
- foreach ($this->components as $component) {
- $contours[] = array(
- "contours" => $glyphs[$component->glyphIndex]->getSVGContours(),
- "transform" => $component->getMatrix(),
- );
- }
-
- return $contours;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline.php php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,107 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
- */
-
-/**
- * `glyf` font table.
- *
- * @package php-font-lib
- */
-class Font_Glyph_Outline extends Font_Binary_Stream {
- /**
- * @var Font_Table_glyf
- */
- protected $table;
-
- protected $offset;
- protected $size;
-
- // Data
- public $numberOfContours;
- public $xMin;
- public $yMin;
- public $xMax;
- public $yMax;
-
- public $raw;
-
- /**
- * @param Font_Table_glyf $table
- * @param $offset
- * @param $size
- *
- * @return Font_Glyph_Outline
- */
- static function init(Font_Table_glyf $table, $offset, $size) {
- $font = $table->getFont();
- $font->seek($offset);
-
- if ($font->readInt16() > -1) {
- /** @var Font_Glyph_Outline_Simple $glyph */
- $glyph = new Font_Glyph_Outline_Simple($table, $offset, $size);
- }
- else {
- /** @var Font_Glyph_Outline_Composite $glyph */
- $glyph = new Font_Glyph_Outline_Composite($table, $offset, $size);
- }
-
- $glyph->parse();
- return $glyph;
- }
-
- /**
- * @return Font_TrueType
- */
- function getFont() {
- return $this->table->getFont();
- }
-
- function __construct(Font_Table_glyf $table, $offset = null, $size = null) {
- $this->table = $table;
- $this->offset = $offset;
- $this->size = $size;
- }
-
- function parse() {
- $font = $this->getFont();
- $font->seek($this->offset);
-
- if (!$this->size) {
- return;
- }
-
- $this->raw = $font->read($this->size);
- }
-
- function parseData(){
- $font = $this->getFont();
- $font->seek($this->offset);
-
- $this->numberOfContours = $font->readInt16();
- $this->xMin = $font->readFWord();
- $this->yMin = $font->readFWord();
- $this->xMax = $font->readFWord();
- $this->yMax = $font->readFWord();
- }
-
- function encode(){
- $font = $this->getFont();
- return $font->write($this->raw, strlen($this->raw));
- }
-
- function getSVGContours() {
- // Inherit
- }
-
- function getGlyphIDs(){
- return array();
- }
-}
-
-require_once dirname(__FILE__) . "/Font_Glyph_Outline_Simple.php";
-require_once dirname(__FILE__) . "/Font_Glyph_Outline_Composite.php";
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Simple.php php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Simple.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Glyph_Outline_Simple.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Glyph_Outline_Simple.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,332 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
- */
-
-/**
- * `glyf` font table.
- *
- * @package php-font-lib
- */
-class Font_Glyph_Outline_Simple extends Font_Glyph_Outline {
- const ON_CURVE = 0x01;
- const X_SHORT_VECTOR = 0x02;
- const Y_SHORT_VECTOR = 0x04;
- const REPEAT = 0x08;
- const THIS_X_IS_SAME = 0x10;
- const THIS_Y_IS_SAME = 0x20;
-
- public $instructions;
- public $points;
-
- function parseData(){
- parent::parseData();
-
- if (!$this->size) {
- return;
- }
-
- $font = $this->getFont();
-
- $noc = $this->numberOfContours;
-
- if ($noc == 0) {
- return;
- }
-
- $endPtsOfContours = $font->r(array(self::uint16, $noc));
-
- $instructionLength = $font->readUInt16();
- $this->instructions = $font->r(array(self::uint8, $instructionLength));
-
- $count = $endPtsOfContours[$noc-1] + 1;
-
- // Flags
- $flags = array();
- for ($index = 0; $index < $count; $index++) {
- $flags[$index] = $font->readUInt8();
-
- if ($flags[$index] & self::REPEAT) {
- $repeats = $font->readUInt8();
-
- for ($i = 1; $i <= $repeats; $i++) {
- $flags[$index+$i] = $flags[$index];
- }
-
- $index += $repeats;
- }
- }
-
- $points = array();
- foreach ($flags as $i => $flag) {
- $points[$i]["onCurve"] = $flag & self::ON_CURVE;
- $points[$i]["endOfContour"] = in_array($i, $endPtsOfContours);
- }
-
- // X Coords
- $x = 0;
- for($i = 0; $i < $count; $i++) {
- $flag = $flags[$i];
-
- if ($flag & self::THIS_X_IS_SAME) {
- if ($flag & self::X_SHORT_VECTOR) {
- $x += $font->readUInt8();
- }
- }
- else {
- if ($flag & self::X_SHORT_VECTOR) {
- $x -= $font->readUInt8();
- }
- else {
- $x += $font->readInt16();
- }
- }
-
- $points[$i]["x"] = $x;
- }
-
- // Y Coords
- $y = 0;
- for($i = 0; $i < $count; $i++) {
- $flag = $flags[$i];
-
- if ($flag & self::THIS_Y_IS_SAME) {
- if ($flag & self::Y_SHORT_VECTOR) {
- $y += $font->readUInt8();
- }
- }
- else {
- if ($flag & self::Y_SHORT_VECTOR) {
- $y -= $font->readUInt8();
- }
- else {
- $y += $font->readInt16();
- }
- }
-
- $points[$i]["y"] = $y;
- }
-
- $this->points = $points;
- }
-
- public function splitSVGPath($path) {
- preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER);
- return $matches[0];
- }
-
- public function makePoints($path) {
- $path = $this->splitSVGPath($path);
- $l = count($path);
- $i = 0;
-
- $points = array();
-
- while($i < $l) {
- switch($path[$i]) {
- // moveTo
- case "M":
- $points[] = array(
- "onCurve" => true,
- "x" => $path[++$i],
- "y" => $path[++$i],
- "endOfContour" => false,
- );
- break;
-
- // lineTo
- case "L":
- $points[] = array(
- "onCurve" => true,
- "x" => $path[++$i],
- "y" => $path[++$i],
- "endOfContour" => false,
- );
- break;
-
- // quadraticCurveTo
- case "Q":
- $points[] = array(
- "onCurve" => false,
- "x" => $path[++$i],
- "y" => $path[++$i],
- "endOfContour" => false,
- );
- $points[] = array(
- "onCurve" => true,
- "x" => $path[++$i],
- "y" => $path[++$i],
- "endOfContour" => false,
- );
- break;
-
- // closePath
- /** @noinspection PhpMissingBreakStatementInspection */
- case "z":
- $points[count($points)-1]["endOfContour"] = true;
-
- default:
- $i++;
- break;
- }
- }
-
- return $points;
- }
-
- function encode(){
- if (empty($this->points)) {
- return parent::encode();
- }
-
- return $this->size = $this->encodePoints($this->points);
- }
-
- public function encodePoints($points) {
- $endPtsOfContours = array();
- $flags = array();
- $coords_x = array();
- $coords_y = array();
-
- $last_x = 0;
- $last_y = 0;
- $xMin = $yMin = 0xFFFF;
- $xMax = $yMax = -0xFFFF;
- foreach($points as $i => $point) {
- $flag = 0;
- if ($point["onCurve"]) {
- $flag |= self::ON_CURVE;
- }
-
- if ($point["endOfContour"]) {
- $endPtsOfContours[] = $i;
- }
-
- // Simplified, we could do some optimizations
- if ($point["x"] == $last_x) {
- $flag |= self::THIS_X_IS_SAME;
- }
- else {
- $x = intval($point["x"]);
- $xMin = min($x, $xMin);
- $xMax = max($x, $xMax);
- $coords_x[] = $x-$last_x; // int16
- }
-
- // Simplified, we could do some optimizations
- if ($point["y"] == $last_y) {
- $flag |= self::THIS_Y_IS_SAME;
- }
- else {
- $y = intval($point["y"]);
- $yMin = min($y, $yMin);
- $yMax = max($y, $yMax);
- $coords_y[] = $y-$last_y; // int16
- }
-
- $flags[] = $flag;
- $last_x = $point["x"];
- $last_y = $point["y"];
- }
-
- $font = $this->getFont();
-
- $l = 0;
- $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours
- $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin
- $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin
- $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax
- $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax
-
- // Simple glyf
- $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours
- $l += $font->writeUInt16(0); // instructionLength
- $l += $font->w(array(self::uint8, count($flags)), $flags); // flags
- $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates
- $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates
- return $l;
- }
-
- public function getSVGContours($points = null){
- $path = "";
-
- if (!$points) {
- if (empty($this->points)) {
- $this->parseData();
- }
-
- $points = $this->points;
- }
-
- $length = count($points);
- $firstIndex = 0;
- $count = 0;
-
- for($i = 0; $i < $length; $i++) {
- $count++;
-
- if ($points[$i]["endOfContour"]) {
- $path .= $this->getSVGPath($points, $firstIndex, $count);
- $firstIndex = $i + 1;
- $count = 0;
- }
- }
-
- return $path;
- }
-
- protected function getSVGPath($points, $startIndex, $count) {
- $offset = 0;
- $path = "";
-
- while($offset < $count) {
- $point = $points[ $startIndex + $offset %$count ];
- $point_p1 = $points[ $startIndex + ($offset+1)%$count ];
-
- if($offset == 0) {
- $path .= "M{$point['x']},{$point['y']} ";
- }
-
- if ($point["onCurve"]) {
- if ($point_p1["onCurve"]) {
- $path .= "L{$point_p1['x']},{$point_p1['y']} ";
- $offset++;
- }
- else {
- $point_p2 = $points[ $startIndex + ($offset+2)%$count ];
-
- if ($point_p2["onCurve"]){
- $path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} ";
- }
- else {
- $path .= "Q{$point_p1['x']},{$point_p1['y']},".$this->midValue($point_p1['x'], $point_p2['x']).",".$this->midValue($point_p1['y'], $point_p2['y'])." ";
- }
-
- $offset += 2;
- }
- }
- else {
- if ($point_p1["onCurve"]) {
- $path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} ";
- }
- else {
- $path .= "Q{$point['x']},{$point['y']},".$this->midValue($point['x'], $point_p1['x']).",".$this->midValue($point['y'], $point_p1['y'])." ";
- }
-
- $offset++;
- }
- }
-
- $path .= "z ";
-
- return $path;
- }
-
- function midValue($a, $b){
- return $a + ($b - $a)/2;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Header.php php-font-lib-0.3.1+dfsg/classes/Font_Header.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Header.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Header.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,34 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Font header container.
- *
- * @package php-font-lib
- */
-abstract class Font_Header extends Font_Binary_Stream {
- /**
- * @var Font_TrueType
- */
- protected $font;
- protected $def = array();
-
- public $data;
-
- public function __construct(Font_TrueType $font) {
- $this->font = $font;
- }
-
- public function encode(){
- return $this->font->pack($this->def, $this->data);
- }
-
- public function parse(){
- $this->data = $this->font->unpack($this->def);
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_OpenType.php php-font-lib-0.3.1+dfsg/classes/Font_OpenType.php
--- php-font-lib-0.2.2+dfsg/classes/Font_OpenType.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_OpenType.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_TrueType.php";
-require_once dirname(__FILE__) . "/Font_OpenType_Table_Directory_Entry.php";
-
-/**
- * Open Type font, the same as a TrueType one.
- *
- * @package php-font-lib
- */
-class Font_OpenType extends Font_TrueType {
- //
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_OpenType_Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/classes/Font_OpenType_Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/classes/Font_OpenType_Table_Directory_Entry.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_OpenType_Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_TrueType_Table_Directory_Entry.php";
-
-/**
- * Open Type Table directory entry, the same as a TrueType one.
- *
- * @package php-font-lib
- */
-class Font_OpenType_Table_Directory_Entry extends Font_TrueType_Table_Directory_Entry {
-
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font.php php-font-lib-0.3.1+dfsg/classes/Font.php
--- php-font-lib-0.2.2+dfsg/classes/Font.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,75 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Generic font file.
- *
- * @package php-font-lib
- */
-class Font {
- static $debug = false;
-
- /**
- * @param string $file The font file
- * @return Font_TrueType|null $file
- */
- public static function load($file) {
- $header = file_get_contents($file, false, null, null, 4);
- $class = null;
-
- switch($header) {
- case "\x00\x01\x00\x00":
- case "true":
- case "typ1":
- $class = "Font_TrueType"; break;
-
- case "OTTO":
- $class = "Font_OpenType"; break;
-
- case "wOFF":
- $class = "Font_WOFF"; break;
-
- case "ttcf":
- $class = "Font_TrueType_Collection"; break;
-
- // Unknown type or EOT
- default:
- $magicNumber = file_get_contents($file, false, null, 34, 2);
-
- if ($magicNumber === "LP") {
- $class = "Font_EOT";
- }
- }
-
- if ($class) {
- /** @noinspection PhpIncludeInspection */
- require_once dirname(__FILE__)."/$class.php";
-
- /** @var Font_TrueType $obj */
- $obj = new $class;
- $obj->load($file);
-
- return $obj;
- }
-
- return null;
- }
-
- static function d($str) {
- if (!self::$debug) return;
- echo "$str\n";
- }
-
- static function UTF16ToUTF8($str) {
- return mb_convert_encoding($str, "utf-8", "utf-16");
- }
-
- static function UTF8ToUTF16($str) {
- return mb_convert_encoding($str, "utf-16", "utf-8");
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_cmap.php php-font-lib-0.3.1+dfsg/classes/Font_Table_cmap.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_cmap.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_cmap.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,252 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `cmap` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_cmap extends Font_Table {
- private static $header_format = array(
- "version" => self::uint16,
- "numberSubtables" => self::uint16,
- );
-
- private static $subtable_header_format = array(
- "platformID" => self::uint16,
- "platformSpecificID" => self::uint16,
- "offset" => self::uint32,
- );
-
- private static $subtable_v4_format = array(
- "length" => self::uint16,
- "language" => self::uint16,
- "segCountX2" => self::uint16,
- "searchRange" => self::uint16,
- "entrySelector" => self::uint16,
- "rangeShift" => self::uint16,
- );
-
- protected function _parse(){
- $font = $this->getFont();
-
- $cmap_offset = $font->pos();
-
- $data = $font->unpack(self::$header_format);
-
- $subtables = array();
- for($i = 0; $i < $data["numberSubtables"]; $i++){
- $subtables[] = $font->unpack(self::$subtable_header_format);
- }
- $data["subtables"] = $subtables;
-
- foreach($data["subtables"] as $i => &$subtable) {
- $font->seek($cmap_offset + $subtable["offset"]);
-
- $subtable["format"] = $font->readUInt16();
-
- // @todo Only CMAP version 4
- if($subtable["format"] != 4) {
- unset($data["subtables"][$i]);
- $data["numberSubtables"]--;
- continue;
- }
-
- $subtable += $font->unpack(self::$subtable_v4_format);
- $segCount = $subtable["segCountX2"] / 2;
- $subtable["segCount"] = $segCount;
-
- $endCode = $font->r(array(self::uint16, $segCount));
-
- $font->readUInt16(); // reservedPad
-
- $startCode = $font->r(array(self::uint16, $segCount));
- $idDelta = $font->r(array(self::int16, $segCount));
-
- $ro_start = $font->pos();
- $idRangeOffset = $font->r(array(self::uint16, $segCount));
-
- $glyphIndexArray = array();
- for($i = 0; $i < $segCount; $i++) {
- $c1 = $startCode[$i];
- $c2 = $endCode[$i];
- $d = $idDelta[$i];
- $ro = $idRangeOffset[$i];
-
- if($ro > 0)
- $font->seek($subtable["offset"] + 2 * $i + $ro);
-
- for($c = $c1; $c <= $c2; $c++) {
- if ($ro == 0)
- $gid = ($c + $d) & 0xFFFF;
- else {
- $offset = ($c - $c1) * 2 + $ro;
- $offset = $ro_start + 2 * $i + $offset;
-
- $font->seek($offset);
- $gid = $font->readUInt16();
-
- if ($gid != 0)
- $gid = ($gid + $d) & 0xFFFF;
- }
-
- if($gid > 0) {
- $glyphIndexArray[$c] = $gid;
- }
- }
- }
-
- $subtable += array(
- "endCode" => $endCode,
- "startCode" => $startCode,
- "idDelta" => $idDelta,
- "idRangeOffset" => $idRangeOffset,
- "glyphIndexArray" => $glyphIndexArray,
- );
- }
-
- $this->data = $data;
- }
-
- function _encode(){
- $font = $this->getFont();
-
- $subset = $font->getSubset();
- $glyphIndexArray = $font->getUnicodeCharMap();
-
- $newGlyphIndexArray = array();
- foreach ($glyphIndexArray as $code => $gid) {
- $new_gid = array_search($gid, $subset);
- if ($new_gid !== false) {
- $newGlyphIndexArray[$code] = $new_gid;
- }
- }
-
- ksort($newGlyphIndexArray); // Sort by char code
-
- $segments = array();
-
- $i = -1;
- $prevCode = 0xFFFF;
- $prevGid = 0xFFFF;
-
- foreach($newGlyphIndexArray as $code => $gid) {
- if (
- $prevCode + 1 != $code ||
- $prevGid + 1 != $gid
- ) {
- $i++;
- $segments[$i] = array();
- }
-
- $segments[$i][] = array($code, $gid);
-
- $prevCode = $code;
- $prevGid = $gid;
- }
-
- $segments[][] = array(0xFFFF, 0xFFFF);
-
- $startCode = array();
- $endCode = array();
- $idDelta = array();
-
- foreach($segments as $codes){
- $start = reset($codes);
- $end = end($codes);
-
- $startCode[] = $start[0];
- $endCode[] = $end[0];
- $idDelta[] = $start[1] - $start[0];
- }
-
- $segCount = count($startCode);
- $idRangeOffset = array_fill(0, $segCount, 0);
-
- $searchRange = 1;
- $entrySelector = 0;
- while ($searchRange * 2 <= $segCount) {
- $searchRange *= 2;
- $entrySelector++;
- }
- $searchRange *= 2;
- $rangeShift = $segCount * 2 - $searchRange;
-
- $subtables = array(
- array(
- // header
- "platformID" => 3, // Unicode
- "platformSpecificID" => 1,
- "offset" => null,
-
- // subtable
- "format" => 4,
- "length" => null,
- "language" => 0,
- "segCount" => $segCount,
- "segCountX2" => $segCount * 2,
- "searchRange" => $searchRange,
- "entrySelector" => $entrySelector,
- "rangeShift" => $rangeShift,
- "startCode" => $startCode,
- "endCode" => $endCode,
- "idDelta" => $idDelta,
- "idRangeOffset" => $idRangeOffset,
- "glyphIndexArray" => $newGlyphIndexArray,
- )
- );
-
- $data = array(
- "version" => 0,
- "numberSubtables" => count($subtables),
- "subtables" => $subtables,
- );
-
- $length = $font->pack(self::$header_format, $data);
-
- $subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format
- $subtable_headers_offset = $font->pos();
-
- $length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size);
-
- // write subtables data
- foreach($data["subtables"] as $i => $subtable) {
- $length_before = $length;
- $data["subtables"][$i]["offset"] = $length;
-
- $length += $font->writeUInt16($subtable["format"]);
-
- $before_subheader = $font->pos();
- $length += $font->pack(self::$subtable_v4_format, $subtable);
-
- $segCount = $subtable["segCount"];
- $length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]);
- $length += $font->writeUInt16(0); // reservedPad
- $length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]);
- $length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]);
- $length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]);
- $length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"]));
-
- $after_subtable = $font->pos();
-
- $subtable["length"] = $length - $length_before;
- $font->seek($before_subheader);
- $length += $font->pack(self::$subtable_v4_format, $subtable);
-
- $font->seek($after_subtable);
- }
-
- // write subtables headers
- $font->seek($subtable_headers_offset);
- foreach($data["subtables"] as $subtable) {
- $font->pack(self::$subtable_header_format, $subtable);
- }
-
- return $length;
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/classes/Font_Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_Directory_Entry.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,124 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Generic Font table directory entry.
- *
- * @package php-font-lib
- */
-class Font_Table_Directory_Entry extends Font_Binary_Stream {
- /**
- * @var Font_TrueType
- */
- protected $font;
-
- /**
- * @var Font_Table
- */
- protected $font_table;
-
- public $entryLength = 4;
-
- public $tag;
- public $checksum;
- public $offset;
- public $length;
-
- protected $origF;
-
- static function computeChecksum($data){
- $len = strlen($data);
- $mod = $len % 4;
-
- if ($mod) {
- $data = str_pad($data, $len + (4 - $mod), "\0");
- }
-
- $len = strlen($data);
-
- $hi = 0x0000;
- $lo = 0x0000;
-
- for ($i = 0; $i < $len; $i += 4) {
- $hi += (ord($data[$i] ) << 8) + ord($data[$i+1]);
- $lo += (ord($data[$i+2]) << 8) + ord($data[$i+3]);
- $hi += $lo >> 16;
- $lo = $lo & 0xFFFF;
- $hi = $hi & 0xFFFF;
- }
-
- return ($hi << 8) + $lo;
- }
-
- function __construct(Font_TrueType $font) {
- $this->font = $font;
- $this->f = $font->f;
- }
-
- function parse() {
- $this->tag = $this->font->read(4);
- }
-
- function open($filename, $mode = self::modeRead) {
- // void
- }
-
- function setTable(Font_Table $font_table) {
- $this->font_table = $font_table;
- }
-
- function encode($entry_offset){
- Font::d("\n==== $this->tag ====");
- //Font::d("Entry offset = $entry_offset");
-
- $data = $this->font_table;
- $font = $this->font;
-
- $table_offset = $font->pos();
- $this->offset = $table_offset;
- $table_length = $data->encode();
-
- $font->seek($table_offset);
- $table_data = $font->read($table_length);
-
- $font->seek($entry_offset);
-
- $font->write($this->tag, 4);
- $font->writeUInt32(self::computeChecksum($table_data));
- $font->writeUInt32($table_offset);
- $font->writeUInt32($table_length);
-
- Font::d("Bytes written = $table_length");
-
- $font->seek($table_offset + $table_length);
- }
-
- /**
- * @return Font_TrueType
- */
- function getFont() {
- return $this->font;
- }
-
- function startRead() {
- $this->font->seek($this->offset);
- }
-
- function endRead() {
- //
- }
-
- function startWrite() {
- $this->font->seek($this->offset);
- }
-
- function endWrite() {
- //
- }
-}
-
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_glyf.php php-font-lib-0.3.1+dfsg/classes/Font_Table_glyf.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_glyf.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_glyf.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,150 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Glyph_Outline.php";
-
-/**
- * `glyf` font table.
- *
- * @package php-font-lib
- * @property Font_Glyph_Outline[] $data
- */
-class Font_Table_glyf extends Font_Table {
- protected function _parse(){
- $font = $this->getFont();
- $offset = $font->pos();
-
- $loca = $font->getData("loca");
- $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry
-
- $data = array();
-
- foreach($real_loca as $gid => $location) {
- $_offset = $offset + $loca[$gid];
- $_size = $loca[$gid+1] - $loca[$gid];
- $data[$gid] = Font_Glyph_Outline::init($this, $_offset, $_size);
- }
-
- $this->data = $data;
- }
-
- public function getGlyphIDs($gids = array()){
- $glyphIDs = array();
-
- foreach ($gids as $_gid) {
- $_glyph = $this->data[$_gid];
- $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());
- }
-
- return array_unique(array_merge($gids, $glyphIDs));
- }
-
- public function toHTML(){
- $max = 160;
- $font = $this->getFont();
-
- $head = $font->getData("head");
- $head_json = json_encode($head);
-
- $os2 = $font->getData("OS/2");
- $os2_json = json_encode($os2);
-
- $hmtx = $font->getData("hmtx");
- $hmtx_json = json_encode($hmtx);
-
- $names = $font->getData("post", "names");
- $glyphIndexArray = array_flip($font->getUnicodeCharMap());
-
- $width = (abs($head["xMin"]) + $head["xMax"]);
- $height = (abs($head["yMin"]) + $head["yMax"]);
-
- $ratio = 1;
- if ($width > $max || $height > $max) {
- $ratio = max($width, $height) / $max;
- $width = round($width/$ratio);
- $height = round($height/$ratio);
- }
-
- $n = 500;
-
- $s = "
"."Only the first $n simple glyphs are shown (".count($this->data)." total)
-
Simple glyph
- Composite glyph
- Zoom:
-
- ";
-
- foreach($this->data as $g => $glyph) {
- if ($n-- <= 0) {
- break;
- }
-
- $glyph->parseData();
-
- $shape = array(
- "SVGContours" => $glyph->getSVGContours(),
- "xMin" => $glyph->xMin,
- "yMin" => $glyph->yMin,
- "xMax" => $glyph->xMax,
- "yMax" => $glyph->yMax,
- );
- $shape_json = json_encode($shape);
-
- $type = ($glyph instanceof Font_Glyph_Outline_Simple ? "simple" : "composite");
- $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0;
- $name = isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $char);
- $char = $char ? "{$glyphIndexArray[$g]};" : "";
-
- $s .= "
-
$g
-
$char
-
$name
- ";
-
- if ($type == "composite") {
- foreach ($glyph->getGlyphIDs() as $_id) {
- $s .= "
$_id ";
- }
- }
-
- $s .= "
-
-
- ";
- }
-
- return $s;
- }
-
-
- protected function _encode() {
- $font = $this->getFont();
- $subset = $font->getSubset();
- $data = $this->data;
-
- $loca = array();
-
- $length = 0;
- foreach($subset as $gid) {
- $loca[] = $length;
- $length += $data[$gid]->encode();
- }
-
- $loca[] = $length; // dummy loca
- $font->getTableObject("loca")->data = $loca;
-
- return $length;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_head.php php-font-lib-0.3.1+dfsg/classes/Font_Table_head.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_head.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_head.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,42 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `head` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_head extends Font_Table {
- protected $def = array(
- "tableVersion" => self::Fixed,
- "fontRevision" => self::Fixed,
- "checkSumAdjustment" => self::uint32,
- "magicNumber" => self::uint32,
- "flags" => self::uint16,
- "unitsPerEm" => self::uint16,
- "created" => self::longDateTime,
- "modified" => self::longDateTime,
- "xMin" => self::FWord,
- "yMin" => self::FWord,
- "xMax" => self::FWord,
- "yMax" => self::FWord,
- "macStyle" => self::uint16,
- "lowestRecPPEM" => self::uint16,
- "fontDirectionHint" => self::int16,
- "indexToLocFormat" => self::int16,
- "glyphDataFormat" => self::int16,
- );
-
- protected function _parse(){
- parent::_parse();
-
- if($this->data["magicNumber"] != 0x5F0F3CF5) {
- throw new Exception("Incorrect magic number (".dechex($this->data["magicNumber"]).")");
- }
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_hhea.php php-font-lib-0.3.1+dfsg/classes/Font_Table_hhea.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_hhea.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_hhea.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `hhea` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_hhea extends Font_Table {
- protected $def = array(
- "version" => self::Fixed,
- "ascent" => self::FWord,
- "descent" => self::FWord,
- "lineGap" => self::FWord,
- "advanceWidthMax" => self::uFWord,
- "minLeftSideBearing" => self::FWord,
- "minRightSideBearing" => self::FWord,
- "xMaxExtent" => self::FWord,
- "caretSlopeRise" => self::int16,
- "caretSlopeRun" => self::int16,
- "caretOffset" => self::FWord,
- self::int16,
- self::int16,
- self::int16,
- self::int16,
- "metricDataFormat" => self::int16,
- "numOfLongHorMetrics" => self::uint16,
- );
-
- function _encode(){
- $font = $this->getFont();
- $this->data["numOfLongHorMetrics"] = count($font->getSubset());
-
- return parent::_encode();
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_hmtx.php php-font-lib-0.3.1+dfsg/classes/Font_Table_hmtx.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_hmtx.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_hmtx.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,53 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `hmtx` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_hmtx extends Font_Table {
- protected function _parse(){
- $font = $this->getFont();
- $offset = $font->pos();
-
- $numOfLongHorMetrics = $font->getData("hhea", "numOfLongHorMetrics");
- $numGlyphs = $font->getData("maxp", "numGlyphs");
-
- $font->seek($offset);
-
- $data = array();
- for($gid = 0; $gid < $numOfLongHorMetrics; $gid++) {
- $advanceWidth = $font->readUInt16();
- $leftSideBearing = $font->readUInt16();
- $data[$gid] = array($advanceWidth, $leftSideBearing);
- }
-
- if($numOfLongHorMetrics < $numGlyphs){
- $lastWidth = end($data);
- $data = array_pad($data, $numGlyphs, $lastWidth);
- }
-
- $this->data = $data;
- }
-
- protected function _encode() {
- $font = $this->getFont();
- $subset = $font->getSubset();
- $data = $this->data;
-
- $length = 0;
-
- foreach($subset as $gid) {
- $length += $font->writeUInt16($data[$gid][0]);
- $length += $font->writeUInt16($data[$gid][1]);
- }
-
- return $length;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_kern.php php-font-lib-0.3.1+dfsg/classes/Font_Table_kern.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_kern.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_kern.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,72 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `kern` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_kern extends Font_Table {
- protected function _parse(){
- $font = $this->getFont();
-
- $data = $font->unpack(array(
- "version" => self::uint16,
- "nTables" => self::uint16,
-
- // only the first subtable will be parsed
- "subtableVersion" => self::uint16,
- "length" => self::uint16,
- "coverage" => self::uint16,
- ));
-
- $data["format"] = ($data["coverage"] >> 8);
-
- $subtable = array();
-
- switch($data["format"]) {
- case 0:
- $subtable = $font->unpack(array(
- "nPairs" => self::uint16,
- "searchRange" => self::uint16,
- "entrySelector" => self::uint16,
- "rangeShift" => self::uint16,
- ));
-
- $pairs = array();
- $tree = array();
-
- for ($i = 0; $i < $subtable["nPairs"]; $i++) {
- $left = $font->readUInt16();
- $right = $font->readUInt16();
- $value = $font->readInt16();
-
- $pairs[] = array(
- "left" => $left,
- "right" => $right,
- "value" => $value,
- );
-
- $tree[$left][$right] = $value;
- }
-
- //$subtable["pairs"] = $pairs;
- $subtable["tree"] = $tree;
- break;
-
- case 1:
- case 2:
- case 3:
- break;
- }
-
- $data["subtable"] = $subtable;
-
- $this->data = $data;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_loca.php php-font-lib-0.3.1+dfsg/classes/Font_Table_loca.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_loca.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_loca.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,73 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `loca` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_loca extends Font_Table {
- protected function _parse(){
- $font = $this->getFont();
- $offset = $font->pos();
-
- $indexToLocFormat = $font->getData("head", "indexToLocFormat");
- $numGlyphs = $font->getData("maxp", "numGlyphs");
-
- $font->seek($offset);
-
- $data = array();
-
- // 2 bytes
- if ($indexToLocFormat == 0) {
- $d = $font->read(($numGlyphs + 1) * 2);
- $loc = unpack("n*", $d);
-
- for ($i = 0; $i <= $numGlyphs; $i++) {
- $data[] = $loc[$i+1] * 2;
- }
- }
-
- // 4 bytes
- else if ($indexToLocFormat == 1) {
- $d = $font->read(($numGlyphs + 1) * 4);
- $loc = unpack("N*", $d);
-
- for ($i = 0; $i <= $numGlyphs; $i++) {
- $data[] = $loc[$i+1];
- }
- }
-
- $this->data = $data;
- }
-
- function _encode(){
- $font = $this->getFont();
- $data = $this->data;
-
- $indexToLocFormat = $font->getData("head", "indexToLocFormat");
- $numGlyphs = $font->getData("maxp", "numGlyphs");
- $length = 0;
-
- // 2 bytes
- if ($indexToLocFormat == 0) {
- for ($i = 0; $i <= $numGlyphs; $i++) {
- $length += $font->writeUInt16($data[$i] / 2);
- }
- }
-
- // 4 bytes
- else if ($indexToLocFormat == 1) {
- for ($i = 0; $i <= $numGlyphs; $i++) {
- $length += $font->writeUInt32($data[$i]);
- }
- }
-
- return $length;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_maxp.php php-font-lib-0.3.1+dfsg/classes/Font_Table_maxp.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_maxp.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_maxp.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `maxp` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_maxp extends Font_Table {
- protected $def = array(
- "version" => self::Fixed,
- "numGlyphs" => self::uint16,
- "maxPoints" => self::uint16,
- "maxContours" => self::uint16,
- "maxComponentPoints" => self::uint16,
- "maxComponentContours" => self::uint16,
- "maxZones" => self::uint16,
- "maxTwilightPoints" => self::uint16,
- "maxStorage" => self::uint16,
- "maxFunctionDefs" => self::uint16,
- "maxInstructionDefs" => self::uint16,
- "maxStackElements" => self::uint16,
- "maxSizeOfInstructions" => self::uint16,
- "maxComponentElements" => self::uint16,
- "maxComponentDepth" => self::uint16,
- );
-
- function _encode(){
- $font = $this->getFont();
- $this->data["numGlyphs"] = count($font->getSubset());
-
- return parent::_encode();
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_name.php php-font-lib-0.3.1+dfsg/classes/Font_Table_name.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_name.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_name.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,190 +0,0 @@
-
- * @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;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_name_Record.php php-font-lib-0.3.1+dfsg/classes/Font_Table_name_Record.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_name_Record.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_name_Record.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,49 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Font table name record.
- *
- * @package php-font-lib
- */
-class Font_Table_name_Record extends Font_Binary_Stream {
- public $platformID;
- public $platformSpecificID;
- public $languageID;
- public $nameID;
- public $length;
- public $offset;
- public $string;
-
- public static $format = array(
- "platformID" => self::uint16,
- "platformSpecificID" => self::uint16,
- "languageID" => self::uint16,
- "nameID" => self::uint16,
- "length" => self::uint16,
- "offset" => self::uint16,
- );
-
- public function map($data) {
- foreach($data as $key => $value) {
- $this->$key = $value;
- }
- }
-
- public function getUTF8() {
- return $this->string;
- }
-
- public function getUTF16() {
- return Font::UTF8ToUTF16($this->string);
- }
-
- function __toString(){
- return $this->string;
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_os2.php php-font-lib-0.3.1+dfsg/classes/Font_Table_os2.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_os2.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_os2.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,44 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `OS/2` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_os2 extends Font_Table {
- protected $def = array(
- "version" => self::uint16,
- "xAvgCharWidth" => self::int16,
- "usWeightClass" => self::uint16,
- "usWidthClass" => self::uint16,
- "fsType" => self::int16,
- "ySubscriptXSize" => self::int16,
- "ySubscriptYSize" => self::int16,
- "ySubscriptXOffset" => self::int16,
- "ySubscriptYOffset" => self::int16,
- "ySuperscriptXSize" => self::int16,
- "ySuperscriptYSize" => self::int16,
- "ySuperscriptXOffset" => self::int16,
- "ySuperscriptYOffset" => self::int16,
- "yStrikeoutSize" => self::int16,
- "yStrikeoutPosition" => self::int16,
- "sFamilyClass" => self::int16,
- "panose" => array(self::uint8, 10),
- "ulCharRange" => array(self::uint32, 4),
- "achVendID" => array(self::char, 4),
- "fsSelection" => self::uint16,
- "fsFirstCharIndex" => self::uint16,
- "fsLastCharIndex" => self::uint16,
- "typoAscender" => self::int16,
- "typoDescender" => self::int16,
- "typoLineGap" => self::int16,
- "winAscent" => self::int16,
- "winDescent" => self::int16,
- );
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table.php php-font-lib-0.3.1+dfsg/classes/Font_Table.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,87 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * Generic font table.
- *
- * @package php-font-lib
- */
-class Font_Table extends Font_Binary_Stream {
- /**
- * @var Font_Table_Directory_Entry
- */
- protected $entry;
- protected $def = array();
-
- public $data;
-
- final public function __construct(Font_Table_Directory_Entry $entry) {
- $this->entry = $entry;
- $entry->setTable($this);
- }
-
- /**
- * @return Font_TrueType
- */
- public function getFont(){
- return $this->entry->getFont();
- }
-
- protected function _encode(){
- if (empty($this->data)) {
- Font::d(" >> Table is empty");
- return 0;
- }
-
- return $this->getFont()->pack($this->def, $this->data);
- }
-
- protected function _parse(){
- $this->data = $this->getFont()->unpack($this->def);
- }
-
- protected function _parseRaw(){
- $this->data = $this->getFont()->read($this->entry->length);
- }
-
- protected function _encodeRaw(){
- return $this->getFont()->write($this->data, $this->entry->length);
- }
-
- public function toHTML(){
- return "".var_export($this->data, true)."
";
- }
-
- final public function encode(){
- $this->entry->startWrite();
-
- if (false && empty($this->def)) {
- $length = $this->_encodeRaw();
- }
- else {
- $length = $this->_encode();
- }
-
- $this->entry->endWrite();
-
- return $length;
- }
-
- final public function parse(){
- $this->entry->startRead();
-
- if (false && empty($this->def)) {
- $this->_parseRaw();
- }
- else {
- $this->_parse();
- }
-
- $this->entry->endRead();
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_Table_post.php php-font-lib-0.3.1+dfsg/classes/Font_Table_post.php
--- php-font-lib-0.2.2+dfsg/classes/Font_Table_post.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_Table_post.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,141 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-/**
- * `post` font table.
- *
- * @package php-font-lib
- */
-class Font_Table_post extends Font_Table {
- protected $def = array(
- "format" => self::Fixed,
- "italicAngle" => self::Fixed,
- "underlinePosition" => self::FWord,
- "underlineThickness" => self::FWord,
- "isFixedPitch" => self::uint32,
- "minMemType42" => self::uint32,
- "maxMemType42" => self::uint32,
- "minMemType1" => self::uint32,
- "maxMemType1" => self::uint32,
- );
-
- protected function _parse(){
- $font = $this->getFont();
- $data = $font->unpack($this->def);
-
- $names = array();
-
- switch($data["format"]) {
- case 1:
- $names = Font_TrueType::$macCharNames;
- break;
-
- case 2:
- $data["numberOfGlyphs"] = $font->readUInt16();
-
- $glyphNameIndex = array();
- for($i = 0; $i < $data["numberOfGlyphs"]; $i++) {
- $glyphNameIndex[] = $font->readUInt16();
- }
-
- $data["glyphNameIndex"] = $glyphNameIndex;
-
- $namesPascal = array();
- for($i = 0; $i < $data["numberOfGlyphs"]; $i++) {
- $len = $font->readUInt8();
- $namesPascal[] = $font->read($len);
- }
-
- foreach($glyphNameIndex as $g => $index) {
- if ($index < 258) {
- $names[$g] = Font_TrueType::$macCharNames[$index];
- }
- else {
- $names[$g] = $namesPascal[$index - 258];
- }
- }
-
- break;
-
- case 2.5:
- // TODO
- break;
-
- case 3:
- // nothing
- break;
-
- case 4:
- // TODO
- break;
- }
-
- $data["names"] = $names;
-
- $this->data = $data;
- }
-
- function _encode(){
- $font = $this->getFont();
- $data = $this->data;
- $data["format"] = 3;
-
- $length = $font->pack($this->def, $data);
-
- return $length;
-
- /*
- $subset = $font->getSubset();
-
- switch($data["format"]) {
- case 1:
- // nothing to do
- break;
-
- case 2:
- $old_names = $data["names"];
-
- $glyphNameIndex = range(0, count($subset));
-
- $names = array();
- foreach($subset as $gid) {
- $names[] = $data["names"][$data["glyphNameIndex"][$gid]];
- }
-
- $numberOfGlyphs = count($names);
- $length += $font->writeUInt16($numberOfGlyphs);
-
- foreach($glyphNameIndex as $gni) {
- $length += $font->writeUInt16($gni);
- }
-
- //$names = array_slice($names, 257);
- foreach($names as $name) {
- $len = strlen($name);
- $length += $font->writeUInt8($len);
- $length += $font->write($name, $len);
- }
-
- break;
-
- case 2.5:
- // TODO
- break;
-
- case 3:
- // nothing
- break;
-
- case 4:
- // TODO
- break;
- }
-
- return $length;*/
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Collection.php php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Collection.php
--- php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Collection.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Collection.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,94 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Binary_Stream.php";
-require_once dirname(__FILE__) . "/Font_TrueType.php";
-
-/**
- * TrueType collection font file.
- *
- * @package php-font-lib
- */
-class Font_TrueType_Collection extends Font_Binary_Stream implements Iterator, Countable {
- /**
- * Current iterator position.
- *
- * @var integer
- */
- private $position = 0;
-
- protected $collectionOffsets = array();
- protected $collection = array();
- protected $version;
- protected $numFonts;
-
- function parse(){
- if (isset($this->numFonts)) {
- return;
- }
-
- $this->read(4); // tag name
-
- $this->version = $this->readFixed();
- $this->numFonts = $this->readUInt32();
-
- for ($i = 0; $i < $this->numFonts; $i++) {
- $this->collectionOffsets[] = $this->readUInt32();
- }
- }
-
- /**
- * @param int $fontId
- *
- * @throws OutOfBoundsException
- * @return Font_TrueType
- */
- function getFont($fontId) {
- $this->parse();
-
- if (!isset($this->collectionOffsets[$fontId])) {
- throw new OutOfBoundsException();
- }
-
- if (isset($this->collection[$fontId])) {
- return $this->collection[$fontId];
- }
-
- $font = new Font_TrueType();
- $font->f = $this->f;
- $font->setTableOffset($this->collectionOffsets[$fontId]);
-
- return $this->collection[$fontId] = $font;
- }
-
- function current() {
- return $this->getFont($this->position);
- }
-
- function key() {
- return $this->position;
- }
-
- function next() {
- return ++$this->position;
- }
-
- function rewind() {
- $this->position = 0;
- }
-
- function valid() {
- $this->parse();
- return isset($this->collectionOffsets[$this->position]);
- }
-
- function count() {
- $this->parse();
- return $this->numFonts;
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Header.php php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Header.php
--- php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Header.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Header.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,31 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Header.php";
-
-/**
- * TrueType font file header.
- *
- * @package php-font-lib
- */
-class Font_TrueType_Header extends Font_Header {
- protected $def = array(
- "format" => self::uint32,
- "numTables" => self::uint16,
- "searchRange" => self::uint16,
- "entrySelector" => self::uint16,
- "rangeShift" => self::uint16,
- );
-
- public function parse(){
- parent::parse();
-
- $format = $this->data["format"];
- $this->data["formatText"] = $this->convertUInt32ToStr($format);
- }
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_TrueType.php php-font-lib-0.3.1+dfsg/classes/Font_TrueType.php
--- php-font-lib-0.2.2+dfsg/classes/Font_TrueType.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_TrueType.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,460 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-$dir = dirname(__FILE__);
-require_once "$dir/Font_Binary_Stream.php";
-require_once "$dir/Font_TrueType_Table_Directory_Entry.php";
-require_once "$dir/Font_TrueType_Header.php";
-require_once "$dir/Font_Table.php";
-require_once "$dir/Font_Table_name.php";
-require_once "$dir/Adobe_Font_Metrics.php";
-
-/**
- * TrueType font file.
- *
- * @package php-font-lib
- */
-class Font_TrueType extends Font_Binary_Stream {
- /**
- * @var Font_TrueType_Header
- */
- public $header = array();
-
- private $tableOffset = 0; // Used for TTC
-
- private static $raw = false;
-
- protected $directory = array();
- protected $data = array();
-
- protected $glyph_subset = array();
-
- public $glyph_all = array();
-
- static $macCharNames = array(
- ".notdef", ".null", "CR",
- "space", "exclam", "quotedbl", "numbersign",
- "dollar", "percent", "ampersand", "quotesingle",
- "parenleft", "parenright", "asterisk", "plus",
- "comma", "hyphen", "period", "slash",
- "zero", "one", "two", "three",
- "four", "five", "six", "seven",
- "eight", "nine", "colon", "semicolon",
- "less", "equal", "greater", "question",
- "at", "A", "B", "C", "D", "E", "F", "G",
- "H", "I", "J", "K", "L", "M", "N", "O",
- "P", "Q", "R", "S", "T", "U", "V", "W",
- "X", "Y", "Z", "bracketleft",
- "backslash", "bracketright", "asciicircum", "underscore",
- "grave", "a", "b", "c", "d", "e", "f", "g",
- "h", "i", "j", "k", "l", "m", "n", "o",
- "p", "q", "r", "s", "t", "u", "v", "w",
- "x", "y", "z", "braceleft",
- "bar", "braceright", "asciitilde", "Adieresis",
- "Aring", "Ccedilla", "Eacute", "Ntilde",
- "Odieresis", "Udieresis", "aacute", "agrave",
- "acircumflex", "adieresis", "atilde", "aring",
- "ccedilla", "eacute", "egrave", "ecircumflex",
- "edieresis", "iacute", "igrave", "icircumflex",
- "idieresis", "ntilde", "oacute", "ograve",
- "ocircumflex", "odieresis", "otilde", "uacute",
- "ugrave", "ucircumflex", "udieresis", "dagger",
- "degree", "cent", "sterling", "section",
- "bullet", "paragraph", "germandbls", "registered",
- "copyright", "trademark", "acute", "dieresis",
- "notequal", "AE", "Oslash", "infinity",
- "plusminus", "lessequal", "greaterequal", "yen",
- "mu", "partialdiff", "summation", "product",
- "pi", "integral", "ordfeminine", "ordmasculine",
- "Omega", "ae", "oslash", "questiondown",
- "exclamdown", "logicalnot", "radical", "florin",
- "approxequal", "increment", "guillemotleft", "guillemotright",
- "ellipsis", "nbspace", "Agrave", "Atilde",
- "Otilde", "OE", "oe", "endash",
- "emdash", "quotedblleft", "quotedblright", "quoteleft",
- "quoteright", "divide", "lozenge", "ydieresis",
- "Ydieresis", "fraction", "currency", "guilsinglleft",
- "guilsinglright", "fi", "fl", "daggerdbl",
- "periodcentered", "quotesinglbase", "quotedblbase", "perthousand",
- "Acircumflex", "Ecircumflex", "Aacute", "Edieresis",
- "Egrave", "Iacute", "Icircumflex", "Idieresis",
- "Igrave", "Oacute", "Ocircumflex", "applelogo",
- "Ograve", "Uacute", "Ucircumflex", "Ugrave",
- "dotlessi", "circumflex", "tilde", "macron",
- "breve", "dotaccent", "ring", "cedilla",
- "hungarumlaut", "ogonek", "caron", "Lslash",
- "lslash", "Scaron", "scaron", "Zcaron",
- "zcaron", "brokenbar", "Eth", "eth",
- "Yacute", "yacute", "Thorn", "thorn",
- "minus", "multiply", "onesuperior", "twosuperior",
- "threesuperior", "onehalf", "onequarter", "threequarters",
- "franc", "Gbreve", "gbreve", "Idot",
- "Scedilla", "scedilla", "Cacute", "cacute",
- "Ccaron", "ccaron", "dmacron"
- );
-
- 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 = strlen($str);
- $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"];
- }
-
- 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 Font_Table_glyf $glyf */
- $glyf = $this->getTableObject("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"), $tags);
- }
- else {
- $tags = array_keys($this->directory);
- }
-
- $num_tables = count($tags);
- $n = 16;// @todo
-
- Font::d("Tables : ".implode(", ", $tags));
-
- /** @var Font_Table_Directory_Entry[] $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];
- }
-
- $this->header->data["numTables"] = $num_tables;
- $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 Font_TrueType_Header($this);
- $this->header->parse();
- }
-
- function parseTableEntries(){
- $this->parseHeader();
-
- if (!empty($this->directory)) {
- return;
- }
-
- if (empty($this->header->data["numTables"])) {
- return;
- }
-
- $class = get_class($this)."_Table_Directory_Entry";
-
- for($i = 0; $i < $this->header->data["numTables"]; $i++) {
- /** @var Font_Table_Directory_Entry $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_file = dirname(__FILE__)."/Font_Table_$name_canon.php";
-
- if (!isset($this->directory[$tag]) || !file_exists($class_file)) {
- return;
- }
-
- /** @noinspection PhpIncludeInspection */
- require_once $class_file;
- $class = "Font_Table_$name_canon";
- }
- else {
- $class = "Font_Table";
- }
-
- /** @var Font_Table $table */
- $table = new $class($this->directory[$tag]);
- $table->parse();
-
- $this->data[$tag] = $table;
- }
-
- /**
- * @param $name
- *
- * @return Font_Table
- */
- public function getTableObject($name) {
- return $this->data[$name];
- }
-
- public function setTableObject($name, Font_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(Font_Table_Directory_Entry $entry) {
- $this->directory[$entry->tag] = $entry;
- }
-
- function saveAdobeFontMetrics($file, $encoding = null) {
- $afm = new Adobe_Font_Metrics($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 Font_Table_name_Record[] $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(Font_Table_name::NAME_COPYRIGHT);
- }
-
- /**
- * Get font name
- *
- * @return string|null
- */
- function getFontName(){
- return $this->getNameTableString(Font_Table_name::NAME_NAME);
- }
-
- /**
- * Get font subfamily
- *
- * @return string|null
- */
- function getFontSubfamily(){
- return $this->getNameTableString(Font_Table_name::NAME_SUBFAMILY);
- }
-
- /**
- * Get font subfamily ID
- *
- * @return string|null
- */
- function getFontSubfamilyID(){
- return $this->getNameTableString(Font_Table_name::NAME_SUBFAMILY_ID);
- }
-
- /**
- * Get font full name
- *
- * @return string|null
- */
- function getFontFullName(){
- return $this->getNameTableString(Font_Table_name::NAME_FULL_NAME);
- }
-
- /**
- * Get font version
- *
- * @return string|null
- */
- function getFontVersion(){
- return $this->getNameTableString(Font_Table_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(Font_Table_name::NAME_POSTSCRIPT_NAME);
- }
-
- function reduce(){
- $names_to_keep = array(
- Font_Table_name::NAME_COPYRIGHT,
- Font_Table_name::NAME_NAME,
- Font_Table_name::NAME_SUBFAMILY,
- Font_Table_name::NAME_SUBFAMILY_ID,
- Font_Table_name::NAME_FULL_NAME,
- Font_Table_name::NAME_VERSION,
- Font_Table_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]);
- }
- }
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/classes/Font_TrueType_Table_Directory_Entry.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_TrueType_Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,31 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Table_Directory_Entry.php";
-
-/**
- * TrueType table directory entry.
- *
- * @package php-font-lib
- */
-class Font_TrueType_Table_Directory_Entry extends Font_Table_Directory_Entry {
- function __construct(Font_TrueType $font) {
- parent::__construct($font);
- }
-
- function parse(){
- parent::parse();
-
- $font = $this->font;
- $this->checksum = $font->readUInt32();
- $this->offset = $font->readUInt32();
- $this->length = $font->readUInt32();
- $this->entryLength += 12;
- }
-}
-
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_WOFF_Header.php php-font-lib-0.3.1+dfsg/classes/Font_WOFF_Header.php
--- php-font-lib-0.2.2+dfsg/classes/Font_WOFF_Header.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_WOFF_Header.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_TrueType_Header.php";
-
-/**
- * WOFF font file header.
- *
- * @package php-font-lib
- */
-class Font_WOFF_Header extends Font_TrueType_Header {
- protected $def = array(
- "format" => self::uint32,
- "flavor" => self::uint32,
- "length" => self::uint32,
- "numTables" => self::uint16,
- self::uint16,
- "totalSfntSize" => self::uint32,
- "majorVersion" => self::uint16,
- "minorVersion" => self::uint16,
- "metaOffset" => self::uint32,
- "metaLength" => self::uint32,
- "metaOrigLength" => self::uint32,
- "privOffset" => self::uint32,
- "privLength" => self::uint32,
- );
-}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_WOFF.php php-font-lib-0.3.1+dfsg/classes/Font_WOFF.php
--- php-font-lib-0.2.2+dfsg/classes/Font_WOFF.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_WOFF.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,81 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_TrueType.php";
-require_once dirname(__FILE__) . "/Font_WOFF_Table_Directory_Entry.php";
-require_once dirname(__FILE__) . "/Font_WOFF_Header.php";
-
-/**
- * WOFF font file.
- *
- * @package php-font-lib
- *
- * @property Font_WOFF_Table_Directory_Entry[] $directory
- */
-class Font_WOFF extends Font_TrueType {
- function parseHeader(){
- if (!empty($this->header)) {
- return;
- }
-
- $this->header = new Font_WOFF_Header($this);
- $this->header->parse();
- }
-
- public function load($file) {
- parent::load($file);
-
- $this->parseTableEntries();
- $dataOffset = $this->pos() + count($this->directory) * 20;
-
- $fw = $this->getTempFile(false);
- $fr = $this->f;
-
- $this->f = $fw;
- $offset = $this->header->encode();
-
- foreach($this->directory as $entry) {
- // Read ...
- $this->f = $fr;
- $this->seek($entry->offset);
- $data = $this->read($entry->length);
-
- if ($entry->length < $entry->origLength) {
- $data = gzuncompress($data);
- }
-
- // Prepare data ...
- $length = strlen($data);
- $entry->length = $entry->origLength = $length;
- $entry->offset = $dataOffset;
-
- // Write ...
- $this->f = $fw;
-
- // Woff Entry
- $this->seek($offset);
- $offset += $this->write($entry->tag, 4); // tag
- $offset += $this->writeUInt32($dataOffset); // offset
- $offset += $this->writeUInt32($length); // length
- $offset += $this->writeUInt32($length); // origLength
- $offset += $this->writeUInt32(Font_Table_Directory_Entry::computeChecksum($data)); // checksum
-
- // Data
- $this->seek($dataOffset);
- $dataOffset += $this->write($data, $length);
- }
-
- $this->f = $fw;
- $this->seek(0);
-
- // Need to re-parse this, don't know why
- $this->header = null;
- $this->directory = array();
- $this->parseTableEntries();
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/classes/Font_WOFF_Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/classes/Font_WOFF_Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/classes/Font_WOFF_Table_Directory_Entry.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/classes/Font_WOFF_Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-require_once dirname(__FILE__) . "/Font_Table_Directory_Entry.php";
-
-/**
- * WOFF font file table directory entry.
- *
- * @package php-font-lib
- */
-class Font_WOFF_Table_Directory_Entry extends Font_Table_Directory_Entry {
- public $origLength;
-
- function __construct(Font_WOFF $font) {
- parent::__construct($font);
- }
-
- function parse(){
- parent::parse();
-
- $font = $this->font;
- $this->offset = $font->readUInt32();
- $this->length = $font->readUInt32();
- $this->origLength = $font->readUInt32();
- $this->checksum = $font->readUInt32();
- }
-}
diff -Nru php-font-lib-0.2.2+dfsg/composer.json php-font-lib-0.3.1+dfsg/composer.json
--- php-font-lib-0.2.2+dfsg/composer.json 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/composer.json 2014-03-19 17:15:11.000000000 +0000
@@ -3,7 +3,7 @@
"type": "library",
"description": "A library to read, parse, export and make subsets of different types of font files.",
"homepage": "https://github.com/PhenX/php-font-lib",
- "license": "LGPL",
+ "license": "LGPL-3.0",
"authors": [
{
"name": "Fabien Ménager",
@@ -11,6 +11,8 @@
}
],
"autoload": {
- "classmap": ["classes/"]
+ "psr-0": {
+ "FontLib\\": "src/"
+ }
}
}
diff -Nru php-font-lib-0.2.2+dfsg/debian/changelog php-font-lib-0.3.1+dfsg/debian/changelog
--- php-font-lib-0.2.2+dfsg/debian/changelog 2016-03-28 22:20:41.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/changelog 2016-04-19 19:20:04.000000000 +0000
@@ -1,8 +1,37 @@
-php-font-lib (0.2.2+dfsg-2build1) xenial; urgency=medium
+php-font-lib (0.3.1+dfsg-3) unstable; urgency=medium
- * No-change rebuild against php 7
+ * Rebuild for PHP 7.0 (Closes: #821573)
- -- Nish Aravamudan Mon, 28 Mar 2016 22:20:41 +0000
+ -- Markus Frosch Tue, 19 Apr 2016 21:19:59 +0200
+
+php-font-lib (0.3.1+dfsg-2) unstable; urgency=medium
+
+ [ David Prévot ]
+ * [ee6247d] Revert "Add ownCloud for Debian maintainers as uploader"
+ * [b0f8ba5] Drop now useless patch
+ * [7987d47] Fix watch file
+
+ [ Markus Frosch ]
+ * [517ac98] Adopt package within the PHP team (Closes: #748606)
+ * [91943d7] Update VCS URLs
+ * [26ba56b] Bump standards version to 3.9.7
+
+ -- Markus Frosch Sun, 28 Feb 2016 15:00:21 +0100
+
+php-font-lib (0.3.1+dfsg-1) experimental; urgency=medium
+
+ [ Fabien Ménager ]
+ * Make the project PSR-0 compliant (maybe PSR-1)
+ * Fix a possible XSS
+
+ [ David Prévot ]
+ * Revert “Track 0.2 releases”, and upload to experimental
+ * Adapt installation to new path
+ * Refresh patch
+ * Provide compatibility symlinks
+ * Add upstream changelog
+
+ -- David Prévot Wed, 23 Apr 2014 15:57:21 -0400
php-font-lib (0.2.2+dfsg-2) unstable; urgency=medium
diff -Nru php-font-lib-0.2.2+dfsg/debian/control php-font-lib-0.3.1+dfsg/debian/control
--- php-font-lib-0.2.2+dfsg/debian/control 2016-03-28 22:20:41.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/control 2016-02-28 13:59:08.000000000 +0000
@@ -1,18 +1,17 @@
Source: php-font-lib
Section: php
Priority: optional
-Maintainer: Ubuntu Developers
-XSBC-Original-Maintainer: Debian PHP PEAR Maintainers
-Uploaders: ownCloud for Debian maintainers ,
- David Prévot
-Build-Depends: debhelper (>= 9), pkg-php-tools (>= 1.7~)
-Standards-Version: 3.9.5
+Maintainer: Debian PHP PEAR Maintainers
+Uploaders: Markus Frosch
+Build-Depends: debhelper (>= 9.20131213~), pkg-php-tools (>= 1.14~)
+Standards-Version: 3.9.7
Homepage: https://github.com/PhenX/php-font-lib
-Vcs-Git: git://anonscm.debian.org/pkg-php/php-font-lib.git
-Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-php/php-font-lib.git
+Vcs-Git: https://anonscm.debian.org/git/pkg-php/php-font-lib.git
+Vcs-Browser: https://anonscm.debian.org/cgit/pkg-php/php-font-lib.git/
Package: php-font-lib
Architecture: all
+Pre-Depends: ${misc:Pre-Depends}
Depends: ${misc:Depends}, ${phpcomposer:Debian-require}
Suggests: ${phpcomposer:Debian-suggest}
Description: read, parse, export and make subsets of different fonts
diff -Nru php-font-lib-0.2.2+dfsg/debian/copyright php-font-lib-0.3.1+dfsg/debian/copyright
--- php-font-lib-0.2.2+dfsg/debian/copyright 2014-04-23 19:07:32.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/copyright 2016-02-28 13:40:05.000000000 +0000
@@ -36,6 +36,7 @@
2010, 2011, Richard D. Worth
2010, 2011, Jörn Zaefferer
License: Expat or GPL-2
+Comment: Not currently shipped (only the minified version, stripped away)
License: Expat
Permission is hereby granted, free of charge, to any person obtaining
diff -Nru php-font-lib-0.2.2+dfsg/debian/install php-font-lib-0.3.1+dfsg/debian/install
--- php-font-lib-0.2.2+dfsg/debian/install 2014-04-23 19:07:32.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/install 2016-02-28 13:40:05.000000000 +0000
@@ -1,2 +1,2 @@
-classes usr/share/php/php-font-lib
-maps usr/share/php/php-font-lib
+src/FontLib usr/share/php
+maps usr/share/php
diff -Nru php-font-lib-0.2.2+dfsg/debian/links php-font-lib-0.3.1+dfsg/debian/links
--- php-font-lib-0.2.2+dfsg/debian/links 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/links 2016-02-28 13:40:05.000000000 +0000
@@ -0,0 +1,2 @@
+usr/share/php/FontLib usr/share/php/php-font-lib/classes
+usr/share/php/maps usr/share/php/php-font-lib/maps
diff -Nru php-font-lib-0.2.2+dfsg/debian/maintscript php-font-lib-0.3.1+dfsg/debian/maintscript
--- php-font-lib-0.2.2+dfsg/debian/maintscript 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/maintscript 2016-02-28 13:40:05.000000000 +0000
@@ -0,0 +1,2 @@
+dir_to_symlink /usr/share/php/php-font-lib/classes ../FontLib 0.3.1+dfsg-1~
+dir_to_symlink /usr/share/php/php-font-lib/maps ../maps 0.3.1+dfsg-1~
diff -Nru php-font-lib-0.2.2+dfsg/debian/patches/0001-Require-PHP.patch php-font-lib-0.3.1+dfsg/debian/patches/0001-Require-PHP.patch
--- php-font-lib-0.2.2+dfsg/debian/patches/0001-Require-PHP.patch 2014-04-23 19:06:47.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/patches/0001-Require-PHP.patch 1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-From: =?utf-8?q?David_Pr=C3=A9vot?=
-Date: Wed, 5 Feb 2014 12:42:55 -0400
-Subject: Require PHP
-
----
- composer.json | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/composer.json b/composer.json
-index da86974..fa32f4c 100644
---- a/composer.json
-+++ b/composer.json
-@@ -10,6 +10,9 @@
- "email": "fabien.menager@gmail.com"
- }
- ],
-+ "require": {
-+ "php": "*"
-+ },
- "autoload": {
- "classmap": ["classes/"]
- }
diff -Nru php-font-lib-0.2.2+dfsg/debian/patches/series php-font-lib-0.3.1+dfsg/debian/patches/series
--- php-font-lib-0.2.2+dfsg/debian/patches/series 2014-04-12 13:07:46.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/patches/series 1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-0001-Require-PHP.patch
diff -Nru php-font-lib-0.2.2+dfsg/debian/rules php-font-lib-0.3.1+dfsg/debian/rules
--- php-font-lib-0.2.2+dfsg/debian/rules 2014-04-12 13:07:46.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/rules 2016-02-28 13:40:05.000000000 +0000
@@ -2,5 +2,8 @@
%:
dh $@ --with phpcomposer
+override_dh_installchangelogs:
+ dh_installchangelogs $(CURDIR)/debian/upstream/changelog
+
get-orig-source:
uscan --force --verbose --rename
diff -Nru php-font-lib-0.2.2+dfsg/debian/upstream/changelog php-font-lib-0.3.1+dfsg/debian/upstream/changelog
--- php-font-lib-0.2.2+dfsg/debian/upstream/changelog 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/upstream/changelog 2016-02-28 13:40:05.000000000 +0000
@@ -0,0 +1,22 @@
+Version 0.3.1
+March 19, 2014
+
+Fix a possible XSS
+
+
+Version 0.3
+March 02, 2014
+
+In this release, nothing new except PSR-0 compliance
+
+
+Version 0.2.2
+February 01, 2014
+
+
+Version 0.2.1
+February 23, 2013
+
+
+Version 0.1
+September 23, 2012
diff -Nru php-font-lib-0.2.2+dfsg/debian/watch php-font-lib-0.3.1+dfsg/debian/watch
--- php-font-lib-0.2.2+dfsg/debian/watch 2014-04-23 19:20:15.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/debian/watch 2016-02-28 14:04:22.000000000 +0000
@@ -1,4 +1,4 @@
version=3
-options="dversionmangle=s/\+dfsg//" \
-http://githubredir.debian.net/github/PhenX/php-font-lib/ \
-(0\.2\..+).tar.gz
+options="dversionmangle=s/\+dfsg//,oversionmangle=s/$/+dfsg/" \
+https://github.com/PhenX/php-font-lib/releases/ \
+.*/archive/(.+).tar.gz
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Adobe_Font_Metrics.php php-font-lib-0.3.1+dfsg/src/FontLib/Adobe_Font_Metrics.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Adobe_Font_Metrics.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Adobe_Font_Metrics.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,217 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib;
+
+use FontLib\Table\Type\name;
+use FontLib\TrueType\File;
+
+/**
+ * Adobe Font Metrics file creation utility class.
+ *
+ * @package php-font-lib
+ */
+class Adobe_Font_Metrics {
+ private $f;
+
+ /**
+ * @var File
+ */
+ private $font;
+
+ function __construct(File $font) {
+ $this->font = $font;
+ }
+
+ function write($file, $encoding = null) {
+ $map_data = array();
+
+ if ($encoding) {
+ $encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding);
+ $map_file = dirname(__FILE__) . "/../maps/$encoding.map";
+ if (!file_exists($map_file)) {
+ throw new \Exception("Unkown encoding ($encoding)");
+ }
+
+ $map = new Encoding_Map($map_file);
+ $map_data = $map->parse();
+ }
+
+ $this->f = fopen($file, "w+");
+
+ $font = $this->font;
+
+ $this->startSection("FontMetrics", 4.1);
+ $this->addPair("Notice", "Converted by PHP-font-lib");
+ $this->addPair("Comment", "https://github.com/PhenX/php-font-lib");
+
+ $encoding_scheme = ($encoding ? $encoding : "FontSpecific");
+ $this->addPair("EncodingScheme", $encoding_scheme);
+
+ $records = $font->getData("name", "records");
+ foreach ($records as $id => $record) {
+ if (!isset(name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) {
+ continue;
+ }
+
+ $this->addPair(name::$nameIdCodes[$id], $record->string);
+ }
+
+ $os2 = $font->getData("OS/2");
+ $this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium"));
+
+ $post = $font->getData("post");
+ $this->addPair("ItalicAngle", $post["italicAngle"]);
+ $this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false"));
+ $this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"]));
+ $this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"]));
+
+ $hhea = $font->getData("hhea");
+
+ if (isset($hhea["ascent"])) {
+ $this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"]));
+ $this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"]));
+ $this->addPair("Descender", $font->normalizeFUnit($hhea["descent"]));
+ }
+ else {
+ $this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"]));
+ $this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"]));
+ $this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"])));
+ }
+
+ $head = $font->getData("head");
+ $this->addArray("FontBBox", array(
+ $font->normalizeFUnit($head["xMin"]),
+ $font->normalizeFUnit($head["yMin"]),
+ $font->normalizeFUnit($head["xMax"]),
+ $font->normalizeFUnit($head["yMax"]),
+ ));
+
+ $glyphIndexArray = $font->getUnicodeCharMap();
+
+ if ($glyphIndexArray) {
+ $hmtx = $font->getData("hmtx");
+ $names = $font->getData("post", "names");
+
+ $this->startSection("CharMetrics", count($hmtx));
+
+ if ($encoding) {
+ foreach ($map_data as $code => $value) {
+ list($c, $name) = $value;
+
+ if (!isset($glyphIndexArray[$c])) {
+ continue;
+ }
+
+ $g = $glyphIndexArray[$c];
+
+ if (!isset($hmtx[$g])) {
+ $hmtx[$g] = $hmtx[0];
+ }
+
+ $this->addMetric(array(
+ "C" => ($code > 255 ? -1 : $code),
+ "WX" => $font->normalizeFUnit($hmtx[$g][0]),
+ "N" => $name,
+ ));
+ }
+ }
+ else {
+ foreach ($glyphIndexArray as $c => $g) {
+ if (!isset($hmtx[$g])) {
+ $hmtx[$g] = $hmtx[0];
+ }
+
+ $this->addMetric(array(
+ "U" => $c,
+ "WX" => $font->normalizeFUnit($hmtx[$g][0]),
+ "N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)),
+ "G" => $g,
+ ));
+ }
+ }
+
+ $this->endSection("CharMetrics");
+
+ $kern = $font->getData("kern", "subtable");
+ $tree = $kern["tree"];
+
+ if (!$encoding && is_array($tree)) {
+ $this->startSection("KernData");
+ $this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree));
+
+ foreach ($tree as $left => $values) {
+ if (!is_array($values)) {
+ continue;
+ }
+ if (!isset($glyphIndexArray[$left])) {
+ continue;
+ }
+
+ $left_gid = $glyphIndexArray[$left];
+
+ if (!isset($names[$left_gid])) {
+ continue;
+ }
+
+ $left_name = $names[$left_gid];
+
+ $this->addLine("");
+
+ foreach ($values as $right => $value) {
+ if (!isset($glyphIndexArray[$right])) {
+ continue;
+ }
+
+ $right_gid = $glyphIndexArray[$right];
+
+ if (!isset($names[$right_gid])) {
+ continue;
+ }
+
+ $right_name = $names[$right_gid];
+ $this->addPair("KPX", "$left_name $right_name $value");
+ }
+ }
+
+ $this->endSection("KernPairs");
+ $this->endSection("KernData");
+ }
+ }
+
+ $this->endSection("FontMetrics");
+ }
+
+ function addLine($line) {
+ fwrite($this->f, "$line\n");
+ }
+
+ function addPair($key, $value) {
+ $this->addLine("$key $value");
+ }
+
+ function addArray($key, $array) {
+ $this->addLine("$key " . implode(" ", $array));
+ }
+
+ function addMetric($data) {
+ $array = array();
+ foreach ($data as $key => $value) {
+ $array[] = "$key $value";
+ }
+ $this->addLine(implode(" ; ", $array));
+ }
+
+ function startSection($name, $value = "") {
+ $this->addLine("Start$name $value");
+ }
+
+ function endSection($name) {
+ $this->addLine("End$name");
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Autoloader.php php-font-lib-0.3.1+dfsg/src/FontLib/Autoloader.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Autoloader.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Autoloader.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,43 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib;
+
+/**
+ * Autoloads FontLib classes
+ *
+ * @package php-font-lib
+ */
+class Autoloader {
+ const PREFIX = 'FontLib';
+
+ /**
+ * Register the autoloader
+ */
+ public static function register() {
+ spl_autoload_register(array(new self, 'autoload'));
+ }
+
+ /**
+ * Autoloader
+ *
+ * @param string
+ */
+ public static function autoload($class) {
+ $prefixLength = strlen(self::PREFIX);
+ if (0 === strncmp(self::PREFIX, $class, $prefixLength)) {
+ $file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength));
+ $file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php');
+ if (file_exists($file)) {
+ require_once $file;
+ }
+ }
+ }
+}
+
+Autoloader::register();
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Binary_Stream.php php-font-lib-0.3.1+dfsg/src/FontLib/Binary_Stream.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Binary_Stream.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Binary_Stream.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,399 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib;
+
+/**
+ * Generic font file binary stream.
+ *
+ * @package php-font-lib
+ */
+class Binary_Stream {
+ /**
+ * @var resource The file pointer
+ */
+ protected $f;
+
+ const uint8 = 1;
+ const int8 = 2;
+ const uint16 = 3;
+ const int16 = 4;
+ const uint32 = 5;
+ const int32 = 6;
+ const shortFrac = 7;
+ const Fixed = 8;
+ const FWord = 9;
+ const uFWord = 10;
+ const F2Dot14 = 11;
+ const longDateTime = 12;
+ const char = 13;
+
+ const modeRead = "rb";
+ const modeWrite = "wb";
+ const modeReadWrite = "rb+";
+
+ static function backtrace() {
+ var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
+ }
+
+ /**
+ * Open a font file in read mode
+ *
+ * @param string $filename The file name of the font to open
+ *
+ * @return bool
+ */
+ public function load($filename) {
+ return $this->open($filename, self::modeRead);
+ }
+
+ /**
+ * Open a font file in a chosen mode
+ *
+ * @param string $filename The file name of the font to open
+ * @param string $mode The opening mode
+ *
+ * @throws \Exception
+ * @return bool
+ */
+ public function open($filename, $mode = self::modeRead) {
+ if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) {
+ throw new \Exception("Unkown file open mode");
+ }
+
+ $this->f = fopen($filename, $mode);
+
+ return $this->f != false;
+ }
+
+ /**
+ * Close the internal file pointer
+ */
+ public function close() {
+ return fclose($this->f) != false;
+ }
+
+ /**
+ * Change the internal file pointer
+ *
+ * @param resource $fp
+ *
+ * @throws \Exception
+ */
+ public function setFile($fp) {
+ if (!is_resource($fp)) {
+ throw new \Exception('$fp is not a valid resource');
+ }
+
+ $this->f = $fp;
+ }
+
+ /**
+ * Create a temporary file in write mode
+ *
+ * @param bool $allow_memory Allow in-memory files
+ *
+ * @return resource the temporary file pointer resource
+ */
+ public static function getTempFile($allow_memory = true) {
+ $f = null;
+
+ if ($allow_memory) {
+ $f = fopen("php://temp", "rb+");
+ }
+ else {
+ $f = fopen(tempnam(sys_get_temp_dir(), "fnt"), "rb+");
+ }
+
+ return $f;
+ }
+
+ /**
+ * Move the internal file pinter to $offset bytes
+ *
+ * @param int $offset
+ *
+ * @return bool True if the $offset position exists in the file
+ */
+ public function seek($offset) {
+ return fseek($this->f, $offset, SEEK_SET) == 0;
+ }
+
+ /**
+ * Gives the current position in the file
+ *
+ * @return int The current position
+ */
+ public function pos() {
+ return ftell($this->f);
+ }
+
+ public function skip($n) {
+ fseek($this->f, $n, SEEK_CUR);
+ }
+
+ public function read($n) {
+ if ($n < 1) {
+ return "";
+ }
+
+ return fread($this->f, $n);
+ }
+
+ public function write($data, $length = null) {
+ if ($data === null || $data === "" || $data === false) {
+ return 0;
+ }
+
+ return fwrite($this->f, $data, $length);
+ }
+
+ public function readUInt8() {
+ return ord($this->read(1));
+ }
+
+ public function writeUInt8($data) {
+ return $this->write(chr($data), 1);
+ }
+
+ public function readInt8() {
+ $v = $this->readUInt8();
+
+ if ($v >= 0x80) {
+ $v -= 0x100;
+ }
+
+ return $v;
+ }
+
+ public function writeInt8($data) {
+ if ($data < 0) {
+ $data += 0x100;
+ }
+
+ return $this->writeUInt8($data);
+ }
+
+ public function readUInt16() {
+ $a = unpack("nn", $this->read(2));
+
+ return $a["n"];
+ }
+
+ public function readUFWord() {
+ return $this->readUInt16();
+ }
+
+ public function writeUInt16($data) {
+ return $this->write(pack("n", $data), 2);
+ }
+
+ public function writeUFWord($data) {
+ return $this->writeUInt16($data);
+ }
+
+ public function readInt16() {
+ $v = $this->readUInt16();
+
+ if ($v >= 0x8000) {
+ $v -= 0x10000;
+ }
+
+ return $v;
+ }
+
+ public function readFWord() {
+ return $this->readInt16();
+ }
+
+ public function writeInt16($data) {
+ if ($data < 0) {
+ $data += 0x10000;
+ }
+
+ return $this->writeUInt16($data);
+ }
+
+ public function writeFWord($data) {
+ return $this->writeInt16($data);
+ }
+
+ public function readUInt32() {
+ $a = unpack("NN", $this->read(4));
+
+ return $a["N"];
+ }
+
+ public function writeUInt32($data) {
+ return $this->write(pack("N", $data), 4);
+ }
+
+ public function readFixed() {
+ $d = $this->readInt16();
+ $d2 = $this->readUInt16();
+
+ return round($d + $d2 / 0x10000, 4);
+ }
+
+ public function writeFixed($data) {
+ $left = floor($data);
+ $right = ($data - $left) * 0x10000;
+
+ return $this->writeInt16($left) + $this->writeUInt16($right);
+ }
+
+ public function readLongDateTime() {
+ $this->readUInt32(); // ignored
+ $date = $this->readUInt32() - 2082844800;
+
+ return strftime("%Y-%m-%d %H:%M:%S", $date);
+ }
+
+ public function writeLongDateTime($data) {
+ $date = strtotime($data);
+ $date += 2082844800;
+
+ return $this->writeUInt32(0) + $this->writeUInt32($date);
+ }
+
+ public function unpack($def) {
+ $d = array();
+ foreach ($def as $name => $type) {
+ $d[$name] = $this->r($type);
+ }
+
+ return $d;
+ }
+
+ public function pack($def, $data) {
+ $bytes = 0;
+ foreach ($def as $name => $type) {
+ $bytes += $this->w($type, $data[$name]);
+ }
+
+ return $bytes;
+ }
+
+ /**
+ * Read a data of type $type in the file from the current position
+ *
+ * @param mixed $type The data type to read
+ *
+ * @return mixed The data that was read
+ */
+ public function r($type) {
+ switch ($type) {
+ case self::uint8:
+ return $this->readUInt8();
+ case self::int8:
+ return $this->readInt8();
+ case self::uint16:
+ return $this->readUInt16();
+ case self::int16:
+ return $this->readInt16();
+ case self::uint32:
+ return $this->readUInt32();
+ case self::int32:
+ return $this->readUInt32();
+ case self::shortFrac:
+ return $this->readFixed();
+ case self::Fixed:
+ return $this->readFixed();
+ case self::FWord:
+ return $this->readInt16();
+ case self::uFWord:
+ return $this->readUInt16();
+ case self::F2Dot14:
+ return $this->readInt16();
+ case self::longDateTime:
+ return $this->readLongDateTime();
+ case self::char:
+ return $this->read(1);
+ default:
+ if (is_array($type)) {
+ if ($type[0] == self::char) {
+ return $this->read($type[1]);
+ }
+
+ $ret = array();
+ for ($i = 0; $i < $type[1]; $i++) {
+ $ret[] = $this->r($type[0]);
+ }
+
+ return $ret;
+ }
+
+ return null;
+ }
+ }
+
+ /**
+ * Write $data of type $type in the file from the current position
+ *
+ * @param mixed $type The data type to write
+ * @param mixed $data The data to write
+ *
+ * @return int The number of bytes read
+ */
+ public function w($type, $data) {
+ switch ($type) {
+ case self::uint8:
+ return $this->writeUInt8($data);
+ case self::int8:
+ return $this->writeInt8($data);
+ case self::uint16:
+ return $this->writeUInt16($data);
+ case self::int16:
+ return $this->writeInt16($data);
+ case self::uint32:
+ return $this->writeUInt32($data);
+ case self::int32:
+ return $this->writeUInt32($data);
+ case self::shortFrac:
+ return $this->writeFixed($data);
+ case self::Fixed:
+ return $this->writeFixed($data);
+ case self::FWord:
+ return $this->writeInt16($data);
+ case self::uFWord:
+ return $this->writeUInt16($data);
+ case self::F2Dot14:
+ return $this->writeInt16($data);
+ case self::longDateTime:
+ return $this->writeLongDateTime($data);
+ case self::char:
+ return $this->write($data, 1);
+ default:
+ if (is_array($type)) {
+ if ($type[0] == self::char) {
+ return $this->write($data, $type[1]);
+ }
+
+ $ret = 0;
+ for ($i = 0; $i < $type[1]; $i++) {
+ $ret += $this->w($type[0], $data[$i]);
+ }
+
+ return $ret;
+ }
+
+ return null;
+ }
+ }
+
+ /**
+ * Converts a Uint32 value to string
+ *
+ * @param int $uint32
+ *
+ * @return string The string
+ */
+ public function convertUInt32ToStr($uint32) {
+ return chr(($uint32 >> 24) & 0xFF) . chr(($uint32 >> 16) & 0xFF) . chr(($uint32 >> 8) & 0xFF) . chr($uint32 & 0xFF);
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Encoding_Map.php php-font-lib-0.3.1+dfsg/src/FontLib/Encoding_Map.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Encoding_Map.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Encoding_Map.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,37 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib;
+
+/**
+ * Encoding map used to map a code point to a Unicode char.
+ *
+ * @package php-font-lib
+ */
+class Encoding_Map {
+ private $f;
+
+ function __construct($file) {
+ $this->f = fopen($file, "r");
+ }
+
+ function parse() {
+ $map = array();
+
+ while ($line = fgets($this->f)) {
+ if (preg_match("/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/", $line, $matches)) {
+ $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]);
+ $map[hexdec($matches[1])] = array($unicode, $matches[4]);
+ }
+ }
+
+ ksort($map);
+
+ return $map;
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/EOT/File.php php-font-lib-0.3.1+dfsg/src/FontLib/EOT/File.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/EOT/File.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/EOT/File.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,156 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\EOT;
+
+/**
+ * EOT font file.
+ *
+ * @package php-font-lib
+ */
+class File extends \FontLib\TrueType\File {
+ const TTEMBED_SUBSET = 0x00000001;
+ const TTEMBED_TTCOMPRESSED = 0x00000004;
+ const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010;
+ const TTMBED_EMBEDEUDC = 0x00000020;
+ const TTEMBED_VALIDATIONTESTS = 0x00000040; // Deprecated
+ const TTEMBED_WEBOBJECT = 0x00000080;
+ const TTEMBED_XORENCRYPTDATA = 0x10000000;
+
+ /**
+ * @var Header
+ */
+ public $header;
+
+ function parseHeader() {
+ if (!empty($this->header)) {
+ return;
+ }
+
+ $this->header = new Header($this);
+ $this->header->parse();
+ }
+
+ function parse() {
+ $this->parseHeader();
+
+ $flags = $this->header->data["Flags"];
+
+ if ($flags & self::TTEMBED_TTCOMPRESSED) {
+ $mtx_version = $this->readUInt8();
+ $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
+ $mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
+ $mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8();
+ /*
+ var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2");
+
+ $pos = $this->pos();
+ $size = $mtx_offset_1 - $pos;
+ var_dump("pos: $pos");
+ var_dump("size: $size");*/
+ }
+
+ if ($flags & self::TTEMBED_XORENCRYPTDATA) {
+ // Process XOR
+ }
+ // TODO Read font data ...
+ }
+
+ /**
+ * Little endian version of the read method
+ */
+ public function read($n) {
+ if ($n < 1) {
+ return "";
+ }
+
+ $string = fread($this->f, $n);
+ $chunks = str_split($string, 2);
+ $chunks = array_map("strrev", $chunks);
+
+ return implode("", $chunks);
+ }
+
+ public function readUInt32() {
+ $uint32 = parent::readUInt32();
+
+ return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000;
+ }
+
+ /**
+ * Get font copyright
+ *
+ * @return string|null
+ */
+ function getFontCopyright() {
+ return null;
+ }
+
+ /**
+ * Get font name
+ *
+ * @return string|null
+ */
+ function getFontName() {
+ return $this->header->data["FamilyName"];
+ }
+
+ /**
+ * Get font subfamily
+ *
+ * @return string|null
+ */
+ function getFontSubfamily() {
+ return $this->header->data["StyleName"];
+ }
+
+ /**
+ * Get font subfamily ID
+ *
+ * @return string|null
+ */
+ function getFontSubfamilyID() {
+ return $this->header->data["StyleName"];
+ }
+
+ /**
+ * Get font full name
+ *
+ * @return string|null
+ */
+ function getFontFullName() {
+ return $this->header->data["FullName"];
+ }
+
+ /**
+ * Get font version
+ *
+ * @return string|null
+ */
+ function getFontVersion() {
+ return $this->header->data["VersionName"];
+ }
+
+ /**
+ * Get font weight
+ *
+ * @return string|null
+ */
+ function getFontWeight() {
+ return $this->header->data["Weight"];
+ }
+
+ /**
+ * Get font Postscript name
+ *
+ * @return string|null
+ */
+ function getFontPostscriptName() {
+ return null;
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/EOT/Header.php php-font-lib-0.3.1+dfsg/src/FontLib/EOT/Header.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/EOT/Header.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/EOT/Header.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,113 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\EOT;
+
+use Exception;
+use FontLib\Font;
+
+/**
+ * TrueType font file header.
+ *
+ * @package php-font-lib
+ *
+ * @property File $font
+ */
+class Header extends \FontLib\Header {
+ protected $def = array(
+ "format" => self::uint32,
+ "numTables" => self::uint16,
+ "searchRange" => self::uint16,
+ "entrySelector" => self::uint16,
+ "rangeShift" => self::uint16,
+ );
+
+ public function parse() {
+ $font = $this->font;
+
+ $this->data = $font->unpack(array(
+ "EOTSize" => self::uint32,
+ "FontDataSize" => self::uint32,
+ "Version" => self::uint32,
+ "Flags" => self::uint32,
+ "FontPANOSE" => array(self::uint8, 10),
+ "Charset" => self::uint8,
+ "Italic" => self::uint8,
+ "Weight" => self::uint32,
+ "fsType" => self::uint16,
+ "MagicNumber" => self::uint16,
+ "UnicodeRange1" => self::uint32,
+ "UnicodeRange2" => self::uint32,
+ "UnicodeRange3" => self::uint32,
+ "UnicodeRange4" => self::uint32,
+ "CodePageRange1" => self::uint32,
+ "CodePageRange2" => self::uint32,
+ "CheckSumAdjustment" => self::uint32,
+ "Reserved1" => self::uint32,
+ "Reserved2" => self::uint32,
+ "Reserved3" => self::uint32,
+ "Reserved4" => self::uint32,
+ ));
+
+ $this->data["Padding1"] = $font->readUInt16();
+ $this->readString("FamilyName");
+
+ $this->data["Padding2"] = $font->readUInt16();
+ $this->readString("StyleName");
+
+ $this->data["Padding3"] = $font->readUInt16();
+ $this->readString("VersionName");
+
+ $this->data["Padding4"] = $font->readUInt16();
+ $this->readString("FullName");
+
+ switch ($this->data["Version"]) {
+ default:
+ throw new Exception("Unknown EOT version " . $this->data["Version"]);
+
+ case 0x00010000:
+ // Nothing to do more
+ break;
+
+ case 0x00020001:
+ $this->data["Padding5"] = $font->readUInt16();
+ $this->readString("RootString");
+ break;
+
+ case 0x00020002:
+ $this->data["Padding5"] = $font->readUInt16();
+ $this->readString("RootString");
+
+ $this->data["RootStringCheckSum"] = $font->readUInt32();
+ $this->data["EUDCCodePage"] = $font->readUInt32();
+
+ $this->data["Padding6"] = $font->readUInt16();
+ $this->readString("Signature");
+
+ $this->data["EUDCFlags"] = $font->readUInt32();
+ $this->data["EUDCFontSize"] = $font->readUInt32();
+ break;
+ }
+
+ if (!empty($this->data["RootString"])) {
+ $this->data["RootString"] = explode("\0", $this->data["RootString"]);
+ }
+ }
+
+ private function readString($name) {
+ $font = $this->font;
+ $size = $font->readUInt16();
+
+ $this->data["{$name}Size"] = $size;
+ $this->data[$name] = Font::UTF16ToUTF8($font->read($size));
+ }
+
+ public function encode() {
+ //return $this->font->pack($this->def, $this->data);
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Font.php php-font-lib-0.3.1+dfsg/src/FontLib/Font.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Font.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Font.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,83 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib;
+
+/**
+ * Generic font file.
+ *
+ * @package php-font-lib
+ */
+class Font {
+ static $debug = false;
+
+ /**
+ * @param string $file The font file
+ *
+ * @return TrueType\File|null $file
+ */
+ public static function load($file) {
+ $header = file_get_contents($file, false, null, null, 4);
+ $class = null;
+
+ switch ($header) {
+ case "\x00\x01\x00\x00":
+ case "true":
+ case "typ1":
+ $class = "TrueType\\File";
+ break;
+
+ case "OTTO":
+ $class = "OpenType\\File";
+ break;
+
+ case "wOFF":
+ $class = "WOFF\\File";
+ break;
+
+ case "ttcf":
+ $class = "TrueType\\Collection";
+ break;
+
+ // Unknown type or EOT
+ default:
+ $magicNumber = file_get_contents($file, false, null, 34, 2);
+
+ if ($magicNumber === "LP") {
+ $class = "EOT\\File";
+ }
+ }
+
+ if ($class) {
+ $class = "FontLib\\$class";
+
+ /** @var TrueType\File $obj */
+ $obj = new $class;
+ $obj->load($file);
+
+ return $obj;
+ }
+
+ return null;
+ }
+
+ static function d($str) {
+ if (!self::$debug) {
+ return;
+ }
+ echo "$str\n";
+ }
+
+ static function UTF16ToUTF8($str) {
+ return mb_convert_encoding($str, "utf-8", "utf-16");
+ }
+
+ static function UTF8ToUTF16($str) {
+ return mb_convert_encoding($str, "utf-16", "utf-8");
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Component.php php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Component.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Component.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Component.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,31 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
+ */
+
+namespace FontLib\Glyph;
+/**
+ * Glyph outline component
+ *
+ * @package php-font-lib
+ */
+class Outline_Component {
+ public $flags;
+ public $glyphIndex;
+ public $a, $b, $c, $d, $e, $f;
+ public $point_compound;
+ public $point_component;
+ public $instructions;
+
+ function getMatrix() {
+ return array(
+ $this->a, $this->b,
+ $this->c, $this->d,
+ $this->e, $this->f,
+ );
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Composite.php php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Composite.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Composite.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Composite.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,237 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
+ */
+
+namespace FontLib\Glyph;
+
+use FontLib\Table\Type\glyf;
+
+/**
+ * Composite glyph outline
+ *
+ * @package php-font-lib
+ */
+class Outline_Composite extends Outline {
+ const ARG_1_AND_2_ARE_WORDS = 0x0001;
+ const ARGS_ARE_XY_VALUES = 0x0002;
+ const ROUND_XY_TO_GRID = 0x0004;
+ const WE_HAVE_A_SCALE = 0x0008;
+ const MORE_COMPONENTS = 0x0020;
+ const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040;
+ const WE_HAVE_A_TWO_BY_TWO = 0x0080;
+ const WE_HAVE_INSTRUCTIONS = 0x0100;
+ const USE_MY_METRICS = 0x0200;
+ const OVERLAP_COMPOUND = 0x0400;
+
+ /**
+ * @var Outline_Component[]
+ */
+ public $components = array();
+
+ function getGlyphIDs() {
+ if (empty($this->components)) {
+ $this->parseData();
+ }
+
+ $glyphIDs = array();
+ foreach ($this->components as $_component) {
+ $glyphIDs[] = $_component->glyphIndex;
+
+ $_glyph = $this->table->data[$_component->glyphIndex];
+ $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());
+ }
+
+ return $glyphIDs;
+ }
+
+ /*function parse() {
+ //$this->parseData();
+ }*/
+
+ function parseData() {
+ parent::parseData();
+
+ $font = $this->getFont();
+
+ do {
+ $flags = $font->readUInt16();
+ $glyphIndex = $font->readUInt16();
+
+ $a = 1.0;
+ $b = 0.0;
+ $c = 0.0;
+ $d = 1.0;
+ $e = 0.0;
+ $f = 0.0;
+
+ $point_compound = null;
+ $point_component = null;
+
+ $instructions = null;
+
+ if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
+ if ($flags & self::ARGS_ARE_XY_VALUES) {
+ $e = $font->readInt16();
+ $f = $font->readInt16();
+ }
+ else {
+ $point_compound = $font->readUInt16();
+ $point_component = $font->readUInt16();
+ }
+ }
+ else {
+ if ($flags & self::ARGS_ARE_XY_VALUES) {
+ $e = $font->readInt8();
+ $f = $font->readInt8();
+ }
+ else {
+ $point_compound = $font->readUInt8();
+ $point_component = $font->readUInt8();
+ }
+ }
+
+ if ($flags & self::WE_HAVE_A_SCALE) {
+ $a = $d = $font->readInt16();
+ }
+ elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
+ $a = $font->readInt16();
+ $d = $font->readInt16();
+ }
+ elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
+ $a = $font->readInt16();
+ $b = $font->readInt16();
+ $c = $font->readInt16();
+ $d = $font->readInt16();
+ }
+
+ //if ($flags & self::WE_HAVE_INSTRUCTIONS) {
+ //
+ //}
+
+ $component = new Outline_Component();
+ $component->flags = $flags;
+ $component->glyphIndex = $glyphIndex;
+ $component->a = $a;
+ $component->b = $b;
+ $component->c = $c;
+ $component->d = $d;
+ $component->e = $e;
+ $component->f = $f;
+ $component->point_compound = $point_compound;
+ $component->point_component = $point_component;
+ $component->instructions = $instructions;
+
+ $this->components[] = $component;
+ } while ($flags & self::MORE_COMPONENTS);
+ }
+
+ function encode() {
+ $font = $this->getFont();
+
+ $gids = $font->getSubset();
+
+ $size = $font->writeInt16(-1);
+ $size += $font->writeFWord($this->xMin);
+ $size += $font->writeFWord($this->yMin);
+ $size += $font->writeFWord($this->xMax);
+ $size += $font->writeFWord($this->yMax);
+
+ foreach ($this->components as $_i => $_component) {
+ $flags = 0;
+ if ($_component->point_component === null && $_component->point_compound === null) {
+ $flags |= self::ARGS_ARE_XY_VALUES;
+
+ if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) {
+ $flags |= self::ARG_1_AND_2_ARE_WORDS;
+ }
+ }
+ elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) {
+ $flags |= self::ARG_1_AND_2_ARE_WORDS;
+ }
+
+ if ($_component->b == 0 && $_component->c == 0) {
+ if ($_component->a == $_component->d) {
+ if ($_component->a != 1.0) {
+ $flags |= self::WE_HAVE_A_SCALE;
+ }
+ }
+ else {
+ $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE;
+ }
+ }
+ else {
+ $flags |= self::WE_HAVE_A_TWO_BY_TWO;
+ }
+
+ if ($_i < count($this->components) - 1) {
+ $flags |= self::MORE_COMPONENTS;
+ }
+
+ $size += $font->writeUInt16($flags);
+
+ $new_gid = array_search($_component->glyphIndex, $gids);
+ $size += $font->writeUInt16($new_gid);
+
+ if ($flags & self::ARG_1_AND_2_ARE_WORDS) {
+ if ($flags & self::ARGS_ARE_XY_VALUES) {
+ $size += $font->writeInt16($_component->e);
+ $size += $font->writeInt16($_component->f);
+ }
+ else {
+ $size += $font->writeUInt16($_component->point_compound);
+ $size += $font->writeUInt16($_component->point_component);
+ }
+ }
+ else {
+ if ($flags & self::ARGS_ARE_XY_VALUES) {
+ $size += $font->writeInt8($_component->e);
+ $size += $font->writeInt8($_component->f);
+ }
+ else {
+ $size += $font->writeUInt8($_component->point_compound);
+ $size += $font->writeUInt8($_component->point_component);
+ }
+ }
+
+ if ($flags & self::WE_HAVE_A_SCALE) {
+ $size += $font->writeInt16($_component->a);
+ }
+ elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) {
+ $size += $font->writeInt16($_component->a);
+ $size += $font->writeInt16($_component->d);
+ }
+ elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) {
+ $size += $font->writeInt16($_component->a);
+ $size += $font->writeInt16($_component->b);
+ $size += $font->writeInt16($_component->c);
+ $size += $font->writeInt16($_component->d);
+ }
+ }
+
+ return $size;
+ }
+
+ public function getSVGContours() {
+ $contours = array();
+
+ /** @var \FontLib\Table\\FontLib\Table\Type\glyf $glyph_data */
+ $glyph_data = $this->getFont()->getTableObject("glyf");
+
+ /** @var Outline[] $glyphs */
+ $glyphs = $glyph_data->data;
+
+ foreach ($this->components as $component) {
+ $contours[] = array(
+ "contours" => $glyphs[$component->glyphIndex]->getSVGContours(),
+ "transform" => $component->getMatrix(),
+ );
+ }
+
+ return $contours;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline.php php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,112 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
+ */
+namespace FontLib\Glyph;
+
+use FontLib\Table\Type\glyf;
+use FontLib\TrueType\File;
+use FontLib\Binary_Stream;
+
+/**
+ * `glyf` font table.
+ *
+ * @package php-font-lib
+ */
+class Outline extends Binary_Stream {
+ /**
+ * @var \FontLib\Table\Type\glyf
+ */
+ protected $table;
+
+ protected $offset;
+ protected $size;
+
+ // Data
+ public $numberOfContours;
+ public $xMin;
+ public $yMin;
+ public $xMax;
+ public $yMax;
+
+ public $raw;
+
+ /**
+ * @param glyf $table
+ * @param $offset
+ * @param $size
+ *
+ * @return Outline
+ */
+ static function init(glyf $table, $offset, $size) {
+ $font = $table->getFont();
+ $font->seek($offset);
+
+ if ($font->readInt16() > -1) {
+ /** @var Outline_Simple $glyph */
+ $glyph = new Outline_Simple($table, $offset, $size);
+ }
+ else {
+ /** @var Outline_Composite $glyph */
+ $glyph = new Outline_Composite($table, $offset, $size);
+ }
+
+ $glyph->parse();
+
+ return $glyph;
+ }
+
+ /**
+ * @return File
+ */
+ function getFont() {
+ return $this->table->getFont();
+ }
+
+ function __construct(glyf $table, $offset = null, $size = null) {
+ $this->table = $table;
+ $this->offset = $offset;
+ $this->size = $size;
+ }
+
+ function parse() {
+ $font = $this->getFont();
+ $font->seek($this->offset);
+
+ if (!$this->size) {
+ return;
+ }
+
+ $this->raw = $font->read($this->size);
+ }
+
+ function parseData() {
+ $font = $this->getFont();
+ $font->seek($this->offset);
+
+ $this->numberOfContours = $font->readInt16();
+ $this->xMin = $font->readFWord();
+ $this->yMin = $font->readFWord();
+ $this->xMax = $font->readFWord();
+ $this->yMax = $font->readFWord();
+ }
+
+ function encode() {
+ $font = $this->getFont();
+
+ return $font->write($this->raw, strlen($this->raw));
+ }
+
+ function getSVGContours() {
+ // Inherit
+ }
+
+ function getGlyphIDs() {
+ return array();
+ }
+}
+
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Simple.php php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Simple.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Glyph/Outline_Simple.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Glyph/Outline_Simple.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,335 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $
+ */
+
+namespace FontLib\Glyph;
+
+/**
+ * `glyf` font table.
+ *
+ * @package php-font-lib
+ */
+class Outline_Simple extends Outline {
+ const ON_CURVE = 0x01;
+ const X_SHORT_VECTOR = 0x02;
+ const Y_SHORT_VECTOR = 0x04;
+ const REPEAT = 0x08;
+ const THIS_X_IS_SAME = 0x10;
+ const THIS_Y_IS_SAME = 0x20;
+
+ public $instructions;
+ public $points;
+
+ function parseData() {
+ parent::parseData();
+
+ if (!$this->size) {
+ return;
+ }
+
+ $font = $this->getFont();
+
+ $noc = $this->numberOfContours;
+
+ if ($noc == 0) {
+ return;
+ }
+
+ $endPtsOfContours = $font->r(array(self::uint16, $noc));
+
+ $instructionLength = $font->readUInt16();
+ $this->instructions = $font->r(array(self::uint8, $instructionLength));
+
+ $count = $endPtsOfContours[$noc - 1] + 1;
+
+ // Flags
+ $flags = array();
+ for ($index = 0; $index < $count; $index++) {
+ $flags[$index] = $font->readUInt8();
+
+ if ($flags[$index] & self::REPEAT) {
+ $repeats = $font->readUInt8();
+
+ for ($i = 1; $i <= $repeats; $i++) {
+ $flags[$index + $i] = $flags[$index];
+ }
+
+ $index += $repeats;
+ }
+ }
+
+ $points = array();
+ foreach ($flags as $i => $flag) {
+ $points[$i]["onCurve"] = $flag & self::ON_CURVE;
+ $points[$i]["endOfContour"] = in_array($i, $endPtsOfContours);
+ }
+
+ // X Coords
+ $x = 0;
+ for ($i = 0; $i < $count; $i++) {
+ $flag = $flags[$i];
+
+ if ($flag & self::THIS_X_IS_SAME) {
+ if ($flag & self::X_SHORT_VECTOR) {
+ $x += $font->readUInt8();
+ }
+ }
+ else {
+ if ($flag & self::X_SHORT_VECTOR) {
+ $x -= $font->readUInt8();
+ }
+ else {
+ $x += $font->readInt16();
+ }
+ }
+
+ $points[$i]["x"] = $x;
+ }
+
+ // Y Coords
+ $y = 0;
+ for ($i = 0; $i < $count; $i++) {
+ $flag = $flags[$i];
+
+ if ($flag & self::THIS_Y_IS_SAME) {
+ if ($flag & self::Y_SHORT_VECTOR) {
+ $y += $font->readUInt8();
+ }
+ }
+ else {
+ if ($flag & self::Y_SHORT_VECTOR) {
+ $y -= $font->readUInt8();
+ }
+ else {
+ $y += $font->readInt16();
+ }
+ }
+
+ $points[$i]["y"] = $y;
+ }
+
+ $this->points = $points;
+ }
+
+ public function splitSVGPath($path) {
+ preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER);
+
+ return $matches[0];
+ }
+
+ public function makePoints($path) {
+ $path = $this->splitSVGPath($path);
+ $l = count($path);
+ $i = 0;
+
+ $points = array();
+
+ while ($i < $l) {
+ switch ($path[$i]) {
+ // moveTo
+ case "M":
+ $points[] = array(
+ "onCurve" => true,
+ "x" => $path[++$i],
+ "y" => $path[++$i],
+ "endOfContour" => false,
+ );
+ break;
+
+ // lineTo
+ case "L":
+ $points[] = array(
+ "onCurve" => true,
+ "x" => $path[++$i],
+ "y" => $path[++$i],
+ "endOfContour" => false,
+ );
+ break;
+
+ // quadraticCurveTo
+ case "Q":
+ $points[] = array(
+ "onCurve" => false,
+ "x" => $path[++$i],
+ "y" => $path[++$i],
+ "endOfContour" => false,
+ );
+ $points[] = array(
+ "onCurve" => true,
+ "x" => $path[++$i],
+ "y" => $path[++$i],
+ "endOfContour" => false,
+ );
+ break;
+
+ // closePath
+ /** @noinspection PhpMissingBreakStatementInspection */
+ case "z":
+ $points[count($points) - 1]["endOfContour"] = true;
+
+ default:
+ $i++;
+ break;
+ }
+ }
+
+ return $points;
+ }
+
+ function encode() {
+ if (empty($this->points)) {
+ return parent::encode();
+ }
+
+ return $this->size = $this->encodePoints($this->points);
+ }
+
+ public function encodePoints($points) {
+ $endPtsOfContours = array();
+ $flags = array();
+ $coords_x = array();
+ $coords_y = array();
+
+ $last_x = 0;
+ $last_y = 0;
+ $xMin = $yMin = 0xFFFF;
+ $xMax = $yMax = -0xFFFF;
+ foreach ($points as $i => $point) {
+ $flag = 0;
+ if ($point["onCurve"]) {
+ $flag |= self::ON_CURVE;
+ }
+
+ if ($point["endOfContour"]) {
+ $endPtsOfContours[] = $i;
+ }
+
+ // Simplified, we could do some optimizations
+ if ($point["x"] == $last_x) {
+ $flag |= self::THIS_X_IS_SAME;
+ }
+ else {
+ $x = intval($point["x"]);
+ $xMin = min($x, $xMin);
+ $xMax = max($x, $xMax);
+ $coords_x[] = $x - $last_x; // int16
+ }
+
+ // Simplified, we could do some optimizations
+ if ($point["y"] == $last_y) {
+ $flag |= self::THIS_Y_IS_SAME;
+ }
+ else {
+ $y = intval($point["y"]);
+ $yMin = min($y, $yMin);
+ $yMax = max($y, $yMax);
+ $coords_y[] = $y - $last_y; // int16
+ }
+
+ $flags[] = $flag;
+ $last_x = $point["x"];
+ $last_y = $point["y"];
+ }
+
+ $font = $this->getFont();
+
+ $l = 0;
+ $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours
+ $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin
+ $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin
+ $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax
+ $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax
+
+ // Simple glyf
+ $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours
+ $l += $font->writeUInt16(0); // instructionLength
+ $l += $font->w(array(self::uint8, count($flags)), $flags); // flags
+ $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates
+ $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates
+ return $l;
+ }
+
+ public function getSVGContours($points = null) {
+ $path = "";
+
+ if (!$points) {
+ if (empty($this->points)) {
+ $this->parseData();
+ }
+
+ $points = $this->points;
+ }
+
+ $length = count($points);
+ $firstIndex = 0;
+ $count = 0;
+
+ for ($i = 0; $i < $length; $i++) {
+ $count++;
+
+ if ($points[$i]["endOfContour"]) {
+ $path .= $this->getSVGPath($points, $firstIndex, $count);
+ $firstIndex = $i + 1;
+ $count = 0;
+ }
+ }
+
+ return $path;
+ }
+
+ protected function getSVGPath($points, $startIndex, $count) {
+ $offset = 0;
+ $path = "";
+
+ while ($offset < $count) {
+ $point = $points[$startIndex + $offset % $count];
+ $point_p1 = $points[$startIndex + ($offset + 1) % $count];
+
+ if ($offset == 0) {
+ $path .= "M{$point['x']},{$point['y']} ";
+ }
+
+ if ($point["onCurve"]) {
+ if ($point_p1["onCurve"]) {
+ $path .= "L{$point_p1['x']},{$point_p1['y']} ";
+ $offset++;
+ }
+ else {
+ $point_p2 = $points[$startIndex + ($offset + 2) % $count];
+
+ if ($point_p2["onCurve"]) {
+ $path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} ";
+ }
+ else {
+ $path .= "Q{$point_p1['x']},{$point_p1['y']}," . $this->midValue($point_p1['x'], $point_p2['x']) . "," . $this->midValue($point_p1['y'], $point_p2['y']) . " ";
+ }
+
+ $offset += 2;
+ }
+ }
+ else {
+ if ($point_p1["onCurve"]) {
+ $path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} ";
+ }
+ else {
+ $path .= "Q{$point['x']},{$point['y']}," . $this->midValue($point['x'], $point_p1['x']) . "," . $this->midValue($point['y'], $point_p1['y']) . " ";
+ }
+
+ $offset++;
+ }
+ }
+
+ $path .= "z ";
+
+ return $path;
+ }
+
+ function midValue($a, $b) {
+ return $a + ($b - $a) / 2;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Header.php php-font-lib-0.3.1+dfsg/src/FontLib/Header.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Header.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Header.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,37 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+namespace FontLib;
+
+use FontLib\TrueType\File;
+
+/**
+ * Font header container.
+ *
+ * @package php-font-lib
+ */
+abstract class Header extends Binary_Stream {
+ /**
+ * @var File
+ */
+ protected $font;
+ protected $def = array();
+
+ public $data;
+
+ public function __construct(File $font) {
+ $this->font = $font;
+ }
+
+ public function encode() {
+ return $this->font->pack($this->def, $this->data);
+ }
+
+ public function parse() {
+ $this->data = $this->font->unpack($this->def);
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/OpenType/File.php php-font-lib-0.3.1+dfsg/src/FontLib/OpenType/File.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/OpenType/File.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/OpenType/File.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,18 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\OpenType;
+
+/**
+ * Open Type font, the same as a TrueType one.
+ *
+ * @package php-font-lib
+ */
+class File extends \FontLib\TrueType\File {
+ //
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/OpenType/Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/src/FontLib/OpenType/Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/OpenType/Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/OpenType/Table_Directory_Entry.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,18 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\OpenType;
+
+/**
+ * Open Type Table directory entry, the same as a TrueType one.
+ *
+ * @package php-font-lib
+ */
+class Table_Directory_Entry extends \FontLib\TrueType\Table_Directory_Entry {
+
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Directory_Entry.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Directory_Entry.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,129 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+namespace FontLib\Table;
+
+use FontLib\TrueType\File;
+use FontLib\Font;
+use FontLib\Binary_Stream;
+
+/**
+ * Generic Font table directory entry.
+ *
+ * @package php-font-lib
+ */
+class Directory_Entry extends Binary_Stream {
+ /**
+ * @var File
+ */
+ protected $font;
+
+ /**
+ * @var Table
+ */
+ protected $font_table;
+
+ public $entryLength = 4;
+
+ public $tag;
+ public $checksum;
+ public $offset;
+ public $length;
+
+ protected $origF;
+
+ static function computeChecksum($data) {
+ $len = strlen($data);
+ $mod = $len % 4;
+
+ if ($mod) {
+ $data = str_pad($data, $len + (4 - $mod), "\0");
+ }
+
+ $len = strlen($data);
+
+ $hi = 0x0000;
+ $lo = 0x0000;
+
+ for ($i = 0; $i < $len; $i += 4) {
+ $hi += (ord($data[$i]) << 8) + ord($data[$i + 1]);
+ $lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]);
+ $hi += $lo >> 16;
+ $lo = $lo & 0xFFFF;
+ $hi = $hi & 0xFFFF;
+ }
+
+ return ($hi << 8) + $lo;
+ }
+
+ function __construct(File $font) {
+ $this->font = $font;
+ $this->f = $font->f;
+ }
+
+ function parse() {
+ $this->tag = $this->font->read(4);
+ }
+
+ function open($filename, $mode = self::modeRead) {
+ // void
+ }
+
+ function setTable(Table $font_table) {
+ $this->font_table = $font_table;
+ }
+
+ function encode($entry_offset) {
+ Font::d("\n==== $this->tag ====");
+ //Font::d("Entry offset = $entry_offset");
+
+ $data = $this->font_table;
+ $font = $this->font;
+
+ $table_offset = $font->pos();
+ $this->offset = $table_offset;
+ $table_length = $data->encode();
+
+ $font->seek($table_offset);
+ $table_data = $font->read($table_length);
+
+ $font->seek($entry_offset);
+
+ $font->write($this->tag, 4);
+ $font->writeUInt32(self::computeChecksum($table_data));
+ $font->writeUInt32($table_offset);
+ $font->writeUInt32($table_length);
+
+ Font::d("Bytes written = $table_length");
+
+ $font->seek($table_offset + $table_length);
+ }
+
+ /**
+ * @return File
+ */
+ function getFont() {
+ return $this->font;
+ }
+
+ function startRead() {
+ $this->font->seek($this->offset);
+ }
+
+ function endRead() {
+ //
+ }
+
+ function startWrite() {
+ $this->font->seek($this->offset);
+ }
+
+ function endWrite() {
+ //
+ }
+}
+
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Table.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Table.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Table.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Table.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,93 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+namespace FontLib\Table;
+
+use FontLib\TrueType\File;
+use FontLib\Font;
+use FontLib\Binary_Stream;
+
+/**
+ * Generic font table.
+ *
+ * @package php-font-lib
+ */
+class Table extends Binary_Stream {
+ /**
+ * @var Directory_Entry
+ */
+ protected $entry;
+ protected $def = array();
+
+ public $data;
+
+ final public function __construct(Directory_Entry $entry) {
+ $this->entry = $entry;
+ $entry->setTable($this);
+ }
+
+ /**
+ * @return File
+ */
+ public function getFont() {
+ return $this->entry->getFont();
+ }
+
+ protected function _encode() {
+ if (empty($this->data)) {
+ Font::d(" >> Table is empty");
+
+ return 0;
+ }
+
+ return $this->getFont()->pack($this->def, $this->data);
+ }
+
+ protected function _parse() {
+ $this->data = $this->getFont()->unpack($this->def);
+ }
+
+ protected function _parseRaw() {
+ $this->data = $this->getFont()->read($this->entry->length);
+ }
+
+ protected function _encodeRaw() {
+ return $this->getFont()->write($this->data, $this->entry->length);
+ }
+
+ public function toHTML() {
+ return "" . var_export($this->data, true) . "
";
+ }
+
+ final public function encode() {
+ $this->entry->startWrite();
+
+ if (false && empty($this->def)) {
+ $length = $this->_encodeRaw();
+ }
+ else {
+ $length = $this->_encode();
+ }
+
+ $this->entry->endWrite();
+
+ return $length;
+ }
+
+ final public function parse() {
+ $this->entry->startRead();
+
+ if (false && empty($this->def)) {
+ $this->_parseRaw();
+ }
+ else {
+ $this->_parse();
+ }
+
+ $this->entry->endRead();
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/cmap.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/cmap.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/cmap.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/cmap.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,258 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `cmap` font table.
+ *
+ * @package php-font-lib
+ */
+class cmap extends Table {
+ private static $header_format = array(
+ "version" => self::uint16,
+ "numberSubtables" => self::uint16,
+ );
+
+ private static $subtable_header_format = array(
+ "platformID" => self::uint16,
+ "platformSpecificID" => self::uint16,
+ "offset" => self::uint32,
+ );
+
+ private static $subtable_v4_format = array(
+ "length" => self::uint16,
+ "language" => self::uint16,
+ "segCountX2" => self::uint16,
+ "searchRange" => self::uint16,
+ "entrySelector" => self::uint16,
+ "rangeShift" => self::uint16,
+ );
+
+ protected function _parse() {
+ $font = $this->getFont();
+
+ $cmap_offset = $font->pos();
+
+ $data = $font->unpack(self::$header_format);
+
+ $subtables = array();
+ for ($i = 0; $i < $data["numberSubtables"]; $i++) {
+ $subtables[] = $font->unpack(self::$subtable_header_format);
+ }
+ $data["subtables"] = $subtables;
+
+ foreach ($data["subtables"] as $i => &$subtable) {
+ $font->seek($cmap_offset + $subtable["offset"]);
+
+ $subtable["format"] = $font->readUInt16();
+
+ // @todo Only CMAP version 4
+ if ($subtable["format"] != 4) {
+ unset($data["subtables"][$i]);
+ $data["numberSubtables"]--;
+ continue;
+ }
+
+ $subtable += $font->unpack(self::$subtable_v4_format);
+ $segCount = $subtable["segCountX2"] / 2;
+ $subtable["segCount"] = $segCount;
+
+ $endCode = $font->r(array(self::uint16, $segCount));
+
+ $font->readUInt16(); // reservedPad
+
+ $startCode = $font->r(array(self::uint16, $segCount));
+ $idDelta = $font->r(array(self::int16, $segCount));
+
+ $ro_start = $font->pos();
+ $idRangeOffset = $font->r(array(self::uint16, $segCount));
+
+ $glyphIndexArray = array();
+ for ($i = 0; $i < $segCount; $i++) {
+ $c1 = $startCode[$i];
+ $c2 = $endCode[$i];
+ $d = $idDelta[$i];
+ $ro = $idRangeOffset[$i];
+
+ if ($ro > 0) {
+ $font->seek($subtable["offset"] + 2 * $i + $ro);
+ }
+
+ for ($c = $c1; $c <= $c2; $c++) {
+ if ($ro == 0) {
+ $gid = ($c + $d) & 0xFFFF;
+ }
+ else {
+ $offset = ($c - $c1) * 2 + $ro;
+ $offset = $ro_start + 2 * $i + $offset;
+
+ $font->seek($offset);
+ $gid = $font->readUInt16();
+
+ if ($gid != 0) {
+ $gid = ($gid + $d) & 0xFFFF;
+ }
+ }
+
+ if ($gid > 0) {
+ $glyphIndexArray[$c] = $gid;
+ }
+ }
+ }
+
+ $subtable += array(
+ "endCode" => $endCode,
+ "startCode" => $startCode,
+ "idDelta" => $idDelta,
+ "idRangeOffset" => $idRangeOffset,
+ "glyphIndexArray" => $glyphIndexArray,
+ );
+ }
+
+ $this->data = $data;
+ }
+
+ function _encode() {
+ $font = $this->getFont();
+
+ $subset = $font->getSubset();
+ $glyphIndexArray = $font->getUnicodeCharMap();
+
+ $newGlyphIndexArray = array();
+ foreach ($glyphIndexArray as $code => $gid) {
+ $new_gid = array_search($gid, $subset);
+ if ($new_gid !== false) {
+ $newGlyphIndexArray[$code] = $new_gid;
+ }
+ }
+
+ ksort($newGlyphIndexArray); // Sort by char code
+
+ $segments = array();
+
+ $i = -1;
+ $prevCode = 0xFFFF;
+ $prevGid = 0xFFFF;
+
+ foreach ($newGlyphIndexArray as $code => $gid) {
+ if (
+ $prevCode + 1 != $code ||
+ $prevGid + 1 != $gid
+ ) {
+ $i++;
+ $segments[$i] = array();
+ }
+
+ $segments[$i][] = array($code, $gid);
+
+ $prevCode = $code;
+ $prevGid = $gid;
+ }
+
+ $segments[][] = array(0xFFFF, 0xFFFF);
+
+ $startCode = array();
+ $endCode = array();
+ $idDelta = array();
+
+ foreach ($segments as $codes) {
+ $start = reset($codes);
+ $end = end($codes);
+
+ $startCode[] = $start[0];
+ $endCode[] = $end[0];
+ $idDelta[] = $start[1] - $start[0];
+ }
+
+ $segCount = count($startCode);
+ $idRangeOffset = array_fill(0, $segCount, 0);
+
+ $searchRange = 1;
+ $entrySelector = 0;
+ while ($searchRange * 2 <= $segCount) {
+ $searchRange *= 2;
+ $entrySelector++;
+ }
+ $searchRange *= 2;
+ $rangeShift = $segCount * 2 - $searchRange;
+
+ $subtables = array(
+ array(
+ // header
+ "platformID" => 3, // Unicode
+ "platformSpecificID" => 1,
+ "offset" => null,
+
+ // subtable
+ "format" => 4,
+ "length" => null,
+ "language" => 0,
+ "segCount" => $segCount,
+ "segCountX2" => $segCount * 2,
+ "searchRange" => $searchRange,
+ "entrySelector" => $entrySelector,
+ "rangeShift" => $rangeShift,
+ "startCode" => $startCode,
+ "endCode" => $endCode,
+ "idDelta" => $idDelta,
+ "idRangeOffset" => $idRangeOffset,
+ "glyphIndexArray" => $newGlyphIndexArray,
+ )
+ );
+
+ $data = array(
+ "version" => 0,
+ "numberSubtables" => count($subtables),
+ "subtables" => $subtables,
+ );
+
+ $length = $font->pack(self::$header_format, $data);
+
+ $subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format
+ $subtable_headers_offset = $font->pos();
+
+ $length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size);
+
+ // write subtables data
+ foreach ($data["subtables"] as $i => $subtable) {
+ $length_before = $length;
+ $data["subtables"][$i]["offset"] = $length;
+
+ $length += $font->writeUInt16($subtable["format"]);
+
+ $before_subheader = $font->pos();
+ $length += $font->pack(self::$subtable_v4_format, $subtable);
+
+ $segCount = $subtable["segCount"];
+ $length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]);
+ $length += $font->writeUInt16(0); // reservedPad
+ $length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]);
+ $length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]);
+ $length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]);
+ $length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"]));
+
+ $after_subtable = $font->pos();
+
+ $subtable["length"] = $length - $length_before;
+ $font->seek($before_subheader);
+ $length += $font->pack(self::$subtable_v4_format, $subtable);
+
+ $font->seek($after_subtable);
+ }
+
+ // write subtables headers
+ $font->seek($subtable_headers_offset);
+ foreach ($data["subtables"] as $subtable) {
+ $font->pack(self::$subtable_header_format, $subtable);
+ }
+
+ return $length;
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/glyf.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/glyf.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/glyf.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/glyf.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,154 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+
+use FontLib\Table\Table;
+use FontLib\Glyph\Outline;
+use FontLib\Glyph\Outline_Simple;
+
+/**
+ * `glyf` font table.
+ *
+ * @package php-font-lib
+ * @property Outline[] $data
+ */
+class glyf extends Table {
+ protected function _parse() {
+ $font = $this->getFont();
+ $offset = $font->pos();
+
+ $loca = $font->getData("loca");
+ $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry
+
+ $data = array();
+
+ foreach ($real_loca as $gid => $location) {
+ $_offset = $offset + $loca[$gid];
+ $_size = $loca[$gid + 1] - $loca[$gid];
+ $data[$gid] = Outline::init($this, $_offset, $_size);
+ }
+
+ $this->data = $data;
+ }
+
+ public function getGlyphIDs($gids = array()) {
+ $glyphIDs = array();
+
+ foreach ($gids as $_gid) {
+ $_glyph = $this->data[$_gid];
+ $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs());
+ }
+
+ return array_unique(array_merge($gids, $glyphIDs));
+ }
+
+ public function toHTML() {
+ $max = 160;
+ $font = $this->getFont();
+
+ $head = $font->getData("head");
+ $head_json = json_encode($head);
+
+ $os2 = $font->getData("OS/2");
+ $os2_json = json_encode($os2);
+
+ $hmtx = $font->getData("hmtx");
+ $hmtx_json = json_encode($hmtx);
+
+ $names = $font->getData("post", "names");
+ $glyphIndexArray = array_flip($font->getUnicodeCharMap());
+
+ $width = (abs($head["xMin"]) + $head["xMax"]);
+ $height = (abs($head["yMin"]) + $head["yMax"]);
+
+ $ratio = 1;
+ if ($width > $max || $height > $max) {
+ $ratio = max($width, $height) / $max;
+ $width = round($width / $ratio);
+ $height = round($height / $ratio);
+ }
+
+ $n = 500;
+
+ $s = "" . "Only the first $n simple glyphs are shown (" . count($this->data) . " total)
+
Simple glyph
+ Composite glyph
+ Zoom:
+
+ ";
+
+ foreach ($this->data as $g => $glyph) {
+ if ($n-- <= 0) {
+ break;
+ }
+
+ $glyph->parseData();
+
+ $shape = array(
+ "SVGContours" => $glyph->getSVGContours(),
+ "xMin" => $glyph->xMin,
+ "yMin" => $glyph->yMin,
+ "xMax" => $glyph->xMax,
+ "yMax" => $glyph->yMax,
+ );
+ $shape_json = json_encode($shape);
+
+ $type = ($glyph instanceof Outline_Simple ? "simple" : "composite");
+ $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0;
+ $name = isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $char);
+ $char = $char ? "{$glyphIndexArray[$g]};" : "";
+
+ $s .= "
+
$g
+
$char
+
$name
+ ";
+
+ if ($type == "composite") {
+ foreach ($glyph->getGlyphIDs() as $_id) {
+ $s .= "
$_id ";
+ }
+ }
+
+ $s .= "
+
+
+ ";
+ }
+
+ return $s;
+ }
+
+
+ protected function _encode() {
+ $font = $this->getFont();
+ $subset = $font->getSubset();
+ $data = $this->data;
+
+ $loca = array();
+
+ $length = 0;
+ foreach ($subset as $gid) {
+ $loca[] = $length;
+ $length += $data[$gid]->encode();
+ }
+
+ $loca[] = $length; // dummy loca
+ $font->getTableObject("loca")->data = $loca;
+
+ return $length;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/head.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/head.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/head.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/head.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,46 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+use Exception;
+
+/**
+ * `head` font table.
+ *
+ * @package php-font-lib
+ */
+class head extends Table {
+ protected $def = array(
+ "tableVersion" => self::Fixed,
+ "fontRevision" => self::Fixed,
+ "checkSumAdjustment" => self::uint32,
+ "magicNumber" => self::uint32,
+ "flags" => self::uint16,
+ "unitsPerEm" => self::uint16,
+ "created" => self::longDateTime,
+ "modified" => self::longDateTime,
+ "xMin" => self::FWord,
+ "yMin" => self::FWord,
+ "xMax" => self::FWord,
+ "yMax" => self::FWord,
+ "macStyle" => self::uint16,
+ "lowestRecPPEM" => self::uint16,
+ "fontDirectionHint" => self::int16,
+ "indexToLocFormat" => self::int16,
+ "glyphDataFormat" => self::int16,
+ );
+
+ protected function _parse() {
+ parent::_parse();
+
+ if ($this->data["magicNumber"] != 0x5F0F3CF5) {
+ throw new Exception("Incorrect magic number (" . dechex($this->data["magicNumber"]) . ")");
+ }
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/hhea.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/hhea.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/hhea.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/hhea.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,44 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `hhea` font table.
+ *
+ * @package php-font-lib
+ */
+class hhea extends Table {
+ protected $def = array(
+ "version" => self::Fixed,
+ "ascent" => self::FWord,
+ "descent" => self::FWord,
+ "lineGap" => self::FWord,
+ "advanceWidthMax" => self::uFWord,
+ "minLeftSideBearing" => self::FWord,
+ "minRightSideBearing" => self::FWord,
+ "xMaxExtent" => self::FWord,
+ "caretSlopeRise" => self::int16,
+ "caretSlopeRun" => self::int16,
+ "caretOffset" => self::FWord,
+ self::int16,
+ self::int16,
+ self::int16,
+ self::int16,
+ "metricDataFormat" => self::int16,
+ "numOfLongHorMetrics" => self::uint16,
+ );
+
+ function _encode() {
+ $font = $this->getFont();
+ $this->data["numOfLongHorMetrics"] = count($font->getSubset());
+
+ return parent::_encode();
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/hmtx.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/hmtx.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/hmtx.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/hmtx.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,56 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `hmtx` font table.
+ *
+ * @package php-font-lib
+ */
+class hmtx extends Table {
+ protected function _parse() {
+ $font = $this->getFont();
+ $offset = $font->pos();
+
+ $numOfLongHorMetrics = $font->getData("hhea", "numOfLongHorMetrics");
+ $numGlyphs = $font->getData("maxp", "numGlyphs");
+
+ $font->seek($offset);
+
+ $data = array();
+ for ($gid = 0; $gid < $numOfLongHorMetrics; $gid++) {
+ $advanceWidth = $font->readUInt16();
+ $leftSideBearing = $font->readUInt16();
+ $data[$gid] = array($advanceWidth, $leftSideBearing);
+ }
+
+ if ($numOfLongHorMetrics < $numGlyphs) {
+ $lastWidth = end($data);
+ $data = array_pad($data, $numGlyphs, $lastWidth);
+ }
+
+ $this->data = $data;
+ }
+
+ protected function _encode() {
+ $font = $this->getFont();
+ $subset = $font->getSubset();
+ $data = $this->data;
+
+ $length = 0;
+
+ foreach ($subset as $gid) {
+ $length += $font->writeUInt16($data[$gid][0]);
+ $length += $font->writeUInt16($data[$gid][1]);
+ }
+
+ return $length;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/kern.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/kern.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/kern.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/kern.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,75 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `kern` font table.
+ *
+ * @package php-font-lib
+ */
+class kern extends Table {
+ protected function _parse() {
+ $font = $this->getFont();
+
+ $data = $font->unpack(array(
+ "version" => self::uint16,
+ "nTables" => self::uint16,
+
+ // only the first subtable will be parsed
+ "subtableVersion" => self::uint16,
+ "length" => self::uint16,
+ "coverage" => self::uint16,
+ ));
+
+ $data["format"] = ($data["coverage"] >> 8);
+
+ $subtable = array();
+
+ switch ($data["format"]) {
+ case 0:
+ $subtable = $font->unpack(array(
+ "nPairs" => self::uint16,
+ "searchRange" => self::uint16,
+ "entrySelector" => self::uint16,
+ "rangeShift" => self::uint16,
+ ));
+
+ $pairs = array();
+ $tree = array();
+
+ for ($i = 0; $i < $subtable["nPairs"]; $i++) {
+ $left = $font->readUInt16();
+ $right = $font->readUInt16();
+ $value = $font->readInt16();
+
+ $pairs[] = array(
+ "left" => $left,
+ "right" => $right,
+ "value" => $value,
+ );
+
+ $tree[$left][$right] = $value;
+ }
+
+ //$subtable["pairs"] = $pairs;
+ $subtable["tree"] = $tree;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ break;
+ }
+
+ $data["subtable"] = $subtable;
+
+ $this->data = $data;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/loca.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/loca.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/loca.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/loca.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,80 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `loca` font table.
+ *
+ * @package php-font-lib
+ */
+class loca extends Table {
+ protected function _parse() {
+ $font = $this->getFont();
+ $offset = $font->pos();
+
+ $indexToLocFormat = $font->getData("head", "indexToLocFormat");
+ $numGlyphs = $font->getData("maxp", "numGlyphs");
+
+ $font->seek($offset);
+
+ $data = array();
+
+ // 2 bytes
+ if ($indexToLocFormat == 0) {
+ $d = $font->read(($numGlyphs + 1) * 2);
+ $loc = unpack("n*", $d);
+
+ for ($i = 0; $i <= $numGlyphs; $i++) {
+ $data[] = $loc[$i + 1] * 2;
+ }
+ }
+
+ // 4 bytes
+ else {
+ if ($indexToLocFormat == 1) {
+ $d = $font->read(($numGlyphs + 1) * 4);
+ $loc = unpack("N*", $d);
+
+ for ($i = 0; $i <= $numGlyphs; $i++) {
+ $data[] = $loc[$i + 1];
+ }
+ }
+ }
+
+ $this->data = $data;
+ }
+
+ function _encode() {
+ $font = $this->getFont();
+ $data = $this->data;
+
+ $indexToLocFormat = $font->getData("head", "indexToLocFormat");
+ $numGlyphs = $font->getData("maxp", "numGlyphs");
+ $length = 0;
+
+ // 2 bytes
+ if ($indexToLocFormat == 0) {
+ for ($i = 0; $i <= $numGlyphs; $i++) {
+ $length += $font->writeUInt16($data[$i] / 2);
+ }
+ }
+
+ // 4 bytes
+ else {
+ if ($indexToLocFormat == 1) {
+ for ($i = 0; $i <= $numGlyphs; $i++) {
+ $length += $font->writeUInt32($data[$i]);
+ }
+ }
+ }
+
+ return $length;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/maxp.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/maxp.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/maxp.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/maxp.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,42 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `maxp` font table.
+ *
+ * @package php-font-lib
+ */
+class maxp extends Table {
+ protected $def = array(
+ "version" => self::Fixed,
+ "numGlyphs" => self::uint16,
+ "maxPoints" => self::uint16,
+ "maxContours" => self::uint16,
+ "maxComponentPoints" => self::uint16,
+ "maxComponentContours" => self::uint16,
+ "maxZones" => self::uint16,
+ "maxTwilightPoints" => self::uint16,
+ "maxStorage" => self::uint16,
+ "maxFunctionDefs" => self::uint16,
+ "maxInstructionDefs" => self::uint16,
+ "maxStackElements" => self::uint16,
+ "maxSizeOfInstructions" => self::uint16,
+ "maxComponentElements" => self::uint16,
+ "maxComponentDepth" => self::uint16,
+ );
+
+ function _encode() {
+ $font = $this->getFont();
+ $this->data["numGlyphs"] = count($font->getSubset());
+
+ return parent::_encode();
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/name.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/name.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/name.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/name.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,193 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+
+use FontLib\Table\Table;
+use FontLib\Font;
+
+/**
+ * `name` font table.
+ *
+ * @package php-font-lib
+ */
+class name extends 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 name_Record();
+ $record_data = $font->unpack(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 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(name_Record::$format, (array)$record);
+ }
+
+ foreach ($records as $record) {
+ $str = $record->getUTF16();
+ $length += $font->write($str, mb_strlen($str, "8bit"));
+ }
+
+ return $length;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/name_Record.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/name_Record.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/name_Record.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/name_Record.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,53 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+namespace FontLib\Table\Type;
+
+use FontLib\Font;
+use FontLib\Binary_Stream;
+
+/**
+ * Font table name record.
+ *
+ * @package php-font-lib
+ */
+class name_Record extends Binary_Stream {
+ public $platformID;
+ public $platformSpecificID;
+ public $languageID;
+ public $nameID;
+ public $length;
+ public $offset;
+ public $string;
+
+ public static $format = array(
+ "platformID" => self::uint16,
+ "platformSpecificID" => self::uint16,
+ "languageID" => self::uint16,
+ "nameID" => self::uint16,
+ "length" => self::uint16,
+ "offset" => self::uint16,
+ );
+
+ public function map($data) {
+ foreach ($data as $key => $value) {
+ $this->$key = $value;
+ }
+ }
+
+ public function getUTF8() {
+ return $this->string;
+ }
+
+ public function getUTF16() {
+ return Font::UTF8ToUTF16($this->string);
+ }
+
+ function __toString() {
+ return $this->string;
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/os2.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/os2.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/os2.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/os2.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,47 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+
+/**
+ * `OS/2` font table.
+ *
+ * @package php-font-lib
+ */
+class os2 extends Table {
+ protected $def = array(
+ "version" => self::uint16,
+ "xAvgCharWidth" => self::int16,
+ "usWeightClass" => self::uint16,
+ "usWidthClass" => self::uint16,
+ "fsType" => self::int16,
+ "ySubscriptXSize" => self::int16,
+ "ySubscriptYSize" => self::int16,
+ "ySubscriptXOffset" => self::int16,
+ "ySubscriptYOffset" => self::int16,
+ "ySuperscriptXSize" => self::int16,
+ "ySuperscriptYSize" => self::int16,
+ "ySuperscriptXOffset" => self::int16,
+ "ySuperscriptYOffset" => self::int16,
+ "yStrikeoutSize" => self::int16,
+ "yStrikeoutPosition" => self::int16,
+ "sFamilyClass" => self::int16,
+ "panose" => array(self::uint8, 10),
+ "ulCharRange" => array(self::uint32, 4),
+ "achVendID" => array(self::char, 4),
+ "fsSelection" => self::uint16,
+ "fsFirstCharIndex" => self::uint16,
+ "fsLastCharIndex" => self::uint16,
+ "typoAscender" => self::int16,
+ "typoDescender" => self::int16,
+ "typoLineGap" => self::int16,
+ "winAscent" => self::int16,
+ "winDescent" => self::int16,
+ );
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/post.php php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/post.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/Table/Type/post.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/Table/Type/post.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,144 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\Table\Type;
+use FontLib\Table\Table;
+use FontLib\TrueType\File;
+
+/**
+ * `post` font table.
+ *
+ * @package php-font-lib
+ */
+class post extends Table {
+ protected $def = array(
+ "format" => self::Fixed,
+ "italicAngle" => self::Fixed,
+ "underlinePosition" => self::FWord,
+ "underlineThickness" => self::FWord,
+ "isFixedPitch" => self::uint32,
+ "minMemType42" => self::uint32,
+ "maxMemType42" => self::uint32,
+ "minMemType1" => self::uint32,
+ "maxMemType1" => self::uint32,
+ );
+
+ protected function _parse() {
+ $font = $this->getFont();
+ $data = $font->unpack($this->def);
+
+ $names = array();
+
+ switch ($data["format"]) {
+ case 1:
+ $names = File::$macCharNames;
+ break;
+
+ case 2:
+ $data["numberOfGlyphs"] = $font->readUInt16();
+
+ $glyphNameIndex = array();
+ for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) {
+ $glyphNameIndex[] = $font->readUInt16();
+ }
+
+ $data["glyphNameIndex"] = $glyphNameIndex;
+
+ $namesPascal = array();
+ for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) {
+ $len = $font->readUInt8();
+ $namesPascal[] = $font->read($len);
+ }
+
+ foreach ($glyphNameIndex as $g => $index) {
+ if ($index < 258) {
+ $names[$g] = File::$macCharNames[$index];
+ }
+ else {
+ $names[$g] = $namesPascal[$index - 258];
+ }
+ }
+
+ break;
+
+ case 2.5:
+ // TODO
+ break;
+
+ case 3:
+ // nothing
+ break;
+
+ case 4:
+ // TODO
+ break;
+ }
+
+ $data["names"] = $names;
+
+ $this->data = $data;
+ }
+
+ function _encode() {
+ $font = $this->getFont();
+ $data = $this->data;
+ $data["format"] = 3;
+
+ $length = $font->pack($this->def, $data);
+
+ return $length;
+ /*
+ $subset = $font->getSubset();
+
+ switch($data["format"]) {
+ case 1:
+ // nothing to do
+ break;
+
+ case 2:
+ $old_names = $data["names"];
+
+ $glyphNameIndex = range(0, count($subset));
+
+ $names = array();
+ foreach($subset as $gid) {
+ $names[] = $data["names"][$data["glyphNameIndex"][$gid]];
+ }
+
+ $numberOfGlyphs = count($names);
+ $length += $font->writeUInt16($numberOfGlyphs);
+
+ foreach($glyphNameIndex as $gni) {
+ $length += $font->writeUInt16($gni);
+ }
+
+ //$names = array_slice($names, 257);
+ foreach($names as $name) {
+ $len = strlen($name);
+ $length += $font->writeUInt8($len);
+ $length += $font->write($name, $len);
+ }
+
+ break;
+
+ case 2.5:
+ // TODO
+ break;
+
+ case 3:
+ // nothing
+ break;
+
+ case 4:
+ // TODO
+ break;
+ }
+
+ return $length;*/
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Collection.php php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Collection.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Collection.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Collection.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,100 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\TrueType;
+
+use Countable;
+use FontLib\Binary_Stream;
+use Iterator;
+use OutOfBoundsException;
+
+/**
+ * TrueType collection font file.
+ *
+ * @package php-font-lib
+ */
+class Collection extends Binary_Stream implements Iterator, Countable {
+ /**
+ * Current iterator position.
+ *
+ * @var integer
+ */
+ private $position = 0;
+
+ protected $collectionOffsets = array();
+ protected $collection = array();
+ protected $version;
+ protected $numFonts;
+
+ function parse() {
+ if (isset($this->numFonts)) {
+ return;
+ }
+
+ $this->read(4); // tag name
+
+ $this->version = $this->readFixed();
+ $this->numFonts = $this->readUInt32();
+
+ for ($i = 0; $i < $this->numFonts; $i++) {
+ $this->collectionOffsets[] = $this->readUInt32();
+ }
+ }
+
+ /**
+ * @param int $fontId
+ *
+ * @throws OutOfBoundsException
+ * @return File
+ */
+ function getFont($fontId) {
+ $this->parse();
+
+ if (!isset($this->collectionOffsets[$fontId])) {
+ throw new OutOfBoundsException();
+ }
+
+ if (isset($this->collection[$fontId])) {
+ return $this->collection[$fontId];
+ }
+
+ $font = new File();
+ $font->f = $this->f;
+ $font->setTableOffset($this->collectionOffsets[$fontId]);
+
+ return $this->collection[$fontId] = $font;
+ }
+
+ function current() {
+ return $this->getFont($this->position);
+ }
+
+ function key() {
+ return $this->position;
+ }
+
+ function next() {
+ return ++$this->position;
+ }
+
+ function rewind() {
+ $this->position = 0;
+ }
+
+ function valid() {
+ $this->parse();
+
+ return isset($this->collectionOffsets[$this->position]);
+ }
+
+ function count() {
+ $this->parse();
+
+ return $this->numFonts;
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/File.php php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/File.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/File.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/File.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,471 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\TrueType;
+
+use FontLib\Adobe_Font_Metrics;
+use FontLib\Font;
+use FontLib\Binary_Stream;
+use FontLib\Table\Table;
+use FontLib\Table\Directory_Entry;
+use FontLib\Table\Type\glyf;
+use FontLib\Table\Type\name;
+use FontLib\Table\Type\name_Record;
+
+/**
+ * TrueType font file.
+ *
+ * @package php-font-lib
+ */
+class File extends Binary_Stream {
+ /**
+ * @var Header
+ */
+ public $header = array();
+
+ private $tableOffset = 0; // Used for TTC
+
+ private static $raw = false;
+
+ protected $directory = array();
+ protected $data = array();
+
+ protected $glyph_subset = array();
+
+ public $glyph_all = array();
+
+ static $macCharNames = array(
+ ".notdef", ".null", "CR",
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quotesingle",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+ "at", "A", "B", "C", "D", "E", "F", "G",
+ "H", "I", "J", "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore",
+ "grave", "a", "b", "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l", "m", "n", "o",
+ "p", "q", "r", "s", "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "Adieresis",
+ "Aring", "Ccedilla", "Eacute", "Ntilde",
+ "Odieresis", "Udieresis", "aacute", "agrave",
+ "acircumflex", "adieresis", "atilde", "aring",
+ "ccedilla", "eacute", "egrave", "ecircumflex",
+ "edieresis", "iacute", "igrave", "icircumflex",
+ "idieresis", "ntilde", "oacute", "ograve",
+ "ocircumflex", "odieresis", "otilde", "uacute",
+ "ugrave", "ucircumflex", "udieresis", "dagger",
+ "degree", "cent", "sterling", "section",
+ "bullet", "paragraph", "germandbls", "registered",
+ "copyright", "trademark", "acute", "dieresis",
+ "notequal", "AE", "Oslash", "infinity",
+ "plusminus", "lessequal", "greaterequal", "yen",
+ "mu", "partialdiff", "summation", "product",
+ "pi", "integral", "ordfeminine", "ordmasculine",
+ "Omega", "ae", "oslash", "questiondown",
+ "exclamdown", "logicalnot", "radical", "florin",
+ "approxequal", "increment", "guillemotleft", "guillemotright",
+ "ellipsis", "nbspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash",
+ "emdash", "quotedblleft", "quotedblright", "quoteleft",
+ "quoteright", "divide", "lozenge", "ydieresis",
+ "Ydieresis", "fraction", "currency", "guilsinglleft",
+ "guilsinglright", "fi", "fl", "daggerdbl",
+ "periodcentered", "quotesinglbase", "quotedblbase", "perthousand",
+ "Acircumflex", "Ecircumflex", "Aacute", "Edieresis",
+ "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Oacute", "Ocircumflex", "applelogo",
+ "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron",
+ "breve", "dotaccent", "ring", "cedilla",
+ "hungarumlaut", "ogonek", "caron", "Lslash",
+ "lslash", "Scaron", "scaron", "Zcaron",
+ "zcaron", "brokenbar", "Eth", "eth",
+ "Yacute", "yacute", "Thorn", "thorn",
+ "minus", "multiply", "onesuperior", "twosuperior",
+ "threesuperior", "onehalf", "onequarter", "threequarters",
+ "franc", "Gbreve", "gbreve", "Idot",
+ "Scedilla", "scedilla", "Cacute", "cacute",
+ "Ccaron", "ccaron", "dmacron"
+ );
+
+ 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 = strlen($str);
+ $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"];
+ }
+
+ 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");
+ $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"), $tags);
+ }
+ else {
+ $tags = array_keys($this->directory);
+ }
+
+ $num_tables = count($tags);
+ $n = 16; // @todo
+
+ Font::d("Tables : " . implode(", ", $tags));
+
+ /** @var Directory_Entry[] $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];
+ }
+
+ $this->header->data["numTables"] = $num_tables;
+ $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\\Table_Directory_Entry";
+
+ for ($i = 0; $i < $this->header->data["numTables"]; $i++) {
+ /** @var Table_Directory_Entry $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) {
+ return $this->data[$name];
+ }
+
+ 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(Directory_Entry $entry) {
+ $this->directory[$entry->tag] = $entry;
+ }
+
+ function saveAdobeFontMetrics($file, $encoding = null) {
+ $afm = new Adobe_Font_Metrics($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 name_Record[] $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]);
+ }
+ }
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Header.php php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Header.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Header.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Header.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,31 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\TrueType;
+
+/**
+ * TrueType font file header.
+ *
+ * @package php-font-lib
+ */
+class Header extends \FontLib\Header {
+ protected $def = array(
+ "format" => self::uint32,
+ "numTables" => self::uint16,
+ "searchRange" => self::uint16,
+ "entrySelector" => self::uint16,
+ "rangeShift" => self::uint16,
+ );
+
+ public function parse() {
+ parent::parse();
+
+ $format = $this->data["format"];
+ $this->data["formatText"] = $this->convertUInt32ToStr($format);
+ }
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/TrueType/Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/TrueType/Table_Directory_Entry.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,33 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\TrueType;
+
+use FontLib\Table\Directory_Entry;
+
+/**
+ * TrueType table directory entry.
+ *
+ * @package php-font-lib
+ */
+class Table_Directory_Entry extends Directory_Entry {
+ function __construct(File $font) {
+ parent::__construct($font);
+ }
+
+ function parse() {
+ parent::parse();
+
+ $font = $this->font;
+ $this->checksum = $font->readUInt32();
+ $this->offset = $font->readUInt32();
+ $this->length = $font->readUInt32();
+ $this->entryLength += 12;
+ }
+}
+
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/File.php php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/File.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/File.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/File.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,81 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\WOFF;
+
+use FontLib\Table\Directory_Entry;
+
+/**
+ * WOFF font file.
+ *
+ * @package php-font-lib
+ *
+ * @property Table_Directory_Entry[] $directory
+ */
+class File extends \FontLib\TrueType\File {
+ function parseHeader() {
+ if (!empty($this->header)) {
+ return;
+ }
+
+ $this->header = new Header($this);
+ $this->header->parse();
+ }
+
+ public function load($file) {
+ parent::load($file);
+
+ $this->parseTableEntries();
+ $dataOffset = $this->pos() + count($this->directory) * 20;
+
+ $fw = $this->getTempFile(false);
+ $fr = $this->f;
+
+ $this->f = $fw;
+ $offset = $this->header->encode();
+
+ foreach ($this->directory as $entry) {
+ // Read ...
+ $this->f = $fr;
+ $this->seek($entry->offset);
+ $data = $this->read($entry->length);
+
+ if ($entry->length < $entry->origLength) {
+ $data = gzuncompress($data);
+ }
+
+ // Prepare data ...
+ $length = strlen($data);
+ $entry->length = $entry->origLength = $length;
+ $entry->offset = $dataOffset;
+
+ // Write ...
+ $this->f = $fw;
+
+ // Woff Entry
+ $this->seek($offset);
+ $offset += $this->write($entry->tag, 4); // tag
+ $offset += $this->writeUInt32($dataOffset); // offset
+ $offset += $this->writeUInt32($length); // length
+ $offset += $this->writeUInt32($length); // origLength
+ $offset += $this->writeUInt32(Directory_Entry::computeChecksum($data)); // checksum
+
+ // Data
+ $this->seek($dataOffset);
+ $dataOffset += $this->write($data, $length);
+ }
+
+ $this->f = $fw;
+ $this->seek(0);
+
+ // Need to re-parse this, don't know why
+ $this->header = null;
+ $this->directory = array();
+ $this->parseTableEntries();
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/Header.php php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/Header.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/Header.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/Header.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,32 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\WOFF;
+
+/**
+ * WOFF font file header.
+ *
+ * @package php-font-lib
+ */
+class Header extends \FontLib\TrueType\Header {
+ protected $def = array(
+ "format" => self::uint32,
+ "flavor" => self::uint32,
+ "length" => self::uint32,
+ "numTables" => self::uint16,
+ self::uint16,
+ "totalSfntSize" => self::uint32,
+ "majorVersion" => self::uint16,
+ "minorVersion" => self::uint16,
+ "metaOffset" => self::uint32,
+ "metaLength" => self::uint32,
+ "metaOrigLength" => self::uint32,
+ "privOffset" => self::uint32,
+ "privLength" => self::uint32,
+ );
+}
\ No newline at end of file
diff -Nru php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/Table_Directory_Entry.php php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/Table_Directory_Entry.php
--- php-font-lib-0.2.2+dfsg/src/FontLib/WOFF/Table_Directory_Entry.php 1970-01-01 00:00:00.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/src/FontLib/WOFF/Table_Directory_Entry.php 2014-03-19 17:15:11.000000000 +0000
@@ -0,0 +1,34 @@
+
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ */
+
+namespace FontLib\WOFF;
+
+use FontLib\Table\Directory_Entry;
+
+/**
+ * WOFF font file table directory entry.
+ *
+ * @package php-font-lib
+ */
+class Table_Directory_Entry extends Directory_Entry {
+ public $origLength;
+
+ function __construct(File $font) {
+ parent::__construct($font);
+ }
+
+ function parse() {
+ parent::parse();
+
+ $font = $this->font;
+ $this->offset = $font->readUInt32();
+ $this->length = $font->readUInt32();
+ $this->origLength = $font->readUInt32();
+ $this->checksum = $font->readUInt32();
+ }
+}
diff -Nru php-font-lib-0.2.2+dfsg/www/font_info.php php-font-lib-0.3.1+dfsg/www/font_info.php
--- php-font-lib-0.2.2+dfsg/www/font_info.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/www/font_info.php 2014-03-19 17:15:11.000000000 +0000
@@ -5,6 +5,10 @@
* @author Fabien Ménager
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
+
+use FontLib\Font;
+use FontLib\TrueType\Collection;
+
?>
@@ -28,9 +32,9 @@
-getFont(0);
}
diff -Nru php-font-lib-0.2.2+dfsg/www/make_subset.php php-font-lib-0.3.1+dfsg/www/make_subset.php
--- php-font-lib-0.2.2+dfsg/www/make_subset.php 2014-02-01 15:22:28.000000000 +0000
+++ php-font-lib-0.3.1+dfsg/www/make_subset.php 2014-03-19 17:15:11.000000000 +0000
@@ -6,6 +6,9 @@
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
*/
+use FontLib\Font;
+use FontLib\Binary_Stream;
+
$fontfile = null;
if (isset($_GET["fontfile"])) {
$fontfile = basename($_GET["fontfile"]);
@@ -22,8 +25,8 @@
$subset = $_POST["subset"];
ob_start();
-
- require_once "../classes/Font.php";
+
+ require_once "../src/FontLib/Autoloader.php";
$font = Font::load($fontfile);
$font->parse();
@@ -32,13 +35,14 @@
$font->reduce();
$new_filename = basename($fontfile);
- $new_filename = substr($new_filename, 0, -4)."-subset.".substr($new_filename, -3);
+ $dot = strpos($new_filename, ".");
+ $new_filename = substr($new_filename, 0, $dot)."-subset".substr($new_filename, $dot);
header("Content-Type: font/truetype");
header("Content-Disposition: attachment; filename=\"$new_filename\"");
$tmp = tempnam(sys_get_temp_dir(), "fnt");
- $font->open($tmp, Font_Binary_Stream::modeWrite);
+ $font->open($tmp, Binary_Stream::modeWrite);
$font->encode(array("OS/2"));
$font->close();
@@ -57,7 +61,7 @@
-
+