/** * Constructor * * Instantiate a TTF 'hhea' table object. * * @param \Pop\Font\AbstractFont $font * @return \Pop\Font\TrueType\Table\Hhea */ public function __construct(\Pop\Font\AbstractFont $font) { $bytePos = $font->tableInfo['hhea']->offset + 4; $ary = unpack('nascent/' . 'ndescent', $font->read($bytePos, 4)); $ary = $font->shiftToSigned($ary); $this->ascent = $font->toEmSpace($ary['ascent']); $this->descent = $font->toEmSpace($ary['descent']); $bytePos = $font->tableInfo['hhea']->offset + 34; $ary = unpack('nnumberOfHMetrics/', $font->read($bytePos, 2)); $this->numberOfHMetrics = $ary['numberOfHMetrics']; }
/** * Constructor * * Instantiate a OTF 'OS/2' table object. * * @param \Pop\Font\AbstractFont $font * @return \Pop\Font\TrueType\Table\Os2 */ public function __construct(\Pop\Font\AbstractFont $font) { $this->flags = new \ArrayObject(array('isFixedPitch' => false, 'isSerif' => false, 'isSymbolic' => false, 'isScript' => false, 'isNonSymbolic' => false, 'isItalic' => false, 'isAllCap' => false, 'isSmallCap' => false, 'isForceBold' => false), \ArrayObject::ARRAY_AS_PROPS); $bytePos = $font->tableInfo['OS/2']->offset + 8; $ary = unpack("nfsType", $font->read($bytePos, 2)); $this->embeddable = $ary['fsType'] != 2 && ($ary['fsType'] & 0x200) == 0; $bytePos = $font->tableInfo['OS/2']->offset + 30; $ary = unpack("nfamily_class", $font->read($bytePos, 2)); $familyClass = $font->shiftToSigned($ary['family_class']) >> 8; if ($familyClass >= 1 && $familyClass <= 5 || $familyClass == 7) { $this->flags->isSerif = true; } else { if ($familyClass == 8) { $this->flags->isSerif = false; } } if ($familyClass == 10) { $this->flags->isScript = true; } if ($familyClass == 12) { $this->flags->isSymbolic = true; $this->flags->isNonSymbolic = false; } else { $this->flags->isSymbolic = false; $this->flags->isNonSymbolic = true; } // Unicode bit-sniffing may not be necessary. $bytePos += 3; $ary = unpack('NunicodeRange1/' . 'NunicodeRange2/' . 'NunicodeRange3/' . 'NunicodeRange4', $font->read($bytePos, 16)); if ($ary['unicodeRange1'] == 1 && $ary['unicodeRange2'] == 0 && $ary['unicodeRange3'] == 0 && $ary['unicodeRange4'] == 0) { $this->flags->isSymbolic = false; $this->flags->isNonSymbolic = true; } $bytePos = $font->tableInfo['OS/2']->offset + 76; $ary = unpack("ncap/", $font->read($bytePos, 2)); $this->capHeight = $font->toEmSpace($font->shiftToSigned($ary['cap'])); }
/** * Constructor * * Instantiate a TTF 'glyf' table object. * * @param \Pop\Font\AbstractFont $font * @return \Pop\Font\TrueType\Table\Glyf */ public function __construct(\Pop\Font\AbstractFont $font) { $locaLength = count($font->tables['loca']->offsets); $j = 0; foreach ($font->tables['loca']->offsets as $offset) { $bytePos = $font->tableInfo['glyf']->offset + $offset; $ary = unpack('nnumberOfContours/' . 'nxMin/' . 'nyMin/' . 'nxMax/' . 'nyMax', $font->read($bytePos, 10)); $ary = $font->shiftToSigned($ary); $ary['xMin'] = $font->toEmSpace($ary['xMin']); $ary['yMin'] = $font->toEmSpace($ary['yMin']); $ary['xMax'] = $font->toEmSpace($ary['xMax']); $ary['yMax'] = $font->toEmSpace($ary['yMax']); $ary['width'] = $ary['xMin'] + $ary['xMax']; $this->glyphWidths[] = $ary['width']; $bytePos += 10; $ary['endPtsOfContours'] = array(); $ary['instructionLength'] = null; $ary['instructions'] = null; $ary['flags'] = null; // The simple and composite glyph descriptions may not be necessary. // If simple glyph. if ($ary['numberOfContours'] > 0) { for ($i = 0; $i < $ary['numberOfContours']; $i++) { $ar = unpack('nendPt', $font->read($bytePos, 2)); $ary['endPtsOfContours'][$i] = $ar['endPt']; $bytePos += 2; } $ar = unpack('ninstructionLength', $font->read($bytePos, 2)); $ary['instructionLength'] = $ar['instructionLength']; $bytePos += 2; if ($ary['instructionLength'] > 0) { for ($i = 0; $i < $ary['instructionLength']; $i++) { $byte = $font->read($bytePos, 1); if (strlen($byte) != 0) { $ar = unpack('Cinstruction', $byte); $ary['instructions'][$i] = $ar['instruction']; $bytePos++; } else { $ary['instructions'][$i] = null; } } } $bytePos++; $byte = $font->read($bytePos, 1); if (strlen($byte) != 0) { $ar = unpack('Cflags', $byte); $ary['flags'] = $ar['flags']; } else { $ary['flags'] = 0; } if ($j < $locaLength - 1) { $this->glyphs[] = $ary; } // Stopped here. Still need to get the x & y coordinates of the simple glyph. // Else, if composite glyph. } else { if ($j < $locaLength - 1) { // Composite glyph goes here. } } $j++; } }