From 18de7b37a41a7dcfb7d0acc7cb89a1ac3f2294b9 Mon Sep 17 00:00:00 2001 From: Indrek Altpere Date: Tue, 2 Feb 2016 18:57:51 +0200 Subject: [PATCH 1/4] Use the multi-read helper to read all the hmtx values in one go --- src/FontLib/Table/Type/hmtx.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/FontLib/Table/Type/hmtx.php b/src/FontLib/Table/Type/hmtx.php index 4201e18..2458e20 100644 --- a/src/FontLib/Table/Type/hmtx.php +++ b/src/FontLib/Table/Type/hmtx.php @@ -25,9 +25,10 @@ protected function _parse() { $font->seek($offset); $data = array(); - for ($gid = 0; $gid < $numOfLongHorMetrics; $gid++) { - $advanceWidth = $font->readUInt16(); - $leftSideBearing = $font->readUInt16(); + $metrics = $font->readUInt16Many($numOfLongHorMetrics * 2); + for ($gid = 0, $mid = 0; $gid < $numOfLongHorMetrics; $gid++) { + $advanceWidth = $metrics[$mid++]; + $leftSideBearing = $metrics[$mid++]; $data[$gid] = array($advanceWidth, $leftSideBearing); } From 9e032d997430bb9fc728a726c997462844bcd5e4 Mon Sep 17 00:00:00 2001 From: Indrek Altpere Date: Tue, 2 Feb 2016 19:05:11 +0200 Subject: [PATCH 2/4] Use the read-many helpers directly to avoid overhead --- src/FontLib/Table/Type/cmap.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/FontLib/Table/Type/cmap.php b/src/FontLib/Table/Type/cmap.php index 51d878b..562f51e 100644 --- a/src/FontLib/Table/Type/cmap.php +++ b/src/FontLib/Table/Type/cmap.php @@ -64,15 +64,15 @@ protected function _parse() { $segCount = $subtable["segCountX2"] / 2; $subtable["segCount"] = $segCount; - $endCode = $font->r(array(self::uint16, $segCount)); + $endCode = $font->readUInt16Many($segCount); $font->readUInt16(); // reservedPad - $startCode = $font->r(array(self::uint16, $segCount)); - $idDelta = $font->r(array(self::int16, $segCount)); + $startCode = $font->readUInt16Many($segCount); + $idDelta = $font->readInt16Many($segCount); $ro_start = $font->pos(); - $idRangeOffset = $font->r(array(self::uint16, $segCount)); + $idRangeOffset = $font->readUInt16Many($segCount); $glyphIndexArray = array(); for ($i = 0; $i < $segCount; $i++) { From a5c4d40e6ec9eee9eb9f01964556b5c8489fac5b Mon Sep 17 00:00:00 2001 From: Indrek Altpere Date: Tue, 2 Feb 2016 19:36:53 +0200 Subject: [PATCH 3/4] Use the read-many helper, handle uint16 => int16 conversion inline because there is no other way to optimize this --- src/FontLib/Table/Type/kern.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/FontLib/Table/Type/kern.php b/src/FontLib/Table/Type/kern.php index 05a17e3..9875946 100644 --- a/src/FontLib/Table/Type/kern.php +++ b/src/FontLib/Table/Type/kern.php @@ -44,10 +44,15 @@ protected function _parse() { $pairs = array(); $tree = array(); - for ($i = 0; $i < $subtable["nPairs"]; $i++) { - $left = $font->readUInt16(); - $right = $font->readUInt16(); - $value = $font->readInt16(); + $values = $font->readUInt16Many($subtable["nPairs"] * 3); + for ($i = 0, $idx = 0; $i < $subtable["nPairs"]; $i++) { + $left = $values[$idx++]; + $right = $values[$idx++]; + $value = $values[$idx++]; + + if ($value >= 0x8000) { + $value -= 0x10000; + } $pairs[] = array( "left" => $left, From 448b15239d1a8dc89fbf869477bdc3770fe24a27 Mon Sep 17 00:00:00 2001 From: Indrek Altpere Date: Tue, 2 Feb 2016 19:40:45 +0200 Subject: [PATCH 4/4] Use the multi-read helper --- src/FontLib/Table/Type/post.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/FontLib/Table/Type/post.php b/src/FontLib/Table/Type/post.php index 393acac..ec5806b 100644 --- a/src/FontLib/Table/Type/post.php +++ b/src/FontLib/Table/Type/post.php @@ -42,10 +42,7 @@ protected function _parse() { case 2: $data["numberOfGlyphs"] = $font->readUInt16(); - $glyphNameIndex = array(); - for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) { - $glyphNameIndex[] = $font->readUInt16(); - } + $glyphNameIndex = $font->readUInt16Many($data["numberOfGlyphs"]); $data["glyphNameIndex"] = $glyphNameIndex;