summaryrefslogtreecommitdiff
path: root/applications/core/lib/Zend/Pdf/Cmap.php
diff options
Diffstat (limited to 'applications/core/lib/Zend/Pdf/Cmap.php')
-rw-r--r--applications/core/lib/Zend/Pdf/Cmap.php341
1 files changed, 341 insertions, 0 deletions
diff --git a/applications/core/lib/Zend/Pdf/Cmap.php b/applications/core/lib/Zend/Pdf/Cmap.php
new file mode 100644
index 0000000..dd61254
--- /dev/null
+++ b/applications/core/lib/Zend/Pdf/Cmap.php
@@ -0,0 +1,341 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to [email protected] so we can send you a copy immediately.
+ *
+ * @package Zend_Pdf
+ * @subpackage Fonts
+ * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+
+/** Zend_Pdf_Cmap_ByteEncoding */
+require_once 'Zend/Pdf/Cmap/ByteEncoding.php';
+
+/** Zend_Pdf_Cmap_ByteEncoding_Static */
+require_once 'Zend/Pdf/Cmap/ByteEncoding/Static.php';
+
+/** Zend_Pdf_Cmap_SegmentToDelta */
+require_once 'Zend/Pdf/Cmap/SegmentToDelta.php';
+
+/** Zend_Pdf_Cmap_TrimmedTable */
+require_once 'Zend/Pdf/Cmap/TrimmedTable.php';
+
+/**
+ * Abstract helper class for {@link Zend_Pdf_Resource_Font} which manages font
+ * character maps.
+ *
+ * Defines the public interface for concrete subclasses which are responsible
+ * for mapping Unicode characters to the font's glyph numbers. Also provides
+ * shared utility methods.
+ *
+ * Cmap objects should ordinarily be obtained through the factory method
+ * {@link cmapWithTypeData()}.
+ *
+ * The supported character map types are those found in the OpenType spec. For
+ * additional detail on the internal binary format of these tables, see:
+ * <ul>
+ * <li>{@link http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6cmap.html}
+ * <li>{@link http://www.microsoft.com/OpenType/OTSpec/cmap.htm}
+ * <li>{@link http://partners.adobe.com/public/developer/opentype/index_cmap.html}
+ * </ul>
+ *
+ * @todo Write code for Zend_Pdf_FontCmap_HighByteMapping class.
+ * @todo Write code for Zend_Pdf_FontCmap_MixedCoverage class.
+ * @todo Write code for Zend_Pdf_FontCmap_TrimmedArray class.
+ * @todo Write code for Zend_Pdf_FontCmap_SegmentedCoverage class.
+ *
+ * @package Zend_Pdf
+ * @subpackage Fonts
+ * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license http://framework.zend.com/license/new-bsd New BSD License
+ */
+abstract class Zend_Pdf_Cmap
+{
+ /**** Class Constants ****/
+
+
+ /* Cmap Table Types */
+
+ /**
+ * Byte Encoding character map table type.
+ */
+ const TYPE_BYTE_ENCODING = 0x00;
+
+ /**
+ * High Byte Mapping character map table type.
+ */
+ const TYPE_HIGH_BYTE_MAPPING = 0x02;
+
+ /**
+ * Segment Value to Delta Mapping character map table type.
+ */
+ const TYPE_SEGMENT_TO_DELTA = 0x04;
+
+ /**
+ * Trimmed Table character map table type.
+ */
+ const TYPE_TRIMMED_TABLE = 0x06;
+
+ /**
+ * Mixed Coverage character map table type.
+ */
+ const TYPE_MIXED_COVERAGE = 0x08;
+
+ /**
+ * Trimmed Array character map table type.
+ */
+ const TYPE_TRIMMED_ARRAY = 0x0a;
+
+ /**
+ * Segmented Coverage character map table type.
+ */
+ const TYPE_SEGMENTED_COVERAGE = 0x0c;
+
+ /**
+ * Static Byte Encoding character map table type. Variant of
+ * {@link TYPE_BYTEENCODING}.
+ */
+ const TYPE_BYTE_ENCODING_STATIC = 0xf1;
+
+ /**
+ * Unknown character map table type.
+ */
+ const TYPE_UNKNOWN = 0xff;
+
+
+ /* Special Glyph Names */
+
+ /**
+ * Glyph representing missing characters.
+ */
+ const MISSING_CHARACTER_GLYPH = 0x00;
+
+
+
+ /**** Public Interface ****/
+
+
+ /* Factory Methods */
+
+ /**
+ * Instantiates the appropriate concrete subclass based on the type of cmap
+ * table and returns the instance.
+ *
+ * The cmap type must be one of the following values:
+ * <ul>
+ * <li>{@link Zend_Pdf_Cmap::TYPE_BYTE_ENCODING}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_HIGH_BYTE_MAPPING}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_MIXED_COVERAGE}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_TRIMMED_ARRAY}
+ * <li>{@link Zend_Pdf_Cmap::TYPE_SEGMENTED_COVERAGE}
+ * </ul>
+ *
+ * Throws an exception if the table type is invalid or the cmap table data
+ * cannot be validated.
+ *
+ * @param integer $cmapType Type of cmap.
+ * @param mixed $cmapData Cmap table data. Usually a string or array.
+ * @return Zend_Pdf_Cmap
+ * @throws Zend_Pdf_Exception
+ */
+ public static function cmapWithTypeData($cmapType, $cmapData)
+ {
+ switch ($cmapType) {
+ case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING:
+ return new Zend_Pdf_Cmap_ByteEncoding($cmapData);
+
+ case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC:
+ return new Zend_Pdf_Cmap_ByteEncoding_Static($cmapData);
+
+ case Zend_Pdf_Cmap::TYPE_HIGH_BYTE_MAPPING:
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception('High byte mapping cmap currently unsupported',
+ Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);
+
+ case Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA:
+ return new Zend_Pdf_Cmap_SegmentToDelta($cmapData);
+
+ case Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE:
+ return new Zend_Pdf_Cmap_TrimmedTable($cmapData);
+
+ case Zend_Pdf_Cmap::TYPE_MIXED_COVERAGE:
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception('Mixed coverage cmap currently unsupported',
+ Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);
+
+ case Zend_Pdf_Cmap::TYPE_TRIMMED_ARRAY:
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception('Trimmed array cmap currently unsupported',
+ Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);
+
+ case Zend_Pdf_Cmap::TYPE_SEGMENTED_COVERAGE:
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception('Segmented coverage cmap currently unsupported',
+ Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);
+
+ default:
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception("Unknown cmap type: $cmapType",
+ Zend_Pdf_Exception::CMAP_UNKNOWN_TYPE);
+ }
+ }
+
+
+ /* Abstract Methods */
+
+ /**
+ * Object constructor
+ *
+ * Parses the raw binary table data. Throws an exception if the table is
+ * malformed.
+ *
+ * @param string $cmapData Raw binary cmap table data.
+ * @throws Zend_Pdf_Exception
+ */
+ abstract public function __construct($cmapData);
+
+ /**
+ * Returns an array of glyph numbers corresponding to the Unicode characters.
+ *
+ * If a particular character doesn't exist in this font, the special 'missing
+ * character glyph' will be substituted.
+ *
+ * See also {@link glyphNumberForCharacter()}.
+ *
+ * @param array $characterCodes Array of Unicode character codes (code points).
+ * @return array Array of glyph numbers.
+ */
+ abstract public function glyphNumbersForCharacters($characterCodes);
+
+ /**
+ * Returns the glyph number corresponding to the Unicode character.
+ *
+ * If a particular character doesn't exist in this font, the special 'missing
+ * character glyph' will be substituted.
+ *
+ * See also {@link glyphNumbersForCharacters()} which is optimized for bulk
+ * operations.
+ *
+ * @param integer $characterCode Unicode character code (code point).
+ * @return integer Glyph number.
+ */
+ abstract public function glyphNumberForCharacter($characterCode);
+
+ /**
+ * Returns an array containing the Unicode characters that have entries in
+ * this character map.
+ *
+ * @return array Unicode character codes.
+ */
+ abstract public function getCoveredCharacters();
+
+ /**
+ * Returns an array containing the glyphs numbers that have entries in this character map.
+ * Keys are Unicode character codes (integers)
+ *
+ * This functionality is partially covered by glyphNumbersForCharacters(getCoveredCharacters())
+ * call, but this method do it in more effective way (prepare complete list instead of searching
+ * glyph for each character code).
+ *
+ * @internal
+ * @return array Array representing <Unicode character code> => <glyph number> pairs.
+ */
+ abstract public function getCoveredCharactersGlyphs();
+
+
+ /**** Internal Methods ****/
+
+
+ /* Internal Utility Methods */
+
+ /**
+ * Extracts a signed 2-byte integer from a string.
+ *
+ * Integers are always big-endian. Throws an exception if the index is out
+ * of range.
+ *
+ * @param string &$data
+ * @param integer $index Position in string of integer.
+ * @return integer
+ * @throws Zend_Pdf_Exception
+ */
+ protected function _extractInt2(&$data, $index)
+ {
+ if (($index < 0) | (($index + 1) > strlen($data))) {
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception("Index out of range: $index",
+ Zend_Pdf_Exception::INDEX_OUT_OF_RANGE);
+ }
+ $number = ord($data[$index]);
+ if (($number & 0x80) == 0x80) { // negative
+ $number = ~((((~ $number) & 0xff) << 8) | ((~ ord($data[++$index])) & 0xff));
+ } else {
+ $number = ($number << 8) | ord($data[++$index]);
+ }
+ return $number;
+ }
+
+ /**
+ * Extracts an unsigned 2-byte integer from a string.
+ *
+ * Integers are always big-endian. Throws an exception if the index is out
+ * of range.
+ *
+ * @param string &$data
+ * @param integer $index Position in string of integer.
+ * @return integer
+ * @throws Zend_Pdf_Exception
+ */
+ protected function _extractUInt2(&$data, $index)
+ {
+ if (($index < 0) | (($index + 1) > strlen($data))) {
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception("Index out of range: $index",
+ Zend_Pdf_Exception::INDEX_OUT_OF_RANGE);
+ }
+ $number = (ord($data[$index]) << 8) | ord($data[++$index]);
+ return $number;
+ }
+
+ /**
+ * Extracts an unsigned 4-byte integer from a string.
+ *
+ * Integers are always big-endian. Throws an exception if the index is out
+ * of range.
+ *
+ * NOTE: If you ask for a 4-byte unsigned integer on a 32-bit machine, the
+ * resulting value WILL BE SIGNED because PHP uses signed integers internally
+ * for everything. To guarantee portability, be sure to use bitwise or
+ * similar operators on large integers!
+ *
+ * @param string &$data
+ * @param integer $index Position in string of integer.
+ * @return integer
+ * @throws Zend_Pdf_Exception
+ */
+ protected function _extractUInt4(&$data, $index)
+ {
+ if (($index < 0) | (($index + 3) > strlen($data))) {
+ require_once 'Zend/Pdf/Exception.php';
+ throw new Zend_Pdf_Exception("Index out of range: $index",
+ Zend_Pdf_Exception::INDEX_OUT_OF_RANGE);
+ }
+ $number = (ord($data[$index]) << 24) | (ord($data[++$index]) << 16) |
+ (ord($data[++$index]) << 8) | ord($data[++$index]);
+ return $number;
+ }
+
+}