暂无描述

Header.php 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. /**
  3. * @package php-font-lib
  4. * @link https://github.com/PhenX/php-font-lib
  5. * @author Fabien Ménager <fabien.menager@gmail.com>
  6. * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
  7. */
  8. namespace FontLib\EOT;
  9. use Exception;
  10. use FontLib\Font;
  11. /**
  12. * TrueType font file header.
  13. *
  14. * @package php-font-lib
  15. *
  16. * @property File $font
  17. */
  18. class Header extends \FontLib\Header {
  19. protected $def = array(
  20. "format" => self::uint32,
  21. "numTables" => self::uint16,
  22. "searchRange" => self::uint16,
  23. "entrySelector" => self::uint16,
  24. "rangeShift" => self::uint16,
  25. );
  26. public function parse() {
  27. $font = $this->font;
  28. $this->data = $font->unpack(array(
  29. "EOTSize" => self::uint32,
  30. "FontDataSize" => self::uint32,
  31. "Version" => self::uint32,
  32. "Flags" => self::uint32,
  33. "FontPANOSE" => array(self::uint8, 10),
  34. "Charset" => self::uint8,
  35. "Italic" => self::uint8,
  36. "Weight" => self::uint32,
  37. "fsType" => self::uint16,
  38. "MagicNumber" => self::uint16,
  39. "UnicodeRange1" => self::uint32,
  40. "UnicodeRange2" => self::uint32,
  41. "UnicodeRange3" => self::uint32,
  42. "UnicodeRange4" => self::uint32,
  43. "CodePageRange1" => self::uint32,
  44. "CodePageRange2" => self::uint32,
  45. "CheckSumAdjustment" => self::uint32,
  46. "Reserved1" => self::uint32,
  47. "Reserved2" => self::uint32,
  48. "Reserved3" => self::uint32,
  49. "Reserved4" => self::uint32,
  50. ));
  51. $this->data["Padding1"] = $font->readUInt16();
  52. $this->readString("FamilyName");
  53. $this->data["Padding2"] = $font->readUInt16();
  54. $this->readString("StyleName");
  55. $this->data["Padding3"] = $font->readUInt16();
  56. $this->readString("VersionName");
  57. $this->data["Padding4"] = $font->readUInt16();
  58. $this->readString("FullName");
  59. switch ($this->data["Version"]) {
  60. default:
  61. throw new Exception("Unknown EOT version " . $this->data["Version"]);
  62. case 0x00010000:
  63. // Nothing to do more
  64. break;
  65. case 0x00020001:
  66. $this->data["Padding5"] = $font->readUInt16();
  67. $this->readString("RootString");
  68. break;
  69. case 0x00020002:
  70. $this->data["Padding5"] = $font->readUInt16();
  71. $this->readString("RootString");
  72. $this->data["RootStringCheckSum"] = $font->readUInt32();
  73. $this->data["EUDCCodePage"] = $font->readUInt32();
  74. $this->data["Padding6"] = $font->readUInt16();
  75. $this->readString("Signature");
  76. $this->data["EUDCFlags"] = $font->readUInt32();
  77. $this->data["EUDCFontSize"] = $font->readUInt32();
  78. break;
  79. }
  80. if (!empty($this->data["RootString"])) {
  81. $this->data["RootString"] = explode("\0", $this->data["RootString"]);
  82. }
  83. }
  84. private function readString($name) {
  85. $font = $this->font;
  86. $size = $font->readUInt16();
  87. $this->data["{$name}Size"] = $size;
  88. $this->data[$name] = Font::UTF16ToUTF8($font->read($size));
  89. }
  90. public function encode() {
  91. //return $this->font->pack($this->def, $this->data);
  92. }
  93. }