cmap.php

来自「Bug tracker, and reporter.」· PHP 代码 · 共 338 行

PHP
338
字号
<?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 license@zend.com 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_Exception */require_once 'Zend/Pdf/Exception.php';/** 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:                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:                throw new Zend_Pdf_Exception('Mixed coverage cmap currently unsupported',                                             Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);            case Zend_Pdf_Cmap::TYPE_TRIMMED_ARRAY:                throw new Zend_Pdf_Exception('Trimmed array cmap currently unsupported',                                             Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);            case Zend_Pdf_Cmap::TYPE_SEGMENTED_COVERAGE:                throw new Zend_Pdf_Exception('Segmented coverage cmap currently unsupported',                                             Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED);            default:                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))) {            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))) {            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))) {            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;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?