summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-01-17 22:50:15 +0000
committerKarl Berry <karl@freefriends.org>2018-01-17 22:50:15 +0000
commite7dfe5ab98e759081fc73990ed6c1ac6910a105d (patch)
tree1635f79c86856a6aa57a45b8b952b651ef9fcba9 /Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
parentae542350b1e3add10d4ee3d7b68f610132f31a50 (diff)
dvisvgm 2.3.1 (patched)
git-svn-id: svn://tug.org/texlive/trunk@46352 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp62
1 files changed, 34 insertions, 28 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
index 01f18f41690..889e070b263 100644
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
+++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/Font.cpp
@@ -2,7 +2,7 @@
** Font.cpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2017 Martin Gieseking <martin.gieseking@uos.de> **
+** Copyright (C) 2005-2018 Martin Gieseking <martin.gieseking@uos.de> **
** **
** This program is free software; you can redistribute it and/or **
** modify it under the terms of the GNU General Public License as **
@@ -18,7 +18,6 @@
** along with this program; if not, see <http://www.gnu.org/licenses/>. **
*************************************************************************/
-#include <config.h>
#include <cstdlib>
#include <fstream>
#include <set>
@@ -33,6 +32,7 @@
#include "SignalHandler.hpp"
#include "Subfont.hpp"
#include "Unicode.hpp"
+#include "utility.hpp"
using namespace std;
@@ -48,7 +48,7 @@ uint32_t Font::unicode (uint32_t c) const {
const FontEncoding* Font::encoding () const {
if (const FontMap::Entry *entry = fontMapEntry())
return FontEncoding::encoding(entry->encname);
- return 0;
+ return nullptr;
}
@@ -110,14 +110,14 @@ TFMFont::TFMFont (const string &name, uint32_t cs, double ds, double ss)
const FontMetrics* TFMFont::getMetrics () const {
if (!_metrics) {
try {
- _metrics.reset(FontMetrics::read(_fontname.c_str()));
+ _metrics = FontMetrics::read(_fontname);
if (!_metrics) {
- _metrics.reset(new NullFontMetric);
+ _metrics = util::make_unique<NullFontMetric>();
Message::wstream(true) << "can't find "+_fontname+".tfm\n";
}
}
catch (FontMetricException &e) {
- _metrics.reset(new NullFontMetric);
+ _metrics = util::make_unique<NullFontMetric>();
Message::wstream(true) << e.what() << " in " << _fontname << ".tfm\n";
}
}
@@ -127,18 +127,18 @@ const FontMetrics* TFMFont::getMetrics () const {
double TFMFont::charWidth (int c) const {
double w = getMetrics() ? getMetrics()->getCharWidth(c) : 0;
- if (style()) {
+ if (style())
w *= style()->extend;
- w += fabs(style()->slant*charHeight(c)); // slant := tan(phi) = dx/height
- }
return w;
}
double TFMFont::italicCorr (int c) const {
double w = getMetrics() ? getMetrics()->getItalicCorr(c) : 0;
- if (style())
+ if (style()) {
+ w += abs(style()->slant*charHeight(c)); // slant := tan(phi) = dx/height
w *= style()->extend;
+ }
return w;
}
@@ -164,13 +164,13 @@ double PhysicalFont::METAFONT_MAG = 4;
FontCache PhysicalFont::_cache;
-Font* PhysicalFont::create (const string &name, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type) {
- return new PhysicalFontImpl(name, 0, checksum, dsize, ssize, type);
+unique_ptr<Font> PhysicalFont::create (const string &name, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type) {
+ return unique_ptr<PhysicalFontImpl>(new PhysicalFontImpl(name, 0, checksum, dsize, ssize, type));
}
-Font* PhysicalFont::create (const string &name, int fontindex, uint32_t checksum, double dsize, double ssize) {
- return new PhysicalFontImpl(name, fontindex, checksum, dsize, ssize, PhysicalFont::Type::TTC);
+unique_ptr<Font> PhysicalFont::create (const string &name, int fontindex, uint32_t checksum, double dsize, double ssize) {
+ return unique_ptr<PhysicalFontImpl>(new PhysicalFontImpl(name, fontindex, checksum, dsize, ssize, PhysicalFont::Type::TTC));
}
@@ -326,7 +326,7 @@ bool PhysicalFont::getGlyph (int c, GraphicsPath<int32_t> &glyph, GFGlyphTracer:
const Glyph *cached_glyph=0;
if (CACHE_PATH) {
_cache.write(CACHE_PATH);
- _cache.read(name().c_str(), CACHE_PATH);
+ _cache.read(name(), CACHE_PATH);
cached_glyph = _cache.getGlyph(c);
}
if (cached_glyph) {
@@ -399,7 +399,7 @@ int PhysicalFont::traceAllGlyphs (bool includeCached, GFGlyphTracer::Callback *c
string gfname;
Glyph glyph;
if (createGF(gfname)) {
- _cache.read(name().c_str(), CACHE_PATH);
+ _cache.read(name(), CACHE_PATH);
double ds = getMetrics() ? getMetrics()->getDesignSize() : 1;
GFGlyphTracer tracer(gfname, unitsPerEm()/ds, cb);
tracer.setGlyph(glyph);
@@ -463,8 +463,8 @@ bool PhysicalFont::getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical
}
-Font* VirtualFont::create (const string &name, uint32_t checksum, double dsize, double ssize) {
- return new VirtualFontImpl(name, checksum, dsize, ssize);
+unique_ptr<Font> VirtualFont::create (const string &name, uint32_t checksum, double dsize, double ssize) {
+ return unique_ptr<VirtualFontImpl>(new VirtualFontImpl(name, checksum, dsize, ssize));
}
@@ -473,7 +473,7 @@ Font* VirtualFont::create (const string &name, uint32_t checksum, double dsize,
PhysicalFontImpl::PhysicalFontImpl (const string &name, int fontindex, uint32_t cs, double ds, double ss, PhysicalFont::Type type)
: TFMFont(name, cs, ds, ss),
- _filetype(type), _fontIndex(fontindex), _fontMapEntry(Font::fontMapEntry()), _encodingPair(Font::encoding()), _localCharMap(0)
+ _filetype(type), _fontIndex(fontindex), _encodingPair(Font::encoding())
{
}
@@ -483,13 +483,12 @@ PhysicalFontImpl::~PhysicalFontImpl () {
_cache.write(CACHE_PATH);
if (!KEEP_TEMP_FILES)
tidy();
- delete _localCharMap;
}
const FontEncoding* PhysicalFontImpl::encoding () const {
if (!_encodingPair.enc1())
- return 0;
+ return nullptr;
return &_encodingPair;
}
@@ -506,7 +505,8 @@ bool PhysicalFontImpl::findAndAssignBaseFontMap () {
}
else if (type() != Type::MF) {
FontEngine::instance().setFont(*this);
- if ((_localCharMap = FontEngine::instance().createCustomToUnicodeMap()) != 0)
+ _localCharMap = FontEngine::instance().createCustomToUnicodeMap();
+ if (_localCharMap)
_charmapID = FontEngine::instance().setCustomCharMap();
else
_charmapID = FontEngine::instance().setUnicodeCharMap();
@@ -547,14 +547,20 @@ uint32_t PhysicalFontImpl::unicode (uint32_t c) const {
}
+const FontStyle* PhysicalFontImpl::style () const {
+ if (auto *entry = fontMapEntry())
+ return &entry->style;
+ return nullptr;
+}
+
+
/** Delete all temporary font files created by Metafont. */
void PhysicalFontImpl::tidy () const {
if (type() == Type::MF) {
- const char *ext[] = {"gf", "tfm", "log", 0};
string fname = FileSystem::tmpdir()+name();
- for (const char **p=ext; *p; ++p) {
- if (FileSystem::exists(fname+"."+(*p)))
- FileSystem::remove(fname+"."+(*p));
+ for (const char *ext : {"gf", "tfm", "log"}) {
+ if (FileSystem::exists(fname+"."+ext))
+ FileSystem::remove(fname+"."+ext);
}
}
}
@@ -562,10 +568,10 @@ void PhysicalFontImpl::tidy () const {
//////////////////////////////////////////////////////////////////////////////
string NativeFont::uniqueName (const string &path, const FontStyle &style) {
- static map<string, int> ids;
+ static unordered_map<string, int> ids;
ostringstream oss;
oss << path << "b" << style.bold << "e" << style.extend << "s" << style.slant;
- map<string, int>::iterator it = ids.find(oss.str());
+ auto it = ids.find(oss.str());
int id = ids.size();
if (it == ids.end())
ids[oss.str()] = id;