summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src')
-rw-r--r--dviware/dvisvgm/src/Bezier.hpp4
-rw-r--r--dviware/dvisvgm/src/FontManager.cpp8
-rw-r--r--dviware/dvisvgm/src/FontManager.hpp3
-rw-r--r--dviware/dvisvgm/src/PDFHandler.cpp42
-rw-r--r--dviware/dvisvgm/src/PDFHandler.hpp2
-rw-r--r--dviware/dvisvgm/src/RangeMap.cpp2
-rw-r--r--dviware/dvisvgm/src/fonts/Base14Fonts.cpp5
-rw-r--r--dviware/dvisvgm/src/fonts/Base14Fonts.hpp2
8 files changed, 33 insertions, 35 deletions
diff --git a/dviware/dvisvgm/src/Bezier.hpp b/dviware/dvisvgm/src/Bezier.hpp
index 9036bfcd55..f79180ccb1 100644
--- a/dviware/dvisvgm/src/Bezier.hpp
+++ b/dviware/dvisvgm/src/Bezier.hpp
@@ -32,7 +32,7 @@ class QuadBezier {
QuadBezier ();
QuadBezier (const DPair &p0, const DPair &p1, const DPair &p2);
void setPoints (const DPair &p0, const DPair &p1, const DPair &p2);
- constexpr const DPair& point (int i) const {return _points[i];}
+ const DPair& point (int i) const {return _points[i];}
DPair valueAt (double t) const;
DPair derivativeAt (double t) const;
double arclen (double t=1.0) const;
@@ -57,7 +57,7 @@ class CubicBezier {
void subdivide (double t, CubicBezier *bezier1, CubicBezier *bezier2) const;
CubicBezier& transform (const Matrix &matrix);
int approximate (double delta, std::vector<DPair> &p, std::vector<double> *t=nullptr) const;
- constexpr const DPair& point (int i) const {return _points[i];}
+ const DPair& point (int i) const {return _points[i];}
int reduceDegree (double delta, std::vector<DPair> &p) const;
std::vector<QuadBezier> toQuadBeziers (double delta, std::vector<double> *startParams=nullptr) const;
BoundingBox getBBox () const;
diff --git a/dviware/dvisvgm/src/FontManager.cpp b/dviware/dvisvgm/src/FontManager.cpp
index 7eeaadeb9d..bc6f88d322 100644
--- a/dviware/dvisvgm/src/FontManager.cpp
+++ b/dviware/dvisvgm/src/FontManager.cpp
@@ -325,18 +325,18 @@ int FontManager::registerFont (uint32_t fontnum, const string &filename, int fon
/** Registers a native font that is referenced by its name instead of a DVI font number.
* @param[in] fname filename/path of the font file
+ * @param[in] fontname font name used if the font file doesn't provide one
* @param[in] ptsize font size in PS points
* return global ID assigned to the font */
-int FontManager::registerFont (const std::string &fname, double ptsize) {
+int FontManager::registerFont (const string &fname, string fontname, double ptsize) {
if (fname.empty())
return -1;
- string fontname;
if (fname.size() > 6 && fname.substr(0,6) == "sys://") {
fontname = fname.substr(6);
if (!find_base14_font(fontname))
return -1;
}
- else if (!FileSystem::exists(fname) || (fontname = FontEngine::instance().getPSName(fname)).empty())
+ else if (!FileSystem::exists(fname) || (fontname.empty() && (fontname = FontEngine::instance().getPSName(fname)).empty()))
return -1;
int id = fontID(fontname, ptsize);
if (id >= 0)
@@ -345,7 +345,7 @@ int FontManager::registerFont (const std::string &fname, double ptsize) {
id = fontID(fontname);
if (id < 0) {
nativeFont = util::make_unique<NativeFontImpl>(fname, fontname, ptsize);
- _name2id.emplace(std::move(fontname), _fonts.size());
+ _name2id.emplace(std::move(fontname), int(_fonts.size()));
}
else {
auto *nf = font_cast<NativeFont*>(getFontById(id));
diff --git a/dviware/dvisvgm/src/FontManager.hpp b/dviware/dvisvgm/src/FontManager.hpp
index eeaa1949de..503813a86d 100644
--- a/dviware/dvisvgm/src/FontManager.hpp
+++ b/dviware/dvisvgm/src/FontManager.hpp
@@ -57,8 +57,7 @@ class FontManager {
int registerFont (uint32_t fontnum, const std::string &fontname, uint32_t checksum, double dsize, double scale);
int registerFont (uint32_t fontnum, const std::string &fname, double ptsize, const FontStyle &style, Color color);
int registerFont (uint32_t fontnum, const std::string &fname, int fontIndex, double ptsize, const FontStyle &style, Color color);
-// int registerFont (const std::string &fname, int fontIndex, double ptsize, const FontStyle &style, Color color);
- int registerFont (const std::string &fname, double ptsize);
+ int registerFont (const std::string &fname, std::string fontname, double ptsize);
Font* getFont (int n) const;
Font* getFont (const std::string &name) const;
Font* getFont (const std::string &name, double ptsize);
diff --git a/dviware/dvisvgm/src/PDFHandler.cpp b/dviware/dvisvgm/src/PDFHandler.cpp
index 9703124e2c..ba88e69852 100644
--- a/dviware/dvisvgm/src/PDFHandler.cpp
+++ b/dviware/dvisvgm/src/PDFHandler.cpp
@@ -139,19 +139,6 @@ string PDFHandler::mutoolVersion () {
}
-/** Returns the bounding box of a selected PDF page. */
-BoundingBox PDFHandler::bbox (string &fname, int pageno) {
- BoundingBox bbox;
- string arraystr = mtShow(fname, "pages/" + to_string(pageno) + "/MediaBox");
- if (arraystr.substr(0, 4) == "null")
- arraystr = mtShow(fname, "pages/" + to_string(pageno) + "/Parent/MediaBox");
- auto vec = parse_pdf_array<double>(arraystr);
- if (vec.size() == 4)
- bbox = BoundingBox(vec[0], vec[1], vec[2], vec[3]);
- return bbox;
-}
-
-
/** Converts a single page of a PDF file to SVG. If no context element is given,
* the SVG page contents are added to a page group element of the SVG tree.
* Otherwise, they are added to the context element which is not inserted into
@@ -220,15 +207,12 @@ void PDFHandler::finishFile () {
void PDFHandler::initPage (int pageno, unique_ptr<SVGElement> context) {
_pageno = pageno;
- _bbox = bbox(_fname, pageno);
- if (context) {
+ if (!context)
+ _svg->newPage(_pageno);
+ else {
_context = context.get();
_svg->pushPageContext(std::move(context));
}
- else {
- _svg->newPage(_pageno);
- _svg->setBBox(_bbox);
- }
// collect sequence of images referenced on current page
collectObjects();
_imgSeq.clear();
@@ -287,7 +271,8 @@ void PDFHandler::elementClosed (XMLElement *trcElement) {
struct Handler {
const char *name;
void (PDFHandler::*func)(XMLElement*);
- } handlers[9] = {
+ } handlers[10] = {
+ {"page", &PDFHandler::doPage},
{"stroke_path", &PDFHandler::doStrokePath},
{"fill_path", &PDFHandler::doFillPath},
{"fill_image", &PDFHandler::doFillImage},
@@ -309,6 +294,13 @@ void PDFHandler::elementClosed (XMLElement *trcElement) {
}
+void PDFHandler::doPage (XMLElement *trcPageElement) {
+ auto vec = parse_attr_value<vector<double>>(trcPageElement, "mediabox");
+ if (vec.size() == 4)
+ _bbox = BoundingBox(vec[0], vec[1], vec[2], vec[3]);
+}
+
+
/** Returns a color object from color data given in the trace XML.
* @param[in] colorspace currently supported: DeviceGray, DeviceRGB, DeviceCMYK
* @param[in] value color components depending on color space */
@@ -645,8 +637,9 @@ void PDFHandler::doFillText (XMLElement *trcFillTextElement) {
filename = it->second.fname;
if (filename.empty())
filename = "sys://"+fontname;
- double ptsize = abs(trm[0]);
- int fontID = FontManager::instance().registerFont(filename, ptsize);
+ double ptsize = matrix_extent({trm[0], trm[1], 0, trm[2], trm[3]});
+ ptsize = round(10*ptsize)/10;
+ int fontID = FontManager::instance().registerFont(filename, fontname, ptsize);
if (fontID >= 0) {
auto font = font_cast<NativeFont*>(FontManager::instance().getFontById(fontID));
if (font != _currentFont) {
@@ -789,7 +782,6 @@ void PDFHandler::collectObjects () {
_objDict = parse_pdf_dict<ObjID>(mtShow("pages/" + to_string(_pageno) + "/Resources/XObject"));
// replace referenced font IDs by actual IDs used for extracted fonts
for (auto &entry : _objDict) {
- string objtype = mtShow(to_string(entry.second.num)+"/Type", SearchPattern(R"(/(\w+))", "$1"));
// store filenames of non-font object in object map
auto fnameIt = _extractedFiles.find(entry.second.num);
entry.second.fname = fnameIt != _extractedFiles.end() ? tmpdir+fnameIt->second : "";
@@ -798,6 +790,10 @@ void PDFHandler::collectObjects () {
if (entry.second.substr(0, 5) == "font-") {
string filepath = tmpdir+entry.second; // path to font file
string fontname = strip_subset_prefix(FontEngine::instance().getPSName(filepath));
+ // If the extracted font file doesn't contain a font name,
+ // try to get it from the corresponding PDF object.
+ if (fontname.empty())
+ fontname = mtShow(to_string(entry.first)+"/FontName", SearchPattern(R"(/(\w+))", "$1"));
_objDict.emplace(fontname, ObjID(entry.first, 0, filepath));
}
}
diff --git a/dviware/dvisvgm/src/PDFHandler.hpp b/dviware/dvisvgm/src/PDFHandler.hpp
index fd34ce0568..3400a1d69d 100644
--- a/dviware/dvisvgm/src/PDFHandler.hpp
+++ b/dviware/dvisvgm/src/PDFHandler.hpp
@@ -57,7 +57,6 @@ class PDFHandler {
const BoundingBox& bbox () const {return _bbox;}
std::unique_ptr<SVGElement> convert (const std::string &fname, int pageno, std::unique_ptr<SVGElement> context=nullptr);
static std::string mutoolVersion ();
- static BoundingBox bbox (std::string &fname, int pageno);
static bool available () {return !mutoolVersion().empty();}
protected:
@@ -77,6 +76,7 @@ class PDFHandler {
void collectObjects ();
void elementOpened (XMLElement *trcElement);
void elementClosed (XMLElement *trcElement);
+ void doPage (XMLElement *trcPageElement);
void doClipPath (XMLElement *trcClipPathElement);
void doClipStrokePath (XMLElement *trcClipStrokePathElement);
void doClipText (XMLElement *trcClipTextElement);
diff --git a/dviware/dvisvgm/src/RangeMap.cpp b/dviware/dvisvgm/src/RangeMap.cpp
index bac95b3093..11489113f3 100644
--- a/dviware/dvisvgm/src/RangeMap.cpp
+++ b/dviware/dvisvgm/src/RangeMap.cpp
@@ -179,7 +179,7 @@ uint32_t RangeMap::valueAt (uint32_t c) const {
/** Returns the number of values mapped. */
size_t RangeMap::numValues () const {
- return std::accumulate(_ranges.begin(), _ranges.end(), 0, [](size_t sum, const Range &range) {
+ return std::accumulate(_ranges.begin(), _ranges.end(), size_t(0), [](size_t sum, const Range &range) {
return sum+range.max()-range.min()+1;
});
}
diff --git a/dviware/dvisvgm/src/fonts/Base14Fonts.cpp b/dviware/dvisvgm/src/fonts/Base14Fonts.cpp
index 07f4850bc1..6f316ffca9 100644
--- a/dviware/dvisvgm/src/fonts/Base14Fonts.cpp
+++ b/dviware/dvisvgm/src/fonts/Base14Fonts.cpp
@@ -2,7 +2,7 @@
** Base14Fonts.cpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> **
+** Copyright (C) 2005-2023 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 **
@@ -38,6 +38,9 @@ extern const MemoryFontData NimbusSans_Italic_cff;
extern const MemoryFontData NimbusSans_Regular_cff;
extern const MemoryFontData StandardSymbolsPS_cff;
+/** Returns the CFF font data for a given name of a Base 14 font.
+ * If 'fontname' doesn't specify one of the 14 PDF base fonts,
+ * the function returns nullptr. */
const MemoryFontData* find_base14_font (const string &fontname) {
struct FontData {
const char *name;
diff --git a/dviware/dvisvgm/src/fonts/Base14Fonts.hpp b/dviware/dvisvgm/src/fonts/Base14Fonts.hpp
index 4e410fdc61..8746f593d6 100644
--- a/dviware/dvisvgm/src/fonts/Base14Fonts.hpp
+++ b/dviware/dvisvgm/src/fonts/Base14Fonts.hpp
@@ -2,7 +2,7 @@
** Base14Fonts.hpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2022 Martin Gieseking <martin.gieseking@uos.de> **
+** Copyright (C) 2005-2023 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 **