Esempio n. 1
0
 /**
  * Constructor
  *
  * Instantiate a TTF 'hhea' table object.
  *
  * @param  \Pop\Pdf\Build\Font\TrueType $font
  * @return Hhea
  */
 public function __construct(\Pop\Pdf\Build\Font\TrueType $font)
 {
     parent::__construct($this->allowed);
     $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'];
 }
Esempio n. 2
0
 /**
  * Constructor
  *
  * Instantiate a OTF 'OS/2' table object.
  *
  * @param  \Pop\Pdf\Build\Font\TrueType $font
  * @return Os2
  */
 public function __construct(\Pop\Pdf\Build\Font\TrueType $font)
 {
     parent::__construct($this->allowed);
     $this->flags = new \ArrayObject(['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']));
 }
Esempio n. 3
0
 /**
  * Constructor
  *
  * Instantiate a TTF 'glyf' table object.
  *
  * @param  \Pop\Pdf\Build\Font\TrueType $font
  * @return Glyf
  */
 public function __construct(\Pop\Pdf\Build\Font\TrueType $font)
 {
     parent::__construct($this->allowed);
     $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'] = [];
         $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++;
     }
 }