summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/FontMetrics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src/FontMetrics.cpp')
-rw-r--r--dviware/dvisvgm/src/FontMetrics.cpp39
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;
}