| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | <?phpnamespace PhpOffice\PhpSpreadsheet\Writer\Xls;use PhpOffice\PhpSpreadsheet\Shared\StringHelper;class Font{    /**     * Color index.     *     * @var int     */    private $colorIndex;    /**     * Font.     *     * @var \PhpOffice\PhpSpreadsheet\Style\Font     */    private $font;    /**     * Constructor.     *     * @param \PhpOffice\PhpSpreadsheet\Style\Font $font     */    public function __construct(\PhpOffice\PhpSpreadsheet\Style\Font $font)    {        $this->colorIndex = 0x7FFF;        $this->font = $font;    }    /**     * Set the color index.     *     * @param int $colorIndex     */    public function setColorIndex($colorIndex)    {        $this->colorIndex = $colorIndex;    }    /**     * Get font record data.     *     * @return string     */    public function writeFont()    {        $font_outline = 0;        $font_shadow = 0;        $icv = $this->colorIndex; // Index to color palette        if ($this->font->getSuperscript()) {            $sss = 1;        } elseif ($this->font->getSubscript()) {            $sss = 2;        } else {            $sss = 0;        }        $bFamily = 0; // Font family        $bCharSet = \PhpOffice\PhpSpreadsheet\Shared\Font::getCharsetFromFontName($this->font->getName()); // Character set        $record = 0x31; // Record identifier        $reserved = 0x00; // Reserved        $grbit = 0x00; // Font attributes        if ($this->font->getItalic()) {            $grbit |= 0x02;        }        if ($this->font->getStrikethrough()) {            $grbit |= 0x08;        }        if ($font_outline) {            $grbit |= 0x10;        }        if ($font_shadow) {            $grbit |= 0x20;        }        $data = pack(            'vvvvvCCCC',            // Fontsize (in twips)            $this->font->getSize() * 20,            $grbit,            // Colour            $icv,            // Font weight            self::mapBold($this->font->getBold()),            // Superscript/Subscript            $sss,            self::mapUnderline($this->font->getUnderline()),            $bFamily,            $bCharSet,            $reserved        );        $data .= StringHelper::UTF8toBIFF8UnicodeShort($this->font->getName());        $length = strlen($data);        $header = pack('vv', $record, $length);        return $header . $data;    }    /**     * Map to BIFF5-BIFF8 codes for bold.     *     * @param bool $bold     *     * @return int     */    private static function mapBold($bold)    {        if ($bold) {            return 0x2BC; //  700 = Bold font weight        }        return 0x190; //  400 = Normal font weight    }    /**     * Map of BIFF2-BIFF8 codes for underline styles.     *     * @var array of int     */    private static $mapUnderline = [        \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_NONE => 0x00,        \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE => 0x01,        \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLE => 0x02,        \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLEACCOUNTING => 0x21,        \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLEACCOUNTING => 0x22,    ];    /**     * Map underline.     *     * @param string $underline     *     * @return int     */    private static function mapUnderline($underline)    {        if (isset(self::$mapUnderline[$underline])) {            return self::$mapUnderline[$underline];        }        return 0x00;    }}
 |