diff options
| author | BLANC Jean-Baptiste <[email protected]> | 2009-06-19 15:09:07 +0200 |
|---|---|---|
| committer | BLANC Jean-Baptiste <[email protected]> | 2009-06-19 15:09:07 +0200 |
| commit | 4eee7bf71fafccdc70de7b9342f077a42ec80bcf (patch) | |
| tree | 5d4140050ed36ff53bf6bfb07514e4d0818a0012 /applications/core/lib/Zend/Pdf/Cmap.php | |
| parent | ab70f9c5a115badd5fa0c89e8f98662617a24fa9 (diff) | |
| download | tbk-master.tar.gz | |
Diffstat (limited to 'applications/core/lib/Zend/Pdf/Cmap.php')
| -rw-r--r-- | applications/core/lib/Zend/Pdf/Cmap.php | 341 |
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; + } + +} |
