summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2016-07-04 22:07:54 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2016-07-04 22:07:54 +0000
commitab399d16f49b986d1de514b2fb8434872decf91d (patch)
tree6d3d0faca673d7aa1c0f48ca679ce7841a82e3df /Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
parentdd2749b37f7b6a9976869e29a028eeab80d686df (diff)
dvisvgm 1.16
git-svn-id: svn://tug.org/texlive/trunk@41628 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp113
1 files changed, 74 insertions, 39 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
index dbb8658069e..66042f70263 100644
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
+++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/TFM.cpp
@@ -22,6 +22,7 @@
#include <fstream>
#include <vector>
#include "FileFinder.h"
+#include "Length.h"
#include "Message.h"
#include "StreamReader.h"
#include "TFM.h"
@@ -30,70 +31,104 @@ using namespace std;
/** Reads a sequence of n TFM words (4 Bytes each).
- * @param[in] sr the TFM data is read from this object
+ * @param[in] reader the TFM data is read from this object
* @param[out] v the read words
* @param[in] n number of words to be read */
template <typename T>
-static void read_words (StreamReader &sr, vector<T> &v, unsigned n) {
+static void read_words (StreamReader &reader, vector<T> &v, unsigned n) {
v.clear();
v.resize(n);
for (unsigned i=0; i < n; i++)
- v[i] = sr.readUnsigned(4);
+ v[i] = reader.readUnsigned(4);
}
-/** Converts a TFM fix point value to double (PS point units). */
-static double fix2double (FixWord fix) {
- const double pt2bp = 72/72.27;
- return double(fix)/(1 << 20)*pt2bp;
+/** Converts a TFM fix point value to double. */
+static inline double fix2double (FixWord fix) {
+ return double(fix)/(1 << 20);
}
-TFM::TFM (istream &is) {
+TFM::TFM (istream &is) : _checksum(0), _firstChar(0), _lastChar(0), _designSize(0) {
+ if (!is)
+ return;
is.seekg(0);
- StreamReader sr(is);
- UInt16 lf = UInt16(sr.readUnsigned(2)); // length of entire file in 4 byte words
- UInt16 lh = UInt16(sr.readUnsigned(2)); // length of header in 4 byte words
- _firstChar= UInt16(sr.readUnsigned(2)); // smallest character code in font
- _lastChar = UInt16(sr.readUnsigned(2)); // largest character code in font
- UInt16 nw = UInt16(sr.readUnsigned(2)); // number of words in width table
- UInt16 nh = UInt16(sr.readUnsigned(2)); // number of words in height table
- UInt16 nd = UInt16(sr.readUnsigned(2)); // number of words in depth table
- UInt16 ni = UInt16(sr.readUnsigned(2)); // number of words in italic corr. table
- UInt16 nl = UInt16(sr.readUnsigned(2)); // number of words in lig/kern table
- UInt16 nk = UInt16(sr.readUnsigned(2)); // number of words in kern table
- UInt16 ne = UInt16(sr.readUnsigned(2)); // number of words in ext. char table
- UInt16 np = UInt16(sr.readUnsigned(2)); // number of font parameter words
+ StreamReader reader(is);
+ UInt16 lf = UInt16(reader.readUnsigned(2)); // length of entire file in 4 byte words
+ UInt16 lh = UInt16(reader.readUnsigned(2)); // length of header in 4 byte words
+ _firstChar= UInt16(reader.readUnsigned(2)); // smallest character code in font
+ _lastChar = UInt16(reader.readUnsigned(2)); // largest character code in font
+ UInt16 nw = UInt16(reader.readUnsigned(2)); // number of words in width table
+ UInt16 nh = UInt16(reader.readUnsigned(2)); // number of words in height table
+ UInt16 nd = UInt16(reader.readUnsigned(2)); // number of words in depth table
+ UInt16 ni = UInt16(reader.readUnsigned(2)); // number of words in italic corr. table
+ UInt16 nl = UInt16(reader.readUnsigned(2)); // number of words in lig/kern table
+ UInt16 nk = UInt16(reader.readUnsigned(2)); // number of words in kern table
+ UInt16 ne = UInt16(reader.readUnsigned(2)); // number of words in ext. char table
+ UInt16 np = UInt16(reader.readUnsigned(2)); // number of font parameter words
if (6+lh+(_lastChar-_firstChar+1)+nw+nh+nd+ni+nl+nk+ne+np != lf)
throw FontMetricException("inconsistent length values");
if (_firstChar >= _lastChar || _lastChar > 255 || ne > 256)
throw FontMetricException("character codes out of range");
- readHeader(sr);
+ readHeader(reader);
is.seekg(24+lh*4); // move to char info table
- readTables(sr, nw, nh, nd, ni);
+ readTables(reader, nw, nh, nd, ni);
+ is.seekg(4*(lf-np), ios::beg); // move to param section
+ readParameters(reader, np);
}
-void TFM::readHeader (StreamReader &sr) {
- _checksum = sr.readUnsigned(4);
- _designSize = sr.readUnsigned(4);
+void TFM::readHeader (StreamReader &reader) {
+ _checksum = reader.readUnsigned(4);
+ _designSize = fix2double(reader.readUnsigned(4))*Length::pt2bp;
}
-void TFM::readTables (StreamReader &sr, int nw, int nh, int nd, int ni) {
- read_words(sr, _charInfoTable, _lastChar-_firstChar+1);
- read_words(sr, _widthTable, nw);
- read_words(sr, _heightTable, nh);
- read_words(sr, _depthTable, nd);
- read_words(sr, _italicTable, ni);
+void TFM::readTables (StreamReader &reader, int nw, int nh, int nd, int ni) {
+ read_words(reader, _charInfoTable, _lastChar-_firstChar+1);
+ read_words(reader, _widthTable, nw);
+ read_words(reader, _heightTable, nh);
+ read_words(reader, _depthTable, nd);
+ read_words(reader, _italicTable, ni);
}
-/** Returns the design size of this font in PS point units. */
-double TFM::getDesignSize () const {
- return fix2double(_designSize);
+/** Read the values from the param section of the TFM file.
+ * @param[in] reader read from this stream
+ * @param[in] np number of paramaters to read */
+void TFM::readParameters (StreamReader &reader, int np) {
+ _params.resize(7);
+ np = min(np, 7);
+ for (int i=0; i < np; i++)
+ _params[i] = reader.readUnsigned(4);
+ for (int i=np; i < 7; i++)
+ _params[i] = 0;
+}
+
+
+/** Returns the optimal space width between words (in PS point units). */
+double TFM::getSpace () const {
+ return _params.empty() ? 0 : fix2double(_params[1])*_designSize;
+}
+
+
+/** Returns the amount of glue stretching between words (in PS point units). */
+double TFM::getSpaceStretch () const {
+ return _params.empty() ? 0 : fix2double(_params[2])*_designSize;
+}
+
+
+/** Returns the amount of glue shrinking between words (in PS point units). */
+double TFM::getSpaceShrink () const {
+ return _params.empty() ? 0 : fix2double(_params[3])*_designSize;
+}
+
+
+/** Returns the size of one EM unit (in PS point units). */
+double TFM::getQuad () const {
+ return _params.empty() ? 0 : fix2double(_params[5])*_designSize;
}
@@ -121,7 +156,7 @@ double TFM::getCharWidth (int c) const {
if (index < 0)
return 0;
index = (_charInfoTable[index] >> 24) & 0xFF;
- return fix2double(_widthTable[index]) * fix2double(_designSize);
+ return fix2double(_widthTable[index]) * _designSize;
}
@@ -131,7 +166,7 @@ double TFM::getCharHeight (int c) const {
if (index < 0)
return 0;
index = (_charInfoTable[index] >> 20) & 0x0F;
- return fix2double(_heightTable[index]) * fix2double(_designSize);
+ return fix2double(_heightTable[index]) * _designSize;
}
@@ -141,7 +176,7 @@ double TFM::getCharDepth (int c) const {
if (index < 0)
return 0;
index = (_charInfoTable[index] >> 16) & 0x0F;
- return fix2double(_depthTable[index]) * fix2double(_designSize);
+ return fix2double(_depthTable[index]) * _designSize;
}
@@ -151,5 +186,5 @@ double TFM::getItalicCorr (int c) const {
if (index < 0)
return 0;
index = (_charInfoTable[index] >> 10) & 0x3F;
- return fix2double(_italicTable[index]) * fix2double(_designSize);
+ return fix2double(_italicTable[index]) * _designSize;
}