diff options
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc')
-rw-r--r-- | Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc | 82 |
1 files changed, 37 insertions, 45 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc index 8a5484bf7eb..74af65d7cd2 100644 --- a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc +++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc @@ -2,7 +2,7 @@ /* cff.{cc,hh} -- Compact Font Format fonts * - * Copyright (c) 1998-2018 Eddie Kohler + * Copyright (c) 1998-2019 Eddie Kohler * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free @@ -326,17 +326,11 @@ static const uint8_t default_dict_cff_data[] = { 0, 0 }; -static const Cff::Dict & +static const Cff::Dict& default_dict() { - static Cff *cff; - static Cff::Font *cfffont; - if (!cfffont) { - cff = new Cff(String::make_stable((const char *) default_dict_cff_data, sizeof(default_dict_cff_data)), - 0, ErrorHandler::default_handler()); - cfffont = (Cff::Font *) cff->font(); - } - return cfffont->top_dict(); + static Cff cff(String::make_stable((const char*) default_dict_cff_data, sizeof(default_dict_cff_data)), 0, ErrorHandler::default_handler()); + return static_cast<Cff::Font*>(cff.font())->top_dict(); } @@ -360,6 +354,8 @@ Cff::~Cff() { for (int i = 0; i < _gsubrs_cs.size(); i++) delete _gsubrs_cs[i]; + for (int i = 0; i < _fonts.size(); ++i) + delete _fonts[i]; } /* @@ -500,25 +496,6 @@ Cff::sid_permstring(int sid) const } } -int -Cff::font_offset(int findex, int &offset, int &length) const -{ - if (findex < 0 || findex >= nfonts()) - return -ENOENT; - offset = _top_dict_index[findex] - _data; - length = _top_dict_index[findex + 1] - _top_dict_index[findex]; - return 0; -} - -int -Cff::font_offset(PermString name, int &offset, int &length) const -{ - for (int i = 0; i < _name_index.size(); i++) - if (_name_index[i] == name && name) - return font_offset(i, offset, length); - return -ENOENT; -} - Cff::FontParent * Cff::font(PermString font_name, ErrorHandler *errh) { @@ -529,24 +506,39 @@ Cff::font(PermString font_name, ErrorHandler *errh) return errh->error("invalid CFF"), (FontParent *) 0; // search for a font named 'font_name' - for (int i = 0; i < _name_index.size(); i++) - if (_name_index[i] && (!font_name || font_name == _name_index[i])) { - int td_offset = _top_dict_index[i] - _data; - int td_length = _top_dict_index[i + 1] - _top_dict_index[i]; - Dict top_dict(this, td_offset, td_length, errh, "Top DICT"); - if (!top_dict.ok()) - return 0; - else if (top_dict.has_first(oROS)) - return new Cff::CIDFont(this, _name_index[i], top_dict, errh); - else - return new Cff::Font(this, _name_index[i], top_dict, errh); - } + int findex; + for (findex = 0; findex < _name_index.size(); ++findex) { + if (_name_index[findex] + && (!font_name || font_name == _name_index[findex])) + break; + } + if (findex >= _name_index.size()) { + if (!font_name) + errh->error("no fonts in CFF"); + else + errh->error("font %<%s%> not found", font_name.c_str()); + return 0; + } + + // return font + for (int i = 0; i < _fonts.size(); ++i) + if (_fonts[i]->_font_index == findex) + return _fonts[i]; - if (!font_name) - errh->error("no fonts in CFF"); + int td_offset = _top_dict_index[findex] - _data; + int td_length = _top_dict_index[findex + 1] - _top_dict_index[findex]; + Dict top_dict(this, td_offset, td_length, errh, "Top DICT"); + if (!top_dict.ok()) + return 0; + + Cff::FontParent* fp; + if (top_dict.has_first(oROS)) + fp = new Cff::CIDFont(this, _name_index[findex], top_dict, errh); else - errh->error("font %<%s%> not found", font_name.c_str()); - return 0; + fp = new Cff::Font(this, _name_index[findex], top_dict, errh); + fp->_font_index = findex; + _fonts.push_back(fp); + return fp; } static inline int |