diff options
Diffstat (limited to 'dviware/dvisvgm/src/FontMetrics.cpp')
-rw-r--r-- | dviware/dvisvgm/src/FontMetrics.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/dviware/dvisvgm/src/FontMetrics.cpp b/dviware/dvisvgm/src/FontMetrics.cpp index 6147f36ab1..0edc1a6a79 100644 --- a/dviware/dvisvgm/src/FontMetrics.cpp +++ b/dviware/dvisvgm/src/FontMetrics.cpp @@ -23,19 +23,42 @@ #include "FileFinder.hpp" #include "FontMetrics.hpp" #include "JFM.hpp" +#include "OFM.hpp" #include "utility.hpp" using namespace std; +static inline uint16_t read_uint16 (istream &is) { + uint16_t val = 256*is.get(); + return val + is.get(); +} + +/** Reads the font metrics for a given font name from a TFM, JFM, or OFM file. + * @param[in] fontname name of font to get the metrics for. + * @return pointer to object that holds the font metrics, or nullptr if no matching file was found */ unique_ptr<FontMetrics> FontMetrics::read (const string &fontname) { - const char *path = FileFinder::instance().lookup(fontname + ".tfm"); + unique_ptr<FontMetrics> metrics; + const char *path = FileFinder::instance().lookup(fontname + ".ofm", false); + if (!path) + path = FileFinder::instance().lookup(fontname + ".tfm"); ifstream ifs(path, ios::binary); - if (!ifs) - return unique_ptr<FontMetrics>(); - uint16_t id = 256*ifs.get(); - id += ifs.get(); - if (id == 9 || id == 11) // Japanese font metric file? - return util::make_unique<JFM>(ifs); - return util::make_unique<TFM>(ifs); + if (ifs) { + auto id = read_uint16(ifs); + if (id == 0) { // OFM? + auto ofmLevel = read_uint16(ifs); + if (ofmLevel == 0) + metrics = util::make_unique<OFM0>(); + else if (ofmLevel == 1) + metrics = util::make_unique<OFM1>(); + else + throw FontMetricException("OFM level "+to_string(ofmLevel)+" not supported"); + } + else if (id == 9 || id == 11) // Japanese font metric file? + metrics = util::make_unique<JFM>(); + else + metrics = util::make_unique<TFM>(); + metrics->read(ifs); + } + return metrics; } |