summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/DVIReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src/DVIReader.cpp')
-rw-r--r--dviware/dvisvgm/src/DVIReader.cpp71
1 files changed, 54 insertions, 17 deletions
diff --git a/dviware/dvisvgm/src/DVIReader.cpp b/dviware/dvisvgm/src/DVIReader.cpp
index 417efe9304..0581ad25c3 100644
--- a/dviware/dvisvgm/src/DVIReader.cpp
+++ b/dviware/dvisvgm/src/DVIReader.cpp
@@ -19,8 +19,6 @@
*************************************************************************/
#include <algorithm>
-#include <cstdarg>
-#include <fstream>
#include <sstream>
#include "Color.hpp"
#include "DVIActions.hpp"
@@ -28,6 +26,7 @@
#include "Font.hpp"
#include "FontManager.hpp"
#include "HashFunction.hpp"
+#include "utility.hpp"
#include "VectorStream.hpp"
using namespace std;
@@ -504,26 +503,64 @@ void DVIReader::cmdFontNum (int len) {
}
+/** Parses a sequence of font attributes given as key1=val1;key2=val2;...;keyn=valn */
+static map<string,string> parse_font_attribs (const string &str) {
+ map<string,string> attribs;
+ if (!str.empty()) {
+ for (const string &attr : util::split(str, ";")) {
+ vector<string> keyval = util::split(attr, "=");
+ if (keyval.size() == 2)
+ attribs[keyval[0]] = keyval[1];
+ }
+ }
+ return attribs;
+}
+
+
/** Helper function to handle a font definition.
* @param[in] fontnum local font number
- * @param[in] name font name
+ * @param[in] name font name (or file path if enclosed in square brackets)
* @param[in] cs checksum to be compared with TFM checksum
- * @param[in] ds design size in PS point units
- * @param[in] ss scaled size in PS point units */
-const Font* DVIReader::defineFont (uint32_t fontnum, const string &name, uint32_t cs, double ds, double ss) {
+ * @param[in] dsize design size of font in PS point units
+ * @param[in] ssize scaled size of font in PS point units */
+const Font* DVIReader::defineFont (uint32_t fontnum, const string &name, uint32_t cs, double dsize, double ssize) {
FontManager &fm = FontManager::instance();
Font *font = fm.getFont(fontnum);
- if (!font) {
- int id = fm.registerFont(fontnum, name, cs, ds, ss);
- font = fm.getFontById(id);
- if (auto vf = dynamic_cast<VirtualFont*>(font)) {
- // read vf file, register its font and character definitions
- fm.enterVF(vf);
- ifstream ifs(vf->path(), ios::binary);
- VFReader vfReader(ifs);
- vfReader.replaceActions(this);
- vfReader.executeAll();
- fm.leaveVF();
+ if (!font && !name.empty()) { // font not registered yet?
+ if (name[0] == '[') { // LuaTeX native font reference?
+ size_t last = name.rfind(']');
+ if (last != string::npos) {
+ string path = name.substr(1, last-1);
+ FontStyle style;
+ int fontIndex=0;
+ if (name.size() > last && name[last+1] == ':') { // look for font attributes?
+ auto attribs = parse_font_attribs(name.substr(last+2));
+ auto it = attribs.begin();
+ if ((it = attribs.find("index")) != attribs.end())
+ fontIndex = stoi(it->second);
+ if ((it = attribs.find("embolden")) != attribs.end())
+ style.bold = stoi(it->second)/65536.0;
+ if ((it = attribs.find("extend")) != attribs.end())
+ style.extend = stoi(it->second)/65536.0;
+ if ((it = attribs.find("slant")) != attribs.end())
+ style.slant = stoi(it->second)/65536.0;
+ }
+ int id = fm.registerFont(fontnum, path, fontIndex, ssize, style, Color::BLACK);
+ font = fm.getFontById(id);
+ }
+ }
+ else { // TFM-based font specified by name
+ int id = fm.registerFont(fontnum, name, cs, dsize, ssize);
+ font = fm.getFontById(id);
+ if (auto vf = dynamic_cast<VirtualFont*>(font)) {
+ // read vf file, register its font and character definitions
+ fm.enterVF(vf);
+ ifstream ifs(vf->path(), ios::binary);
+ VFReader vfReader(ifs);
+ vfReader.replaceActions(this);
+ vfReader.executeAll();
+ fm.leaveVF();
+ }
}
}
return font;