summaryrefslogtreecommitdiffstats
path: root/library/vendor/dompdf/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/vendor/dompdf/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php242
1 files changed, 242 insertions, 0 deletions
diff --git a/library/vendor/dompdf/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php b/library/vendor/dompdf/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php
new file mode 100644
index 0000000..8ab0d2c
--- /dev/null
+++ b/library/vendor/dompdf/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php
@@ -0,0 +1,242 @@
+<?php
+/**
+ * @package php-font-lib
+ * @link https://github.com/PhenX/php-font-lib
+ * @author Fabien Ménager <fabien.menager@gmail.com>
+ * @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;
+
+/**
+ * Composite glyph outline
+ *
+ * @package php-font-lib
+ */
+class OutlineComposite 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 OutlineComponent[]
+ */
+ 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];
+
+ if ($_glyph !== $this) {
+ $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 OutlineComponent();
+ $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\Type\glyf $glyph_data */
+ $glyph_data = $this->getFont()->getTableObject("glyf");
+
+ /** @var Outline[] $glyphs */
+ $glyphs = $glyph_data->data;
+
+ foreach ($this->components as $component) {
+ $_glyph = $glyphs[$component->glyphIndex];
+
+ if ($_glyph !== $this) {
+ $contours[] = array(
+ "contours" => $_glyph->getSVGContours(),
+ "transform" => $component->getMatrix(),
+ );
+ }
+ }
+
+ return $contours;
+ }
+} \ No newline at end of file