texlive-base/texlive-base-lcdf-typetools...

14604 lines
564 KiB
Diff
Raw Normal View History

2018-03-07 21:45:31 +00:00
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1 2018-02-23 12:47:54.075972154 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc 2018-02-23 12:47:54.075972154 -0500
@@ -1,6 +1,6 @@
/* cfftot1.cc -- driver for translating CFF fonts to Type 1 fonts
*
- * Copyright (c) 2002-2016 Eddie Kohler
+ * Copyright (c) 2002-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -221,7 +221,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("cfftot1 (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2002-2016 Eddie Kohler\n\
+ printf("Copyright (C) 2002-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc 2018-02-23 12:47:54.076972128 -0500
@@ -1,6 +1,6 @@
/* maket1font.{cc,hh} -- translate CFF fonts to Type 1 fonts
*
- * Copyright (c) 2002-2016 Eddie Kohler
+ * Copyright (c) 2002-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac 2018-02-23 12:47:54.076972128 -0500
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([lcdf-typetools], [2.106])
+AC_INIT([lcdf-typetools], [2.107])
AC_CONFIG_SRCDIR([NEWS.md])
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([autoconf.h])
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h 2018-02-23 12:47:54.076972128 -0500
@@ -7,7 +7,6 @@
#ifdef WIN32
# ifdef __MINGW32__
# include <winsock2.h>
-# include <windows.h>
# else
# include <win32lib.h>
# endif
@@ -39,6 +38,11 @@ double good_strtod(const char *s, char *
}
/* Get rid of a possible inline macro under C++. */
# define inline inline
+
+/* Ignore `noexcept` if compiler is too old. */
+#if __cplusplus < 201103L
+#define noexcept
+#endif
#endif
#endif /* LCDF_TYPETOOLS_CONFIG_H */
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh 2018-02-23 12:47:54.076972128 -0500
@@ -31,7 +31,7 @@ class Cff { public:
int nfonts() const { return _name_index.size(); }
PermString font_name(int i) const { return _name_index[i]; }
- FontParent *font(PermString = PermString(), ErrorHandler * = 0);
+ FontParent* font(PermString = PermString(), ErrorHandler* = 0);
enum { NSTANDARD_STRINGS = 391, MAX_SID = 64999 };
int max_sid() const { return NSTANDARD_STRINGS - 1 + _strings.size(); }
@@ -125,13 +125,12 @@ class Cff { public:
mutable HashMap<PermString, int> _strings_map;
IndexIterator _gsubrs_index;
- Vector<Charstring *> _gsubrs_cs;
+ Vector<Charstring*> _gsubrs_cs;
+ Vector<FontParent*> _fonts;
unsigned _units_per_em;
int parse_header(ErrorHandler *);
- int font_offset(int, int &, int &) const;
- int font_offset(PermString, int &, int &) const;
enum { HEADER_SIZE = 4 };
@@ -238,12 +237,14 @@ class Cff::FontParent : public Charstrin
Cff* _cff;
int _charstring_type;
int _error;
+ int _font_index;
FontParent(const FontParent &);
FontParent &operator=(const FontParent &);
Charstring *charstring(const IndexIterator &, int) const;
+ friend class Cff;
friend class Cff::Font;
friend class Cff::CIDFont;
friend class Cff::ChildFont;
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh 2018-02-23 12:47:54.077972103 -0500
@@ -83,20 +83,20 @@ class Data {
static inline int32_t s32_aligned16(const unsigned char* s);
static inline int32_t s32_aligned(const unsigned char* s);
- inline uint8_t operator[](unsigned offset) const throw (Bounds);
- inline uint16_t u16(unsigned offset) const throw (Bounds);
- inline int16_t s16(unsigned offset) const throw (Bounds);
- inline uint32_t u32(unsigned offset) const throw (Bounds);
- inline int32_t s32(unsigned offset) const throw (Bounds);
- inline uint8_t operator[](int offset) const throw (Bounds);
- inline uint16_t u16(int offset) const throw (Bounds);
- inline int16_t s16(int offset) const throw (Bounds);
- inline uint32_t u32(int offset) const throw (Bounds);
- inline int32_t s32(int offset) const throw (Bounds);
-
- Data subtable(unsigned offset) const throw (Bounds);
- Data offset_subtable(unsigned offset_offset) const throw (Bounds);
- inline Data substring(int left, int len = -1) const throw ();
+ inline uint8_t operator[](unsigned offset) const;
+ inline uint16_t u16(unsigned offset) const;
+ inline int16_t s16(unsigned offset) const;
+ inline uint32_t u32(unsigned offset) const;
+ inline int32_t s32(unsigned offset) const;
+ inline uint8_t operator[](int offset) const;
+ inline uint16_t u16(int offset) const;
+ inline int16_t s16(int offset) const;
+ inline uint32_t u32(int offset) const;
+ inline int32_t s32(int offset) const;
+
+ Data subtable(unsigned offset) const;
+ Data offset_subtable(unsigned offset_offset) const;
+ inline Data substring(int left, int len = -1) const noexcept;
void align_long() { _str.align(4); }
@@ -106,7 +106,7 @@ class Data {
};
-inline uint8_t Data::operator[](unsigned offset) const throw (Bounds) {
+inline uint8_t Data::operator[](unsigned offset) const {
if (offset >= static_cast<unsigned>(_str.length()))
throw Bounds();
else
@@ -114,11 +114,7 @@ inline uint8_t Data::operator[](unsigned
}
inline uint16_t Data::u16(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohs(*reinterpret_cast<const uint16_t*>(s));
-#else
return (s[0] << 8) + s[1];
-#endif
}
inline uint16_t Data::u16_aligned(const unsigned char* s) {
@@ -127,11 +123,7 @@ inline uint16_t Data::u16_aligned(const
}
inline int16_t Data::s16(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohs(*reinterpret_cast<const int16_t*>(s));
-#else
return (int16_t) ((s[0] << 8) + s[1]);
-#endif
}
inline int16_t Data::s16_aligned(const unsigned char* s) {
@@ -140,20 +132,12 @@ inline int16_t Data::s16_aligned(const u
}
inline uint32_t Data::u32(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohl(*reinterpret_cast<const uint32_t*>(s));
-#else
- return (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
-#endif
+ return ((unsigned) s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
}
inline uint32_t Data::u32_aligned16(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohl(*reinterpret_cast<const uint32_t*>(s));
-#else
efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
- return (u16_aligned(s) << 16) + u16_aligned(s + 2);
-#endif
+ return ((unsigned) u16_aligned(s) << 16) + u16_aligned(s + 2);
}
inline uint32_t Data::u32_aligned(const unsigned char* s) {
@@ -162,20 +146,12 @@ inline uint32_t Data::u32_aligned(const
}
inline int32_t Data::s32(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohl(*reinterpret_cast<const int32_t*>(s));
-#else
- return (int32_t) ((s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]);
-#endif
+ return (int32_t) (((unsigned) s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]);
}
inline int32_t Data::s32_aligned16(const unsigned char* s) {
-#if __x86__ || __x86_64__ || HAVE_INDIFFERENT_ALIGNMENT
- return ntohl(*reinterpret_cast<const int32_t*>(s));
-#else
efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
- return (int32_t) ((u16_aligned(s) << 16) + u16_aligned(s + 2));
-#endif
+ return (int32_t) (((unsigned) u16_aligned(s) << 16) + u16_aligned(s + 2));
}
inline int32_t Data::s32_aligned(const unsigned char* s) {
@@ -183,55 +159,55 @@ inline int32_t Data::s32_aligned(const u
return ntohl(*reinterpret_cast<const int32_t*>(s));
}
-inline uint16_t Data::u16(unsigned offset) const throw (Bounds) {
+inline uint16_t Data::u16(unsigned offset) const {
if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
throw Bounds();
else
return u16_aligned(_str.udata() + offset);
}
-inline int16_t Data::s16(unsigned offset) const throw (Bounds) {
+inline int16_t Data::s16(unsigned offset) const {
if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
throw Bounds();
else
return s16_aligned(_str.udata() + offset);
}
-inline uint32_t Data::u32(unsigned offset) const throw (Bounds) {
+inline uint32_t Data::u32(unsigned offset) const {
if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
throw Bounds();
else
return u32_aligned16(_str.udata() + offset);
}
-inline int32_t Data::s32(unsigned offset) const throw (Bounds) {
+inline int32_t Data::s32(unsigned offset) const {
if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
throw Bounds();
else
return s32_aligned16(_str.udata() + offset);
}
-inline uint8_t Data::operator[](int offset) const throw (Bounds) {
+inline uint8_t Data::operator[](int offset) const {
return (*this)[unsigned(offset)];
}
-inline uint16_t Data::u16(int offset) const throw (Bounds) {
+inline uint16_t Data::u16(int offset) const {
return u16(unsigned(offset));
}
-inline int16_t Data::s16(int offset) const throw (Bounds) {
+inline int16_t Data::s16(int offset) const {
return s16(unsigned(offset));
}
-inline uint32_t Data::u32(int offset) const throw (Bounds) {
+inline uint32_t Data::u32(int offset) const {
return u32(unsigned(offset));
}
-inline int32_t Data::s32(int offset) const throw (Bounds) {
+inline int32_t Data::s32(int offset) const {
return s32(unsigned(offset));
}
-inline Data Data::substring(int left, int len) const throw () {
+inline Data Data::substring(int left, int len) const noexcept {
return Data(_str.substring(left, len));
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh 2018-02-23 12:47:54.077972103 -0500
@@ -9,7 +9,7 @@ class Positioning;
class Gpos { public:
- Gpos(const Data &, ErrorHandler * = 0) throw (Error);
+ Gpos(const Data &, ErrorHandler * = 0);
// default destructor
const ScriptList &script_list() const { return _script_list; }
@@ -29,7 +29,7 @@ class Gpos { public:
};
class GposLookup { public:
- GposLookup(const Data &) throw (Error);
+ GposLookup(const Data &);
int type() const { return _type; }
uint16_t flags() const { return _d.u16(2); }
bool unparse_automatics(Vector<Positioning> &, ErrorHandler * = 0) const;
@@ -66,9 +66,9 @@ class GposValue { public:
};
class GposSingle { public:
- GposSingle(const Data &) throw (Error);
+ GposSingle(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
void unparse(Vector<Positioning> &) const;
enum { F2_HEADERSIZE = 8 };
private:
@@ -76,9 +76,9 @@ class GposSingle { public:
};
class GposPair { public:
- GposPair(const Data &) throw (Error);
+ GposPair(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
void unparse(Vector<Positioning> &) const;
enum { F1_HEADERSIZE = 10, F1_RECSIZE = 2,
PAIRSET_HEADERSIZE = 2, PAIRVALUE_HEADERSIZE = 2,
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh 2018-02-23 12:47:54.077972103 -0500
@@ -9,7 +9,7 @@ class Substitution;
class Gsub { public:
- Gsub(const Data &, const Font *, ErrorHandler * = 0) throw (Error);
+ Gsub(const Data &, const Font *, ErrorHandler * = 0);
// default destructor
const ScriptList &script_list() const { return _script_list; }
@@ -31,7 +31,7 @@ class Gsub { public:
};
class GsubLookup { public:
- GsubLookup(const Data &) throw (Error);
+ GsubLookup(const Data &);
int type() const { return _type; }
uint16_t flags() const { return _d.u16(2); }
void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
@@ -49,9 +49,9 @@ class GsubLookup { public:
};
class GsubSingle { public:
- GsubSingle(const Data &) throw (Error);
+ GsubSingle(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
Glyph map(Glyph) const;
void mark_out_glyphs(Vector<bool> &gmap) const;
void unparse(Vector<Substitution> &subs, const Coverage &limit) const;
@@ -62,9 +62,9 @@ class GsubSingle { public:
};
class GsubMultiple { public:
- GsubMultiple(const Data &) throw (Error);
+ GsubMultiple(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
bool map(Glyph, Vector<Glyph> &) const;
void mark_out_glyphs(Vector<bool> &gmap) const;
void unparse(Vector<Substitution> &, bool alternate = false) const;
@@ -76,9 +76,9 @@ class GsubMultiple { public:
};
class GsubLigature { public:
- GsubLigature(const Data &) throw (Error);
+ GsubLigature(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
bool map(const Vector<Glyph> &, Glyph &, int &) const;
void mark_out_glyphs(Vector<bool> &gmap) const;
void unparse(Vector<Substitution> &) const;
@@ -91,9 +91,9 @@ class GsubLigature { public:
};
class GsubContext { public:
- GsubContext(const Data &) throw (Error);
+ GsubContext(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
bool unparse(const Gsub &gsub, Vector<Substitution> &out_subs, const Coverage &limit) const;
enum { F3_HSIZE = 6, SUBRECSIZE = 4 };
@@ -113,9 +113,9 @@ class GsubContext { public:
};
class GsubChainContext { public:
- GsubChainContext(const Data &) throw (Error);
+ GsubChainContext(const Data &);
// default destructor
- Coverage coverage() const throw ();
+ Coverage coverage() const noexcept;
void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
bool unparse(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) const;
enum { F1_HEADERSIZE = 6, F1_RECSIZE = 2,
@@ -199,7 +199,7 @@ class Substitution { public:
void add_outer_left(Glyph);
void remove_outer_left();
Substitution in_out_append_glyph(Glyph) const;
- bool out_alter(const Substitution &, int) throw ();
+ bool out_alter(const Substitution &, int) noexcept;
void add_outer_right(Glyph);
void remove_outer_right();
@@ -238,14 +238,14 @@ class Substitution { public:
static bool substitute_in(const Substitute &, uint8_t, const Coverage &);
static bool substitute_in(const Substitute &, uint8_t, const GlyphSet &);
- static Glyph extract_glyph(const Substitute &, uint8_t) throw ();
- static Glyph extract_glyph(const Substitute &, int which, uint8_t) throw ();
- static bool extract_glyphs(const Substitute &, uint8_t, Vector<Glyph> &, bool coverage_ok) throw ();
- static Glyph *extract_glyphptr(const Substitute &, uint8_t) throw ();
- static int extract_nglyphs(const Substitute &, uint8_t, bool coverage_ok) throw ();
- static bool matches(const Substitute &, uint8_t, int pos, Glyph) throw ();
+ static Glyph extract_glyph(const Substitute &, uint8_t) noexcept;
+ static Glyph extract_glyph(const Substitute &, int which, uint8_t) noexcept;
+ static bool extract_glyphs(const Substitute &, uint8_t, Vector<Glyph> &, bool coverage_ok) noexcept;
+ static Glyph *extract_glyphptr(const Substitute &, uint8_t) noexcept;
+ static int extract_nglyphs(const Substitute &, uint8_t, bool coverage_ok) noexcept;
+ static bool matches(const Substitute &, uint8_t, int pos, Glyph) noexcept;
- static void unparse_glyphids(StringAccum &, const Substitute &, uint8_t, const Vector<PermString> *) throw ();
+ static void unparse_glyphids(StringAccum &, const Substitute &, uint8_t, const Vector<PermString> *) noexcept;
};
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh 2018-02-23 12:47:54.077972103 -0500
@@ -142,23 +142,23 @@ class FeatureList {
class Coverage {
public:
- Coverage() throw (); // empty coverage
- Coverage(Glyph first, Glyph last) throw (); // range coverage
- Coverage(const Vector<bool> &gmap) throw (); // used-bytemap coverage
- Coverage(const String &str, ErrorHandler *errh = 0, bool check = true) throw ();
+ Coverage() noexcept; // empty coverage
+ Coverage(Glyph first, Glyph last) noexcept; // range coverage
+ Coverage(const Vector<bool> &gmap) noexcept; // used-bytemap coverage
+ Coverage(const String &str, ErrorHandler *errh = 0, bool check = true) noexcept;
// default destructor
- bool ok() const throw () { return _str.length() > 0; }
- int size() const throw ();
- bool has_fast_covers() const throw () {
+ bool ok() const noexcept { return _str.length() > 0; }
+ int size() const noexcept;
+ bool has_fast_covers() const noexcept {
return _str.length() > 0 && _str.data()[1] == T_X_BYTEMAP;
}
- int coverage_index(Glyph) const throw ();
- bool covers(Glyph g) const throw () { return coverage_index(g) >= 0; }
+ int coverage_index(Glyph) const noexcept;
+ bool covers(Glyph g) const noexcept { return coverage_index(g) >= 0; }
- void unparse(StringAccum&) const throw ();
- String unparse() const throw ();
+ void unparse(StringAccum&) const noexcept;
+ String unparse() const noexcept;
class iterator { public:
iterator() : _pos(0), _value(0) { }
@@ -194,7 +194,7 @@ class Coverage {
iterator begin() const { return iterator(_str, false); }
iterator end() const { return iterator(_str, true); }
- Glyph operator[](int) const throw ();
+ Glyph operator[](int) const noexcept;
enum { T_LIST = 1, T_RANGES = 2, T_X_BYTEMAP = 3,
HEADERSIZE = 4, LIST_RECSIZE = 2, RANGES_RECSIZE = 6 };
@@ -238,17 +238,17 @@ class GlyphSet {
class ClassDef {
public:
- ClassDef(const String&, ErrorHandler* = 0) throw ();
+ ClassDef(const String&, ErrorHandler* = 0) noexcept;
// default destructor
bool ok() const { return _str.length() > 0; }
- int nclass() const throw ();
+ int nclass() const noexcept;
- int lookup(Glyph) const throw ();
- int operator[](Glyph g) const throw () { return lookup(g); }
+ int lookup(Glyph) const noexcept;
+ int operator[](Glyph g) const noexcept { return lookup(g); }
- void unparse(StringAccum&) const throw ();
- String unparse() const throw ();
+ void unparse(StringAccum&) const noexcept;
+ String unparse() const noexcept;
class class_iterator {
public:
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh 2018-02-23 12:47:54.077972103 -0500
@@ -25,15 +25,15 @@ class Os2 { public:
O_LOWEROPTICALPOINTSIZE = 96, O_UPPEROPTICALPOINTSIZE = 98 };
enum { HEADER_SIZE = 2 };
- inline int16_t typo_ascender() const throw (Bounds);
- inline int16_t typo_descender() const throw (Bounds);
- inline int16_t typo_line_gap() const throw (Bounds);
- inline int16_t x_height() const throw (Bounds);
- inline int16_t cap_height() const throw (Bounds);
- inline double lower_optical_point_size() const throw (Bounds);
- inline double upper_optical_point_size() const throw (Bounds);
- inline bool has_optical_point_size() const throw ();
- inline String vendor_id() const throw ();
+ inline int16_t typo_ascender() const;
+ inline int16_t typo_descender() const;
+ inline int16_t typo_line_gap() const;
+ inline int16_t x_height() const;
+ inline int16_t cap_height() const;
+ inline double lower_optical_point_size() const;
+ inline double upper_optical_point_size() const;
+ inline bool has_optical_point_size() const noexcept;
+ inline String vendor_id() const noexcept;
private:
@@ -45,47 +45,47 @@ class Os2 { public:
};
-inline int16_t Os2::typo_ascender() const throw (Bounds)
+inline int16_t Os2::typo_ascender() const
{
return _data.s16(O_TYPOASCENDER);
}
-inline int16_t Os2::typo_descender() const throw (Bounds)
+inline int16_t Os2::typo_descender() const
{
return _data.s16(O_TYPODESCENDER);
}
-inline int16_t Os2::typo_line_gap() const throw (Bounds)
+inline int16_t Os2::typo_line_gap() const
{
return _data.s16(O_TYPOLINEGAP);
}
-inline int16_t Os2::x_height() const throw (Bounds)
+inline int16_t Os2::x_height() const
{
return _data.s16(O_XHEIGHT);
}
-inline int16_t Os2::cap_height() const throw (Bounds)
+inline int16_t Os2::cap_height() const
{
return _data.s16(O_CAPHEIGHT);
}
-inline double Os2::lower_optical_point_size() const throw (Bounds)
+inline double Os2::lower_optical_point_size() const
{
return _data.u16(O_LOWEROPTICALPOINTSIZE) / 20.;
}
-inline double Os2::upper_optical_point_size() const throw (Bounds)
+inline double Os2::upper_optical_point_size() const
{
return _data.u16(O_UPPEROPTICALPOINTSIZE) / 20.;
}
-inline bool Os2::has_optical_point_size() const throw ()
+inline bool Os2::has_optical_point_size() const noexcept
{
return _data.length() >= O_UPPEROPTICALPOINTSIZE + 2;
}
-inline String Os2::vendor_id() const throw ()
+inline String Os2::vendor_id() const noexcept
{
return _data.substring(O_VENDORID, 4).string();
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh 2018-02-23 12:47:54.077972103 -0500
@@ -31,8 +31,9 @@ class CharstringBounds : public Charstri
bool char_bounds(const CharstringContext&, bool shift = true);
void translate(double dx, double dy);
inline Point transform(const Point& p) const;
- bool output(double bb[4], double& width, bool use_cur_width = false) const;
+ // output: [left, bottom, right, top]
+ bool output(double bb[4], double& width, bool use_cur_width = false) const;
static bool bounds(const CharstringContext&,
double bounds[4], double& width);
static bool bounds(const Transform&, const CharstringContext&,
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh 2018-02-23 12:47:54.078972078 -0500
@@ -6,7 +6,7 @@ namespace Efont { namespace OpenType {
class KernTable { public:
- KernTable(const Data &, ErrorHandler * = 0) throw (Error);
+ KernTable(const Data &, ErrorHandler * = 0);
// default destructor
bool ok() const { return _error >= 0; }
@@ -34,7 +34,7 @@ class KernTable { public:
inline uint32_t first_offset() const {
return _version == 0 ? 4 : 8;
}
- inline Data subtable(uint32_t &off) const throw (Error);
+ inline Data subtable(uint32_t &off) const;
};
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh 2018-02-23 12:47:54.078972078 -0500
@@ -8,30 +8,30 @@
class Bezier { public:
Bezier() : _bb(-1) { }
- inline Bezier(Point p[4]) throw ();
- inline Bezier(const Point &, const Point &, const Point &, const Point &) throw ();
+ inline Bezier(Point p[4]) noexcept;
+ inline Bezier(const Point &, const Point &, const Point &, const Point &) noexcept;
const Point *points() const { return _p; }
const Point &point(int i) const { assert(i>=0&&i<4); return _p[i]; }
Point &mpoint(int i) { assert(i>=0&&i<4); _bb = -1; return _p[i]; }
void set_point(int i, const Point &p) { mpoint(i) = p; }
- Point eval(double) const throw ();
- bool is_flat(double) const throw ();
- bool in_bb(const Point &, double) const throw ();
- bool hit(const Point &, double) const throw ();
-
- inline double bb_left() const throw ();
- inline double bb_right() const throw ();
- inline double bb_top() const throw ();
- inline double bb_bottom() const throw ();
-
- inline double bb_left_x() const throw ();
- inline double bb_right_x() const throw ();
- inline double bb_top_x() const throw ();
- inline double bb_bottom_x() const throw ();
+ Point eval(double) const noexcept;
+ bool is_flat(double) const noexcept;
+ bool in_bb(const Point &, double) const noexcept;
+ bool hit(const Point &, double) const noexcept;
+
+ inline double bb_left() const noexcept;
+ inline double bb_right() const noexcept;
+ inline double bb_top() const noexcept;
+ inline double bb_bottom() const noexcept;
+
+ inline double bb_left_x() const noexcept;
+ inline double bb_right_x() const noexcept;
+ inline double bb_top_x() const noexcept;
+ inline double bb_bottom_x() const noexcept;
- void halve(Bezier &, Bezier &) const throw ();
+ void halve(Bezier &, Bezier &) const noexcept;
inline void segmentize(Vector<Point> &) const;
void segmentize(Vector<Point> &, bool) const;
@@ -43,23 +43,23 @@ class Bezier { public:
Point _p[4];
mutable int _bb;
- void make_bb() const throw ();
- inline void ensure_bb() const throw ();
+ void make_bb() const noexcept;
+ inline void ensure_bb() const noexcept;
- double hit_recurse(const Point &, double, double, double, double, double) const throw ();
+ double hit_recurse(const Point &, double, double, double, double, double) const noexcept;
};
inline
-Bezier::Bezier(Point p[4]) throw ()
+Bezier::Bezier(Point p[4]) noexcept
: _bb(-1)
{
memcpy(_p, p, sizeof(Point) * 4);
}
inline
-Bezier::Bezier(const Point &p0, const Point &p1, const Point &p2, const Point &p3) throw ()
+Bezier::Bezier(const Point &p0, const Point &p1, const Point &p2, const Point &p3) noexcept
{
_p[0] = p0;
_p[1] = p1;
@@ -69,59 +69,59 @@ Bezier::Bezier(const Point &p0, const Po
}
inline void
-Bezier::ensure_bb() const throw ()
+Bezier::ensure_bb() const noexcept
{
if (_bb < 0)
make_bb();
}
inline double
-Bezier::bb_top_x() const throw ()
+Bezier::bb_top_x() const noexcept
{
return _p[(_bb >> 4) & 3].y;
}
inline double
-Bezier::bb_left_x() const throw ()
+Bezier::bb_left_x() const noexcept
{
return _p[(_bb >> 2) & 3].x;
}
inline double
-Bezier::bb_bottom_x() const throw ()
+Bezier::bb_bottom_x() const noexcept
{
return _p[(_bb >> 6) & 3].y;
}
inline double
-Bezier::bb_right_x() const throw ()
+Bezier::bb_right_x() const noexcept
{
return _p[(_bb >> 0) & 3].x;
}
inline double
-Bezier::bb_top() const throw ()
+Bezier::bb_top() const noexcept
{
ensure_bb();
return bb_top_x();
}
inline double
-Bezier::bb_left() const throw ()
+Bezier::bb_left() const noexcept
{
ensure_bb();
return bb_left_x();
}
inline double
-Bezier::bb_bottom() const throw ()
+Bezier::bb_bottom() const noexcept
{
ensure_bb();
return bb_bottom_x();
}
inline double
-Bezier::bb_right() const throw ()
+Bezier::bb_right() const noexcept
{
ensure_bb();
return bb_right_x();
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h 2018-02-23 12:47:54.078972078 -0500
@@ -8,7 +8,7 @@ extern "C" {
/* clp.h - Public interface to CLP.
* This file is part of CLP, the command line parser package.
*
- * Copyright (c) 1997-2016 Eddie Kohler, ekohler@gmail.com
+ * Copyright (c) 1997-2018 Eddie Kohler, ekohler@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh 2018-02-23 12:47:54.078972078 -0500
@@ -14,28 +14,28 @@ struct Point {
Point(const Point &p, double dx, double dy) : x(p.x + dx), y(p.y + dy) { }
// ~Point() use compiler default
- inline double squared_length() const throw ();
- inline double length() const throw ();
- inline double magnitude() const throw ();
- static inline double distance(const Point &, const Point &) throw ();
- static inline double dot(const Point &, const Point &) throw ();
- static Point midpoint(const Point &, const Point &) throw ();
+ inline double squared_length() const noexcept;
+ inline double length() const noexcept;
+ inline double magnitude() const noexcept;
+ static inline double distance(const Point &, const Point &) noexcept;
+ static inline double dot(const Point &, const Point &) noexcept;
+ static Point midpoint(const Point &, const Point &) noexcept;
- inline double angle() const throw ();
+ inline double angle() const noexcept;
void shift(double dx, double dy) { x += dx; y += dy; }
- inline Point shifted(double dx, double dy) const throw ();
- Point rotated(double) const throw ();
- inline Point normal() const throw ();
-
- bool on_line(const Point &, const Point &, double) const throw ();
- bool on_segment(const Point &, const Point &, double) const throw ();
-
- inline Point &operator+=(const Point &) throw ();
- inline Point &operator-=(const Point &) throw ();
- inline Point &operator*=(double) throw ();
- inline Point &operator/=(double) throw ();
+ inline Point shifted(double dx, double dy) const noexcept;
+ Point rotated(double) const noexcept;
+ inline Point normal() const noexcept;
+
+ bool on_line(const Point &, const Point &, double) const noexcept;
+ bool on_segment(const Point &, const Point &, double) const noexcept;
+
+ inline Point &operator+=(const Point &) noexcept;
+ inline Point &operator-=(const Point &) noexcept;
+ inline Point &operator*=(double) noexcept;
+ inline Point &operator/=(double) noexcept;
// Point operator+(Point, const Point &);
// Point operator-(Point, const Point &);
@@ -49,44 +49,44 @@ struct Point {
};
inline double
-Point::squared_length() const throw ()
+Point::squared_length() const noexcept
{
return x*x + y*y;
}
inline double
-Point::length() const throw ()
+Point::length() const noexcept
{
return sqrt(x*x + y*y);
}
inline double
-Point::magnitude() const throw ()
+Point::magnitude() const noexcept
{
return length();
}
inline double
-Point::angle() const throw ()
+Point::angle() const noexcept
{
return atan2(y, x);
}
inline Point
-Point::shifted(double dx, double dy) const throw ()
+Point::shifted(double dx, double dy) const noexcept
{
return Point(x + dx, y + dy);
}
inline Point
-Point::normal() const throw ()
+Point::normal() const noexcept
{
double l = length();
return (l ? Point(x/l, y/l) : *this);
}
inline Point &
-Point::operator+=(const Point &p) throw ()
+Point::operator+=(const Point &p) noexcept
{
x += p.x;
y += p.y;
@@ -94,7 +94,7 @@ Point::operator+=(const Point &p) throw
}
inline Point &
-Point::operator-=(const Point &p) throw ()
+Point::operator-=(const Point &p) noexcept
{
x -= p.x;
y -= p.y;
@@ -102,7 +102,7 @@ Point::operator-=(const Point &p) throw
}
inline Point &
-Point::operator*=(double d) throw ()
+Point::operator*=(double d) noexcept
{
x *= d;
y *= d;
@@ -110,7 +110,7 @@ Point::operator*=(double d) throw ()
}
inline Point &
-Point::operator/=(double d) throw ()
+Point::operator/=(double d) noexcept
{
x /= d;
y /= d;
@@ -118,66 +118,66 @@ Point::operator/=(double d) throw ()
}
inline bool
-operator==(const Point &a, const Point &b) throw ()
+operator==(const Point &a, const Point &b) noexcept
{
return a.x == b.x && a.y == b.y;
}
inline bool
-operator!=(const Point &a, const Point &b) throw ()
+operator!=(const Point &a, const Point &b) noexcept
{
return a.x != b.x || a.y != b.y;
}
inline Point
-operator+(Point a, const Point &b) throw ()
+operator+(Point a, const Point &b) noexcept
{
a += b;
return a;
}
inline Point
-operator-(Point a, const Point &b) throw ()
+operator-(Point a, const Point &b) noexcept
{
a -= b;
return a;
}
inline Point
-operator-(const Point &a) throw ()
+operator-(const Point &a) noexcept
{
return Point(-a.x, -a.y);
}
inline Point
-operator*(Point a, double scale) throw ()
+operator*(Point a, double scale) noexcept
{
a *= scale;
return a;
}
inline Point
-operator*(double scale, Point a) throw ()
+operator*(double scale, Point a) noexcept
{
a *= scale;
return a;
}
inline Point
-operator/(Point a, double scale) throw ()
+operator/(Point a, double scale) noexcept
{
a /= scale;
return a;
}
inline double
-Point::distance(const Point &a, const Point &b) throw ()
+Point::distance(const Point &a, const Point &b) noexcept
{
return (a - b).length();
}
inline double
-Point::dot(const Point &a, const Point &b) throw ()
+Point::dot(const Point &a, const Point &b) noexcept
{
return a.x*b.x + a.y*b.y;
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh 2018-02-23 12:47:54.078972078 -0500
@@ -20,143 +20,41 @@ template<typename T> class Vector;
class StringAccum { public:
- /** @brief Construct an empty StringAccum (with length 0). */
- StringAccum()
- : _s(0), _len(0), _cap(0) {
- }
-
- /** @brief Construct a StringAccum with room for at least @a capacity
- * characters.
- * @param capacity initial capacity
- *
- * If @a capacity <= 0, the StringAccum is created empty. If @a capacity
- * is too large (so that @a capacity bytes of memory can't be allocated),
- * the StringAccum falls back to a smaller capacity (possibly zero). */
- explicit inline StringAccum(int capacity);
-
- /** @brief Construct a StringAccum containing the characters in @a s. */
- explicit inline StringAccum(const char *cstr)
- : _s(0), _len(0), _cap(0) {
- append(cstr);
- }
-
- /** @brief Construct a StringAccum containing the characters in @a s. */
- inline StringAccum(const char *s, int len)
- : _s(0), _len(0), _cap(0) {
- append(s, len);
- }
-
- /** @brief Construct a StringAccum containing the characters in @a str. */
- StringAccum(const String &str)
- : _s(0), _len(0), _cap(0) {
- append(str.begin(), str.end());
- }
-
- /** @brief Construct a StringAccum containing a copy of @a x. */
- StringAccum(const StringAccum &x)
- : _s(0), _len(0), _cap(0) {
- append(x.data(), x.length());
- }
-
- /** @brief Destroy a StringAccum, freeing its memory. */
- ~StringAccum() {
- if (_cap > 0)
- delete[] (_s - MEMO_SPACE);
- }
-
-
- /** @brief Return the contents of the StringAccum.
- * @return The StringAccum's contents.
- *
- * The return value is null if the StringAccum is empty or out-of-memory.
- * The returned data() value points to writable memory (unless the
- * StringAccum itself is const). */
- inline const char *data() const {
- return reinterpret_cast<const char *>(_s);
- }
-
- /** @overload */
- inline char *data() {
- return reinterpret_cast<char *>(_s);
- }
+ typedef const char* const_iterator;
+ typedef char* iterator;
- inline const unsigned char* udata() const {
- return _s;
- }
-
- inline unsigned char* udata() {
- return _s;
- }
-
- /** @brief Return true iff the StringAccum is empty or out-of-memory. */
- bool empty() const {
- return _len == 0;
- }
-
- /** @brief Return the length of the StringAccum. */
- int length() const {
- return _len;
- }
-
- /** @brief Return the StringAccum's current capacity.
- *
- * The capacity is the maximum length the StringAccum can hold without
- * incurring a memory allocation. Returns -1 for out-of-memory
- * StringAccums. */
- int capacity() const {
- return _cap;
- }
-
-
- typedef const char *const_iterator;
- typedef char *iterator;
-
- /** @brief Return an iterator for the first character in the StringAccum.
- *
- * StringAccum iterators are simply pointers into string data, so they are
- * quite efficient. @sa StringAccum::data */
- inline const_iterator begin() const {
- return reinterpret_cast<char *>(_s);
- }
-
- /** @overload */
- inline iterator begin() {
- return reinterpret_cast<char *>(_s);
- }
-
- /** @brief Return an iterator for the end of the StringAccum.
- *
- * The return value points one character beyond the last character in the
- * StringAccum. */
- inline StringAccum::const_iterator end() const {
- return reinterpret_cast<char *>(_s + _len);
- }
-
- /** @overload */
- inline iterator end() {
- return reinterpret_cast<char *>(_s + _len);
- }
+ typedef int (StringAccum::*unspecified_bool_type)() const;
+ inline StringAccum();
+ explicit inline StringAccum(int capacity);
+ explicit inline StringAccum(const char *cstr);
+ inline StringAccum(const char* s, int len);
+ inline StringAccum(const String& str);
+ inline StringAccum(const StringAccum& x);
+ inline ~StringAccum();
+
+ inline const char* data() const;
+ inline char* data();
+ inline const unsigned char* udata() const;
+ inline unsigned char* udata();
+ inline int length() const;
+ inline int capacity() const;
+
+ inline bool empty() const;
+ inline bool operator!() const;
+ inline bool out_of_memory() const;
+
+ inline const_iterator begin() const;
+ inline iterator begin();
+ inline const_iterator end() const;
+ inline iterator end();
- typedef int (StringAccum::*unspecified_bool_type)() const;
/** @brief Return true iff the StringAccum contains characters.
*
* Returns false for empty and out-of-memory StringAccums. */
- operator unspecified_bool_type() const {
- return _len != 0 ? &StringAccum::capacity : 0;
- }
-
- /** @brief Return true iff the StringAccum does not contain characters.
- *
- * Returns true for empty and out-of-memory StringAccums. */
- bool operator!() const {
- return _len == 0;
- }
-
- /** @brief Return true iff the StringAccum is out-of-memory. */
- bool out_of_memory() const {
- return _cap < 0;
+ inline operator unspecified_bool_type() const {
+ return _len != 0 ? &StringAccum::capacity : 0;
}
@@ -169,182 +67,44 @@ class StringAccum { public:
const char *c_str();
- /** @brief Return the <a>i</a>th character in the string.
- * @param i character index
- * @pre 0 <= @a i < length() */
- char operator[](int i) const {
- assert((unsigned) i < (unsigned) _len);
- return static_cast<char>(_s[i]);
- }
-
- /** @brief Return a reference to the <a>i</a>th character in the string.
- * @param i character index
- * @pre 0 <= @a i < length() */
- char &operator[](int i) {
- assert((unsigned) i < (unsigned) _len);
- return reinterpret_cast<char &>(_s[i]);
- }
-
- /** @brief Return the first character in the string.
- * @pre length() > 0 */
- char front() const {
- assert(_len > 0);
- return static_cast<char>(_s[0]);
- }
+ inline char operator[](int i) const;
+ inline char& operator[](int i);
+ inline char front() const;
+ inline char& front();
+ inline char back() const;
+ inline char& back();
- /** @brief Return a reference to the first character in the string.
- * @pre length() > 0 */
- char &front() {
- assert(_len > 0);
- return reinterpret_cast<char &>(_s[0]);
- }
-
- /** @brief Return the last character in the string.
- * @pre length() > 0 */
- char back() const {
- assert(_len > 0);
- return static_cast<char>(_s[_len - 1]);
- }
-
- /** @brief Return a reference to the last character in the string.
- * @pre length() > 0 */
- char &back() {
- assert(_len > 0);
- return reinterpret_cast<char &>(_s[_len - 1]);
- }
+ inline void clear();
-
- /** @brief Clear the StringAccum's comments.
- *
- * All characters in the StringAccum are erased. Also resets the
- * StringAccum's out-of-memory status. */
- inline void clear() {
- if (_cap < 0) {
- _cap = 0;
- _s = 0;
- }
- _len = 0;
- }
-
-
- /** @brief Reserve space for at least @a n characters.
- * @return a pointer to at least @a n characters, or null if allocation
- * fails
- * @pre @a n >= 0
- *
- * reserve() does not change the string's length(), only its capacity().
- * In a frequent usage pattern, code calls reserve(), passing an upper
- * bound on the characters that could be written by a series of
- * operations. After writing into the returned buffer, adjust_length() is
- * called to account for the number of characters actually written.
- *
- * On failure, null is returned and errno is set to ENOMEM. */
- inline char *reserve(int n) {
- assert(n >= 0);
- if (_len + n <= _cap)
- return reinterpret_cast<char *>(_s + _len);
- else
- return grow(_len + n);
- }
-
- /** @brief Set the StringAccum's length to @a len.
- * @param len new length in characters
- * @pre 0 <= @a len <= capacity()
- * @sa adjust_length */
- inline void set_length(int len) {
- assert(len >= 0 && _len <= _cap);
- _len = len;
- }
+ inline char* reserve(int n);
+ inline void set_length(int len);
/** @brief Set the StringAccum's length to @a len.
* @pre @a len >= 0
* @return 0 on success, -ENOMEM on failure */
int resize(int len);
- /** @brief Adjust the StringAccum's length.
- * @param delta length adjustment
- * @pre If @a delta > 0, then length() + @a delta <= capacity().
- * If @a delta < 0, then length() + delta >= 0.
- *
- * The StringAccum's length after adjust_length(@a delta) equals its old
- * length plus @a delta. Generally adjust_length() is used after a call
- * to reserve(). @sa set_length */
- inline void adjust_length(int delta) {
- assert(_len + delta >= 0 && _len + delta <= _cap);
- _len += delta;
- }
-
- /** @brief Reserve space and adjust length in one operation.
- * @param nadjust number of characters to reserve and adjust length
- * @param nreserve additional characters to reserve
- * @pre @a nadjust >= 0 and @a nreserve >= 0
- *
- * This operation combines the effects of reserve(@a nadjust + @a
- * nreserve) and adjust_length(@a nadjust). Returns the result of the
- * reserve() call. */
- inline char *extend(int nadjust, int nreserve = 0) {
- assert(nadjust >= 0 && nreserve >= 0);
- if (_len + nadjust + nreserve <= _cap) {
- char *x = reinterpret_cast<char *>(_s + _len);
- _len += nadjust;
- return x;
- } else
- return hard_extend(nadjust, nreserve);
- }
-
-
- /** @brief Remove characters from the end of the StringAccum.
- * @param n number of characters to remove
- * @pre @a n >= 0 and @a n <= length()
- *
- * Same as adjust_length(-@a n). */
- inline void pop_back(int n = 1) {
- assert(n >= 0 && _len >= n);
- _len -= n;
- }
+ inline void adjust_length(int delta);
+ inline char* extend(int nadjust, int nreserve = 0);
+ inline void pop_back(int n = 1);
- /** @brief Append character @a c to the StringAccum.
- * @param c character to append */
- inline void append(char c) {
- if (_len < _cap || grow(_len))
- _s[_len++] = c;
- }
- /** @overload */
- inline void append(unsigned char c) {
- append(static_cast<char>(c));
- }
+ inline void append(char c);
+ inline void append(unsigned char c);
/** @brief Append @a len copies of character @a c to the StringAccum. */
void append_fill(int c, int len);
- /** @brief Append the UTF-8 encoding of Unicode character @a ch. */
- inline void append_utf8(unsigned ch) {
- if (ch < 0x80)
- append((unsigned char) ch);
- else
- append_utf8_hard(ch);
- }
+ inline void append_utf8(unsigned ch);
/** @brief Append the null-terminated C string @a s to this StringAccum.
* @param s data to append */
- void append(const char *s);
- /** @brief Append the first @a len characters of @a s to this StringAccum.
- * @param s data to append
- * @param len length of data
- * @pre @a len >= 0 */
- inline void append(const char *s, int len);
- /** @overload */
- inline void append(const unsigned char *s, int len);
-
- /** @brief Append the data from @a begin to @a end to the end of this
- * StringAccum.
- *
- * Does nothing if @a begin >= @a end. */
- inline void append(const char *begin, const char *end);
- /** @overload */
- inline void append(const unsigned char *begin, const unsigned char *end);
+ void append(const char* s);
+ inline void append(const char* s, int len);
+ inline void append(const unsigned char* s, int len);
+ inline void append(const char* begin, const char* end);
+ inline void append(const unsigned char* begin, const unsigned char* end);
// word joining
void append_break_lines(const String &text, int linelen, const String &leftmargin = String());
@@ -374,16 +134,7 @@ class StringAccum { public:
String take_string();
- /** @brief Assign this StringAccum to @a x. */
- StringAccum &operator=(const StringAccum &x) {
- if (&x != this) {
- if (out_of_memory())
- _s = 0, _cap = 0;
- _len = 0;
- append(x.data(), x.length());
- }
- return *this;
- }
+ inline StringAccum& operator=(const StringAccum& x);
/** @brief Swap this StringAccum's contents with @a x. */
void swap(StringAccum &x);
@@ -393,7 +144,7 @@ class StringAccum { public:
private:
enum {
- MEMO_SPACE = String::MEMO_SPACE
+ MEMO_SPACE = String::MEMO_SPACE
};
unsigned char *_s;
@@ -434,42 +185,329 @@ StringAccum &operator<<(StringAccum &, u
StringAccum &operator<<(StringAccum &, double);
-inline
-StringAccum::StringAccum(int capacity)
- : _len(0)
-{
+/** @brief Construct an empty StringAccum (with length 0). */
+inline StringAccum::StringAccum()
+ : _s(0), _len(0), _cap(0) {
+}
+
+/** @brief Construct a StringAccum with room for at least @a capacity
+ * characters.
+ * @param capacity initial capacity
+ *
+ * If @a capacity <= 0, the StringAccum is created empty. If @a capacity
+ * is too large (so that @a capacity bytes of memory can't be allocated),
+ * the StringAccum falls back to a smaller capacity (possibly zero). */
+inline StringAccum::StringAccum(int capacity)
+ : _len(0) {
assert(capacity >= 0);
if (capacity
- && (_s = new unsigned char[capacity + MEMO_SPACE])) {
- _s += MEMO_SPACE;
- _cap = capacity;
+ && (_s = new unsigned char[capacity + MEMO_SPACE])) {
+ _s += MEMO_SPACE;
+ _cap = capacity;
} else {
- _s = 0;
- _cap = 0;
+ _s = 0;
+ _cap = 0;
}
}
-inline void StringAccum::append(const char *s, int len) {
+/** @brief Construct a StringAccum containing the characters in @a s. */
+inline StringAccum::StringAccum(const char *cstr)
+ : _s(0), _len(0), _cap(0) {
+ append(cstr);
+}
+
+/** @brief Construct a StringAccum containing the characters in @a s. */
+inline StringAccum::StringAccum(const char *s, int len)
+ : _s(0), _len(0), _cap(0) {
+ append(s, len);
+}
+
+/** @brief Construct a StringAccum containing the characters in @a str. */
+inline StringAccum::StringAccum(const String &str)
+ : _s(0), _len(0), _cap(0) {
+ append(str.begin(), str.end());
+}
+
+/** @brief Construct a StringAccum containing a copy of @a x. */
+inline StringAccum::StringAccum(const StringAccum &x)
+ : _s(0), _len(0), _cap(0) {
+ append(x.data(), x.length());
+}
+
+/** @brief Destroy a StringAccum, freeing its memory. */
+inline StringAccum::~StringAccum() {
+ if (_cap > 0)
+ delete[] (_s - MEMO_SPACE);
+}
+
+/** @brief Return the contents of the StringAccum.
+ * @return The StringAccum's contents.
+ *
+ * The return value is null if the StringAccum is empty or out-of-memory.
+ * The returned data() value points to writable memory (unless the
+ * StringAccum itself is const). */
+inline const char* StringAccum::data() const {
+ return reinterpret_cast<const char *>(_s);
+}
+
+/** @overload */
+inline char* StringAccum::data() {
+ return reinterpret_cast<char *>(_s);
+}
+
+inline const unsigned char* StringAccum::udata() const {
+ return _s;
+}
+
+inline unsigned char* StringAccum::udata() {
+ return _s;
+}
+
+/** @brief Return true iff the StringAccum is empty or out-of-memory. */
+inline bool StringAccum::empty() const {
+ return _len == 0;
+}
+
+/** @brief Return the length of the StringAccum. */
+inline int StringAccum::length() const {
+ return _len;
+}
+
+/** @brief Return the StringAccum's current capacity.
+ *
+ * The capacity is the maximum length the StringAccum can hold without
+ * incurring a memory allocation. Returns -1 for out-of-memory
+ * StringAccums. */
+inline int StringAccum::capacity() const {
+ return _cap;
+}
+
+/** @brief Return an iterator for the first character in the StringAccum.
+ *
+ * StringAccum iterators are simply pointers into string data, so they are
+ * quite efficient. @sa StringAccum::data */
+inline StringAccum::const_iterator StringAccum::begin() const {
+ return reinterpret_cast<char*>(_s);
+}
+
+/** @overload */
+inline StringAccum::iterator StringAccum::begin() {
+ return reinterpret_cast<char*>(_s);
+}
+
+/** @brief Return an iterator for the end of the StringAccum.
+ *
+ * The return value points one character beyond the last character in the
+ * StringAccum. */
+inline StringAccum::const_iterator StringAccum::end() const {
+ return reinterpret_cast<char*>(_s + _len);
+}
+
+/** @overload */
+inline StringAccum::iterator StringAccum::end() {
+ return reinterpret_cast<char*>(_s + _len);
+}
+
+/** @brief Return true iff the StringAccum does not contain characters.
+ *
+ * Returns true for empty and out-of-memory StringAccums. */
+inline bool StringAccum::operator!() const {
+ return _len == 0;
+}
+
+/** @brief Return true iff the StringAccum is out-of-memory. */
+inline bool StringAccum::out_of_memory() const {
+ return _cap < 0;
+}
+
+/** @brief Return the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+inline char StringAccum::operator[](int i) const {
+ assert((unsigned) i < (unsigned) _len);
+ return static_cast<char>(_s[i]);
+}
+
+/** @brief Return a reference to the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+inline char& StringAccum::operator[](int i) {
+ assert((unsigned) i < (unsigned) _len);
+ return reinterpret_cast<char &>(_s[i]);
+}
+
+/** @brief Return the first character in the string.
+ * @pre length() > 0 */
+inline char StringAccum::front() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[0]);
+}
+
+/** @brief Return a reference to the first character in the string.
+ * @pre length() > 0 */
+inline char& StringAccum::front() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[0]);
+}
+
+/** @brief Return the last character in the string.
+ * @pre length() > 0 */
+inline char StringAccum::back() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[_len - 1]);
+}
+
+/** @brief Return a reference to the last character in the string.
+ * @pre length() > 0 */
+inline char& StringAccum::back() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[_len - 1]);
+}
+
+/** @brief Clear the StringAccum's comments.
+ *
+ * All characters in the StringAccum are erased. Also resets the
+ * StringAccum's out-of-memory status. */
+inline void StringAccum::clear() {
+ if (_cap < 0) {
+ _cap = 0;
+ _s = 0;
+ }
+ _len = 0;
+}
+
+/** @brief Reserve space for at least @a n characters.
+ * @return a pointer to at least @a n characters, or null if allocation
+ * fails
+ * @pre @a n >= 0
+ *
+ * reserve() does not change the string's length(), only its capacity().
+ * In a frequent usage pattern, code calls reserve(), passing an upper
+ * bound on the characters that could be written by a series of
+ * operations. After writing into the returned buffer, adjust_length() is
+ * called to account for the number of characters actually written.
+ *
+ * On failure, null is returned and errno is set to ENOMEM. */
+inline char* StringAccum::reserve(int n) {
+ assert(n >= 0);
+ if (_len + n <= _cap)
+ return reinterpret_cast<char *>(_s + _len);
+ else
+ return grow(_len + n);
+}
+
+/** @brief Set the StringAccum's length to @a len.
+ * @param len new length in characters
+ * @pre 0 <= @a len <= capacity()
+ * @sa adjust_length */
+inline void StringAccum::set_length(int len) {
+ assert(len >= 0 && _len <= _cap);
+ _len = len;
+}
+
+/** @brief Adjust the StringAccum's length.
+ * @param delta length adjustment
+ * @pre If @a delta > 0, then length() + @a delta <= capacity().
+ * If @a delta < 0, then length() + delta >= 0.
+ *
+ * The StringAccum's length after adjust_length(@a delta) equals its old
+ * length plus @a delta. Generally adjust_length() is used after a call
+ * to reserve(). @sa set_length */
+inline void StringAccum::adjust_length(int delta) {
+ assert(_len + delta >= 0 && _len + delta <= _cap);
+ _len += delta;
+}
+
+/** @brief Reserve space and adjust length in one operation.
+ * @param nadjust number of characters to reserve and adjust length
+ * @param nreserve additional characters to reserve
+ * @pre @a nadjust >= 0 and @a nreserve >= 0
+ *
+ * This operation combines the effects of reserve(@a nadjust + @a
+ * nreserve) and adjust_length(@a nadjust). Returns the result of the
+ * reserve() call. */
+inline char* StringAccum::extend(int nadjust, int nreserve) {
+ assert(nadjust >= 0 && nreserve >= 0);
+ if (_len + nadjust + nreserve <= _cap) {
+ char *x = reinterpret_cast<char *>(_s + _len);
+ _len += nadjust;
+ return x;
+ } else
+ return hard_extend(nadjust, nreserve);
+}
+
+/** @brief Remove characters from the end of the StringAccum.
+ * @param n number of characters to remove
+ * @pre @a n >= 0 and @a n <= length()
+ *
+ * Same as adjust_length(-@a n). */
+inline void StringAccum::pop_back(int n) {
+ assert(n >= 0 && _len >= n);
+ _len -= n;
+}
+
+/** @brief Append character @a c to the StringAccum.
+ * @param c character to append */
+inline void StringAccum::append(char c) {
+ if (_len < _cap || grow(_len))
+ _s[_len++] = c;
+}
+
+/** @overload */
+inline void StringAccum::append(unsigned char c) {
+ append(static_cast<char>(c));
+}
+
+/** @brief Append the UTF-8 encoding of Unicode character @a ch. */
+inline void StringAccum::append_utf8(unsigned ch) {
+ if (ch < 0x80)
+ append((unsigned char) ch);
+ else
+ append_utf8_hard(ch);
+}
+
+/** @brief Append the first @a len characters of @a s to this StringAccum.
+ * @param s data to append
+ * @param len length of data
+ * @pre @a len >= 0 */
+inline void StringAccum::append(const char* s, int len) {
assert(len >= 0);
if (_len + len <= _cap) {
- memcpy(_s + _len, s, len);
- _len += len;
+ memcpy(_s + _len, s, len);
+ _len += len;
} else
- hard_append(s, len);
+ hard_append(s, len);
}
-inline void StringAccum::append(const unsigned char *s, int len) {
+/** @overload */
+inline void StringAccum::append(const unsigned char* s, int len) {
append(reinterpret_cast<const char *>(s), len);
}
-inline void StringAccum::append(const char *begin, const char *end) {
+/** @brief Append the data from @a begin to @a end to the end of this
+ * StringAccum.
+ *
+ * Does nothing if @a begin >= @a end. */
+inline void StringAccum::append(const char* begin, const char* end) {
if (begin < end)
- append(begin, end - begin);
+ append(begin, end - begin);
}
-inline void StringAccum::append(const unsigned char *begin, const unsigned char *end) {
+/** @overload */
+inline void StringAccum::append(const unsigned char* begin, const unsigned char* end) {
if (begin < end)
- append(begin, end - begin);
+ append(begin, end - begin);
+}
+
+/** @brief Assign this StringAccum to @a x. */
+inline StringAccum& StringAccum::operator=(const StringAccum& x) {
+ if (&x != this) {
+ if (out_of_memory())
+ _s = 0, _cap = 0;
+ _len = 0;
+ append(x.data(), x.length());
+ }
+ return *this;
}
/** @relates StringAccum
@@ -513,9 +551,9 @@ operator<<(StringAccum &sa, bool b)
{
static const char truefalse[] = "truefalse";
if (b)
- sa.append(truefalse, 4);
+ sa.append(truefalse, 4);
else
- sa.append(truefalse + 4, 5);
+ sa.append(truefalse + 4, 5);
return sa;
}
@@ -562,9 +600,9 @@ inline StringAccum &
operator<<(StringAccum &sa, const String &str)
{
if (!str.out_of_memory())
- sa.hard_append(str.begin(), str.length());
+ sa.hard_append(str.begin(), str.length());
else
- sa.assign_out_of_memory();
+ sa.assign_out_of_memory();
return sa;
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc 2018-02-23 12:47:54.079972053 -0500
@@ -7,7 +7,7 @@
*
* Copyright (c) 1999-2000 Massachusetts Institute of Technology
* Copyright (c) 2001-2003 International Computer Science Institute
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec 2018-02-23 12:47:54.079972053 -0500
@@ -1,6 +1,6 @@
Summary: Programs to manipulate OpenType and multiple-master fonts
Name: lcdf-typetools
-Version: 2.106
+Version: 2.107
Copyright: GPL
Vendor: Little Cambridgeport Design Factory <http://www.lcdf.org/>
Group: Utilities/Printing
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc 2018-02-23 12:47:54.079972053 -0500
@@ -2,7 +2,7 @@
/* afm.{cc,hh} -- Adobe Font Metrics files
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc 2018-02-23 12:47:54.079972053 -0500
@@ -2,7 +2,7 @@
/* afmparse.{cc,hh} -- Adobe Font Metrics parsing
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc 2018-02-23 12:47:54.079972053 -0500
@@ -2,7 +2,7 @@
/* afmw.{cc,hh} -- Adobe Font Metrics writing
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc 2018-02-23 12:47:54.079972053 -0500
@@ -2,7 +2,7 @@
/* amfm.{cc,hh} -- Adobe Multiple-Master Font Metrics
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* cff.{cc,hh} -- Compact Font Format fonts
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -326,17 +326,11 @@ static const uint8_t default_dict_cff_da
0, 0
};
-static const Cff::Dict &
+static const Cff::Dict&
default_dict()
{
- static Cff *cff;
- static Cff::Font *cfffont;
- if (!cfffont) {
- cff = new Cff(String::make_stable((const char *) default_dict_cff_data, sizeof(default_dict_cff_data)),
- 0, ErrorHandler::default_handler());
- cfffont = (Cff::Font *) cff->font();
- }
- return cfffont->top_dict();
+ static Cff cff(String::make_stable((const char*) default_dict_cff_data, sizeof(default_dict_cff_data)), 0, ErrorHandler::default_handler());
+ return static_cast<Cff::Font*>(cff.font())->top_dict();
}
@@ -360,6 +354,8 @@ Cff::~Cff()
{
for (int i = 0; i < _gsubrs_cs.size(); i++)
delete _gsubrs_cs[i];
+ for (int i = 0; i < _fonts.size(); ++i)
+ delete _fonts[i];
}
/*
@@ -500,25 +496,6 @@ Cff::sid_permstring(int sid) const
}
}
-int
-Cff::font_offset(int findex, int &offset, int &length) const
-{
- if (findex < 0 || findex >= nfonts())
- return -ENOENT;
- offset = _top_dict_index[findex] - _data;
- length = _top_dict_index[findex + 1] - _top_dict_index[findex];
- return 0;
-}
-
-int
-Cff::font_offset(PermString name, int &offset, int &length) const
-{
- for (int i = 0; i < _name_index.size(); i++)
- if (_name_index[i] == name && name)
- return font_offset(i, offset, length);
- return -ENOENT;
-}
-
Cff::FontParent *
Cff::font(PermString font_name, ErrorHandler *errh)
{
@@ -529,24 +506,39 @@ Cff::font(PermString font_name, ErrorHan
return errh->error("invalid CFF"), (FontParent *) 0;
// search for a font named 'font_name'
- for (int i = 0; i < _name_index.size(); i++)
- if (_name_index[i] && (!font_name || font_name == _name_index[i])) {
- int td_offset = _top_dict_index[i] - _data;
- int td_length = _top_dict_index[i + 1] - _top_dict_index[i];
- Dict top_dict(this, td_offset, td_length, errh, "Top DICT");
- if (!top_dict.ok())
- return 0;
- else if (top_dict.has_first(oROS))
- return new Cff::CIDFont(this, _name_index[i], top_dict, errh);
- else
- return new Cff::Font(this, _name_index[i], top_dict, errh);
- }
+ int findex;
+ for (findex = 0; findex < _name_index.size(); ++findex) {
+ if (_name_index[findex]
+ && (!font_name || font_name == _name_index[findex]))
+ break;
+ }
+ if (findex >= _name_index.size()) {
+ if (!font_name)
+ errh->error("no fonts in CFF");
+ else
+ errh->error("font %<%s%> not found", font_name.c_str());
+ return 0;
+ }
+
+ // return font
+ for (int i = 0; i < _fonts.size(); ++i)
+ if (_fonts[i]->_font_index == findex)
+ return _fonts[i];
+
+ int td_offset = _top_dict_index[findex] - _data;
+ int td_length = _top_dict_index[findex + 1] - _top_dict_index[findex];
+ Dict top_dict(this, td_offset, td_length, errh, "Top DICT");
+ if (!top_dict.ok())
+ return 0;
- if (!font_name)
- errh->error("no fonts in CFF");
+ Cff::FontParent* fp;
+ if (top_dict.has_first(oROS))
+ fp = new Cff::CIDFont(this, _name_index[findex], top_dict, errh);
else
- errh->error("font %<%s%> not found", font_name.c_str());
- return 0;
+ fp = new Cff::Font(this, _name_index[findex], top_dict, errh);
+ fp->_font_index = findex;
+ _fonts.push_back(fp);
+ return fp;
}
static inline int
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* encoding.{cc,hh} -- 8-bit encodings
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* findmet.{cc,hh} -- find font metrics
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* metrics.{cc,hh} -- generic font metrics
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* otf.{cc,hh} -- OpenType font basics
*
- * Copyright (c) 2002-2016 Eddie Kohler
+ * Copyright (c) 2002-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -747,11 +747,11 @@ FeatureList::lookups(const ScriptList &s
* *
**************************/
-Coverage::Coverage() throw ()
+Coverage::Coverage() noexcept
{
}
-Coverage::Coverage(Glyph first, Glyph last) throw ()
+Coverage::Coverage(Glyph first, Glyph last) noexcept
{
if (first <= last) {
_str = String("\000\002\000\001\000\000\000\000\000\000", 10);
@@ -764,7 +764,7 @@ Coverage::Coverage(Glyph first, Glyph la
}
}
-Coverage::Coverage(const Vector<bool> &gmap) throw ()
+Coverage::Coverage(const Vector<bool> &gmap) noexcept
{
int end = gmap.size();
while (end > 0 && !gmap[end - 1])
@@ -790,7 +790,7 @@ Coverage::Coverage(const Vector<bool> &g
}
}
-Coverage::Coverage(const String &str, ErrorHandler *errh, bool do_check) throw ()
+Coverage::Coverage(const String &str, ErrorHandler *errh, bool do_check) noexcept
: _str(str)
{
_str.align(2);
@@ -844,7 +844,7 @@ Coverage::check(ErrorHandler *errh)
}
int
-Coverage::size() const throw ()
+Coverage::size() const noexcept
{
if (_str.length() == 0)
return -1;
@@ -861,7 +861,7 @@ Coverage::size() const throw ()
}
int
-Coverage::coverage_index(Glyph g) const throw ()
+Coverage::coverage_index(Glyph g) const noexcept
{
if (_str.length() == 0)
return -1;
@@ -906,7 +906,7 @@ Coverage::coverage_index(Glyph g) const
}
Glyph
-Coverage::operator[](int cindex) const throw ()
+Coverage::operator[](int cindex) const noexcept
{
if (_str.length() == 0 || cindex < 0)
return 0;
@@ -935,7 +935,7 @@ Coverage::operator[](int cindex) const t
}
void
-Coverage::unparse(StringAccum &sa) const throw ()
+Coverage::unparse(StringAccum &sa) const noexcept
{
const uint8_t *data = _str.udata();
if (_str.length() == 0)
@@ -958,7 +958,7 @@ Coverage::unparse(StringAccum &sa) const
}
String
-Coverage::unparse() const throw ()
+Coverage::unparse() const noexcept
{
StringAccum sa;
unparse(sa);
@@ -1237,7 +1237,7 @@ GlyphSet::operator=(const GlyphSet &o)
* *
**************************/
-ClassDef::ClassDef(const String &str, ErrorHandler *errh) throw ()
+ClassDef::ClassDef(const String &str, ErrorHandler *errh) noexcept
: _str(str)
{
_str.align(2);
@@ -1277,7 +1277,7 @@ ClassDef::check(ErrorHandler *errh)
}
int
-ClassDef::lookup(Glyph g) const throw ()
+ClassDef::lookup(Glyph g) const noexcept
{
if (_str.length() == 0)
return -1;
@@ -1311,7 +1311,7 @@ ClassDef::lookup(Glyph g) const throw ()
}
void
-ClassDef::unparse(StringAccum &sa) const throw ()
+ClassDef::unparse(StringAccum &sa) const noexcept
{
const uint8_t *data = _str.udata();
if (_str.length() == 0)
@@ -1336,7 +1336,7 @@ ClassDef::unparse(StringAccum &sa) const
}
String
-ClassDef::unparse() const throw ()
+ClassDef::unparse() const noexcept
{
StringAccum sa;
unparse(sa);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc 2018-02-23 12:47:54.080972028 -0500
@@ -2,7 +2,7 @@
/* otfcmap.{cc,hh} -- OpenType cmap table
*
- * Copyright (c) 2002-2016 Eddie Kohler
+ * Copyright (c) 2002-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -184,25 +184,27 @@ Cmap::check_table(int t, ErrorHandler *e
|| (searchRange>>1) > segCountX2/2
|| 1 << (entrySelector + 1) != searchRange
|| rangeShift != segCountX2 - searchRange)
- return errh->error("bad table %d segment counts (format 4)", t);
+ return errh->error("bad table %d segment counts (format %d)", format);
uint32_t segCount = segCountX2 >> 1;
if (length < 16 + 8 * segCount)
- return errh->error("bad table %d length (format %d)", t, format);
+ return errh->error("bad table %d length (format %d, length %u, need %u)", t, format, length, 16 + 8 * segCount);
const uint8_t *endCodes = data + 14;
const uint8_t *startCodes = endCodes + 2 + segCountX2;
const uint8_t *idDeltas = startCodes + segCountX2;
const uint8_t *idRangeOffsets = idDeltas + segCountX2;
+ uint32_t idRangeOffsetsPos = idRangeOffsets - data;
int last_end = 0;
for (int i = 0; i < segCountX2; i += 2) {
int endCode = USHORT_AT(endCodes + i);
int startCode = USHORT_AT(startCodes + i);
- /* int idDelta = SHORT_AT(idDeltas + i); // no need to check */
+ /* int idDelta = SHORT_AT(idDeltas + i); // not needed */
int idRangeOffset = USHORT_AT(idRangeOffsets + i);
if (endCode < startCode || startCode < last_end)
return errh->error("bad table %d overlapping range %d (format %d)", t, i/2, format);
if (idRangeOffset
- && idRangeOffsets + i + idRangeOffset + (endCode - startCode)*2 + 2 > data + length)
- return errh->error("bad table %d range %d length (format 4)", t, i/2);
+ && idRangeOffset != 65535
+ && idRangeOffsetsPos + i + idRangeOffset + (endCode - startCode)*2 + 2 > length)
+ return errh->error("bad table %d range %d length (format %d, range %d-%d, idRangeOffset %d, length %u)", t, i/2, format, startCode, endCode, idRangeOffset, length);
last_end = endCode + 1;
}
if (USHORT_AT(endCodes + segCountX2 - 2) != 0xFFFF)
@@ -308,6 +310,8 @@ Cmap::map_table(int t, uint32_t uni, Err
int idRangeOffset = USHORT_AT(idRangeOffsets + (m << 1));
if (idRangeOffset == 0)
return (idDelta + uni) & 65535;
+ else if (idRangeOffset == 65535)
+ return 0;
int g = USHORT_AT(idRangeOffsets + (m << 1) + idRangeOffset + ((uni - startCount) << 1));
if (g == 0)
return 0;
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc 2018-02-23 12:47:54.081972003 -0500
@@ -2,7 +2,7 @@
/* otfdata.{cc,hh} -- OpenType bounds-checked string type
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -21,7 +21,7 @@
namespace Efont { namespace OpenType {
Data
-Data::subtable(unsigned offset) const throw (Bounds)
+Data::subtable(unsigned offset) const
{
if (offset > (unsigned) _str.length())
throw Bounds();
@@ -29,7 +29,7 @@ Data::subtable(unsigned offset) const th
}
Data
-Data::offset_subtable(unsigned offset_offset) const throw (Bounds)
+Data::offset_subtable(unsigned offset_offset) const
{
int offset = u16(offset_offset);
if (offset > _str.length())
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc 2018-02-23 12:47:54.081972003 -0500
@@ -1,6 +1,6 @@
/* otfdescrip.cc -- descriptions for OpenType tags
*
- * Copyright (c) 2002-2016 Eddie Kohler
+ * Copyright (c) 2002-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc 2018-02-23 12:47:54.081972003 -0500
@@ -2,7 +2,7 @@
/* otfgpos.{cc,hh} -- OpenType GPOS table
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -32,7 +32,7 @@ namespace Efont { namespace OpenType {
* *
**************************/
-Gpos::Gpos(const Data &d, ErrorHandler *errh) throw (Error)
+Gpos::Gpos(const Data &d, ErrorHandler *errh)
{
// Fixed Version
// Offset ScriptList
@@ -79,7 +79,7 @@ const int GposValue::nibble_bitcount_x2[
* *
**************************/
-GposLookup::GposLookup(const Data &d) throw (Error)
+GposLookup::GposLookup(const Data &d)
: _d(d)
{
if (_d.length() < 6)
@@ -143,7 +143,7 @@ GposLookup::unparse_automatics(Vector<Po
* *
**************************/
-GposSingle::GposSingle(const Data &d) throw (Error)
+GposSingle::GposSingle(const Data &d)
: _d(d)
{
if (_d[0] != 0
@@ -156,7 +156,7 @@ GposSingle::GposSingle(const Data &d) th
}
Coverage
-GposSingle::coverage() const throw ()
+GposSingle::coverage() const noexcept
{
return Coverage(_d.offset_subtable(2), 0, false);
}
@@ -183,7 +183,7 @@ GposSingle::unparse(Vector<Positioning>
* *
**************************/
-GposPair::GposPair(const Data &d) throw (Error)
+GposPair::GposPair(const Data &d)
: _d(d)
{
if (_d[0] != 0
@@ -196,7 +196,7 @@ GposPair::GposPair(const Data &d) throw
}
Coverage
-GposPair::coverage() const throw ()
+GposPair::coverage() const noexcept
{
return Coverage(_d.offset_subtable(2), 0, false);
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc 2018-02-23 12:47:54.081972003 -0500
@@ -2,7 +2,7 @@
/* otfgsub.{cc,hh} -- OpenType GSUB table
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -255,13 +255,13 @@ Substitution::context_in(const GlyphSet
}
Glyph
-Substitution::extract_glyph(const Substitute &s, uint8_t t) throw ()
+Substitution::extract_glyph(const Substitute &s, uint8_t t) noexcept
{
return (t == T_GLYPH ? s.gid : 0);
}
Glyph
-Substitution::extract_glyph(const Substitute &s, int which, uint8_t t) throw ()
+Substitution::extract_glyph(const Substitute &s, int which, uint8_t t) noexcept
{
switch (t) {
case T_GLYPH:
@@ -279,7 +279,7 @@ Substitution::extract_glyph(const Substi
}
bool
-Substitution::extract_glyphs(const Substitute &s, uint8_t t, Vector<Glyph> &v, bool coverage_ok) throw ()
+Substitution::extract_glyphs(const Substitute &s, uint8_t t, Vector<Glyph> &v, bool coverage_ok) noexcept
{
switch (t) {
case T_GLYPH:
@@ -302,7 +302,7 @@ Substitution::extract_glyphs(const Subst
}
Glyph *
-Substitution::extract_glyphptr(const Substitute &s, uint8_t t) throw ()
+Substitution::extract_glyphptr(const Substitute &s, uint8_t t) noexcept
{
switch (t) {
case T_GLYPH:
@@ -315,7 +315,7 @@ Substitution::extract_glyphptr(const Sub
}
int
-Substitution::extract_nglyphs(const Substitute &s, uint8_t t, bool coverage_ok) throw ()
+Substitution::extract_nglyphs(const Substitute &s, uint8_t t, bool coverage_ok) noexcept
{
switch (t) {
case T_GLYPH:
@@ -330,7 +330,7 @@ Substitution::extract_nglyphs(const Subs
}
bool
-Substitution::matches(const Substitute &s, uint8_t t, int pos, Glyph g) throw ()
+Substitution::matches(const Substitute &s, uint8_t t, int pos, Glyph g) noexcept
{
switch (t) {
case T_GLYPH:
@@ -461,7 +461,7 @@ Substitution::remove_outer_right()
}
bool
-Substitution::out_alter(const Substitution &o, int pos) throw ()
+Substitution::out_alter(const Substitution &o, int pos) noexcept
{
const Glyph *g = out_glyphptr();
int ng = out_nglyphs();
@@ -490,7 +490,7 @@ Substitution::out_alter(const Substituti
}
static void
-unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns) throw ()
+unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns) noexcept
{
if (gid > 0 && gns && gns->size() > gid && (*gns)[gid])
sa << (*gns)[gid];
@@ -499,7 +499,7 @@ unparse_glyphid(StringAccum &sa, Glyph g
}
void
-Substitution::unparse_glyphids(StringAccum &sa, const Substitute &s, uint8_t t, const Vector<PermString> *gns) throw ()
+Substitution::unparse_glyphids(StringAccum &sa, const Substitute &s, uint8_t t, const Vector<PermString> *gns) noexcept
{
if (t == T_GLYPH)
unparse_glyphid(sa, s.gid, gns);
@@ -565,7 +565,7 @@ Substitution::unparse(const Vector<PermS
* *
**************************/
-Gsub::Gsub(const Data &d, const Font *otf, ErrorHandler *errh) throw (Error)
+Gsub::Gsub(const Data &d, const Font *otf, ErrorHandler *errh)
: _chaincontext_reverse_backtrack(false)
{
// Fixed Version
@@ -615,7 +615,7 @@ Gsub::lookup(unsigned i) const
* *
**************************/
-GsubLookup::GsubLookup(const Data &d) throw (Error)
+GsubLookup::GsubLookup(const Data &d)
: _d(d)
{
if (_d.length() < 6)
@@ -779,7 +779,7 @@ GsubLookup::apply(const Glyph *g, int po
* *
**************************/
-GsubSingle::GsubSingle(const Data &d) throw (Error)
+GsubSingle::GsubSingle(const Data &d)
: _d(d)
{
if (_d[0] != 0
@@ -792,7 +792,7 @@ GsubSingle::GsubSingle(const Data &d) th
}
Coverage
-GsubSingle::coverage() const throw ()
+GsubSingle::coverage() const noexcept
{
return Coverage(_d.offset_subtable(2), 0, false);
}
@@ -857,7 +857,7 @@ GsubSingle::apply(const Glyph *g, int po
* *
**************************/
-GsubMultiple::GsubMultiple(const Data &d) throw (Error)
+GsubMultiple::GsubMultiple(const Data &d)
: _d(d)
{
if (_d[0] != 0 || _d[1] != 1)
@@ -869,7 +869,7 @@ GsubMultiple::GsubMultiple(const Data &d
}
Coverage
-GsubMultiple::coverage() const throw ()
+GsubMultiple::coverage() const noexcept
{
return Coverage(_d.offset_subtable(2), 0, false);
}
@@ -934,7 +934,7 @@ GsubMultiple::apply(const Glyph *g, int
* *
**************************/
-GsubLigature::GsubLigature(const Data &d) throw (Error)
+GsubLigature::GsubLigature(const Data &d)
: _d(d)
{
if (_d[0] != 0
@@ -947,7 +947,7 @@ GsubLigature::GsubLigature(const Data &d
}
Coverage
-GsubLigature::coverage() const throw ()
+GsubLigature::coverage() const noexcept
{
return Coverage(_d.offset_subtable(2), 0, false);
}
@@ -1040,7 +1040,7 @@ GsubLigature::apply(const Glyph *g, int
* *
**************************/
-GsubContext::GsubContext(const Data &d) throw (Error)
+GsubContext::GsubContext(const Data &d)
: _d(d)
{
switch (_d.u16(0)) {
@@ -1062,7 +1062,7 @@ GsubContext::GsubContext(const Data &d)
}
Coverage
-GsubContext::coverage() const throw ()
+GsubContext::coverage() const noexcept
{
if (_d[1] == 3)
return Coverage(_d.offset_subtable(F3_HSIZE), 0, false);
@@ -1171,7 +1171,7 @@ GsubContext::unparse(const Gsub &gsub, V
* *
**************************/
-GsubChainContext::GsubChainContext(const Data &d) throw (Error)
+GsubChainContext::GsubChainContext(const Data &d)
: _d(d)
{
switch (_d.u16(0)) {
@@ -1201,7 +1201,7 @@ GsubChainContext::GsubChainContext(const
}
Coverage
-GsubChainContext::coverage() const throw ()
+GsubChainContext::coverage() const noexcept
{
switch (_d.u16(0)) {
case 1:
@@ -1279,7 +1279,6 @@ GsubChainContext::f1_unparse(const Gsub
int subtab_offset = subst_offset + 2;
Substitution s(nbacktrack, ninput, ninput, nlookahead);
- Glyph* left_begin = s.left_glyphptr();
if (gsub.chaincontext_reverse_backtrack()) {
for (int i = 0; i != nbacktrack; ++i)
s.left_glyphptr()[i] = _d.u16(sr_offset + 2 + i*2);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc 2018-02-23 12:47:54.081972003 -0500
@@ -2,7 +2,7 @@
/* otfname.{cc,hh} -- OpenType name table
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc 2018-02-23 12:47:54.081972003 -0500
@@ -2,7 +2,7 @@
/* otfos2.{cc,hh} -- OpenType OS/2 table
*
- * Copyright (c) 2005-2016 Eddie Kohler
+ * Copyright (c) 2005-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* otfpost.{cc,hh} -- OpenType post table
*
- * Copyright (c) 2006-2016 Eddie Kohler
+ * Copyright (c) 2006-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* pairop.{cc,hh} -- ligature/kern font metrics
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* psres.{cc,hh} -- PSres.upr files
*
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* t1bounds.{cc,hh} -- charstring bounding box finder
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* t1cs.{cc,hh} -- Type 1/2 charstrings
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -115,7 +115,7 @@ Type1Charstring::Type1Charstring(int len
const unsigned char *d = reinterpret_cast<const unsigned char*>(s.data());
_key = t1R_cs;
for (int i = 0; i < lenIV; i++, d++)
- _key = ((*d + _key) * t1C1 + t1C2) & 0xFFFF;
+ _key = ((*d + _key) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
_s = s.substring(lenIV);
}
}
@@ -139,7 +139,7 @@ Type1Charstring::decrypt() const
for (int i = 0; i < _s.length(); i++, d++) {
uint8_t encrypted = *d;
*d = encrypted ^ (r >> 8);
- r = ((encrypted + r) * t1C1 + t1C2) & 0xFFFF;
+ r = ((encrypted + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
}
_key = -1;
}
@@ -193,7 +193,7 @@ Type1Charstring::process(CharstringInter
} else { // 255: push huge number
if (left < 5)
goto runoff_error;
- int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ int32_t val = ((uint32_t) data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
more = interp.number(val);
ahead = 5;
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* t1csgen.{cc,hh} -- Type 1 charstring generation
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc 2018-02-23 12:47:54.082971978 -0500
@@ -2,7 +2,7 @@
/* t1font.{cc,hh} -- Type 1 font
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc 2018-02-23 12:47:54.083971953 -0500
@@ -1,6 +1,6 @@
/* t1fontskel.cc -- Type 1 font skeleton
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc 2018-02-23 12:47:54.083971953 -0500
@@ -2,7 +2,7 @@
/* t1interp.{cc,hh} -- Type 1/2 charstring interpretation
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc 2018-02-23 12:47:54.083971953 -0500
@@ -2,7 +2,7 @@
/* t1item.{cc,hh} -- items in a Type 1 font
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -731,12 +731,12 @@ Type1Subr::gen(Type1Writer &w)
for (int i = 0; i < w.lenIV(); i++) {
unsigned char c = (unsigned char)(r >> 8);
*t++ = c;
- r = ((c + r) * t1C1 + t1C2) & 0xFFFF;
+ r = ((c + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
}
for (int i = 0; i < len; i++, data++) {
unsigned char c = (*data ^ (r >> 8));
*t++ = c;
- r = ((c + r) * t1C1 + t1C2) & 0xFFFF;
+ r = ((c + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
}
w.print((char *)buf, len + w.lenIV());
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc 2018-02-23 12:47:54.083971953 -0500
@@ -2,7 +2,7 @@
/* t1mm.{cc,hh} -- Type 1 multiple master font information
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc 2018-02-23 12:47:54.083971953 -0500
@@ -2,7 +2,7 @@
/* t1rw.{cc,hh} -- Type 1 font reading and writing
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -117,7 +117,7 @@ inline int
Type1Reader::eexec(int c)
{
unsigned char answer = (unsigned char)(c ^ (_r >> 8));
- _r = (((unsigned char)c + _r) * t1C1 + t1C2) & 0xFFFF;
+ _r = (((unsigned char)c + _r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
return answer;
}
@@ -439,7 +439,7 @@ inline unsigned char
Type1Writer::eexec(int p)
{
unsigned char c = ((unsigned char)p ^ (_r >> 8)) & 0xFF;
- _r = ((c + _r) * t1C1 + t1C2) & 0xFFFF;
+ _r = ((c + _r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
return c;
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc 2018-02-23 12:47:54.083971953 -0500
@@ -2,7 +2,7 @@
/* t1unparser.{cc,hh} -- debug printing of Type 1 fonts
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc 2018-02-23 12:47:54.084971928 -0500
@@ -2,7 +2,7 @@
/* ttfcs.{cc,hh} -- TrueType "charstring" emulation
*
- * Copyright (c) 2006-2016 Eddie Kohler
+ * Copyright (c) 2006-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc 2018-02-23 12:47:54.084971928 -0500
@@ -2,7 +2,7 @@
/* ttfhead.{cc,hh} -- TrueType head table
*
- * Copyright (c) 2007-2016 Eddie Kohler
+ * Copyright (c) 2007-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc.git4166ff9 2016-11-25 13:08:52.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc 2018-02-23 12:47:54.084971928 -0500
@@ -2,7 +2,7 @@
/* ttfkern.{cc,hh} -- TrueType kern table
*
- * Copyright (c) 2009-2016 Eddie Kohler
+ * Copyright (c) 2009-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -27,7 +27,7 @@
namespace Efont { namespace OpenType {
inline Data
-KernTable::subtable(uint32_t &off_in_out) const throw (Error)
+KernTable::subtable(uint32_t &off_in_out) const
{
uint32_t off = off_in_out, len;
if (_version == 0) {
@@ -42,7 +42,7 @@ KernTable::subtable(uint32_t &off_in_out
return _d.substring(off, len);
}
-KernTable::KernTable(const Data &d, ErrorHandler *) throw (Error)
+KernTable::KernTable(const Data &d, ErrorHandler *)
: _d(d), _error(-1)
{
// USHORT Version
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc 2018-02-23 12:47:54.084971928 -0500
@@ -2,7 +2,7 @@
/* bezier.{cc,hh} -- cubic Bezier curves
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -23,7 +23,7 @@
//
void
-Bezier::make_bb() const throw ()
+Bezier::make_bb() const noexcept
{
_bb = 0;
for (int i = 1; i < 4; i++) {
@@ -44,7 +44,7 @@ Bezier::make_bb() const throw ()
//
bool
-Bezier::is_flat(double t) const throw ()
+Bezier::is_flat(double t) const noexcept
{
return (_p[2].on_segment(_p[0], _p[3], t)
&& _p[1].on_segment(_p[0], _p[3], t));
@@ -66,7 +66,7 @@ eval_bezier(Point *b_in, int degree, dou
}
Point
-Bezier::eval(double u) const throw ()
+Bezier::eval(double u) const noexcept
{
Bezier b = *this;
double m = 1.0 - u;
@@ -82,7 +82,7 @@ Bezier::eval(double u) const throw ()
//
void
-Bezier::halve(Bezier &l, Bezier &r) const throw ()
+Bezier::halve(Bezier &l, Bezier &r) const noexcept
{
Point half = Point::midpoint(_p[1], _p[2]);
l._p[0] = _p[0];
@@ -100,7 +100,7 @@ Bezier::halve(Bezier &l, Bezier &r) cons
//
bool
-Bezier::in_bb(const Point &p, double tolerance) const throw ()
+Bezier::in_bb(const Point &p, double tolerance) const noexcept
{
ensure_bb();
if (bb_right() + tolerance < p.x
@@ -114,7 +114,7 @@ Bezier::in_bb(const Point &p, double tol
double
Bezier::hit_recurse(const Point &p, double tolerance, double leftd,
- double rightd, double leftt, double rightt) const throw ()
+ double rightd, double leftt, double rightt) const noexcept
{
Bezier left, right;
double middled, resultt;
@@ -146,7 +146,7 @@ Bezier::hit_recurse(const Point &p, doub
}
bool
-Bezier::hit(const Point &p, double tolerance) const throw ()
+Bezier::hit(const Point &p, double tolerance) const noexcept
{
double leftd = (_p[0] - p).squared_length();
double rightd = (_p[3] - p).squared_length();
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c 2018-02-23 12:47:54.084971928 -0500
@@ -2,7 +2,7 @@
/* clp.c - Complete source code for CLP.
* This file is part of CLP, the command line parser package.
*
- * Copyright (c) 1997-2016 Eddie Kohler, ekohler@gmail.com
+ * Copyright (c) 1997-2018 Eddie Kohler, ekohler@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc 2018-02-23 12:47:54.085971903 -0500
@@ -4,7 +4,7 @@
* Eddie Kohler
*
* Copyright (c) 1999-2000 Massachusetts Institute of Technology
- * Copyright (c) 2001-2016 Eddie Kohler
+ * Copyright (c) 2001-2018 Eddie Kohler
* Copyright (c) 2008 Meraki, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -595,7 +595,7 @@ ErrorHandler::vxformat(int default_flags
s2 = numbuf + NUMBUF_SIZE;
- unsigned long num;
+ do_number_t num;
switch (width_flag) {
case 'H':
case -8:
@@ -651,13 +651,12 @@ ErrorHandler::vxformat(int default_flags
default:
goto error;
}
- s1 = do_number(num, (char *)s2, base, flags);
+ s1 = do_number(num, (char*) s2, base, flags);
#if HAVE_INT64_TYPES
got_number:
#endif
- s1 = do_number_flags((char *)s1, (char *)s2, base, flags,
- precision, field_width);
+ s1 = do_number_flags((char*)s1, (char*) s2, base, flags, precision, field_width);
break;
}
@@ -681,7 +680,7 @@ ErrorHandler::vxformat(int default_flags
}
void* v = va_arg(val, void*);
s2 = numbuf + NUMBUF_SIZE;
- s1 = do_number((unsigned long) v, (char*) s2, 16, flags);
+ s1 = do_number((do_number_t) v, (char*) s2, 16, flags);
s1 = do_number_flags((char*) s1, (char*) s2, 16, flags | cf_alternate_form, precision, field_width);
break;
}
@@ -828,7 +827,7 @@ ErrorHandler::fatal(const char *fmt, ...
{
va_list val;
va_start(val, fmt);
- int r = xmessage(String::make_stable(e_fatal, 4), fmt, val);
+ (void) xmessage(String::make_stable(e_fatal, 4), fmt, val);
va_end(val);
abort();
}
@@ -881,7 +880,7 @@ ErrorHandler::lfatal(const String &landm
va_list val;
va_start(val, fmt);
String l = make_landmark_anno(landmark);
- int r = xmessage(String::make_stable(e_fatal, 4) + l, fmt, val);
+ (void) xmessage(String::make_stable(e_fatal, 4) + l, fmt, val);
va_end(val);
abort();
}
@@ -1091,7 +1090,7 @@ ErrorVeneer::account(int level)
ContextErrorHandler::ContextErrorHandler(ErrorHandler *errh, const char *fmt,
...)
: ErrorVeneer(errh), _indent(String::make_stable(" ", 2)),
- _context_printed(false), _context_landmark("{l:}")
+ _context_landmark("{l:}"), _context_printed(false)
{
va_list val;
va_start(val, fmt);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc 2018-02-23 12:47:54.085971903 -0500
@@ -2,7 +2,7 @@
/* filename.{cc,hh} -- filenames
*
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -126,5 +126,5 @@ Filename::open_write(bool binary) const
if (_actual || !_path)
return _actual;
else
- return fopen(_path.c_str(), "wb");
+ return fopen(_path.c_str(), binary ? "wb" : "w");
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc 2018-02-23 12:47:54.085971903 -0500
@@ -2,7 +2,7 @@
/* globmatch.{cc,hh} -- glob_match() function for shell globbing
*
- * Copyright (c) 2000-2016 Eddie Kohler
+ * Copyright (c) 2000-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc 2018-02-23 12:47:54.085971903 -0500
@@ -2,7 +2,7 @@
/* landmark.{cc,hh} -- FILE:LINE type landmarks
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc 2018-02-23 12:47:54.086971878 -0500
@@ -2,7 +2,7 @@
/* permstr.{cc,hh} -- permanent strings
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc 2018-02-23 12:47:54.087971853 -0500
@@ -2,7 +2,7 @@
/* point.{cc,hh} -- 2D points
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -19,7 +19,7 @@
#include <lcdf/point.hh>
Point
-Point::rotated(double rotation) const throw ()
+Point::rotated(double rotation) const noexcept
{
double r = length();
double theta = angle() + rotation;
@@ -27,13 +27,13 @@ Point::rotated(double rotation) const th
}
Point
-Point::midpoint(const Point &a, const Point &b) throw ()
+Point::midpoint(const Point &a, const Point &b) noexcept
{
return Point((a.x + b.x)/2, (a.y + b.y)/2);
}
bool
-Point::on_line(const Point &a, const Point &b, double tolerance) const throw ()
+Point::on_line(const Point &a, const Point &b, double tolerance) const noexcept
{
Point c = b - a;
double d = c.x * (y - a.y) - c.y * (x - a.x);
@@ -41,7 +41,7 @@ Point::on_line(const Point &a, const Poi
}
bool
-Point::on_segment(const Point &a, const Point &b, double t) const throw ()
+Point::on_segment(const Point &a, const Point &b, double t) const noexcept
{
double tt;
Point c = b - a;
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc 2018-02-23 12:47:54.087971853 -0500
@@ -2,7 +2,7 @@
/* slurper.{cc,hh} -- reading from files a line at a time
*
- * Copyright (c) 1998-2016 Eddie Kohler
+ * Copyright (c) 1998-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc 2018-02-23 12:47:54.087971853 -0500
@@ -4,7 +4,7 @@
* Eddie Kohler
*
* Copyright (c) 1999-2000 Massachusetts Institute of Technology
- * Copyright (c) 2001-2016 Eddie Kohler
+ * Copyright (c) 2001-2018 Eddie Kohler
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -61,7 +61,7 @@ StringAccum::assign_out_of_memory()
{
assert(_cap >= 0);
if (_cap > 0)
- delete[] (_s - MEMO_SPACE);
+ delete[] (_s - MEMO_SPACE);
_s = reinterpret_cast<unsigned char *>(const_cast<char *>(String::out_of_memory_data()));
_cap = -1;
_len = 0;
@@ -72,25 +72,25 @@ StringAccum::grow(int want)
{
// can't append to out-of-memory strings
if (_cap < 0) {
- errno = ENOMEM;
- return 0;
+ errno = ENOMEM;
+ return 0;
}
int ncap = (_cap ? (_cap + MEMO_SPACE) * 2 : 128) - MEMO_SPACE;
while (ncap <= want)
- ncap = (ncap + MEMO_SPACE) * 2 - MEMO_SPACE;
+ ncap = (ncap + MEMO_SPACE) * 2 - MEMO_SPACE;
unsigned char *n = new unsigned char[ncap + MEMO_SPACE];
if (!n) {
- assign_out_of_memory();
- errno = ENOMEM;
- return 0;
+ assign_out_of_memory();
+ errno = ENOMEM;
+ return 0;
}
n += MEMO_SPACE;
if (_s) {
- memcpy(n, _s, _len);
- delete[] (_s - MEMO_SPACE);
+ memcpy(n, _s, _len);
+ delete[] (_s - MEMO_SPACE);
}
_s = n;
_cap = ncap;
@@ -102,10 +102,10 @@ StringAccum::resize(int len)
{
assert(len >= 0);
if (len > _cap && !grow(len))
- return -ENOMEM;
+ return -ENOMEM;
else {
- _len = len;
- return 0;
+ _len = len;
+ return 0;
}
}
@@ -114,7 +114,7 @@ StringAccum::hard_extend(int nadjust, in
{
char *x = grow(_len + nadjust + nreserve);
if (x)
- _len += nadjust;
+ _len += nadjust;
return x;
}
@@ -122,7 +122,7 @@ const char *
StringAccum::c_str()
{
if (_len < _cap || grow(_len))
- _s[_len] = '\0';
+ _s[_len] = '\0';
return reinterpret_cast<char *>(_s);
}
@@ -130,28 +130,28 @@ void
StringAccum::append_fill(int c, int len)
{
if (char *s = extend(len))
- memset(s, c, len);
+ memset(s, c, len);
}
void
StringAccum::append_utf8_hard(unsigned ch)
{
if (ch < 0x80)
- append((unsigned char) ch);
+ append((unsigned char) ch);
else if (ch < 0x800) {
- append((unsigned char) (0xC0 + ((ch >> 6) & 0x1F)));
- append((unsigned char) (0x80 + (ch & 0x3F)));
+ append((unsigned char) (0xC0 + ((ch >> 6) & 0x1F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
} else if (ch < 0x10000) {
- append((unsigned char) (0xE0 + ((ch >> 12) & 0x0F)));
- append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
- append((unsigned char) (0x80 + (ch & 0x3F)));
+ append((unsigned char) (0xE0 + ((ch >> 12) & 0x0F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
} else if (ch < 0x110000) {
- append((unsigned char) (0xF0 + ((ch >> 18) & 0x07)));
- append((unsigned char) (0x80 + ((ch >> 12) & 0x3F)));
- append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
- append((unsigned char) (0x80 + (ch & 0x3F)));
+ append((unsigned char) (0xF0 + ((ch >> 18) & 0x07)));
+ append((unsigned char) (0x80 + ((ch >> 12) & 0x3F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
} else
- append((unsigned char) '?');
+ append((unsigned char) '?');
}
void
@@ -161,27 +161,29 @@ StringAccum::hard_append(const char *s,
// a naive implementation might use sa's data after freeing it.
const char *my_s = reinterpret_cast<char *>(_s);
- if (_len + len <= _cap) {
+ if (len <= 0) {
+ // do nothing
+ } else if (_len + len <= _cap) {
success:
- memcpy(_s + _len, s, len);
- _len += len;
+ memcpy(_s + _len, s, len);
+ _len += len;
} else if (s < my_s || s >= my_s + _cap) {
- if (grow(_len + len))
- goto success;
+ if (grow(_len + len))
+ goto success;
} else {
- unsigned char *old_s = _s;
- int old_len = _len;
+ unsigned char *old_s = _s;
+ int old_len = _len;
- _s = 0;
- _len = 0;
- _cap = 0;
-
- if (char *new_s = extend(old_len + len)) {
- memcpy(new_s, old_s, old_len);
- memcpy(new_s + old_len, s, len);
- }
+ _s = 0;
+ _len = 0;
+ _cap = 0;
+
+ if (char *new_s = extend(old_len + len)) {
+ memcpy(new_s, old_s, old_len);
+ memcpy(new_s + old_len, s, len);
+ }
- delete[] (old_s - MEMO_SPACE);
+ delete[] (old_s - MEMO_SPACE);
}
}
@@ -198,14 +200,14 @@ StringAccum::take_string()
int cap = _cap;
char *str = reinterpret_cast<char *>(_s);
if (len > 0) {
- _s = 0;
- _len = _cap = 0;
- return String::make_claim(str, len, cap);
+ _s = 0;
+ _len = _cap = 0;
+ return String::make_claim(str, len, cap);
} else if (!out_of_memory())
- return String();
+ return String();
else {
- clear();
- return String::make_out_of_memory();
+ clear();
+ return String::make_out_of_memory();
}
}
@@ -227,8 +229,8 @@ StringAccum &
operator<<(StringAccum &sa, long i)
{
if (char *x = sa.reserve(24)) {
- int len = sprintf(x, "%ld", i);
- sa.adjust_length(len);
+ int len = sprintf(x, "%ld", i);
+ sa.adjust_length(len);
}
return sa;
}
@@ -240,8 +242,8 @@ StringAccum &
operator<<(StringAccum &sa, unsigned long u)
{
if (char *x = sa.reserve(24)) {
- int len = sprintf(x, "%lu", u);
- sa.adjust_length(len);
+ int len = sprintf(x, "%lu", u);
+ sa.adjust_length(len);
}
return sa;
}
@@ -250,8 +252,8 @@ StringAccum &
operator<<(StringAccum &sa, double d)
{
if (char *x = sa.reserve(256)) {
- int len = sprintf(x, "%.12g", d);
- sa.adjust_length(len);
+ int len = sprintf(x, "%.12g", d);
+ sa.adjust_length(len);
}
return sa;
}
@@ -263,12 +265,12 @@ StringAccum::snprintf(int n, const char
va_start(val, format);
if (char *x = reserve(n + 1)) {
#if HAVE_VSNPRINTF
- int len = vsnprintf(x, n + 1, format, val);
+ int len = vsnprintf(x, n + 1, format, val);
#else
- int len = vsprintf(x, format, val);
- assert(len <= n);
+ int len = vsprintf(x, format, val);
+ assert(len <= n);
#endif
- adjust_length(len);
+ adjust_length(len);
}
va_end(val);
return *this;
@@ -278,27 +280,27 @@ void
StringAccum::append_break_lines(const String& text, int linelen, const String &leftmargin)
{
if (text.length() == 0)
- return;
+ return;
const char* line = text.begin();
const char* ends = text.end();
linelen -= leftmargin.length();
for (const char* s = line; s < ends; s++) {
- const char* start = s;
- while (s < ends && isspace((unsigned char) *s))
- s++;
- const char* word = s;
- while (s < ends && !isspace((unsigned char) *s))
- s++;
- if (s - line > linelen && start > line) {
- *this << leftmargin;
- append(line, start - line);
- *this << '\n';
- line = word;
- }
+ const char* start = s;
+ while (s < ends && isspace((unsigned char) *s))
+ s++;
+ const char* word = s;
+ while (s < ends && !isspace((unsigned char) *s))
+ s++;
+ if (s - line > linelen && start > line) {
+ *this << leftmargin;
+ append(line, start - line);
+ *this << '\n';
+ line = word;
+ }
}
if (line < text.end()) {
- *this << leftmargin;
- append(line, text.end() - line);
- *this << '\n';
+ *this << leftmargin;
+ append(line, text.end() - line);
+ *this << '\n';
}
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc 2018-02-23 12:47:54.087971853 -0500
@@ -4,7 +4,7 @@
* Eddie Kohler
*
* Copyright (c) 1999-2000 Massachusetts Institute of Technology
- * Copyright (c) 2001-2016 Eddie Kohler
+ * Copyright (c) 2001-2018 Eddie Kohler
* Copyright (c) 2008-2009 Meraki, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc 2018-02-23 12:47:54.087971853 -0500
@@ -2,7 +2,7 @@
/* transform.{cc,hh} -- planar affine transformations
*
- * Copyright (c) 2000-2016 Eddie Kohler
+ * Copyright (c) 2000-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc 2018-02-23 12:47:54.087971853 -0500
@@ -36,11 +36,11 @@ Vector<void*> &
Vector<void*>::operator=(const Vector<void*> &o)
{
if (&o != this) {
- _n = 0;
- if (reserve(o._n)) {
- _n = o._n;
- memcpy(_l, o._l, sizeof(void *) * _n);
- }
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+ memcpy(_l, o._l, sizeof(void *) * _n);
+ }
}
return *this;
}
@@ -57,15 +57,17 @@ bool
Vector<void*>::reserve(int want)
{
if (want < 0)
- want = (_capacity > 0 ? _capacity * 2 : 4);
+ want = (_capacity > 0 ? _capacity * 2 : 4);
if (want <= _capacity)
- return true;
+ return true;
void **new_l = new void*[want];
if (!new_l)
- return false;
+ return false;
- memcpy(new_l, _l, sizeof(void*) * _n);
+ if (_n) {
+ memcpy(new_l, _l, sizeof(void*) * _n);
+ }
delete[] _l;
_l = new_l;
@@ -77,21 +79,21 @@ Vector<void*>::iterator
Vector<void*>::erase(iterator a, iterator b)
{
if (b > a) {
- assert(a >= begin() && b <= end());
- memmove(a, b, (end() - b) * sizeof(void*));
- _n -= b - a;
- return a;
+ assert(a >= begin() && b <= end());
+ memmove(a, b, (end() - b) * sizeof(void*));
+ _n -= b - a;
+ return a;
} else
- return b;
+ return b;
}
void
Vector<void*>::resize(int nn, void *e)
{
if (nn <= _capacity || reserve(nn)) {
- for (int i = _n; i < nn; i++)
- _l[i] = e;
- _n = nn;
+ for (int i = _n; i < nn; i++)
+ _l[i] = e;
+ _n = nn;
}
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc 2018-02-23 12:47:54.088971828 -0500
@@ -1,6 +1,6 @@
/* main.cc -- driver for mmafm program
*
- * Copyright (c) 1997-2016 Eddie Kohler
+ * Copyright (c) 1997-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -322,7 +322,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("mmafm (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 1997-2016 Eddie Kohler\n\
+ printf("Copyright (C) 1997-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1 2018-02-23 12:47:54.088971828 -0500
@@ -1,5 +1,5 @@
.\" -*-nroff-*-
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc 2018-02-23 12:47:54.088971828 -0500
@@ -1,6 +1,6 @@
/* main.cc -- driver for mmpfb program
*
- * Copyright (c) 1997-2016 Eddie Kohler
+ * Copyright (c) 1997-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -355,7 +355,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("mmpfb (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 1997-2016 Eddie Kohler\n\
+ printf("Copyright (C) 1997-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1 2018-02-23 12:47:54.088971828 -0500
@@ -1,5 +1,5 @@
.\" -*-nroff-*-
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc 2018-02-23 12:47:54.088971828 -0500
@@ -1,6 +1,6 @@
/* myfont.cc -- general multiple- to single-master conversion
*
- * Copyright (c) 1997-2016 Eddie Kohler
+ * Copyright (c) 1997-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc 2018-02-23 12:47:54.088971828 -0500
@@ -1,6 +1,6 @@
/* t1minimize.cc -- make minimal copy of a Type 1 font
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc 2018-02-23 12:47:54.088971828 -0500
@@ -1,6 +1,6 @@
/* t1rewrit.cc -- routines for multiple- to single-master charstring conversion
*
- * Copyright (c) 1997-2016 Eddie Kohler
+ * Copyright (c) 1997-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md 2018-02-23 12:47:54.089971803 -0500
@@ -1,6 +1,15 @@
LCDF Typetools NEWS
===================
+## Version 2.107 22.Feb.2018
+
+* Some corrections to output of `--math-spacing`.
+
+* Reduce undefined behavior.
+
+* Handle some incorrect fonts more gracefully.
+
+
## Version 2.106 21.Jun.2016
* Minor updates, mostly involving licensing of Adobe code and data.
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1 2018-02-23 12:47:54.089971803 -0500
@@ -1,5 +1,5 @@
'\"t
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc 2018-02-23 12:47:54.089971803 -0500
@@ -1,6 +1,6 @@
/* otfinfo.cc -- driver for reporting information about OpenType fonts
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -528,7 +528,7 @@ do_query_unicode(const OpenType::Font& o
sprintf(name, "uni%04X", it->first);
else
sprintf(name, "u%X", it->first);
- if ((size_t) it->second < glyph_names.size())
+ if (it->second < glyph_names.size())
result_errh->message("%s %d %s\n", name, it->second, glyph_names[it->second].c_str());
else
result_errh->message("%s %d\n", name, it->second);
@@ -645,7 +645,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("otfinfo (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2003-2016 Eddie Kohler\n\
+ printf("Copyright (C) 2003-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
@@ -721,5 +721,6 @@ particular purpose.\n");
do_info(otf, &cerrh, result_errh);
}
+ Clp_DeleteParser(clp);
return (errh->nerrors() == 0 ? 0 : 1);
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc 2018-02-23 12:47:54.089971803 -0500
@@ -1,6 +1,6 @@
/* automatic.{cc,hh} -- code for automatic mode and interfacing with kpathsea
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -39,10 +39,6 @@
#include <algorithm>
#ifdef WIN32
-#ifdef _MSC_VER
-# include <io.h>
-# include <direct.h>
-#endif
# define mkdir(dir, access) mkdir(dir)
# define COPY_CMD "copy"
# define CMD_SEP "&"
@@ -93,7 +89,7 @@ static const struct {
static String odir_kpathsea[NUMODIR];
static bool writable_texdir_tried = false;
-static String writable_texdir; // always ends with directory separator
+static String writable_texdir; // always ends with directory separator
static int tds_1_1 = -1;
static bool mktexupd_tried = false;
@@ -112,41 +108,30 @@ look_for_writable_texdir(const char *pat
{
String path = kpsei_string(kpsei_path_expand(path_variable));
while (path && !writable_texdir) {
- const char* colon = std::find(path.begin(), path.end(), kpsei_env_sep_char);
- String texdir = path.substring(path.begin(), colon);
- path = path.substring(colon + 1, path.end());
- if (access(texdir.c_str(), W_OK) >= 0)
- writable_texdir = texdir;
- else if (create && errno != EACCES && mkdir(texdir.c_str(), 0777) >= 0)
- // create file if it doesn't exist already
- writable_texdir = texdir;
+ const char* colon = std::find(path.begin(), path.end(), kpsei_env_sep_char);
+ String texdir = path.substring(path.begin(), colon);
+ path = path.substring(colon + 1, path.end());
+ if (access(texdir.c_str(), W_OK) >= 0)
+ writable_texdir = texdir;
+ else if (create && errno != EACCES && mkdir(texdir.c_str(), 0777) >= 0)
+ // create file if it doesn't exist already
+ writable_texdir = texdir;
}
if (writable_texdir && writable_texdir.back() != '/')
- writable_texdir += "/";
+ writable_texdir += "/";
}
static void
find_writable_texdir(ErrorHandler *errh, const char *)
{
-#if defined(W32TEX)
-// W32TeX does not have TEXMFVAR
- char *p = kpsei_var_value("TEXMFVAR");
- if (p == NULL) // W32TeX
- look_for_writable_texdir("$TEXMFLOCAL", true);
- else { // TeXLive
- free (p);
- look_for_writable_texdir("$TEXMFVAR", true);
- }
-#else
look_for_writable_texdir("$TEXMFVAR", true);
-#endif
if (!writable_texdir)
- look_for_writable_texdir("$VARTEXMF", false);
+ look_for_writable_texdir("$VARTEXMF", false);
if (!writable_texdir)
- look_for_writable_texdir("$TEXMF", false);
+ look_for_writable_texdir("$TEXMF", false);
if (!writable_texdir) {
- errh->warning("no writable directory found in $TEXMFVAR or $TEXMF");
- errh->message("(You probably need to set your TEXMF environment variable; see\n\
+ errh->warning("no writable directory found in $TEXMFVAR or $TEXMF");
+ errh->message("(You probably need to set your TEXMF environment variable; see\n\
the manual for more information. The current TEXMF path is\n\
%<%s%>.)", kpsei_string(kpsei_path_expand("$TEXMF")).c_str());
}
@@ -179,7 +164,7 @@ set_typeface(const String &s, bool overr
{
bool had = (bool) typeface;
if (!had || override)
- typeface = s;
+ typeface = s;
return !had;
}
@@ -189,91 +174,93 @@ getodir(int o, ErrorHandler *errh)
assert(o >= 0 && o < NUMODIR);
if (!odir[o] && automatic && odir_info[o].envvar)
- odir[o] = getenv(odir_info[o].envvar);
+ odir[o] = getenv(odir_info[o].envvar);
#if HAVE_KPATHSEA
if (!odir[o] && automatic && !writable_texdir_tried)
- find_writable_texdir(errh, odir_info[o].name);
+ find_writable_texdir(errh, odir_info[o].name);
if (!odir[o] && automatic && writable_texdir) {
- String suffix = odir_info[o].texdir;
+ String suffix = odir_info[o].texdir;
+
+ // May need to behave differently on TDS 1.1 rather than TDS 1.0.
+ if (suffix[0] == '#') {
+ // check type of TDS
+ if (tds_1_1 < 0) {
+ // using a procedure suggested by Olaf Weber
+ String encfonts = kpsei_string(kpsei_path_expand("$TEXMFMAIN/fonts/enc"));
+ if (!encfonts)
+ encfonts = kpsei_string(kpsei_path_expand("$TEXMFDIST/fonts/enc"));
+ tds_1_1 = (encfonts != String());
+ }
+ if (tds_1_1 == 0)
+ suffix = suffix.substring(std::find(suffix.begin() + 1, suffix.end(), '#') + 1, suffix.end());
+ else
+ suffix = suffix.substring(suffix.begin() + 1, std::find(suffix.begin() + 1, suffix.end(), '#'));
+ }
+
+ String dir = writable_texdir + suffix;
+
+ if (dir.back() == '%')
+ dir = dir.substring(0, -1) + get_vendor() + "/" + get_typeface();
+ else if (dir.back() == '@')
+ dir = dir.substring(0, -1) + get_vendor();
+
+ // create parent directories as appropriate
+ int slash = writable_texdir.length() - 1;
+ while (access(dir.c_str(), F_OK) < 0 && slash < dir.length()) {
+ if ((slash = dir.find_left('/', slash + 1)) < 0)
+ slash = dir.length();
+ String subdir = dir.substring(0, slash);
+ if (access(subdir.c_str(), F_OK) < 0
+ && !no_create
+ && mkdir(subdir.c_str(), 0777) < 0)
+ goto kpathsea_done;
+ }
- // May need to behave differently on TDS 1.1 rather than TDS 1.0.
- if (suffix[0] == '#') {
- // check type of TDS
- if (tds_1_1 < 0) {
- // using a procedure suggested by Olaf Weber
- String encfonts = kpsei_string(kpsei_path_expand("$TEXMFMAIN/fonts/enc"));
- if (!encfonts)
- encfonts = kpsei_string(kpsei_path_expand("$TEXMFDIST/fonts/enc"));
- tds_1_1 = (encfonts != String());
- }
- if (tds_1_1 == 0)
- suffix = suffix.substring(std::find(suffix.begin() + 1, suffix.end(), '#') + 1, suffix.end());
- else
- suffix = suffix.substring(suffix.begin() + 1, std::find(suffix.begin() + 1, suffix.end(), '#'));
- }
-
- String dir = writable_texdir + suffix;
-
- if (dir.back() == '%')
- dir = dir.substring(0, -1) + get_vendor() + "/" + get_typeface();
- else if (dir.back() == '@')
- dir = dir.substring(0, -1) + get_vendor();
-
- // create parent directories as appropriate
- int slash = writable_texdir.length() - 1;
- while (access(dir.c_str(), F_OK) < 0 && slash < dir.length()) {
- if ((slash = dir.find_left('/', slash + 1)) < 0)
- slash = dir.length();
- String subdir = dir.substring(0, slash);
- if (access(subdir.c_str(), F_OK) < 0
- && !no_create
- && mkdir(subdir.c_str(), 0777) < 0)
- goto kpathsea_done;
- }
-
- // that's our answer
- odir[o] = dir;
- odir_kpathsea[o] = dir;
+ // that's our answer
+ odir[o] = dir;
+ odir_kpathsea[o] = dir;
}
kpathsea_done:
#endif
if (!odir[o]) {
- if (automatic) {
- errh->warning("%s not specified, placing %s files in %<.%>", odir_info[o].envvar, odir_info[o].name);
+ if (automatic) {
+ errh->warning("%s not specified, placing %s files in %<.%>", odir_info[o].envvar, odir_info[o].name);
#if !HAVE_KPATHSEA
- static int kpathsea_warning = 0;
- if (++kpathsea_warning == 1)
- errh->message("(This version of otftotfm lacks $TEXMF directory support.)");
+ static int kpathsea_warning = 0;
+ if (++kpathsea_warning == 1)
+ errh->message("(This version of otftotfm lacks $TEXMF directory support.)");
#endif
- }
- odir[o] = ".";
+ }
+ odir[o] = ".";
}
while (odir[o].length() && odir[o].back() == '/')
- odir[o] = odir[o].substring(0, -1);
+ odir[o] = odir[o].substring(0, -1);
if (verbose)
- errh->message("placing %s files in %<%s%>", odir_info[o].name, odir[o].c_str());
+ errh->message("placing %s files in %<%s%>", odir_info[o].name, odir[o].c_str());
return odir[o];
}
-bool
+void
setodir(int o, const String &value)
{
assert(o >= 0 && o < NUMODIR);
- bool had = (bool) odir[o];
odir[o] = value;
- return !had;
}
const char *
odirname(int o)
{
- assert(o >= 0 && o < NUMODIR);
- return odir_info[o].name;
+ if (o == NUMODIR) {
+ return "default";
+ } else {
+ assert(o >= 0 && o < NUMODIR);
+ return odir_info[o].name;
+ }
}
#if HAVE_KPATHSEA
@@ -281,9 +268,9 @@ static bool
file_in_kpathsea_odir(int o, const String &file)
{
return odir_kpathsea[o]
- && file.length() > odir[o].length()
- && memcmp(file.data(), odir[o].data(), odir[o].length()) == 0
- && file[odir[o].length()] == '/';
+ && file.length() > odir[o].length()
+ && memcmp(file.data(), odir[o].data(), odir[o].length()) == 0
+ && file[odir[o].length()] == '/';
}
#endif
@@ -293,68 +280,64 @@ update_odir(int o, String file, ErrorHan
assert(o >= 0 && o < NUMODIR);
#if HAVE_KPATHSEA
if (file.find_left('/') < 0)
- file = odir[o] + "/" + file;
+ file = odir[o] + "/" + file;
// exit if this directory was not found via kpathsea, or the file is not
// in the kpathsea directory
if (!file_in_kpathsea_odir(o, file))
- return;
+ return;
assert(writable_texdir && writable_texdir.length() <= odir[o].length()
- && memcmp(file.data(), writable_texdir.data(), writable_texdir.length()) == 0);
+ && memcmp(file.data(), writable_texdir.data(), writable_texdir.length()) == 0);
// divide the filename into portions
// file == writable_texdir + directory + file
file = file.substring(writable_texdir.length());
while (file && file[0] == '/')
- file = file.substring(1);
+ file = file.substring(1);
int last_slash = file.find_right('/');
String directory = (last_slash >= 0 ? file.substring(0, last_slash) : String());
file = file.substring(last_slash >= 0 ? last_slash + 1 : 0);
- if (!file) // no filename to update
- return;
+ if (!file) // no filename to update
+ return;
// return if nocreate
if (no_create) {
- errh->message("would update %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
- return;
+ errh->message("would update %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+ return;
} else if (verbose)
- errh->message("updating %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+ errh->message("updating %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
// try to update ls-R ourselves, rather than running mktexupd --
// mktexupd's runtime is painful: a half second to update a file
String ls_r = writable_texdir + "ls-R";
bool success = false;
if (access(ls_r.c_str(), R_OK) >= 0) // make sure it already exists
- if (FILE *f = fopen(ls_r.c_str(), "ab")) {
- fprintf(f, "./%s:\n%s\n", directory.c_str(), file.c_str());
- success = true;
- fclose(f);
- }
+ if (FILE *f = fopen(ls_r.c_str(), "a")) {
+ fprintf(f, "./%s:\n%s\n", directory.c_str(), file.c_str());
+ success = true;
+ fclose(f);
+ }
// otherwise, run mktexupd
if (!success && writable_texdir.find_left('\'') < 0 && directory.find_left('\'') < 0 && file.find_left('\'') < 0) {
- // look for mktexupd script
- if (!mktexupd_tried) {
-#ifdef _WIN32
- mktexupd = "mktexupd";
-#else
- mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
-#endif
- mktexupd_tried = true;
- }
+ // look for mktexupd script
+ if (!mktexupd_tried) {
+ mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
+ mktexupd_tried = true;
+ }
- // run script
- if (mktexupd) {
- String command = mktexupd + " " + shell_quote(writable_texdir + directory) + " " + shell_quote(file);
- int retval = system(command.c_str());
- if (retval == 127)
- errh->error("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (retval != 0)
- errh->error("%<%s%> failed", command.c_str());
- }
+ // run script
+ if (mktexupd) {
+ String command = mktexupd + " " + shell_quote(writable_texdir + directory) + " " + shell_quote(file);
+ int retval = system(command.c_str());
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ }
}
#else
(void) file, (void) errh;
@@ -375,25 +358,25 @@ installed_type1(const String &otf_filena
(void) otf_filename, (void) allow_generate, (void) errh;
if (!ps_fontname)
- return String();
+ return String();
#if HAVE_KPATHSEA
# if HAVE_AUTO_CFFTOT1
if (!(force && allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh))) {
# endif
- // look for .pfb and .pfa
- String file, path;
- if ((file = ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
- || (file = ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
- if (path == "./" + file || path == file) {
- if (verbose)
- errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
- } else {
- if (verbose)
- errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
- return path;
- }
- }
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
# if HAVE_AUTO_CFFTOT1
}
# endif
@@ -402,21 +385,21 @@ installed_type1(const String &otf_filena
#if HAVE_AUTO_CFFTOT1
// if not found, and can generate on the fly, run cfftot1
if (allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh)) {
- String pfb_filename = odir[O_TYPE1] + "/" + ps_fontname + ".pfb";
- if (pfb_filename.find_left('\'') >= 0 || otf_filename.find_left('\'') >= 0)
- return String();
- String command = "cfftot1 " + shell_quote(otf_filename) + " -n " + shell_quote(ps_fontname) + " " + shell_quote(pfb_filename);
- int retval = mysystem(command.c_str(), errh);
- if (retval == 127)
- errh->error("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (retval != 0)
- errh->error("%<%s%> failed", command.c_str());
- if (retval == 0) {
- update_odir(O_TYPE1, pfb_filename, errh);
- return pfb_filename;
- }
+ String pfb_filename = odir[O_TYPE1] + "/" + ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || otf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "cfftot1 " + shell_quote(otf_filename) + " -n " + shell_quote(ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ }
}
#endif
@@ -429,9 +412,9 @@ installed_type1_dotlessj(const String &o
(void) otf_filename, (void) allow_generate, (void) errh;
if (!ps_fontname)
- return String();
+ return String();
if (verbose)
- errh->message("searching for dotless-j font for %s", ps_fontname.c_str());
+ errh->message("searching for dotless-j font for %s", ps_fontname.c_str());
String j_ps_fontname = ps_fontname + "LCDFJ";
@@ -439,20 +422,20 @@ installed_type1_dotlessj(const String &o
# if HAVE_AUTO_T1DOTLESSJ
if (!(force && allow_generate && getodir(O_TYPE1, errh))) {
# endif
- // look for existing .pfb or .pfa
- String file, path;
- if ((file = j_ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
- || (file = j_ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
- // ignore versions in the current directory
- if (path == "./" + file || path == file) {
- if (verbose)
- errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
- } else {
- if (verbose)
- errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
- return path;
- }
- }
+ // look for existing .pfb or .pfa
+ String file, path;
+ if ((file = j_ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = j_ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ // ignore versions in the current directory
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
# if HAVE_AUTO_T1DOTLESSJ
}
# endif
@@ -461,26 +444,26 @@ installed_type1_dotlessj(const String &o
#if HAVE_AUTO_T1DOTLESSJ
// if not found, and can generate on the fly, try running t1dotlessj
if (allow_generate && getodir(O_TYPE1, errh)) {
- if (String base_filename = installed_type1(otf_filename, ps_fontname, allow_generate, errh)) {
- String pfb_filename = odir[O_TYPE1] + "/" + j_ps_fontname + ".pfb";
- if (pfb_filename.find_left('\'') >= 0 || base_filename.find_left('\'') >= 0)
- return String();
- String command = "t1dotlessj " + shell_quote(base_filename) + " -n " + shell_quote(j_ps_fontname) + " " + shell_quote(pfb_filename);
- int retval = mysystem(command.c_str(), errh);
- if (retval == 127)
- errh->warning("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (WEXITSTATUS(retval) == T1DOTLESSJ_EXIT_J_NODOT)
- return String("\0", 1);
- else if (retval != 0)
- errh->warning("%<%s%> failed (%d)", command.c_str(), retval);
- if (retval == 0) {
- update_odir(O_TYPE1, pfb_filename, errh);
- return pfb_filename;
- } else
- errh->warning("output font will not contain a dotless-j character");
- }
+ if (String base_filename = installed_type1(otf_filename, ps_fontname, allow_generate, errh)) {
+ String pfb_filename = odir[O_TYPE1] + "/" + j_ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || base_filename.find_left('\'') >= 0)
+ return String();
+ String command = "t1dotlessj " + shell_quote(base_filename) + " -n " + shell_quote(j_ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (WEXITSTATUS(retval) == T1DOTLESSJ_EXIT_J_NODOT)
+ return String("\0", 1);
+ else if (retval != 0)
+ errh->warning("%<%s%> failed (%d)", command.c_str(), retval);
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ } else
+ errh->warning("output font will not contain a dotless-j character");
+ }
}
#endif
@@ -494,45 +477,45 @@ installed_truetype(const String &ttf_fil
#if HAVE_KPATHSEA
if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh))) {
- if (String path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TRUETYPE))) {
- if (path == "./" + file || path == file) {
- if (verbose)
- errh->message("ignoring TrueType file %s found with kpathsea in %<.%>", path.c_str());
- } else {
- if (verbose)
- errh->message("TrueType file %s found with kpathsea at %s", file.c_str(), path.c_str());
- return path;
- }
- }
+ if (String path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TRUETYPE))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring TrueType file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
}
#endif
// perhaps generate type 42 in the future, for now just copy
if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh)) {
- String installed_ttf_filename = odir[O_TRUETYPE] + "/" + file;
- if (installed_ttf_filename.find_left('\'') >= 0 || installed_ttf_filename.find_left('\"') >= 0)
- return String();
-
- int retval;
- if (!same_filename(ttf_filename, installed_ttf_filename)) {
- String command = COPY_CMD " " + shell_quote(ttf_filename) + " " + shell_quote(installed_ttf_filename);
- retval = mysystem(command.c_str(), errh);
- if (retval == 127)
- errh->error("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (retval != 0)
- errh->error("%<%s%> failed", command.c_str());
- } else {
- if (verbose)
- errh->message("TrueType file %s already located in output directory", installed_ttf_filename.c_str());
- retval = 0;
- }
-
- if (retval == 0) {
- update_odir(O_TRUETYPE, installed_ttf_filename, errh);
- return installed_ttf_filename;
- }
+ String installed_ttf_filename = odir[O_TRUETYPE] + "/" + file;
+ if (installed_ttf_filename.find_left('\'') >= 0 || installed_ttf_filename.find_left('\"') >= 0)
+ return String();
+
+ int retval;
+ if (!same_filename(ttf_filename, installed_ttf_filename)) {
+ String command = COPY_CMD " " + shell_quote(ttf_filename) + " " + shell_quote(installed_ttf_filename);
+ retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s already located in output directory", installed_ttf_filename.c_str());
+ retval = 0;
+ }
+
+ if (retval == 0) {
+ update_odir(O_TRUETYPE, installed_ttf_filename, errh);
+ return installed_ttf_filename;
+ }
}
return String();
@@ -544,24 +527,24 @@ installed_type42(const String &ttf_filen
(void) allow_generate, (void) ttf_filename, (void) errh;
if (!ps_fontname)
- return String();
+ return String();
#if HAVE_KPATHSEA
# if HAVE_AUTO_TTFTOTYPE42
if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh))) {
# endif
- // look for .pfb and .pfa
- String file, path;
- if ((file = ps_fontname + ".t42", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE42)))) {
- if (path == "./" + file || path == file) {
- if (verbose)
- errh->message("ignoring Type 42 file %s found with kpathsea in %<.%>", path.c_str());
- } else {
- if (verbose)
- errh->message("Type 42 file %s found with kpathsea at %s", file.c_str(), path.c_str());
- return path;
- }
- }
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".t42", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE42)))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 42 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 42 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
# if HAVE_AUTO_TTFTOTYPE42
}
# endif
@@ -570,21 +553,21 @@ installed_type42(const String &ttf_filen
#if HAVE_AUTO_TTFTOTYPE42
// if not found, and can generate on the fly, run ttftotype42
if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh)) {
- String t42_filename = odir[O_TYPE42] + "/" + ps_fontname + ".t42";
- if (t42_filename.find_left('\'') >= 0 || ttf_filename.find_left('\'') >= 0)
- return String();
- String command = "ttftotype42 " + shell_quote(ttf_filename) + " " + shell_quote(t42_filename);
- int retval = mysystem(command.c_str(), errh);
- if (retval == 127)
- errh->error("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (retval != 0)
- errh->error("%<%s%> failed", command.c_str());
- if (retval == 0) {
- update_odir(O_TYPE42, t42_filename, errh);
- return t42_filename;
- }
+ String t42_filename = odir[O_TYPE42] + "/" + ps_fontname + ".t42";
+ if (t42_filename.find_left('\'') >= 0 || ttf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "ttftotype42 " + shell_quote(ttf_filename) + " " + shell_quote(t42_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ if (retval == 0) {
+ update_odir(O_TYPE42, t42_filename, errh);
+ return t42_filename;
+ }
}
#endif
@@ -596,94 +579,94 @@ update_autofont_map(const String &fontna
{
#if HAVE_KPATHSEA
if (automatic && !map_file && getodir(O_MAP, errh))
- map_file = odir[O_MAP] + "/" + get_vendor() + ".map";
+ map_file = odir[O_MAP] + "/" + get_vendor() + ".map";
#endif
if (map_file == "" || map_file == "-")
- fputs(mapline.c_str(), stdout);
+ fputs(mapline.c_str(), stdout);
else {
- // report no_create/verbose
- if (no_create) {
- errh->message("would update %s for %s", map_file.c_str(), String(fontname).c_str());
- return 0;
- } else if (verbose)
- errh->message("updating %s for %s", map_file.c_str(), String(fontname).c_str());
-
- int fd = open(map_file.c_str(), O_RDWR | O_CREAT, 0666);
- if (fd < 0)
- return errh->lerror(map_file, "%s", strerror(errno));
- FILE *f = fdopen(fd, "r+");
- // NB: also change encoding logic if you change this code
+ // report no_create/verbose
+ if (no_create) {
+ errh->message("would update %s for %s", map_file.c_str(), String(fontname).c_str());
+ return 0;
+ } else if (verbose)
+ errh->message("updating %s for %s", map_file.c_str(), String(fontname).c_str());
+
+ int fd = open(map_file.c_str(), O_RDWR | O_CREAT, 0666);
+ if (fd < 0)
+ return errh->lerror(map_file, "%s", strerror(errno));
+ FILE *f = fdopen(fd, "r+");
+ // NB: also change encoding logic if you change this code
#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
- {
- struct flock lock;
- lock.l_type = F_WRLCK;
- lock.l_whence = SEEK_SET;
- lock.l_start = 0;
- lock.l_len = 0;
- int result;
- while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
- /* try again */;
- if (result < 0) {
- result = errno;
- fclose(f);
- return errh->error("locking %s: %s", map_file.c_str(), strerror(result));
- }
- }
-#endif
-
- // read old data from map file
- StringAccum sa;
- int amt;
- do {
- if (char *x = sa.reserve(8192)) {
- amt = fread(x, 1, 8192, f);
- sa.adjust_length(amt);
- } else
- amt = 0;
- } while (amt != 0);
- if (!feof(f))
- return errh->error("%s: %s", map_file.c_str(), strerror(errno));
- String text = sa.take_string();
-
- // add comment if necessary
- bool created = (!text);
- if (created)
- text = "% Automatically maintained by otftotfm or other programs. Do not edit.\n\n";
- if (text.back() != '\n')
- text += "\n";
-
- // append old encodings
- int fl = 0;
- int nl = text.find_left('\n') + 1;
- bool changed = created;
- while (fl < text.length()) {
- if (fl + fontname.length() + 1 < nl
- && memcmp(text.data() + fl, fontname.data(), fontname.length()) == 0
- && text[fl + fontname.length()] == ' ') {
- // found the old name
- if (text.substring(fl, nl - fl) == mapline) {
- // duplicate of old name, don't change it
- fclose(f);
- if (verbose)
- errh->message("%s unchanged", map_file.c_str());
- return 0;
- } else {
- text = text.substring(0, fl) + text.substring(nl);
- nl = fl;
- changed = true;
- }
- }
- fl = nl;
- nl = text.find_left('\n', fl) + 1;
- }
+ {
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", map_file.c_str(), strerror(result));
+ }
+ }
+#endif
+
+ // read old data from map file
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f))
+ return errh->error("%s: %s", map_file.c_str(), strerror(errno));
+ String text = sa.take_string();
+
+ // add comment if necessary
+ bool created = (!text);
+ if (created)
+ text = "% Automatically maintained by otftotfm or other programs. Do not edit.\n\n";
+ if (text.back() != '\n')
+ text += "\n";
+
+ // append old encodings
+ int fl = 0;
+ int nl = text.find_left('\n') + 1;
+ bool changed = created;
+ while (fl < text.length()) {
+ if (fl + fontname.length() + 1 < nl
+ && memcmp(text.data() + fl, fontname.data(), fontname.length()) == 0
+ && text[fl + fontname.length()] == ' ') {
+ // found the old name
+ if (text.substring(fl, nl - fl) == mapline) {
+ // duplicate of old name, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ return 0;
+ } else {
+ text = text.substring(0, fl) + text.substring(nl);
+ nl = fl;
+ changed = true;
+ }
+ }
+ fl = nl;
+ nl = text.find_left('\n', fl) + 1;
+ }
- if (!mapline && !changed) {
+ if (!mapline && !changed) {
// special case: empty mapline, unchanged file
- if (verbose)
- errh->message("%s unchanged", map_file.c_str());
- } else {
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ } else {
// add our text
text += mapline;
@@ -694,7 +677,7 @@ update_autofont_map(const String &fontna
#endif
{
fclose(f);
- f = fopen(map_file.c_str(), "wb");
+ f = fopen(map_file.c_str(), "w");
fd = fileno(f);
}
@@ -702,87 +685,78 @@ update_autofont_map(const String &fontna
ignore_result(fwrite(text.data(), 1, text.length(), f));
}
- fclose(f);
+ fclose(f);
- // inform about the new file if necessary
- if (created)
- update_odir(O_MAP, map_file, errh);
+ // inform about the new file if necessary
+ if (created)
+ update_odir(O_MAP, map_file, errh);
#if HAVE_KPATHSEA && !WIN32
- // run 'updmap' if present
- String updmap_dir, updmap_file;
- if (automatic && (output_flags & G_UPDMAP))
- updmap_dir = getodir(O_MAP_PARENT, errh);
- if (updmap_dir && (updmap_file = updmap_dir + "/updmap")
- && access(updmap_file.c_str(), X_OK) >= 0) {
- // want to run 'updmap' from its directory, can't use system()
- if (verbose)
- errh->message("running %s", updmap_file.c_str());
-
- pid_t child = fork();
- if (child < 0)
- errh->fatal("%s during fork", strerror(errno));
- else if (child == 0) {
- // change to updmap directory, run it
- if (chdir(updmap_dir.c_str()) < 0)
- errh->fatal("%s: %s during chdir", updmap_dir.c_str(), strerror(errno));
- if (execl("./updmap", updmap_file.c_str(), (const char*) 0) < 0)
- errh->fatal("%s: %s during exec", updmap_file.c_str(), strerror(errno));
- exit(1); // should never get here
- }
+ // run 'updmap' if present
+ String updmap_dir, updmap_file;
+ if (automatic && (output_flags & G_UPDMAP))
+ updmap_dir = getodir(O_MAP_PARENT, errh);
+ if (updmap_dir && (updmap_file = updmap_dir + "/updmap")
+ && access(updmap_file.c_str(), X_OK) >= 0) {
+ // want to run 'updmap' from its directory, can't use system()
+ if (verbose)
+ errh->message("running %s", updmap_file.c_str());
+
+ pid_t child = fork();
+ if (child < 0)
+ errh->fatal("%s during fork", strerror(errno));
+ else if (child == 0) {
+ // change to updmap directory, run it
+ if (chdir(updmap_dir.c_str()) < 0)
+ errh->fatal("%s: %s during chdir", updmap_dir.c_str(), strerror(errno));
+ if (execl("./updmap", updmap_file.c_str(), (const char*) 0) < 0)
+ errh->fatal("%s: %s during exec", updmap_file.c_str(), strerror(errno));
+ exit(1); // should never get here
+ }
# if HAVE_WAITPID
- // wait for updmap to finish
- int status;
- while (1) {
- pid_t answer = waitpid(child, &status, 0);
- if (answer >= 0)
- break;
- else if (errno != EINTR)
- errh->fatal("%s during wait", strerror(errno));
- }
- if (!WIFEXITED(status))
- errh->warning("%s exited abnormally", updmap_file.c_str());
- else if (WEXITSTATUS(status) != 0)
- errh->warning("%s exited with status %d", updmap_file.c_str(), WEXITSTATUS(status));
+ // wait for updmap to finish
+ int status;
+ while (1) {
+ pid_t answer = waitpid(child, &status, 0);
+ if (answer >= 0)
+ break;
+ else if (errno != EINTR)
+ errh->fatal("%s during wait", strerror(errno));
+ }
+ if (!WIFEXITED(status))
+ errh->warning("%s exited abnormally", updmap_file.c_str());
+ else if (WEXITSTATUS(status) != 0)
+ errh->warning("%s exited with status %d", updmap_file.c_str(), WEXITSTATUS(status));
# else
# error "need waitpid() support: report this bug to the maintainer"
# endif
- goto ran_updmap;
- }
+ goto ran_updmap;
+ }
# if HAVE_AUTO_UPDMAP
- // run system updmap
- if (output_flags & G_UPDMAP) {
- String filename = map_file;
- int slash = filename.find_right('/');
- if (slash >= 0)
- filename = filename.substring(slash + 1);
+ // run system updmap
+ if (output_flags & G_UPDMAP) {
+ String filename = map_file;
+ int slash = filename.find_right('/');
+ if (slash >= 0)
+ filename = filename.substring(slash + 1);
String redirect = verbose ? " 1>&2" : " >" DEV_NULL " 2>&1";
-#if defined(W32TEX)
-// jtex_filetype is defined only in W32TeX
- char *p = kpsei_var_value("jtex_filetype");
- if (p != NULL) { // W32TeX
- free(p);
- String option = "--add ";
- } else // TeXLive
-#endif
- String option = "--enable Map ";
- String command = "updmap --nomkmap " + option + shell_quote(filename) + redirect
+ String command = "updmap --nomkmap --enable Map " + shell_quote(filename) + redirect
+ CMD_SEP " updmap" + redirect;
- int retval = mysystem(command.c_str(), errh);
- if (retval == 127)
- errh->warning("could not run %<%s%>", command.c_str());
- else if (retval < 0)
- errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
- else if (retval != 0)
- errh->warning("%<%s%> exited with status %d;\nrun it manually to check for errors", command.c_str(), WEXITSTATUS(retval));
- goto ran_updmap;
- }
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->warning("%<%s%> exited with status %d;\nrun it manually to check for errors", command.c_str(), WEXITSTATUS(retval));
+ goto ran_updmap;
+ }
# endif
- if (verbose)
- errh->message("not running updmap");
+ if (verbose)
+ errh->message("not running updmap");
ran_updmap: ;
#endif
@@ -795,27 +769,27 @@ String
locate_encoding(String encfile, ErrorHandler *errh, bool literal)
{
if (!encfile || encfile == "-")
- return encfile;
+ return encfile;
if (!literal) {
- int slash = encfile.find_right('/');
- int dot = encfile.find_left('.', slash >= 0 ? slash : 0);
- if (dot < 0)
- if (String file = locate_encoding(encfile + ".enc", errh, true))
- return file;
+ int slash = encfile.find_right('/');
+ int dot = encfile.find_left('.', slash >= 0 ? slash : 0);
+ if (dot < 0)
+ if (String file = locate_encoding(encfile + ".enc", errh, true))
+ return file;
}
#if HAVE_KPATHSEA
if (String file = kpsei_string(kpsei_find_file(encfile.c_str(), KPSEI_FMT_ENCODING))) {
- if (verbose)
- errh->message("encoding file %s found with kpathsea at %s", encfile.c_str(), file.c_str());
- return file;
+ if (verbose)
+ errh->message("encoding file %s found with kpathsea at %s", encfile.c_str(), file.c_str());
+ return file;
} else if (verbose)
- errh->message("encoding file %s not found with kpathsea", encfile.c_str());
+ errh->message("encoding file %s not found with kpathsea", encfile.c_str());
#endif
if (access(encfile.c_str(), R_OK) >= 0)
- return encfile;
+ return encfile;
else
- return String();
+ return String();
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh 2018-02-23 12:47:54.090971778 -0500
@@ -3,13 +3,15 @@
#include <lcdf/string.hh>
class ErrorHandler;
-enum { O_ENCODING = 0, O_TFM, O_PL, O_VF, O_VPL, O_TYPE1, O_MAP, O_MAP_PARENT,
- O_TRUETYPE, O_OPENTYPE, O_TYPE42, NUMODIR };
+enum {
+ O_ENCODING = 0, O_TFM, O_PL, O_VF, O_VPL, O_TYPE1, O_MAP, O_MAP_PARENT,
+ O_TRUETYPE, O_OPENTYPE, O_TYPE42, NUMODIR
+};
extern bool automatic;
extern bool no_create;
String getodir(int o, ErrorHandler *);
-bool setodir(int o, const String &);
+void setodir(int o, const String &);
bool set_vendor(const String &);
bool set_typeface(const String &, bool override);
bool set_map_file(const String &);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc 2018-02-23 12:47:54.090971778 -0500
@@ -1,6 +1,6 @@
/* dvipsencoding.{cc,hh} -- store a DVIPS encoding
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -35,90 +35,90 @@ static Vector<uint32_t> glyphmap;
static PermString::Initializer perm_initializer;
PermString DvipsEncoding::dot_notdef(".notdef");
-#define NEXT_GLYPH_NAME(gn) ("/" + (gn))
+#define NEXT_GLYPH_NAME(gn) ("/" + (gn))
void
DvipsEncoding::add_glyphlist(String text)
{
const char *s = text.begin(), *end = text.end();
while (s != end) {
- // move to first nonblank
- while (s != end && isspace((unsigned char) *s))
- ++s;
- // ignore comments
- if (s != end && *s == '#') {
- skip_to_end_of_line:
- while (s != end && *s != '\n' && *s != '\r')
- ++s;
- continue;
- }
- // parse glyph name
- const char *name_start = s;
- while (s != end && !isspace((unsigned char) *s) && *s != ';')
- ++s;
- if (s == name_start)
- goto skip_to_end_of_line;
- String glyph_name = text.substring(name_start, s).compact();
- int map_pos = glyphmap.size();
- // parse Unicodes
- while (1) {
- while (s != end && (*s == ' ' || *s == '\t'))
- ++s;
- if (s == end || *s == '\n' || *s == '\r' || *s == '#'
- || (map_pos == glyphmap.size() && *s != ';' && *s != ','))
- break;
- if (*s == ';' || *s == ',') {
- ++s;
- while (s != end && (*s == ' ' || *s == '\t'))
- ++s;
- if (s == end || !isxdigit((unsigned char) *s))
- goto skip_to_end_of_line;
- if (map_pos != glyphmap.size())
- glyphmap.push_back(GLYPHLIST_ALTERNATIVE);
- }
- uint32_t u = 0;
- while (s != end && isxdigit((unsigned char) *s)) {
- if (*s >= '0' && *s <= '9')
- u = (u << 4) + *s - '0';
- else if (*s >= 'A' && *s <= 'F')
- u = (u << 4) + *s - 'A' + 10;
- else
- u = (u << 4) + *s - 'a' + 10;
- ++s;
- }
- if (u == 0 || u > 0x10FFFF)
- goto skip_to_end_of_line;
- glyphmap.push_back(u);
- if (s != end && !isspace((unsigned char) *s) && *s != ',' && *s != ';')
- break;
- }
- // store result
- if (map_pos == glyphmap.size() - 1) {
- glyphlist.insert(glyph_name, glyphmap.back());
- glyphmap.pop_back();
- } else {
- glyphlist.insert(glyph_name, map_pos | GLYPHLIST_USEMAP);
- glyphmap.push_back(0);
- }
- goto skip_to_end_of_line;
+ // move to first nonblank
+ while (s != end && isspace((unsigned char) *s))
+ ++s;
+ // ignore comments
+ if (s != end && *s == '#') {
+ skip_to_end_of_line:
+ while (s != end && *s != '\n' && *s != '\r')
+ ++s;
+ continue;
+ }
+ // parse glyph name
+ const char *name_start = s;
+ while (s != end && !isspace((unsigned char) *s) && *s != ';')
+ ++s;
+ if (s == name_start)
+ goto skip_to_end_of_line;
+ String glyph_name = text.substring(name_start, s).compact();
+ int map_pos = glyphmap.size();
+ // parse Unicodes
+ while (1) {
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || *s == '\n' || *s == '\r' || *s == '#'
+ || (map_pos == glyphmap.size() && *s != ';' && *s != ','))
+ break;
+ if (*s == ';' || *s == ',') {
+ ++s;
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || !isxdigit((unsigned char) *s))
+ goto skip_to_end_of_line;
+ if (map_pos != glyphmap.size())
+ glyphmap.push_back(GLYPHLIST_ALTERNATIVE);
+ }
+ uint32_t u = 0;
+ while (s != end && isxdigit((unsigned char) *s)) {
+ if (*s >= '0' && *s <= '9')
+ u = (u << 4) + *s - '0';
+ else if (*s >= 'A' && *s <= 'F')
+ u = (u << 4) + *s - 'A' + 10;
+ else
+ u = (u << 4) + *s - 'a' + 10;
+ ++s;
+ }
+ if (u == 0 || u > 0x10FFFF)
+ goto skip_to_end_of_line;
+ glyphmap.push_back(u);
+ if (s != end && !isspace((unsigned char) *s) && *s != ',' && *s != ';')
+ break;
+ }
+ // store result
+ if (map_pos == glyphmap.size() - 1) {
+ glyphlist.insert(glyph_name, glyphmap.back());
+ glyphmap.pop_back();
+ } else {
+ glyphlist.insert(glyph_name, map_pos | GLYPHLIST_USEMAP);
+ glyphmap.push_back(0);
+ }
+ goto skip_to_end_of_line;
}
}
static void
unicode_add_suffix(Vector<uint32_t> &prefix,
- int prefix_starting_from,
- const Vector<uint32_t> &suffix)
+ int prefix_starting_from,
+ const Vector<uint32_t> &suffix)
{
int prefix_size = prefix.size();
for (Vector<uint32_t>::const_iterator it = suffix.begin();
- it != suffix.end() && *it != 0;
- ++it)
- if (*it == GLYPHLIST_ALTERNATIVE) {
- prefix.push_back(*it);
- for (int i = prefix_starting_from; i < prefix_size; ++i)
- prefix.push_back(prefix[i]);
- } else
- prefix.push_back(*it);
+ it != suffix.end() && *it != 0;
+ ++it)
+ if (*it == GLYPHLIST_ALTERNATIVE) {
+ prefix.push_back(*it);
+ for (int i = prefix_starting_from; i < prefix_size; ++i)
+ prefix.push_back(prefix[i]);
+ } else
+ prefix.push_back(*it);
}
bool
@@ -129,7 +129,7 @@ DvipsEncoding::glyphname_unicode(String
// drop all characters to the right of the first dot
String::iterator dot = std::find(gn.begin(), gn.end(), '.');
if (dot > gn.begin() && dot < gn.end())
- gn = gn.substring(gn.begin(), dot);
+ gn = gn.substring(gn.begin(), dot);
// map the first component, handle later components recursively
String::iterator underscore = std::find(gn.begin(), gn.end(), '_');
@@ -137,47 +137,47 @@ DvipsEncoding::glyphname_unicode(String
int prefix_start = 0;
Vector<uint32_t> suffix;
if (String gn_suffix = gn.substring(underscore + 1, gn.end())) {
- if (!glyphname_unicode(gn_suffix, suffix))
- return false;
+ if (!glyphname_unicode(gn_suffix, suffix))
+ return false;
}
// check glyphlist
int value = glyphlist[component];
uint32_t uval;
if (value >= 0 && !(value & GLYPHLIST_USEMAP))
- unis.push_back(value);
+ unis.push_back(value);
else if (value >= 0) {
- for (int i = (value & ~GLYPHLIST_USEMAP);
- glyphmap[i];
- ++i)
- if (glyphmap[i] == GLYPHLIST_ALTERNATIVE) {
- unicode_add_suffix(unis, prefix_start, suffix);
- unis.push_back(GLYPHLIST_ALTERNATIVE);
- prefix_start = unis.size();
- } else
- unis.push_back(glyphmap[i]);
+ for (int i = (value & ~GLYPHLIST_USEMAP);
+ glyphmap[i];
+ ++i)
+ if (glyphmap[i] == GLYPHLIST_ALTERNATIVE) {
+ unicode_add_suffix(unis, prefix_start, suffix);
+ unis.push_back(GLYPHLIST_ALTERNATIVE);
+ prefix_start = unis.size();
+ } else
+ unis.push_back(glyphmap[i]);
} else if (component.length() >= 7
- && (component.length() % 4) == 3
- && (memcmp(component.data(), "uni", 3) == 0
- // 16.Aug.2008: Some texnansx.enc have incorrect "Uni"
- // prefix, but we might as well understand it.
- || memcmp(component.data(), "Uni", 3) == 0)) {
- for (const char *s = component.begin() + 3;
- s < component.end();
- s += 4)
- if (parse_unicode_number(s, s + 4, -1, uval))
- unis.push_back(uval);
- else {
- unis.resize(unis_first_size);
- return false;
- }
+ && (component.length() % 4) == 3
+ && (memcmp(component.data(), "uni", 3) == 0
+ // 16.Aug.2008: Some texnansx.enc have incorrect "Uni"
+ // prefix, but we might as well understand it.
+ || memcmp(component.data(), "Uni", 3) == 0)) {
+ for (const char *s = component.begin() + 3;
+ s < component.end();
+ s += 4)
+ if (parse_unicode_number(s, s + 4, -1, uval))
+ unis.push_back(uval);
+ else {
+ unis.resize(unis_first_size);
+ return false;
+ }
} else if (component.length() >= 5
- && component.length() <= 7
- && component[0] == 'u'
- && parse_unicode_number(component.begin() + 1, component.end(), -1, uval))
- unis.push_back(uval);
+ && component.length() <= 7
+ && component[0] == 'u'
+ && parse_unicode_number(component.begin() + 1, component.end(), -1, uval))
+ unis.push_back(uval);
else
- return false;
+ return false;
unicode_add_suffix(unis, prefix_start, suffix);
return true;
@@ -194,7 +194,7 @@ void
DvipsEncoding::encode(int e, PermString what)
{
if (e >= _e.size())
- _e.resize(e + 1, dot_notdef);
+ _e.resize(e + 1, dot_notdef);
_e[e] = what;
}
@@ -203,21 +203,21 @@ DvipsEncoding::encoding_of(PermString wh
{
int slot = -1;
for (int i = 0; i < _e.size(); i++)
- if (_e[i] == what) {
- slot = i;
- goto use_slot;
- } else if (!_e[i] || _e[i] == dot_notdef)
- slot = i;
+ if (_e[i] == what) {
+ slot = i;
+ goto use_slot;
+ } else if (!_e[i] || _e[i] == dot_notdef)
+ slot = i;
if (what == "||")
- return _boundary_char;
+ return _boundary_char;
else if (!encoding_required || slot < 0)
- return -1;
+ return -1;
use_slot:
if (encoding_required) {
- if (slot >= _encoding_required.size())
- _encoding_required.resize(slot + 1, false);
- _encoding_required[slot] = true;
- this->encode(slot, what);
+ if (slot >= _encoding_required.size())
+ _encoding_required.resize(slot + 1, false);
+ _encoding_required[slot] = true;
+ this->encode(slot, what);
}
return slot;
}
@@ -229,51 +229,51 @@ tokenize(const String &s, int &pos_in, i
int len = s.length();
int pos = pos_in;
while (1) {
- // skip whitespace
- while (pos < len && isspace((unsigned char) data[pos])) {
- if (data[pos] == '\n')
- line++;
- else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
- line++;
- pos++;
- }
-
- if (pos >= len) {
- pos_in = len;
- return String();
- } else if (data[pos] == '%') {
- for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
- /* nada */;
- } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
- pos_in = pos + 1;
- return s.substring(pos, 1);
- } else if (data[pos] == '(') {
- int first = pos, nest = 0;
- for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
- switch (data[pos]) {
- case '(': nest++; break;
- case ')': nest--; break;
- case '\\':
- if (pos + 1 < len)
- pos++;
- break;
- case '\n': line++; break;
- case '\r':
- if (pos + 1 == len || data[pos+1] != '\n')
- line++;
- break;
- }
- pos_in = (pos < len ? pos + 1 : len);
- return s.substring(first, pos_in - first);
- } else {
- int first = pos;
- while (pos < len && data[pos] == '/')
- pos++;
- while (pos < len && data[pos] != '/' && !isspace((unsigned char) data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
- pos++;
- pos_in = pos;
- return s.substring(first, pos - first);
- }
+ // skip whitespace
+ while (pos < len && isspace((unsigned char) data[pos])) {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
+ pos_in = pos + 1;
+ return s.substring(pos, 1);
+ } else if (data[pos] == '(') {
+ int first = pos, nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ pos_in = (pos < len ? pos + 1 : len);
+ return s.substring(first, pos_in - first);
+ } else {
+ int first = pos;
+ while (pos < len && data[pos] == '/')
+ pos++;
+ while (pos < len && data[pos] != '/' && !isspace((unsigned char) data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
+ pos++;
+ pos_in = pos;
+ return s.substring(first, pos - first);
+ }
}
}
@@ -285,43 +285,43 @@ comment_tokenize(const String &s, int &p
int len = s.length();
int pos = pos_in;
while (1) {
- while (pos < len && data[pos] != '%' && data[pos] != '(') {
- if (data[pos] == '\n')
- line++;
- else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
- line++;
- pos++;
- }
-
- if (pos >= len) {
- pos_in = len;
- return String();
- } else if (data[pos] == '%') {
- for (pos++; pos < len && (data[pos] == ' ' || data[pos] == '\t'); pos++)
- /* nada */;
- int first = pos;
- for (; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
- /* nada */;
- pos_in = pos;
- if (pos > first)
- return s.substring(first, pos - first);
- } else {
- int nest = 0;
- for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
- switch (data[pos]) {
- case '(': nest++; break;
- case ')': nest--; break;
- case '\\':
- if (pos + 1 < len)
- pos++;
- break;
- case '\n': line++; break;
- case '\r':
- if (pos + 1 == len || data[pos+1] != '\n')
- line++;
- break;
- }
- }
+ while (pos < len && data[pos] != '%' && data[pos] != '(') {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && (data[pos] == ' ' || data[pos] == '\t'); pos++)
+ /* nada */;
+ int first = pos;
+ for (; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ pos_in = pos;
+ if (pos > first)
+ return s.substring(first, pos - first);
+ } else {
+ int nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ }
}
}
@@ -329,7 +329,7 @@ static bool
retokenize_isword(char c)
{
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
- || (c >= '0' && c <= '9') || c == '.' || c == '_';
+ || (c >= '0' && c <= '9') || c == '.' || c == '_';
}
@@ -352,8 +352,8 @@ static int
find_ligkern_op(const String &s)
{
for (int i = 0; ligkern_ops[i].s; i++)
- if (ligkern_ops[i].s == s)
- return ligkern_ops[i].v;
+ if (ligkern_ops[i].s == s)
+ return ligkern_ops[i].v;
return 0;
}
@@ -368,16 +368,16 @@ DvipsEncoding::add_ligkern(const Ligatur
{
Ligature *old = std::find(_lig.begin(), _lig.end(), l);
if (old == _lig.end())
- _lig.push_back(l);
+ _lig.push_back(l);
else {
- if ((l.join & JT_KERN) && (override > 0 || !(old->join & JT_KERN))) {
- old->join |= JT_KERN;
- old->k = l.k;
- }
- if ((l.join & JT_LIG) && (override > 0 || !(old->join & JT_LIG))) {
- old->join = (old->join & JT_KERN) | (l.join & JT_LIGALL);
- old->d = l.d;
- }
+ if ((l.join & JT_KERN) && (override > 0 || !(old->join & JT_KERN))) {
+ old->join |= JT_KERN;
+ old->k = l.k;
+ }
+ if ((l.join & JT_LIG) && (override > 0 || !(old->join & JT_LIG))) {
+ old->join = (old->join & JT_KERN) | (l.join & JT_LIGALL);
+ old->d = l.d;
+ }
}
}
@@ -389,107 +389,107 @@ DvipsEncoding::parse_ligkern_words(Vecto
long l;
char *endptr;
if (v.size() == 3) {
- // empty string fails
- if (!v[0])
- return -1;
- // boundary char setting
- if (v[0] == "||" && v[1] == "=") {
- char *endptr;
- if (override > 0 || _boundary_char < 0)
- _boundary_char = strtol(v[2].c_str(), &endptr, 10);
- if (*endptr == 0 && _boundary_char < _e.size())
- return 0;
- else
- return errh->error("parse error in boundary character assignment");
- }
- // altselector char setting
- if (v[0] == "^^" && v[1] == "=") {
- char *endptr;
- if (override > 0 || _altselector_char < 0)
- _altselector_char = strtol(v[2].c_str(), &endptr, 10);
- if (*endptr == 0 && _altselector_char < _e.size())
- return 0;
- else
- return errh->error("parse error in altselector character assignment");
- }
- // encoding
- l = strtol(v[0].c_str(), &endptr, 0);
- if (endptr == v[0].end() && v[1] == "=") {
- if (l >= 0 && l < 256) {
- if (override > 0 || !_e[l])
- encode(l, v[2]);
- return 0;
- } else
- return errh->error("encoding value %<%d%> out of range", l);
- }
-
- // kern operation
- if (v[1].length() >= 3 && v[1][0] == '{' && v[1].back() == '}') {
- String middle = v[1].substring(1, v[1].length() - 2);
- l = strtol(middle.c_str(), &endptr, 0);
- if (endptr == middle.end()) {
- op = JT_KERN;
- goto found_kernop;
- }
- }
- op = find_ligkern_op(v[1]);
- if (!op || (op & JT_ADDLIG))
- return -1;
+ // empty string fails
+ if (!v[0])
+ return -1;
+ // boundary char setting
+ if (v[0] == "||" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _boundary_char < 0)
+ _boundary_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _boundary_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in boundary character assignment");
+ }
+ // altselector char setting
+ if (v[0] == "^^" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _altselector_char < 0)
+ _altselector_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _altselector_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in altselector character assignment");
+ }
+ // encoding
+ l = strtol(v[0].c_str(), &endptr, 0);
+ if (endptr == v[0].end() && v[1] == "=") {
+ if (l >= 0 && l < 256) {
+ if (override > 0 || !_e[l])
+ encode(l, v[2]);
+ return 0;
+ } else
+ return errh->error("encoding value %<%d%> out of range", l);
+ }
+
+ // kern operation
+ if (v[1].length() >= 3 && v[1][0] == '{' && v[1].back() == '}') {
+ String middle = v[1].substring(1, v[1].length() - 2);
+ l = strtol(middle.c_str(), &endptr, 0);
+ if (endptr == middle.end()) {
+ op = JT_KERN;
+ goto found_kernop;
+ }
+ }
+ op = find_ligkern_op(v[1]);
+ if (!op || (op & JT_ADDLIG))
+ return -1;
found_kernop:
- int av = (v[0] == "*" ? J_ALL : encoding_of(v[0]));
- if (av < 0)
- return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[0].c_str());
- int bv = (v[2] == "*" ? J_ALL : encoding_of(v[2]));
- if (bv < 0)
- return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[2].c_str());
- if ((op & JT_KERN) && l && (av == J_ALL || bv == J_ALL))
- return errh->warning("%<%s %s %s%> illegal, only {0} works with *", v[0].c_str(), v[1].c_str(), v[2].c_str());
- Ligature lig = { av, bv, op, static_cast<int>(l), 0 };
- add_ligkern(lig, override);
- return 0;
+ int av = (v[0] == "*" ? J_ALL : encoding_of(v[0]));
+ if (av < 0)
+ return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[0].c_str());
+ int bv = (v[2] == "*" ? J_ALL : encoding_of(v[2]));
+ if (bv < 0)
+ return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[2].c_str());
+ if ((op & JT_KERN) && l && (av == J_ALL || bv == J_ALL))
+ return errh->warning("%<%s %s %s%> illegal, only {0} works with *", v[0].c_str(), v[1].c_str(), v[2].c_str());
+ Ligature lig = { av, bv, op, static_cast<int>(l), 0 };
+ add_ligkern(lig, override);
+ return 0;
} else if (v.size() == 4 && ((op = find_ligkern_op(v[2])) & JT_ADDLIG)) {
- int av = encoding_of(v[0], override > 0);
- if (av < 0)
- return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[0].c_str()) : -1);
- int bv = encoding_of(v[1], override > 0);
- if (bv < 0)
- return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[1].c_str()) : -1);
- int cv = encoding_of(v[3], override > 0);
- if (cv < 0)
- return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[3].c_str()) : -1);
- Ligature lig = { av, bv, op, 0, cv };
- add_ligkern(lig, override);
- return 0;
+ int av = encoding_of(v[0], override > 0);
+ if (av < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[0].c_str()) : -1);
+ int bv = encoding_of(v[1], override > 0);
+ if (bv < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[1].c_str()) : -1);
+ int cv = encoding_of(v[3], override > 0);
+ if (cv < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[3].c_str()) : -1);
+ Ligature lig = { av, bv, op, 0, cv };
+ add_ligkern(lig, override);
+ return 0;
} else
- return -EPARSE;
+ return -EPARSE;
}
int
DvipsEncoding::parse_position_words(Vector<String> &v, int override, ErrorHandler *errh)
{
if (v.size() != 4)
- return -EPARSE;
+ return -EPARSE;
int c = encoding_of(v[0]);
if (c < 0)
- return (override > 0 ? errh->warning("bad positioning (%<%s%> has no encoding)", v[0].c_str()) : -1);
+ return (override > 0 ? errh->warning("bad positioning (%<%s%> has no encoding)", v[0].c_str()) : -1);
char *endptr;
int pdx, pdy, adx;
if (!v[1] || !v[2] || !v[3]
- || (pdx = strtol(v[1].c_str(), &endptr, 10), *endptr)
- || (pdy = strtol(v[2].c_str(), &endptr, 10), *endptr)
- || (adx = strtol(v[3].c_str(), &endptr, 10), *endptr))
- return errh->error("parse error in POSITION");
+ || (pdx = strtol(v[1].c_str(), &endptr, 10), *endptr)
+ || (pdy = strtol(v[2].c_str(), &endptr, 10), *endptr)
+ || (adx = strtol(v[3].c_str(), &endptr, 10), *endptr))
+ return errh->error("parse error in POSITION");
Ligature l = { c, pdx, pdy, adx, 0 };
Ligature *old = std::find(_pos.begin(), _pos.end(), l);
if (old == _pos.end())
- _pos.push_back(l);
+ _pos.push_back(l);
else if (override > 0)
- *old = l;
+ *old = l;
return 0;
}
@@ -498,31 +498,31 @@ DvipsEncoding::parse_unicoding_words(Vec
{
int av;
if (v.size() < 2 || (v[1] != "=" && v[1] != "=:" && v[1] != ":="))
- return -EPARSE;
+ return -EPARSE;
else if (v[0] == "||" || (av = encoding_of(v[0])) < 0)
- return errh->warning("bad UNICODING (%<%s%> has no encoding)", v[0].c_str());
+ return errh->warning("bad UNICODING (%<%s%> has no encoding)", v[0].c_str());
int original_size = _unicoding.size();
if (v.size() == 2 || (v.size() == 3 && v[2] == dot_notdef))
- /* no warnings to delete a glyph */;
+ /* no warnings to delete a glyph */;
else {
- for (int i = 2; i < v.size(); i++) {
- if (_unicoding.size() != original_size)
- _unicoding.push_back(GLYPHLIST_ALTERNATIVE);
- if (!glyphname_unicode(v[i], _unicoding)) {
- errh->warning("can%,t map %<%s%> to Unicode", v[i].c_str());
- if (i == v.size() - 1 && _unicoding.size() == original_size)
- errh->warning("target %<%s%> will be deleted from encoding", v[0].c_str());
- else if (_unicoding.size() != original_size)
- _unicoding.pop_back();
- }
- }
+ for (int i = 2; i < v.size(); i++) {
+ if (_unicoding.size() != original_size)
+ _unicoding.push_back(GLYPHLIST_ALTERNATIVE);
+ if (!glyphname_unicode(v[i], _unicoding)) {
+ errh->warning("can%,t map %<%s%> to Unicode", v[i].c_str());
+ if (i == v.size() - 1 && _unicoding.size() == original_size)
+ errh->warning("target %<%s%> will be deleted from encoding", v[0].c_str());
+ else if (_unicoding.size() != original_size)
+ _unicoding.pop_back();
+ }
+ }
}
_unicoding.push_back(0);
if (override > 0 || _unicoding_map[v[0]] < 0)
- _unicoding_map.insert(v[0], original_size);
+ _unicoding_map.insert(v[0], original_size);
return 0;
}
@@ -536,31 +536,31 @@ void
DvipsEncoding::parse_word_group(Vector<String> &words, int override, int wt, ErrorHandler *errh)
{
if (words.size() > 0) {
- int (DvipsEncoding::*method)(Vector<String> &, int, ErrorHandler *) = word_types[wt].parsefunc;
- if ((this->*method)(words, override, errh) == -EPARSE) {
- Vector<String> rewords;
- for (String *sp = words.begin(); sp != words.end(); sp++) {
- const char *s = sp->begin(), *ends = sp->end();
- while (s != ends) {
- const char *word = s;
- if (*s == '{') {
- for (s++; s != ends && *s != '}'; s++)
- /* nada */;
- if (s != ends)
- s++;
- } else {
- bool x = retokenize_isword(*s);
- for (s++; s != ends && x == retokenize_isword(*s); s++)
- /* nada */;
- }
- rewords.push_back(sp->substring(word, s));
- }
- }
- if ((this->*method)(rewords, override, errh) == -EPARSE)
- errh->error("parse error in %s", word_types[wt].name);
+ int (DvipsEncoding::*method)(Vector<String> &, int, ErrorHandler *) = word_types[wt].parsefunc;
+ if ((this->*method)(words, override, errh) == -EPARSE) {
+ Vector<String> rewords;
+ for (String *sp = words.begin(); sp != words.end(); sp++) {
+ const char *s = sp->begin(), *ends = sp->end();
+ while (s != ends) {
+ const char *word = s;
+ if (*s == '{') {
+ for (s++; s != ends && *s != '}'; s++)
+ /* nada */;
+ if (s != ends)
+ s++;
+ } else {
+ bool x = retokenize_isword(*s);
+ for (s++; s != ends && x == retokenize_isword(*s); s++)
+ /* nada */;
+ }
+ rewords.push_back(sp->substring(word, s));
+ }
+ }
+ if ((this->*method)(rewords, override, errh) == -EPARSE)
+ errh->error("parse error in %s", word_types[wt].name);
- }
- words.clear();
+ }
+ words.clear();
}
}
@@ -571,16 +571,16 @@ DvipsEncoding::parse_words(const String
const char *data = s.data();
const char *end = s.end();
while (data < end) {
- while (data < end && isspace((unsigned char) *data))
- data++;
- const char *first = data;
- while (data < end && !isspace((unsigned char) *data) && *data != ';')
- data++;
- if (data == first) {
- data++; // step past semicolon (or harmlessly past EOS)
- parse_word_group(words, override, wt, errh);
- } else
- words.push_back(s.substring(first, data));
+ while (data < end && isspace((unsigned char) *data))
+ data++;
+ const char *first = data;
+ while (data < end && !isspace((unsigned char) *data) && *data != ';')
+ data++;
+ if (data == first) {
+ data++; // step past semicolon (or harmlessly past EOS)
+ parse_word_group(words, override, wt, errh);
+ } else
+ words.push_back(s.substring(first, data));
}
parse_word_group(words, override, wt, errh);
return 0;
@@ -598,14 +598,14 @@ static String
trim_space(const String &s, int pos)
{
while (pos < s.length() && isspace((unsigned char) s[pos]))
- pos++;
+ pos++;
int epos = s.length();
for (int x = 0; x < 2; x++) {
- while (epos > pos && isspace((unsigned char) s[epos - 1]))
- epos--;
- if (epos == pos || s[epos - 1] != ';')
- break;
- epos--;
+ while (epos > pos && isspace((unsigned char) s[epos - 1]))
+ epos--;
+ if (epos == pos || s[epos - 1] != ';')
+ break;
+ epos--;
}
return s.substring(pos, epos - pos);
}
@@ -616,7 +616,7 @@ DvipsEncoding::parse(String filename, bo
int before = errh->nerrors();
String s = read_file(filename, errh);
if (errh->nerrors() != before)
- return -1;
+ return -1;
_filename = filename;
_printable_filename = printable_filename(filename);
_file_had_ligkern = false;
@@ -625,15 +625,15 @@ DvipsEncoding::parse(String filename, bo
// parse text
String token = tokenize(s, pos, line);
if (!token || token[0] != '/')
- return errh->lerror(landmark(line), "parse error, expected name");
+ return errh->lerror(landmark(line), "parse error, expected name");
_name = token.substring(1);
_initial_comment = s.substring(0, pos - token.length());
if (tokenize(s, pos, line) != "[")
- return errh->lerror(landmark(line), "parse error, expected [");
+ return errh->lerror(landmark(line), "parse error, expected [");
while ((token = tokenize(s, pos, line)) && token[0] == '/')
- _e.push_back(token.substring(1));
+ _e.push_back(token.substring(1));
_final_text = token + s.substring(pos);
@@ -642,59 +642,59 @@ DvipsEncoding::parse(String filename, bo
Vector<String> words;
LandmarkErrorHandler lerrh(errh, "");
while ((token = comment_tokenize(s, pos, line)))
- if (token.length() >= 8
- && memcmp(token.data(), "LIGKERN", 7) == 0
- && isspace((unsigned char) token[7])
- && !ignore_ligkern) {
- lerrh.set_landmark(landmark(line));
- parse_words(token.substring(8), 1, WT_LIGKERN, &lerrh);
-
- } else if (token.length() >= 9
- && memcmp(token.data(), "LIGKERNX", 8) == 0
- && isspace((unsigned char) token[8])
- && !ignore_ligkern) {
- lerrh.set_landmark(landmark(line));
- parse_words(token.substring(9), 1, WT_LIGKERN, &lerrh);
-
- } else if (token.length() >= 10
- && memcmp(token.data(), "UNICODING", 9) == 0
- && isspace((unsigned char) token[9])
- && !ignore_other) {
- lerrh.set_landmark(landmark(line));
- parse_words(token.substring(10), 1, WT_UNICODING, &lerrh);
-
- } else if (token.length() >= 9
- && memcmp(token.data(), "POSITION", 8) == 0
- && isspace((unsigned char) token[8])
- && !ignore_other) {
- lerrh.set_landmark(landmark(line));
- parse_words(token.substring(9), 1, WT_POSITION, &lerrh);
-
- } else if (token.length() >= 13
- && memcmp(token.data(), "CODINGSCHEME", 12) == 0
- && isspace((unsigned char) token[12])
- && !ignore_other) {
- _coding_scheme = trim_space(token, 13);
- if (_coding_scheme.length() > 39)
- lerrh.lwarning(landmark(line), "only first 39 chars of CODINGSCHEME are significant");
- if (std::find(_coding_scheme.begin(), _coding_scheme.end(), '(') < _coding_scheme.end()
- || std::find(_coding_scheme.begin(), _coding_scheme.end(), ')') < _coding_scheme.end()) {
- lerrh.lerror(landmark(line), "CODINGSCHEME cannot contain parentheses");
- _coding_scheme = String();
- }
-
- } else if (token.length() >= 11
- && memcmp(token.data(), "WARNMISSING", 11) == 0
- && (token.length() == 11 || isspace((unsigned char) token[11]))
- && !ignore_other) {
- String value = trim_space(token, 11);
- if (value == "1" || value == "yes" || value == "true" || !value)
- _warn_missing = true;
- else if (value == "0" || value == "no" || value == "false")
- _warn_missing = false;
- else
- lerrh.lerror(landmark(line), "WARNMISSING command not understood");
- }
+ if (token.length() >= 8
+ && memcmp(token.data(), "LIGKERN", 7) == 0
+ && isspace((unsigned char) token[7])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(8), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "LIGKERNX", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 10
+ && memcmp(token.data(), "UNICODING", 9) == 0
+ && isspace((unsigned char) token[9])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(10), 1, WT_UNICODING, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "POSITION", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_POSITION, &lerrh);
+
+ } else if (token.length() >= 13
+ && memcmp(token.data(), "CODINGSCHEME", 12) == 0
+ && isspace((unsigned char) token[12])
+ && !ignore_other) {
+ _coding_scheme = trim_space(token, 13);
+ if (_coding_scheme.length() > 39)
+ lerrh.lwarning(landmark(line), "only first 39 chars of CODINGSCHEME are significant");
+ if (std::find(_coding_scheme.begin(), _coding_scheme.end(), '(') < _coding_scheme.end()
+ || std::find(_coding_scheme.begin(), _coding_scheme.end(), ')') < _coding_scheme.end()) {
+ lerrh.lerror(landmark(line), "CODINGSCHEME cannot contain parentheses");
+ _coding_scheme = String();
+ }
+
+ } else if (token.length() >= 11
+ && memcmp(token.data(), "WARNMISSING", 11) == 0
+ && (token.length() == 11 || isspace((unsigned char) token[11]))
+ && !ignore_other) {
+ String value = trim_space(token, 11);
+ if (value == "1" || value == "yes" || value == "true" || !value)
+ _warn_missing = true;
+ else if (value == "0" || value == "no" || value == "false")
+ _warn_missing = false;
+ else
+ lerrh.lerror(landmark(line), "WARNMISSING command not understood");
+ }
return 0;
}
@@ -721,23 +721,23 @@ void
DvipsEncoding::bad_codepoint(int code, Metrics &metrics, HashMap<PermString, int> &unencoded)
{
for (int i = 0; i < _lig.size(); i++) {
- Ligature &l = _lig[i];
- if (l.c1 == code || l.c2 == code)
- l.join = 0;
- else if ((l.join & JT_ADDLIG) && l.d == code)
- l.join &= ~JT_LIGALL;
+ Ligature &l = _lig[i];
+ if (l.c1 == code || l.c2 == code)
+ l.join = 0;
+ else if ((l.join & JT_ADDLIG) && l.d == code)
+ l.join &= ~JT_LIGALL;
}
if (_warn_missing) {
- Vector<uint32_t> garbage;
- bool unicodes_explicit = x_unicodes(_e[code], garbage);
- if (!unicodes_explicit || garbage.size() > 0) {
- Vector<Setting> v;
- v.push_back(Setting(Setting::RULE, 500, 500));
- v.push_back(Setting(Setting::SPECIAL, String("Warning: missing glyph '") + _e[code] + "'"));
- metrics.encode_virtual(code, _e[code], 0, v, true);
- unencoded.insert(_e[code], 1);
- }
+ Vector<uint32_t> garbage;
+ bool unicodes_explicit = x_unicodes(_e[code], garbage);
+ if (!unicodes_explicit || garbage.size() > 0) {
+ Vector<Setting> v;
+ v.push_back(Setting(Setting::RULE, 500, 500));
+ v.push_back(Setting(Setting::SPECIAL, String("Warning: missing glyph '") + _e[code] + "'"));
+ metrics.encode_virtual(code, _e[code], 0, v, true);
+ unencoded.insert(_e[code], 1);
+ }
}
}
@@ -745,9 +745,9 @@ static inline Efont::OpenType::Glyph
map_uni(uint32_t uni, const Efont::OpenType::Cmap &cmap, const Metrics &m)
{
if (uni == U_EMPTYSLOT)
- return m.emptyslot_glyph();
+ return m.emptyslot_glyph();
else
- return cmap.map_uni(uni);
+ return cmap.map_uni(uni);
}
bool
@@ -755,12 +755,12 @@ DvipsEncoding::x_unicodes(PermString chn
{
int i = _unicoding_map[chname];
if (i >= 0) {
- for (; _unicoding[i] > 0; i++)
- unicodes.push_back(_unicoding[i]);
- return true;
+ for (; _unicoding[i] > 0; i++)
+ unicodes.push_back(_unicoding[i]);
+ return true;
} else {
- glyphname_unicode(chname, unicodes);
- return false;
+ glyphname_unicode(chname, unicodes);
+ return false;
}
}
@@ -770,144 +770,144 @@ DvipsEncoding::make_metrics(Metrics &met
{
// first pass: without secondaries
for (int code = 0; code < _e.size(); code++) {
- PermString chname = _e[code];
+ PermString chname = _e[code];
- // common case: skip .notdef
- if (chname == dot_notdef)
- continue;
-
- // find first single Unicode glyph supported by the font
- Efont::OpenType::Glyph glyph = 0;
- uint32_t glyph_uni = 0;
- {
- Vector<uint32_t> unicodes;
- (void) x_unicodes(chname, unicodes);
- Vector<uint32_t>::iterator u = unicodes.begin();
- while (u != unicodes.end() && glyph <= 0) {
- uint32_t this_uni = u[0];
- ++u;
- if (u != unicodes.end()) {
- if (*u != GLYPHLIST_ALTERNATIVE)
- break;
- ++u;
- }
-
- glyph = map_uni(this_uni, *finfo.cmap, metrics);
- if (glyph_uni == 0 || glyph > 0)
- glyph_uni = this_uni;
- }
- }
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find first single Unicode glyph supported by the font
+ Efont::OpenType::Glyph glyph = 0;
+ uint32_t glyph_uni = 0;
+ {
+ Vector<uint32_t> unicodes;
+ (void) x_unicodes(chname, unicodes);
+ Vector<uint32_t>::iterator u = unicodes.begin();
+ while (u != unicodes.end() && glyph <= 0) {
+ uint32_t this_uni = u[0];
+ ++u;
+ if (u != unicodes.end()) {
+ if (*u != GLYPHLIST_ALTERNATIVE)
+ break;
+ ++u;
+ }
+
+ glyph = map_uni(this_uni, *finfo.cmap, metrics);
+ if (glyph_uni == 0 || glyph > 0)
+ glyph_uni = this_uni;
+ }
+ }
- // find named glyph, if any
- Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
#if 0
- // 2.May.2008: ff, fi, fl, ffi, and ffl might map to f_f, f_i, f_l,
- // f_f_i, and f_f_l
- if (!named_glyph && chname.length() > 0 && chname.length() <= 3
- && chname[0] == 'f') {
- if (chname.equals("ff", 2))
- named_glyph = finfo.glyphid("f_f");
- else if (chname.equals("fi", 2))
- named_glyph = finfo.glyphid("f_i");
- else if (chname.equals("fl", 2))
- named_glyph = finfo.glyphid("f_l");
- else if (chname.equals("ffi", 2))
- named_glyph = finfo.glyphid("f_f_i");
- else if (chname.equals("ffl", 2))
- named_glyph = finfo.glyphid("f_f_l");
- }
+ // 2.May.2008: ff, fi, fl, ffi, and ffl might map to f_f, f_i, f_l,
+ // f_f_i, and f_f_l
+ if (!named_glyph && chname.length() > 0 && chname.length() <= 3
+ && chname[0] == 'f') {
+ if (chname.equals("ff", 2))
+ named_glyph = finfo.glyphid("f_f");
+ else if (chname.equals("fi", 2))
+ named_glyph = finfo.glyphid("f_i");
+ else if (chname.equals("fl", 2))
+ named_glyph = finfo.glyphid("f_l");
+ else if (chname.equals("ffi", 2))
+ named_glyph = finfo.glyphid("f_f_i");
+ else if (chname.equals("ffl", 2))
+ named_glyph = finfo.glyphid("f_f_l");
+ }
#endif
- // do not use a Unicode-mapped glyph if literal
- if (literal)
- glyph = named_glyph;
-
- // If we found a glyph, maybe use its named_glyph variant.
- if (glyph > 0 && named_glyph > 0
- && std::find(chname.begin(), chname.end(), '.') < chname.end())
- glyph = named_glyph;
-
- // assign slot
- if (glyph > 0)
- metrics.encode(code, glyph_uni, glyph);
+ // do not use a Unicode-mapped glyph if literal
+ if (literal)
+ glyph = named_glyph;
+
+ // If we found a glyph, maybe use its named_glyph variant.
+ if (glyph > 0 && named_glyph > 0
+ && std::find(chname.begin(), chname.end(), '.') < chname.end())
+ glyph = named_glyph;
+
+ // assign slot
+ if (glyph > 0)
+ metrics.encode(code, glyph_uni, glyph);
}
// second pass: with secondaries
for (int code = 0; code < _e.size(); code++) {
- // skip already-encoded characters and .notdef
- if (literal || metrics.glyph(code) > 0 || _e[code] == dot_notdef)
- continue;
-
- PermString chname = _e[code];
-
- // find all Unicodes
- Vector<uint32_t> unicodes;
- bool unicodes_explicit = x_unicodes(chname, unicodes);
-
- // find named glyph, if any
- Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
-
- // 1. We were not able to find the glyph using Unicode.
- // 2. There might be a named_glyph.
- // May need to try secondaries later. Store this slot.
- // Try secondaries, if there's explicit unicoding or no named_glyph.
- if (unicodes_explicit || named_glyph <= 0)
- for (uint32_t *u = unicodes.begin(); u != unicodes.end(); ) {
- uint32_t *endu = u + 1;
- while (endu != unicodes.end() && *endu != GLYPHLIST_ALTERNATIVE)
- ++endu;
- if (secondary->encode_uni(code, chname, u, endu, metrics, errh))
- goto encoded;
- u = (endu == unicodes.end() ? endu : endu + 1);
- }
-
- // 1. We were not able to find the glyph using Unicode or secondaries.
- // 2. There might be a named_glyph.
- // Use named glyph, if any. Special case for "UNICODING foo =: ;",
- // which should turn off the character (even if a named_glyph exists),
- // UNLESS the glyph was explicitly requested.
- if (named_glyph > 0
- && (!unicodes_explicit
- || unicodes.size() > 0
- || (_encoding_required.size() > code && _encoding_required[code]))) {
- uint32_t uni = 0;
- if (unicodes.size() == 1 || (unicodes.size() > 0 && unicodes[1] == GLYPHLIST_ALTERNATIVE))
- uni = unicodes[0];
- metrics.encode(code, uni, named_glyph);
- }
+ // skip already-encoded characters and .notdef
+ if (literal || metrics.glyph(code) > 0 || _e[code] == dot_notdef)
+ continue;
+
+ PermString chname = _e[code];
+
+ // find all Unicodes
+ Vector<uint32_t> unicodes;
+ bool unicodes_explicit = x_unicodes(chname, unicodes);
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+
+ // 1. We were not able to find the glyph using Unicode.
+ // 2. There might be a named_glyph.
+ // May need to try secondaries later. Store this slot.
+ // Try secondaries, if there's explicit unicoding or no named_glyph.
+ if (unicodes_explicit || named_glyph <= 0)
+ for (uint32_t *u = unicodes.begin(); u != unicodes.end(); ) {
+ uint32_t *endu = u + 1;
+ while (endu != unicodes.end() && *endu != GLYPHLIST_ALTERNATIVE)
+ ++endu;
+ if (secondary->encode_uni(code, chname, u, endu, metrics, errh))
+ goto encoded;
+ u = (endu == unicodes.end() ? endu : endu + 1);
+ }
+
+ // 1. We were not able to find the glyph using Unicode or secondaries.
+ // 2. There might be a named_glyph.
+ // Use named glyph, if any. Special case for "UNICODING foo =: ;",
+ // which should turn off the character (even if a named_glyph exists),
+ // UNLESS the glyph was explicitly requested.
+ if (named_glyph > 0
+ && (!unicodes_explicit
+ || unicodes.size() > 0
+ || (_encoding_required.size() > code && _encoding_required[code]))) {
+ uint32_t uni = 0;
+ if (unicodes.size() == 1 || (unicodes.size() > 0 && unicodes[1] == GLYPHLIST_ALTERNATIVE))
+ uni = unicodes[0];
+ metrics.encode(code, uni, named_glyph);
+ }
encoded:
- /* all set */;
+ /* all set */;
}
// add altselector
if (_altselector_char >= 0 && _altselector_char < _e.size()) {
- metrics.add_altselector_code(_altselector_char, 0);
- if (metrics.glyph(_altselector_char) <= 0 && !literal)
- (void) secondary->encode_uni(_altselector_char, "altselector", U_ALTSELECTOR, metrics, errh);
+ metrics.add_altselector_code(_altselector_char, 0);
+ if (metrics.glyph(_altselector_char) <= 0 && !literal)
+ (void) secondary->encode_uni(_altselector_char, "<altselector>", U_ALTSELECTOR, metrics, errh);
}
// final pass: complain
HashMap<PermString, int> unencoded_map;
for (int code = 0; code < _e.size(); code++)
- if (_e[code] != dot_notdef && metrics.glyph(code) <= 0)
- bad_codepoint(code, metrics, unencoded_map);
+ if (_e[code] != dot_notdef && metrics.glyph(code) <= 0)
+ bad_codepoint(code, metrics, unencoded_map);
Vector<String> unencoded;
for (HashMap<PermString, int>::iterator it = unencoded_map.begin(); it; ++it)
- unencoded.push_back(it.key());
+ unencoded.push_back(it.key());
if (unencoded.size() == 1) {
- errh->warning("%<%s%> glyph not found in font", unencoded[0].c_str());
- errh->message("(This glyph will appear as a blot and cause warnings if used.)");
+ errh->warning("%<%s%> glyph not found in font", unencoded[0].c_str());
+ errh->message("(This glyph will appear as a blot and cause warnings if used.)");
} else if (unencoded.size() > 1) {
- std::sort(unencoded.begin(), unencoded.end());
- StringAccum sa;
- for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
- sa << *a << ' ';
- sa.pop_back();
- sa.append_break_lines(sa.take_string(), 68, " ");
- sa.pop_back();
- errh->warning("%d glyphs not found in font:", unencoded.size());
- errh->message("%s\n(These glyphs will appear as blots and cause warnings if used.)", sa.c_str());
+ std::sort(unencoded.begin(), unencoded.end());
+ StringAccum sa;
+ for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
+ sa << *a << ' ';
+ sa.pop_back();
+ sa.append_break_lines(sa.take_string(), 68, " ");
+ sa.pop_back();
+ errh->warning("%d glyphs not found in font:", unencoded.size());
+ errh->message("%s\n(These glyphs will appear as blots and cause warnings if used.)", sa.c_str());
}
metrics.set_coding_scheme(_coding_scheme);
@@ -918,19 +918,19 @@ DvipsEncoding::make_base_mappings(Vector
{
mappings.clear();
for (int code = 0; code < _e.size(); code++) {
- PermString chname = _e[code];
+ PermString chname = _e[code];
- // common case: skip .notdef
- if (chname == dot_notdef)
- continue;
-
- // find named glyph
- Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
- if (named_glyph > 0) {
- if (mappings.size() <= named_glyph)
- mappings.resize(named_glyph + 1, -1);
- mappings[named_glyph] = code;
- }
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find named glyph
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+ if (named_glyph > 0) {
+ if (mappings.size() <= named_glyph)
+ mappings.resize(named_glyph + 1, -1);
+ mappings[named_glyph] = code;
+ }
}
}
@@ -940,24 +940,24 @@ DvipsEncoding::apply_ligkern_lig(Metrics
{
assert((int)J_ALL == (int)Metrics::CODE_ALL);
for (const Ligature *l = _lig.begin(); l < _lig.end(); l++) {
- if (l->c1 < 0 || l->c2 < 0 || l->join < 0 || !(l->join & JT_LIG))
- continue;
- metrics.remove_ligatures(l->c1, l->c2);
- if (!(l->join & JT_ADDLIG))
- /* nada */;
- else if ((l->join & JT_LIGALL) == JL_LIG)
- metrics.add_ligature(l->c1, l->c2, l->d);
- else if ((l->join & JT_LIGALL) == JL_LIGC)
- metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->d, l->c2));
- else if ((l->join & JT_LIGALL) == JL_CLIG)
- metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->c1, l->d));
- else {
- static int complex_join_warning = 0;
- if (!complex_join_warning) {
- errh->warning("complex LIGKERN ligature removed (I only support %<=:%>, %<=:|%>, and %<|=:%>)");
- complex_join_warning = 1;
- }
- }
+ if (l->c1 < 0 || l->c2 < 0 || l->join < 0 || !(l->join & JT_LIG))
+ continue;
+ metrics.remove_ligatures(l->c1, l->c2);
+ if (!(l->join & JT_ADDLIG))
+ /* nada */;
+ else if ((l->join & JT_LIGALL) == JL_LIG)
+ metrics.add_ligature(l->c1, l->c2, l->d);
+ else if ((l->join & JT_LIGALL) == JL_LIGC)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->d, l->c2));
+ else if ((l->join & JT_LIGALL) == JL_CLIG)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->c1, l->d));
+ else {
+ static int complex_join_warning = 0;
+ if (!complex_join_warning) {
+ errh->warning("complex LIGKERN ligature removed (I only support %<=:%>, %<=:|%>, and %<|=:%>)");
+ complex_join_warning = 1;
+ }
+ }
}
}
@@ -966,14 +966,14 @@ DvipsEncoding::apply_ligkern_kern(Metric
{
assert((int)J_ALL == (int)Metrics::CODE_ALL);
for (const Ligature *l = _lig.begin(); l < _lig.end(); l++)
- if (l->c1 >= 0 && l->c2 >= 0 && (l->join & JT_KERN))
- metrics.set_kern(l->c1, l->c2, l->k);
+ if (l->c1 >= 0 && l->c2 >= 0 && (l->join & JT_KERN))
+ metrics.set_kern(l->c1, l->c2, l->k);
}
void
DvipsEncoding::apply_position(Metrics &metrics, ErrorHandler *) const
{
for (const Ligature *l = _pos.begin(); l < _pos.end(); l++)
- if (l->c1 >= 0)
- metrics.add_single_positioning(l->c1, l->c2, l->join, l->k);
+ if (l->c1 >= 0)
+ metrics.add_single_positioning(l->c1, l->c2, l->join, l->k);
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh 2018-02-23 12:47:54.090971778 -0500
@@ -13,27 +13,27 @@ class DvipsEncoding { public:
static void add_glyphlist(String);
- operator bool() const { return _e.size() > 0; }
- const String &name() const { return _name; }
- const String &filename() const { return _filename; }
- int boundary_char() const { return _boundary_char; }
- const String &coding_scheme() const { return _coding_scheme; }
- void set_coding_scheme(const String &s) { _coding_scheme = s; }
- void set_warn_missing(bool wm) { _warn_missing = wm; }
+ operator bool() const { return _e.size() > 0; }
+ const String &name() const { return _name; }
+ const String &filename() const { return _filename; }
+ int boundary_char() const { return _boundary_char; }
+ const String &coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
+ void set_warn_missing(bool wm) { _warn_missing = wm; }
void encode(int, PermString);
inline int encoding_of(PermString) const;
int encoding_of(PermString, bool encode);
inline bool encoded(int e) const;
inline PermString encoding(int e) const;
- int encoding_size() const { return _e.size(); }
+ int encoding_size() const { return _e.size(); }
int parse(String filename, bool ignore_ligkern, bool ignore_other, ErrorHandler *);
int parse_ligkern(const String &ligkern_text, int override, ErrorHandler *);
int parse_position(const String &ligkern_text, int override, ErrorHandler *);
int parse_unicoding(const String &unicoding_text, int override, ErrorHandler *);
- bool file_had_ligkern() const { return _file_had_ligkern; }
+ bool file_had_ligkern() const { return _file_had_ligkern; }
// also modifies 'this':
void make_metrics(Metrics &, const FontInfo &, Secondary *, bool literal, ErrorHandler *);
@@ -44,17 +44,17 @@ class DvipsEncoding { public:
void apply_position(Metrics &, ErrorHandler *) const;
enum { JT_KERN = 32, JT_LIG = 64, JT_ADDLIG = 128, JT_LIGALL = 199,
- JL_LIG = JT_LIG | JT_ADDLIG, JL_CLIG = JL_LIG | 1,
- JL_CLIG_S = JL_LIG | 2, JL_LIGC = JL_LIG | 3,
- JL_LIGC_S = JL_LIG | 4, JL_CLIGC = JL_LIG | 5,
- JL_CLIGC_S = JL_LIG | 6, JL_CLIGC_SS = JL_LIG | 7,
- JT_NOLIGKERN = JT_KERN | JT_LIG,
- J_ALL = 0x7FFFFFFF }; // also see nokern_names in dvipsencoding.cc
+ JL_LIG = JT_LIG | JT_ADDLIG, JL_CLIG = JL_LIG | 1,
+ JL_CLIG_S = JL_LIG | 2, JL_LIGC = JL_LIG | 3,
+ JL_LIGC_S = JL_LIG | 4, JL_CLIGC = JL_LIG | 5,
+ JL_CLIGC_S = JL_LIG | 6, JL_CLIGC_SS = JL_LIG | 7,
+ JT_NOLIGKERN = JT_KERN | JT_LIG,
+ J_ALL = 0x7FFFFFFF }; // also see nokern_names in dvipsencoding.cc
private:
struct Ligature {
- int c1, c2, join, k, d;
+ int c1, c2, join, k, d;
};
Vector<PermString> _e;
@@ -79,8 +79,8 @@ class DvipsEncoding { public:
bool _warn_missing;
struct WordType {
- const char *name;
- int (DvipsEncoding::*parsefunc)(Vector<String>&, int, ErrorHandler*);
+ const char *name;
+ int (DvipsEncoding::*parsefunc)(Vector<String>&, int, ErrorHandler*);
};
static const WordType word_types[];
enum { WT_LIGKERN = 0, WT_POSITION, WT_UNICODING };
@@ -114,9 +114,9 @@ inline PermString
DvipsEncoding::encoding(int e) const
{
if (encoded(e))
- return _e[e];
+ return _e[e];
else
- return PermString();
+ return PermString();
}
inline int
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc 2018-02-23 12:47:54.090971778 -0500
@@ -1,6 +1,6 @@
/* glyphfilter.{cc,hh} -- define subsets of characters
*
- * Copyright (c) 2004-2016 Eddie Kohler
+ * Copyright (c) 2004-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -30,7 +30,7 @@ GlyphFilter::allow(Efont::OpenType::Glyp
{
// out-of-range glyphs never match
if (glyph < 0 || glyph >= glyph_names.size())
- return false;
+ return false;
String glyph_name = glyph_names[glyph];
int uniprop = -1;
@@ -39,32 +39,32 @@ GlyphFilter::allow(Efont::OpenType::Glyp
// loop over patterns
for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
- // check pattern type
- if ((p->type & ~T_TYPEMASK) != ptype)
- continue;
- // check include/exclude
- if ((p->type & T_EXCLUDE) == 0) {
- if (included)
- continue;
- any_includes = true;
- }
- // check if there's a match
- bool match;
- if (p->data == D_NAME)
- match = glob_match(glyph_name, p->pattern);
- else if (p->data == D_UNIPROP) {
- if (uniprop < 0)
- uniprop = UnicodeProperty::property(unicode);
- match = ((uniprop & p->u.uniprop.mask) == p->u.uniprop.value);
- } else
- match = (unicode >= p->u.unirange.low && unicode <= p->u.unirange.high);
- // act if match
- if (match == ((p->type & T_NEGATE) == 0)) {
- if ((p->type & T_EXCLUDE) == 0)
- included = true;
- else
- return false;
- }
+ // check pattern type
+ if ((p->type & ~T_TYPEMASK) != ptype)
+ continue;
+ // check include/exclude
+ if ((p->type & T_EXCLUDE) == 0) {
+ if (included)
+ continue;
+ any_includes = true;
+ }
+ // check if there's a match
+ bool match;
+ if (p->data == D_NAME)
+ match = glob_match(glyph_name, p->pattern);
+ else if (p->data == D_UNIPROP) {
+ if (uniprop < 0)
+ uniprop = UnicodeProperty::property(unicode);
+ match = ((uniprop & p->u.uniprop.mask) == p->u.uniprop.value);
+ } else
+ match = (unicode >= p->u.unirange.low && unicode <= p->u.unirange.high);
+ // act if match
+ if (match == ((p->type & T_NEGATE) == 0)) {
+ if ((p->type & T_EXCLUDE) == 0)
+ included = true;
+ else
+ return false;
+ }
}
return !any_includes || included;
@@ -83,13 +83,13 @@ GlyphFilter::Pattern::compare(const Glyp
{
int cmp = a.type - b.type;
if (cmp == 0)
- cmp = a.data - b.data;
+ cmp = a.data - b.data;
if (cmp == 0)
- cmp = (int) (a.u.unirange.low - b.u.unirange.low);
+ cmp = (int) (a.u.unirange.low - b.u.unirange.low);
if (cmp == 0)
- cmp = (int) (a.u.unirange.high - b.u.unirange.high);
+ cmp = (int) (a.u.unirange.high - b.u.unirange.high);
if (cmp == 0)
- cmp = String::compare(a.pattern, b.pattern);
+ cmp = String::compare(a.pattern, b.pattern);
return cmp;
}
@@ -101,59 +101,59 @@ GlyphFilter::add_pattern(const String& p
const char* begin = pattern.begin();
const char* end = pattern.end();
while (begin < end && isspace((unsigned char) *begin))
- begin++;
+ begin++;
if (begin >= end)
- errh->error("missing pattern");
+ errh->error("missing pattern");
while (begin < end) {
- const char* word = begin;
- while (word < end && !isspace((unsigned char) *word))
- word++;
- bool negated = false;
- if (begin < word && begin[0] == '!')
- negated = true, begin++;
-
- // actually parse clause
- Pattern p(ptype + (negated ? T_NEGATE : 0));
-
- // unicode property
- if (begin + 3 <= word && begin[0] == '<' && word[-1] == '>') {
- p.data = D_UNIPROP;
- if (UnicodeProperty::parse_property(pattern.substring(begin + 1, word - 1), p.u.uniprop.value, p.u.uniprop.mask))
- _patterns.push_back(p);
- else if (errh)
- errh->error("unknown Unicode property %<%s%>", pattern.c_str());
- goto next_clause;
- }
-
- // unicode values
- {
- const char* dash = std::find(begin, word, '-');
- if (parse_unicode_number(begin, dash, 2, p.u.unirange.low)) {
- if (dash == word)
- p.u.unirange.high = p.u.unirange.low;
- else if (dash == word - 1)
- p.u.unirange.high = 0xFFFFFFFFU;
- else if (parse_unicode_number(dash + 1, word, (begin[0] == 'U' ? 1 : 0), p.u.unirange.high))
- /* do nothing */;
- else
- goto name_pattern; // assume it's a name
- p.data = D_UNIRANGE;
- _patterns.push_back(p);
- goto next_clause;
- }
- }
+ const char* word = begin;
+ while (word < end && !isspace((unsigned char) *word))
+ word++;
+ bool negated = false;
+ if (begin < word && begin[0] == '!')
+ negated = true, begin++;
+
+ // actually parse clause
+ Pattern p(ptype + (negated ? T_NEGATE : 0));
+
+ // unicode property
+ if (begin + 3 <= word && begin[0] == '<' && word[-1] == '>') {
+ p.data = D_UNIPROP;
+ if (UnicodeProperty::parse_property(pattern.substring(begin + 1, word - 1), p.u.uniprop.value, p.u.uniprop.mask))
+ _patterns.push_back(p);
+ else if (errh)
+ errh->error("unknown Unicode property %<%s%>", pattern.c_str());
+ goto next_clause;
+ }
+
+ // unicode values
+ {
+ const char* dash = std::find(begin, word, '-');
+ if (parse_unicode_number(begin, dash, 2, p.u.unirange.low)) {
+ if (dash == word)
+ p.u.unirange.high = p.u.unirange.low;
+ else if (dash == word - 1)
+ p.u.unirange.high = 0xFFFFFFFFU;
+ else if (parse_unicode_number(dash + 1, word, (begin[0] == 'U' ? 1 : 0), p.u.unirange.high))
+ /* do nothing */;
+ else
+ goto name_pattern; // assume it's a name
+ p.data = D_UNIRANGE;
+ _patterns.push_back(p);
+ goto next_clause;
+ }
+ }
- // otherwise must be name pattern
+ // otherwise must be name pattern
name_pattern:
- p.data = D_NAME;
- p.pattern = pattern.substring(begin, word);
- _patterns.push_back(p);
+ p.data = D_NAME;
+ p.pattern = pattern.substring(begin, word);
+ _patterns.push_back(p);
- // move to next clause
+ // move to next clause
next_clause:
- for (begin = word; begin < end && isspace((unsigned char) *begin); begin++)
- /* nada */;
+ for (begin = word; begin < end && isspace((unsigned char) *begin); begin++)
+ /* nada */;
}
}
@@ -176,7 +176,7 @@ GlyphFilter::operator+=(const GlyphFilte
_patterns.reserve(gf._patterns.size());
const Pattern* end = gf._patterns.end();
for (const Pattern* p = gf._patterns.begin(); p < end; p++)
- _patterns.push_back(*p);
+ _patterns.push_back(*p);
return *this;
}
@@ -184,9 +184,9 @@ GlyphFilter
operator+(const GlyphFilter& a, const GlyphFilter& b)
{
if (!b)
- return a;
+ return a;
if (!a)
- return b;
+ return b;
GlyphFilter x(a);
x += b;
return x;
@@ -196,14 +196,14 @@ bool
operator==(const GlyphFilter& a, const GlyphFilter& b)
{
if (&a == &b)
- return true;
+ return true;
if (a._patterns.size() != b._patterns.size())
- return false;
+ return false;
const GlyphFilter::Pattern* pa = a._patterns.begin();
const GlyphFilter::Pattern* pb = b._patterns.begin();
for (; pa < a._patterns.end(); pa++, pb++)
- if (!(*pa == *pb))
- return false;
+ if (!(*pa == *pb))
+ return false;
return true;
}
@@ -211,10 +211,10 @@ void
GlyphFilter::sort()
{
if (!_sorted) {
- std::sort(_patterns.begin(), _patterns.end());
- Pattern* true_end = std::unique(_patterns.begin(), _patterns.end());
- _patterns.erase(true_end, _patterns.end());
- _sorted = true;
+ std::sort(_patterns.begin(), _patterns.end());
+ Pattern* true_end = std::unique(_patterns.begin(), _patterns.end());
+ _patterns.erase(true_end, _patterns.end());
+ _sorted = true;
}
}
@@ -222,15 +222,15 @@ void
GlyphFilter::unparse(StringAccum& sa) const
{
for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
- sa << (p->type & T_DST ? 'D' : 'S') << (p->type & T_NEGATE ? "!" : "") << (p->type & T_EXCLUDE ? "X" : "");
- if (p->data == D_NAME)
- sa << '<' << p->pattern << '>';
- else if (p->data == D_UNIPROP)
- sa << "[UNIPROP:" << p->u.uniprop.mask << '=' << p->u.uniprop.value << ']';
- else
- sa.snprintf(20, "[U+%02x-U+%02x]", p->u.unirange.low, p->u.unirange.high);
- sa << ' ';
+ sa << (p->type & T_DST ? 'D' : 'S') << (p->type & T_NEGATE ? "!" : "") << (p->type & T_EXCLUDE ? "X" : "");
+ if (p->data == D_NAME)
+ sa << '<' << p->pattern << '>';
+ else if (p->data == D_UNIPROP)
+ sa << "[UNIPROP:" << p->u.uniprop.mask << '=' << p->u.uniprop.value << ']';
+ else
+ sa.snprintf(20, "[U+%02x-U+%02x]", p->u.unirange.low, p->u.unirange.high);
+ sa << ' ';
}
if (_patterns.size())
- sa.pop_back();
+ sa.pop_back();
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh 2018-02-23 12:47:54.091971753 -0500
@@ -6,9 +6,9 @@ class Metrics;
class GlyphFilter { public:
- GlyphFilter() : _sorted(true) { }
+ GlyphFilter() : _sorted(true) { }
- operator bool() const { return _patterns.size() != 0; }
+ operator bool() const { return _patterns.size() != 0; }
inline bool allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
inline bool allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
@@ -17,34 +17,34 @@ class GlyphFilter { public:
void add_alternate_filter(const String&, bool is_exclude, ErrorHandler*);
friend bool operator==(const GlyphFilter&, const GlyphFilter&);
- inline bool check_eq(GlyphFilter&); // may alter both GlyphFilters
+ inline bool check_eq(GlyphFilter&); // may alter both GlyphFilters
GlyphFilter& operator+=(const GlyphFilter&);
void unparse(StringAccum&) const;
struct Pattern {
- uint16_t type;
- uint16_t data;
- union {
- struct {
- int mask;
- int value;
- } uniprop;
- struct {
- uint32_t low;
- uint32_t high;
- } unirange;
- } u;
- String pattern;
- Pattern(uint16_t type);
- static int compare(const Pattern&, const Pattern&);
+ uint16_t type;
+ uint16_t data;
+ union {
+ struct {
+ int mask;
+ int value;
+ } uniprop;
+ struct {
+ uint32_t low;
+ uint32_t high;
+ } unirange;
+ } u;
+ String pattern;
+ Pattern(uint16_t type);
+ static int compare(const Pattern&, const Pattern&);
};
private:
enum { T_EXCLUDE = 1, T_NEGATE = 2, T_TYPEMASK = 3,
- T_SRC = 0, T_DST = 4 };
+ T_SRC = 0, T_DST = 4 };
enum { D_NAME, D_UNIPROP, D_UNIRANGE };
Vector<Pattern> _patterns;
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c 2018-02-23 12:47:54.091971753 -0500
@@ -1,6 +1,6 @@
/* kpseinterface.{c,h} -- interface with the kpathsea library
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -21,9 +21,6 @@
#include <kpathsea/expand.h>
#include <kpathsea/c-pathch.h>
#include <kpathsea/tex-file.h>
-#ifdef W32TEX
-#include <kpathsea/variable.h>
-#endif
#include "kpseinterface.h"
int kpsei_env_sep_char = ENV_SEP;
@@ -89,11 +86,3 @@ kpsei_set_debug_flags(unsigned flags)
{
kpathsea_debug = flags;
}
-
-#ifdef W32TEX
-char*
-kpsei_var_value(const char *name)
-{
- return kpse_var_value(name);
-}
-#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h 2018-02-23 12:47:54.091971753 -0500
@@ -13,10 +13,6 @@ enum { KPSEI_FMT_WEB2C, KPSEI_FMT_ENCODI
char* kpsei_find_file(const char* name, int format);
void kpsei_set_debug_flags(unsigned flags);
-#ifdef W32TEX
-char* kpsei_var_value(const char *name);
-#endif
-
#ifdef __cplusplus
}
#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am 2018-02-23 12:47:54.091971753 -0500
@@ -11,6 +11,7 @@ otftotfm_SOURCES = \
metrics.cc metrics.hh \
otftotfm.cc otftotfm.hh \
secondary.cc secondary.hh \
+ setting.hh \
uniprop.cc uniprop.hh \
util.cc util.hh
EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc 2018-02-23 12:47:54.092971728 -0500
@@ -1,6 +1,6 @@
/* metrics.{cc,hh} -- an encoding during and after OpenType features
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -35,7 +35,7 @@ Metrics::Metrics(const Efont::Charstring
Metrics::~Metrics()
{
for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
- delete c->virtual_char;
+ delete c->virtual_char;
}
int
@@ -54,36 +54,36 @@ Metrics::check() const
// 2. all 'ligatures' entries with 'in1 == c' are in '_encoding[c].ligs'
// 3. 'virtual_char' SHOW operations point to valid non-virtual chars
for (int code = 0; code < _encoding.size(); code++) {
- const Char *ch = &_encoding[code];
- assert((ch->virtual_char != 0) == (ch->glyph == VIRTUAL_GLYPH));
- for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
- assert(valid_code(l->in2) && valid_code(l->out));
- for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
- assert(valid_code(k->in2));
- if (const VirtualChar *vc = ch->virtual_char) {
- assert(vc->name);
- int font_number = 0;
- for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
- assert(s->valid_op());
- if (s->op == Setting::SHOW && font_number == 0)
- assert(nonvirtual_code(s->x));
- else if (s->op == Setting::FONT)
- font_number = s->x;
- }
- }
- assert(ch->built_in1 < 0 || valid_code(ch->built_in1));
- assert(ch->built_in2 < 0 || valid_code(ch->built_in2));
- assert((ch->built_in1 >= 0) == (ch->built_in2 >= 0));
- assert(ch->base_code < 0 || valid_code(ch->base_code));
- if (valid_code(ch->base_code)) {
- const Char *ch2 = &_encoding[ch->base_code];
- assert((!ch->virtual_char && ch->glyph)
- || (!ch2->virtual_char && ch2->glyph));
- }
- if (ch->flag(Char::CONTEXT_ONLY))
- assert(ch->virtual_char && ch->built_in1 >= 0 && ch->built_in2 >= 0);
- if (ch->flag(Char::CONTEXT_ONLY))
- assert(ch->flag(Char::LIVE));
+ const Char *ch = &_encoding[code];
+ assert((ch->virtual_char != 0) == (ch->glyph == VIRTUAL_GLYPH));
+ for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ assert(valid_code(l->in2) && valid_code(l->out));
+ for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ assert(valid_code(k->in2));
+ if (const VirtualChar *vc = ch->virtual_char) {
+ assert(vc->name);
+ int font_number = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
+ assert(s->valid_op());
+ if (s->op == Setting::SHOW && font_number == 0)
+ assert(nonvirtual_code(s->x));
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ }
+ assert(ch->built_in1 < 0 || valid_code(ch->built_in1));
+ assert(ch->built_in2 < 0 || valid_code(ch->built_in2));
+ assert((ch->built_in1 >= 0) == (ch->built_in2 >= 0));
+ assert(ch->base_code < 0 || valid_code(ch->base_code));
+ if (valid_code(ch->base_code)) {
+ const Char *ch2 = &_encoding[ch->base_code];
+ assert((!ch->virtual_char && ch->glyph)
+ || (!ch2->virtual_char && ch2->glyph));
+ }
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->virtual_char && ch->built_in1 >= 0 && ch->built_in2 >= 0);
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->flag(Char::LIVE));
}
}
@@ -91,32 +91,32 @@ PermString
Metrics::code_name(Code code) const
{
if (code < 0 || code >= _encoding.size())
- return permprintf("<badcode%d>", code);
+ return permprintf("<badcode%d>", code);
else {
- const Char &ch = _encoding[code];
- if (ch.virtual_char)
- return ch.virtual_char->name;
- else if (ch.glyph == _boundary_glyph)
- return "<boundary>";
- else if (ch.glyph == _emptyslot_glyph)
- return "<emptyslot>";
- else if (ch.glyph >= 0 && ch.glyph < _mapped_fonts[0]->nglyphs())
- return _mapped_fonts[0]->glyph_name(ch.glyph);
- else
- return permprintf("<glyph%d>", ch.glyph);
+ const Char &ch = _encoding[code];
+ if (ch.virtual_char)
+ return ch.virtual_char->name;
+ else if (ch.glyph == _boundary_glyph)
+ return "<boundary>";
+ else if (ch.glyph == _emptyslot_glyph)
+ return "<emptyslot>";
+ else if (ch.glyph >= 0 && ch.glyph < _mapped_fonts[0]->nglyphs())
+ return _mapped_fonts[0]->glyph_name(ch.glyph);
+ else
+ return permprintf("<glyph%d>", ch.glyph);
}
}
/*****************************************************************************/
-/* encoding */
+/* encoding */
Metrics::Code
Metrics::unicode_encoding(uint32_t uni) const
{
for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
- if (ch->unicode == uni)
- return ch - _encoding.begin();
+ if (ch->unicode == uni)
+ return ch - _encoding.begin();
return -1;
}
@@ -124,15 +124,15 @@ Metrics::Code
Metrics::hard_encoding(Glyph g, Code after) const
{
if (g < 0)
- return -1;
+ return -1;
int answer = -1, n = 0;
for (int i = _encoding.size() - 1; i >= after; i--)
- if (_encoding[i].glyph == g)
- answer = i, n++;
+ if (_encoding[i].glyph == g)
+ answer = i, n++;
if (n < 2 && after == 0) {
- if (g >= _emap.size())
- _emap.resize(g + 1, -2);
- _emap[g] = answer;
+ if (g >= _emap.size())
+ _emap.resize(g + 1, -2);
+ _emap[g] = answer;
}
return answer;
}
@@ -143,15 +143,15 @@ Metrics::force_encoding(Glyph g, int loo
assert(g >= 0);
int e = encoding(g, 0);
if (e >= 0)
- return e;
+ return e;
else {
- Char ch;
- ch.glyph = g;
- ch.base_code = _encoding.size();
- ch.lookup_source = lookup_source;
- _encoding.push_back(ch);
- assign_emap(g, ch.base_code);
- return ch.base_code;
+ Char ch;
+ ch.glyph = g;
+ ch.base_code = _encoding.size();
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ assign_emap(g, ch.base_code);
+ return ch.base_code;
}
}
@@ -160,11 +160,11 @@ Metrics::encode(Code code, uint32_t uni,
{
assert(code >= 0 && g >= 0 && g != VIRTUAL_GLYPH);
if (code >= _encoding.size())
- _encoding.resize(code + 1, Char());
+ _encoding.resize(code + 1, Char());
_encoding[code].unicode = uni;
_encoding[code].glyph = g;
if (g > 0)
- _encoding[code].base_code = code;
+ _encoding[code].base_code = code;
assert(!_encoding[code].virtual_char);
assign_emap(g, code);
}
@@ -174,20 +174,20 @@ Metrics::encode_virtual(Code code, PermS
{
assert(code >= 0 && v.size() > 0);
if (code >= _encoding.size())
- _encoding.resize(code + 1, Char());
+ _encoding.resize(code + 1, Char());
_encoding[code].unicode = uni;
_encoding[code].glyph = VIRTUAL_GLYPH;
if (base_char)
- _encoding[code].flags |= Char::BASE_REP;
+ _encoding[code].flags |= Char::BASE_REP;
assert(!_encoding[code].virtual_char);
VirtualChar *vc = _encoding[code].virtual_char = new VirtualChar;
vc->name = name;
vc->setting = v;
int font_number = 0;
for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
- assert(s->valid_op() && (s->op != Setting::SHOW || font_number != 0 || nonvirtual_code(s->x)));
- if (s->op == Setting::FONT)
- font_number = s->x;
+ assert(s->valid_op() && (s->op != Setting::SHOW || font_number != 0 || nonvirtual_code(s->x)));
+ if (s->op == Setting::FONT)
+ font_number = s->x;
}
}
@@ -196,28 +196,28 @@ Metrics::apply_base_encoding(const Strin
{
int font_number = -1;
for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
- if (c->glyph > 0 && !c->virtual_char && c->glyph < mapping.size()
- && mapping[c->glyph] >= 0) {
- if (font_number < 0)
- font_number = add_mapped_font(mapped_font(0), font_name);
- VirtualChar *vc = c->virtual_char = new VirtualChar;
- vc->name = dvipsenc.encoding(mapping[c->glyph]);
- vc->setting.push_back(Setting(Setting::FONT, font_number));
- vc->setting.push_back(Setting(Setting::SHOW, mapping[c->glyph], c->glyph));
- c->glyph = VIRTUAL_GLYPH;
- c->base_code = -1;
- c->flags = (c->flags & ~Char::BASE_LIVE) | Char::BASE_REP;
- }
+ if (c->glyph > 0 && !c->virtual_char && c->glyph < mapping.size()
+ && mapping[c->glyph] >= 0) {
+ if (font_number < 0)
+ font_number = add_mapped_font(mapped_font(0), font_name);
+ VirtualChar *vc = c->virtual_char = new VirtualChar;
+ vc->name = dvipsenc.encoding(mapping[c->glyph]);
+ vc->setting.push_back(Setting(Setting::FONT, font_number));
+ vc->setting.push_back(Setting(Setting::SHOW, mapping[c->glyph], c->glyph));
+ c->glyph = VIRTUAL_GLYPH;
+ c->base_code = -1;
+ c->flags = (c->flags & ~Char::BASE_LIVE) | Char::BASE_REP;
+ }
}
void
Metrics::add_altselector_code(Code code, int altselector_type)
{
for (Kern *k = _altselectors.begin(); k != _altselectors.end(); k++)
- if (k->in2 == code) {
- k->kern = altselector_type;
- return;
- }
+ if (k->in2 == code) {
+ k->kern = altselector_type;
+ return;
+ }
_altselectors.push_back(Kern(code, altselector_type));
}
@@ -227,16 +227,16 @@ Metrics::base_glyphs(Vector<Glyph> &v, i
bool any = false;
v.assign(_encoding.size(), 0);
for (const Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
- if (ch->base_code >= 0 && ch->base_code < size) {
- v[ch->base_code] = ch->glyph;
- any = true;
- }
+ if (ch->base_code >= 0 && ch->base_code < size) {
+ v[ch->base_code] = ch->glyph;
+ any = true;
+ }
return any;
}
/*****************************************************************************/
-/* Char methods */
+/* Char methods */
void
Metrics::Char::clear()
@@ -260,7 +260,7 @@ Metrics::Char::swap(Char &c)
std::swap(glyph, c.glyph);
// NB: only a partial switch of base_code!!
if (base_code < 0)
- base_code = c.base_code;
+ base_code = c.base_code;
c.base_code = -1;
std::swap(unicode, c.unicode);
ligatures.swap(c.ligatures);
@@ -277,7 +277,7 @@ Metrics::Char::swap(Char &c)
/*****************************************************************************/
-/* manipulating ligature lists */
+/* manipulating ligature lists */
Metrics::Ligature *
Metrics::ligature_obj(Code code1, Code code2)
@@ -285,8 +285,8 @@ Metrics::ligature_obj(Code code1, Code c
assert(valid_code(code1) && valid_code(code2));
Char &ch = _encoding[code1];
for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
- if (l->in2 == code2)
- return l;
+ if (l->in2 == code2)
+ return l;
return 0;
}
@@ -307,39 +307,39 @@ void
Metrics::add_ligature(Code in1, Code in2, Code out)
{
if (Ligature *l = ligature_obj(in1, in2)) {
- Char &ch = _encoding[l->out];
- if (ch.flags & Char::BUILT) {
- // move old ligatures to point to the true ligature
- for (Ligature *ll = ch.ligatures.begin(); ll != ch.ligatures.end(); ll++)
- add_ligature(out, ll->in2, ll->out);
- repoint_ligature(in1, l, out);
- }
+ Char &ch = _encoding[l->out];
+ if (ch.flags & Char::BUILT) {
+ // move old ligatures to point to the true ligature
+ for (Ligature *ll = ch.ligatures.begin(); ll != ch.ligatures.end(); ll++)
+ add_ligature(out, ll->in2, ll->out);
+ repoint_ligature(in1, l, out);
+ }
} else
- new_ligature(in1, in2, out);
+ new_ligature(in1, in2, out);
}
Metrics::Code
Metrics::pair_code(Code in1, Code in2, int lookup_source)
{
if (const Ligature *l = ligature_obj(in1, in2)) {
- if (lookup_source < 0)
- _encoding[l->out].flags &= ~Char::INTERMEDIATE;
- return l->out;
+ if (lookup_source < 0)
+ _encoding[l->out].flags &= ~Char::INTERMEDIATE;
+ return l->out;
} else {
- Char ch;
- ch.glyph = VIRTUAL_GLYPH;
- ch.flags = Char::BUILT | (lookup_source >= 0 ? Char::INTERMEDIATE : 0);
- VirtualChar *vc = ch.virtual_char = new VirtualChar;
- vc->name = permprintf("%s__%s", code_str(in1), code_str(in2));
- setting(in1, vc->setting, SET_INTERMEDIATE);
- vc->setting.push_back(Setting(Setting::KERN));
- setting(in2, vc->setting, SET_INTERMEDIATE);
- ch.built_in1 = in1;
- ch.built_in2 = in2;
- ch.lookup_source = lookup_source;
- _encoding.push_back(ch);
- new_ligature(in1, in2, _encoding.size() - 1);
- return _encoding.size() - 1;
+ Char ch;
+ ch.glyph = VIRTUAL_GLYPH;
+ ch.flags = Char::BUILT | (lookup_source >= 0 ? Char::INTERMEDIATE : 0);
+ VirtualChar *vc = ch.virtual_char = new VirtualChar;
+ vc->name = permprintf("%s__%s", code_str(in1), code_str(in2));
+ setting(in1, vc->setting, SET_INTERMEDIATE);
+ vc->setting.push_back(Setting(Setting::KERN));
+ setting(in2, vc->setting, SET_INTERMEDIATE);
+ ch.built_in1 = in1;
+ ch.built_in2 = in2;
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ new_ligature(in1, in2, _encoding.size() - 1);
+ return _encoding.size() - 1;
}
}
@@ -347,22 +347,22 @@ void
Metrics::remove_ligatures(Code in1, Code in2)
{
if (in1 == CODE_ALL) {
- for (in1 = 0; in1 < _encoding.size(); in1++)
- remove_ligatures(in1, in2);
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ remove_ligatures(in1, in2);
} else {
- Char &ch = _encoding[in1];
- if (in2 == CODE_ALL)
- ch.ligatures.clear();
- else if (Ligature *l = ligature_obj(in1, in2)) {
- *l = ch.ligatures.back();
- ch.ligatures.pop_back();
- }
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL)
+ ch.ligatures.clear();
+ else if (Ligature *l = ligature_obj(in1, in2)) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ }
}
}
/*****************************************************************************/
-/* manipulating kern lists */
+/* manipulating kern lists */
Metrics::Kern *
Metrics::kern_obj(Code in1, Code in2)
@@ -370,8 +370,8 @@ Metrics::kern_obj(Code in1, Code in2)
assert(valid_code(in1) && valid_code(in2));
Char &ch = _encoding[in1];
for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
- if (k->in2 == in2)
- return k;
+ if (k->in2 == in2)
+ return k;
return 0;
}
@@ -381,8 +381,8 @@ Metrics::kern(Code in1, Code in2) const
assert(valid_code(in1) && valid_code(in2));
const Char &ch = _encoding[in1];
for (const Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
- if (k->in2 == in2)
- return k->kern;
+ if (k->in2 == in2)
+ return k->kern;
return 0;
}
@@ -390,30 +390,30 @@ void
Metrics::add_kern(Code in1, Code in2, int kern)
{
if (Kern *k = kern_obj(in1, in2))
- k->kern += kern;
+ k->kern += kern;
else
- _encoding[in1].kerns.push_back(Kern(in2, kern));
+ _encoding[in1].kerns.push_back(Kern(in2, kern));
}
void
Metrics::set_kern(Code in1, Code in2, int kern)
{
if (in1 == CODE_ALL) {
- for (in1 = 0; in1 < _encoding.size(); in1++)
- set_kern(in1, in2, kern);
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ set_kern(in1, in2, kern);
} else {
- Char &ch = _encoding[in1];
- if (in2 == CODE_ALL) {
- assert(kern == 0);
- ch.kerns.clear();
- } else if (Kern *k = kern_obj(in1, in2)) {
- if (kern == 0) {
- *k = ch.kerns.back();
- ch.kerns.pop_back();
- } else
- k->kern = kern;
- } else if (kern != 0)
- ch.kerns.push_back(Kern(in2, kern));
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL) {
+ assert(kern == 0);
+ ch.kerns.clear();
+ } else if (Kern *k = kern_obj(in1, in2)) {
+ if (kern == 0) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ } else
+ k->kern = kern;
+ } else if (kern != 0)
+ ch.kerns.push_back(Kern(in2, kern));
}
}
@@ -422,38 +422,38 @@ Metrics::reencode_right_ligkern(Code old
{
int nchanges = 0;
for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
- for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
- if (l->in2 == old_in2) {
- if (new_in2 >= 0)
- l->in2 = new_in2;
- else {
- *l = ch->ligatures.back();
- ch->ligatures.pop_back();
- l--;
- }
- nchanges++;
- }
- for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
- if (k->in2 == old_in2) {
- if (new_in2 >= 0)
- k->in2 = new_in2;
- else {
- *k = ch->kerns.back();
- ch->kerns.pop_back();
- k--;
- }
- nchanges++;
- }
- // XXX?
- if (ch->context_setting(-1, old_in2) && new_in2 >= 0 && ch->built_in1 >= 0)
- ch->built_in2 = new_in2;
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->in2 == old_in2) {
+ if (new_in2 >= 0)
+ l->in2 = new_in2;
+ else {
+ *l = ch->ligatures.back();
+ ch->ligatures.pop_back();
+ l--;
+ }
+ nchanges++;
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ if (k->in2 == old_in2) {
+ if (new_in2 >= 0)
+ k->in2 = new_in2;
+ else {
+ *k = ch->kerns.back();
+ ch->kerns.pop_back();
+ k--;
+ }
+ nchanges++;
+ }
+ // XXX?
+ if (ch->context_setting(-1, old_in2) && new_in2 >= 0 && ch->built_in1 >= 0)
+ ch->built_in2 = new_in2;
}
return nchanges;
}
/*****************************************************************************/
-/* positioning */
+/* positioning */
void
Metrics::add_single_positioning(Code c, int pdx, int pdy, int adx)
@@ -467,7 +467,7 @@ Metrics::add_single_positioning(Code c,
/*****************************************************************************/
-/* changed_context structure */
+/* changed_context structure */
class Metrics::ChangedContext { public:
ChangedContext(int ncodes);
@@ -498,35 +498,35 @@ Metrics::ChangedContext::ChangedContext(
Metrics::ChangedContext::~ChangedContext()
{
for (Vector<uint32_t> **v = _v.begin(); v != _v.end(); v++)
- if (*v != &_all_sentinel)
- delete *v;
+ if (*v != &_all_sentinel)
+ delete *v;
}
inline void
Metrics::ChangedContext::ensure_all(Code c) const
{
if (c >= 0 && (c >> 5) >= _all_sentinel.size())
- _all_sentinel.resize((c >> 5) + 1, 0xFFFFFFFFU);
+ _all_sentinel.resize((c >> 5) + 1, 0xFFFFFFFFU);
}
inline bool
Metrics::ChangedContext::bit(const Vector<uint32_t> &v, Code c)
{
if (c < 0 || (c >> 5) >= v.size())
- return false;
+ return false;
else
- return (v[c >> 5] & (1 << (c & 0x1F))) != 0;
+ return (v[c >> 5] & (1 << (c & 0x1F))) != 0;
}
bool
Metrics::ChangedContext::allowed(Code c, bool left_context) const
{
if (c < 0)
- return false;
+ return false;
else if (c >= _v.size())
- return left_context;
+ return left_context;
else
- return (_v[c] != &_all_sentinel);
+ return (_v[c] != &_all_sentinel);
}
bool
@@ -534,11 +534,11 @@ Metrics::ChangedContext::pair_allowed(Co
{
ensure_all(c2);
if (c1 < 0 || c2 < 0)
- return false;
+ return false;
else if (c1 >= _v.size() || c2 >= _v.size() || !_v[c1])
- return true;
+ return true;
else
- return !bit(*_v[c1], c2);
+ return !bit(*_v[c1], c2);
}
bool
@@ -552,10 +552,10 @@ Metrics::ChangedContext::disallow(Code c
{
assert(c >= 0);
if (c >= _v.size())
- _v.resize(c + 1, 0);
+ _v.resize(c + 1, 0);
if (_v[c] != &_all_sentinel) {
- delete _v[c];
- _v[c] = &_all_sentinel;
+ delete _v[c];
+ _v[c] = &_all_sentinel;
}
}
@@ -564,60 +564,60 @@ Metrics::ChangedContext::disallow_pair(C
{
assert(c1 >= 0 && c2 >= 0);
if (c1 >= _v.size())
- _v.resize(c1 + 1, 0);
+ _v.resize(c1 + 1, 0);
if (!_v[c1])
- _v[c1] = new Vector<uint32_t>;
+ _v[c1] = new Vector<uint32_t>;
if (_v[c1] != &_all_sentinel) {
- if ((c2 >> 5) >= _v[c1]->size())
- _v[c1]->resize((c2 >> 5) + 1, 0);
- (*_v[c1])[c2 >> 5] |= 1 << (c2 & 0x1F);
+ if ((c2 >> 5) >= _v[c1]->size())
+ _v[c1]->resize((c2 >> 5) + 1, 0);
+ (*_v[c1])[c2 >> 5] |= 1 << (c2 & 0x1F);
}
}
/*****************************************************************************/
-/* applying GSUB substitutions */
+/* applying GSUB substitutions */
void
Metrics::apply_single(Code cin, const Substitution *s, int lookup,
- ChangedContext &ctx, const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names)
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
{
// check if encoded
if (!ctx.allowed(cin, false))
- /* not encoded before this substitution began, or completely changed;
- ingore */
- return;
+ /* not encoded before this substitution began, or completely changed;
+ ingore */
+ return;
// check if substitution of this code allowed
if (!glyph_filter.allow_substitution(s->in_glyph(), glyph_names, unicode(cin)))
- return;
+ return;
// look for an allowed alternate
Glyph out = -1;
for (int i = 0; out < 0 && i < s->out_nglyphs(); i++)
- if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, unicode(cin)))
- out = s->out_glyph(i);
- if (out < 0) // no allowed alternate
- return;
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, unicode(cin)))
+ out = s->out_glyph(i);
+ if (out < 0) // no allowed alternate
+ return;
// apply substitution
if (ctx.virgin(cin)) {
- // no one has changed this glyph yet, change it unilaterally
- assign_emap(s->in_glyph(), -2);
- assign_emap(out, cin);
- assert(!_encoding[cin].virtual_char);
- _encoding[cin].glyph = out;
+ // no one has changed this glyph yet, change it unilaterally
+ assign_emap(s->in_glyph(), -2);
+ assign_emap(out, cin);
+ assert(!_encoding[cin].virtual_char);
+ _encoding[cin].glyph = out;
} else {
- // some contextual substitutions have changed this glyph, add
- // contextual substitutions for the remaining possibilities
- Code cout = force_encoding(out, lookup);
- for (Code right = 0; right < _encoding.size(); right++)
- if (_encoding[right].visible() && !_encoding[right].flag(Char::BUILT) && ctx.pair_allowed(cin, right)) {
- Code pair = pair_code(cout, right, lookup);
- _encoding[cout].flags &= ~Char::INTERMEDIATE;
- add_ligature(cin, right, pair);
- }
+ // some contextual substitutions have changed this glyph, add
+ // contextual substitutions for the remaining possibilities
+ Code cout = force_encoding(out, lookup);
+ for (Code right = 0; right < _encoding.size(); right++)
+ if (_encoding[right].visible() && !_encoding[right].flag(Char::BUILT) && ctx.pair_allowed(cin, right)) {
+ Code pair = pair_code(cout, right, lookup);
+ _encoding[cout].flags &= ~Char::INTERMEDIATE;
+ add_ligature(cin, right, pair);
+ }
}
// no more substitutions for cin
@@ -630,7 +630,7 @@ Metrics::apply_ligature(const Vector<Cod
// build up the character pair
int cin1 = in[0];
for (const Code *inp = in.begin() + 1; inp < in.end() - 1; inp++)
- cin1 = pair_code(cin1, *inp, lookup);
+ cin1 = pair_code(cin1, *inp, lookup);
int cin2 = in.back();
// build up the output character
@@ -638,18 +638,18 @@ Metrics::apply_ligature(const Vector<Cod
s->all_out_glyphs(out);
int cout = -1;
for (Glyph *outp = out.begin(); outp < out.end(); outp++) {
- *outp = force_encoding(*outp, lookup);
- cout = (cout < 0 ? *outp : pair_code(cout, *outp, lookup));
+ *outp = force_encoding(*outp, lookup);
+ cout = (cout < 0 ? *outp : pair_code(cout, *outp, lookup));
}
_encoding[cout].flags &= ~Char::INTERMEDIATE;
// check for replacing a fake ligature
int old_out = -1;
if (Ligature *l = ligature_obj(cin1, cin2)) {
- if (l->out == cout) // already created this same ligature
- return;
- if (_encoding[l->out].flags & Char::BUILT)
- old_out = l->out;
+ if (l->out == cout) // already created this same ligature
+ return;
+ if (_encoding[l->out].flags & Char::BUILT)
+ old_out = l->out;
}
// make the final ligature
@@ -659,35 +659,39 @@ Metrics::apply_ligature(const Vector<Cod
// if appropriate, swap old ligatures to point to the new result
if (old_out >= 0)
- for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
- for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
- if (l->out == old_out)
- repoint_ligature(ch - _encoding.begin(), l, cout);
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->out == old_out)
+ repoint_ligature(ch - _encoding.begin(), l, cout);
}
void
Metrics::apply_simple_context_ligature(const Vector<Code> &codes,
- const Substitution *s, int lookup, ChangedContext &ctx)
+ const Substitution *s, int lookup, ChangedContext &ctx,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString>& glyph_names)
{
int nleft = s->left_nglyphs(), nin = s->in_nglyphs();
assert(codes.size() >= 2);
// check if context allows substitutions
- for (const Code *inp = codes.begin(); inp < codes.end(); ++inp)
- if (!ctx.allowed(*inp, inp - codes.begin() < nleft))
- return;
+ for (int i = 0; i < codes.size(); ++i) {
+ if (!ctx.allowed(codes[i], i < nleft)
+ || !glyph_filter.allow_substitution(s->in_glyph(i), glyph_names, unicode(codes[i])))
+ return;
+ }
// check if any part of the combination has already changed
int ncheck = nleft + (nin > 2 ? 2 : nin);
if (ncheck == codes.size())
- --ncheck;
+ --ncheck;
for (const Code *inp = codes.begin(); inp < codes.begin() + ncheck; ++inp)
- if (!ctx.pair_allowed(inp[0], inp[1]))
- return;
+ if (!ctx.pair_allowed(inp[0], inp[1]))
+ return;
// mark this combination as changed if appropriate
if (codes.size() == 2 && nin == 1)
- ctx.disallow_pair(codes[0], codes[1]);
+ ctx.disallow_pair(codes[0], codes[1]);
// actually apply ligature
apply_ligature(codes, s, lookup);
@@ -697,18 +701,18 @@ bool
Metrics::next_encoding(Vector<Code> &codes, const Vector<Glyph> &glyphs) const
{
if (!codes.size()) {
- codes.assign(glyphs.size(), 0);
- for (int i = 0; i < glyphs.size(); ++i)
- if ((codes[i] = encoding(glyphs[i], 0)) < 0)
- return false;
- return true;
+ codes.assign(glyphs.size(), 0);
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], 0)) < 0)
+ return false;
+ return true;
} else {
- for (int i = 0; i < glyphs.size(); ++i)
- if ((codes[i] = encoding(glyphs[i], codes[i] + 1)) >= 0)
- return true;
- else
- codes[i] = encoding(glyphs[i], 0);
- return false;
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], codes[i] + 1)) >= 0)
+ return true;
+ else
+ codes[i] = encoding(glyphs[i], 0);
+ return false;
}
}
@@ -724,20 +728,20 @@ Metrics::apply(const Vector<Substitution
// loop over substitutions
int failures = 0;
for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
- bool is_single = s->is_single() || s->is_alternate();
- bool is_apply_single = is_single && allow_single;
- bool is_apply_simple_context_ligature = !is_single && !s->is_multiple() && s->is_simple_context();
-
- if (is_apply_single || is_apply_simple_context_ligature) {
- s->all_in_glyphs(glyphs);
- for (codes.clear(); next_encoding(codes, glyphs); ) {
- if (is_apply_single)
- apply_single(codes[0], s, lookup, ctx, glyph_filter, glyph_names);
- else
- apply_simple_context_ligature(codes, s, lookup, ctx);
- }
- } else
- failures++;
+ bool is_single = s->is_single() || s->is_alternate();
+ bool is_apply_single = is_single && allow_single;
+ bool is_apply_simple_context_ligature = !is_single && !s->is_multiple() && s->is_simple_context();
+
+ if (is_apply_single || is_apply_simple_context_ligature) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_apply_single)
+ apply_single(codes[0], s, lookup, ctx, glyph_filter, glyph_names);
+ else
+ apply_simple_context_ligature(codes, s, lookup, ctx, glyph_filter, glyph_names);
+ }
+ } else
+ failures++;
}
return sv.size() - failures;
@@ -745,42 +749,42 @@ Metrics::apply(const Vector<Substitution
void
Metrics::apply_alternates_single(Code cin, const Substitution *s, int lookup,
- const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names)
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
{
for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
- if (as->kern == 0) {
- Code last = cin;
- uint32_t u = unicode(cin);
- for (int i = 0; i < s->out_nglyphs(); i++)
- if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, u)) {
- Code out = force_encoding(s->out_glyph(i), lookup);
- add_ligature(last, as->in2, out);
- last = out;
- }
- } else if (as->kern <= s->out_nglyphs()) {
- Code out = force_encoding(s->out_glyph(as->kern - 1), lookup);
- add_ligature(cin, as->in2, out);
- }
+ if (as->kern == 0) {
+ Code last = cin;
+ uint32_t u = unicode(cin);
+ for (int i = 0; i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, u)) {
+ Code out = force_encoding(s->out_glyph(i), lookup);
+ add_ligature(last, as->in2, out);
+ last = out;
+ }
+ } else if (as->kern <= s->out_nglyphs()) {
+ Code out = force_encoding(s->out_glyph(as->kern - 1), lookup);
+ add_ligature(cin, as->in2, out);
+ }
}
void
Metrics::apply_alternates_ligature(const Vector<Code> &codes,
- const Substitution *s, int lookup,
- const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names)
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
{
// check whether the output character is allowed
if (!glyph_filter.allow_alternate(s->out_glyph(), glyph_names, 0))
- return;
+ return;
// find alternate selector and apply ligature if appropriate
for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
- if (as->kern == 0) {
- Vector<Code> lig(codes);
- lig.insert(lig.begin() + 1, as->in2);
- apply_ligature(lig, s, lookup);
- }
+ if (as->kern == 0) {
+ Vector<Code> lig(codes);
+ lig.insert(lig.begin() + 1, as->in2);
+ apply_ligature(lig, s, lookup);
+ }
}
void
@@ -790,36 +794,36 @@ Metrics::apply_alternates(const Vector<S
Vector<Code> codes;
for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
- bool is_single = s->is_single() || s->is_alternate();
- if (is_single || s->is_ligature()) {
- s->all_in_glyphs(glyphs);
- for (codes.clear(); next_encoding(codes, glyphs); ) {
- if (is_single)
- apply_alternates_single(codes[0], s, lookup, glyph_filter, glyph_names);
- else
- apply_alternates_ligature(codes, s, lookup, glyph_filter, glyph_names);
- }
- }
+ bool is_single = s->is_single() || s->is_alternate();
+ if (is_single || s->is_ligature()) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_single)
+ apply_alternates_single(codes[0], s, lookup, glyph_filter, glyph_names);
+ else
+ apply_alternates_ligature(codes, s, lookup, glyph_filter, glyph_names);
+ }
+ }
}
}
/*****************************************************************************/
-/* applying GPOS positionings */
+/* applying GPOS positionings */
-static bool // returns old value
+static bool // returns old value
assign_bitvec(int*& bitvec, int e, int n)
{
if (e >= 0 && e < n) {
- if (!bitvec) {
- bitvec = new int[((n - 1) >> 5) + 1];
- memset(bitvec, 0, sizeof(int) * (((n - 1) >> 5) + 1));
- }
- bool result = (bitvec[e >> 5] & (1 << (e & 0x1F))) != 0;
- bitvec[e >> 5] |= (1 << (e & 0x1F));
- return result;
+ if (!bitvec) {
+ bitvec = new int[((n - 1) >> 5) + 1];
+ memset(bitvec, 0, sizeof(int) * (((n - 1) >> 5) + 1));
+ }
+ bool result = (bitvec[e >> 5] & (1 << (e & 0x1F))) != 0;
+ bitvec[e >> 5] |= (1 << (e & 0x1F));
+ return result;
} else
- return false;
+ return false;
}
int
@@ -834,33 +838,33 @@ Metrics::apply(const Vector<Positioning>
// loop over substitutions
int success = 0;
for (const Positioning *p = pv.begin(); p != pv.end(); p++) {
- bool is_single = p->is_single();
- if (is_single || p->is_pairkern()) {
- p->all_in_glyphs(glyphs);
- for (codes.clear(); next_encoding(codes, glyphs); )
- if (is_single) {
- if (!assign_bitvec(single_changed, codes[0], _encoding.size())) {
- _encoding[codes[0]].pdx += p->left().pdx;
- _encoding[codes[0]].pdy += p->left().pdy;
- _encoding[codes[0]].adx += p->left().adx;
- }
- } else {
- if (!assign_bitvec(pair_changed[codes[0]], codes[1], _encoding.size()))
- add_kern(codes[0], codes[1], p->left().adx);
- }
- success++;
- }
+ bool is_single = p->is_single();
+ if (is_single || p->is_pairkern()) {
+ p->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); )
+ if (is_single) {
+ if (!assign_bitvec(single_changed, codes[0], _encoding.size())) {
+ _encoding[codes[0]].pdx += p->left().pdx;
+ _encoding[codes[0]].pdy += p->left().pdy;
+ _encoding[codes[0]].adx += p->left().adx;
+ }
+ } else {
+ if (!assign_bitvec(pair_changed[codes[0]], codes[1], _encoding.size()))
+ add_kern(codes[0], codes[1], p->left().adx);
+ }
+ success++;
+ }
}
delete[] single_changed;
for (int i = 0; i < pair_changed.size(); i++)
- delete[] pair_changed[i];
+ delete[] pair_changed[i];
return success;
}
/*****************************************************************************/
-/* liveness marking, Ligature3s */
+/* liveness marking, Ligature3s */
String Metrics::Ligature3::unparse(const Metrics& m) const {
StringAccum sa;
@@ -874,11 +878,11 @@ operator<(const Metrics::Ligature3 &l1,
{
// topological < : is l1's output one of l2's inputs?
if (l1.out == l2.in1 || l1.out == l2.in2)
- return true;
+ return true;
else
- return l1.in1 < l2.in1
- || (l1.in1 == l2.in1 && (l1.in2 < l2.in2
- || (l1.in2 == l2.in2 && l1.out < l2.out)));
+ return l1.in1 < l2.in1
+ || (l1.in1 == l2.in1 && (l1.in2 < l2.in2
+ || (l1.in2 == l2.in2 && l1.out < l2.out)));
}
void
@@ -887,8 +891,8 @@ Metrics::all_ligatures(Vector<Ligature3>
/* Develop a topologically-sorted ligature list. */
all_ligs.clear();
for (Code code = 0; code < _encoding.size(); code++)
- for (const Ligature *l = _encoding[code].ligatures.begin(); l != _encoding[code].ligatures.end(); l++)
- all_ligs.push_back(Ligature3(code, l->in2, l->out));
+ for (const Ligature *l = _encoding[code].ligatures.begin(); l != _encoding[code].ligatures.end(); l++)
+ all_ligs.push_back(Ligature3(code, l->in2, l->out));
std::sort(all_ligs.begin(), all_ligs.end());
}
@@ -901,86 +905,86 @@ Metrics::mark_liveness(int size, const V
// make sure we have ligatures
Vector<Ligature3> my_ligs;
if (!all_ligs) {
- all_ligatures(my_ligs);
- all_ligs = &my_ligs;
+ all_ligatures(my_ligs);
+ all_ligs = &my_ligs;
}
/* Characters below 'size' are in both virtual and base encodings. */
for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
- if (ch->visible())
- ch->flags |= Char::LIVE | (ch->virtual_char ? 0 : Char::BASE_LIVE);
+ if (ch->visible())
+ ch->flags |= Char::LIVE | (ch->virtual_char ? 0 : Char::BASE_LIVE);
/* Characters reachable from live chars by live ligatures are live. */
redo_live_reachable:
for (const Ligature3 *l = all_ligs->begin(); l != all_ligs->end(); l++)
- if (_encoding[l->in1].flag(Char::LIVE) && _encoding[l->in2].flag(Char::LIVE)) {
- Char &ch = _encoding[l->out];
- if (!ch.flag(Char::LIVE))
- ch.flags |= Char::LIVE | Char::CONTEXT_ONLY | (ch.virtual_char ? 0 : Char::BASE_LIVE);
- if (ch.flag(Char::CONTEXT_ONLY) && !ch.context_setting(l->in1, l->in2))
- ch.flags &= ~Char::CONTEXT_ONLY;
- }
+ if (_encoding[l->in1].flag(Char::LIVE) && _encoding[l->in2].flag(Char::LIVE)) {
+ Char &ch = _encoding[l->out];
+ if (!ch.flag(Char::LIVE))
+ ch.flags |= Char::LIVE | Char::CONTEXT_ONLY | (ch.virtual_char ? 0 : Char::BASE_LIVE);
+ if (ch.flag(Char::CONTEXT_ONLY) && !ch.context_setting(l->in1, l->in2))
+ ch.flags &= ~Char::CONTEXT_ONLY;
+ }
/* Characters reachable from context-only ligatures are live. */
changed = false;
for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
- if (ch->flag(Char::CONTEXT_ONLY)) {
- Char &ch1 = _encoding[ch->built_in1];
- Char &ch2 = _encoding[ch->built_in2];
- if (!ch1.flag(Char::LIVE) || !ch2.flag(Char::LIVE)) {
- ch1.flags |= Char::LIVE;
- ch2.flags |= Char::LIVE;
- changed = true;
- }
- }
+ if (ch->flag(Char::CONTEXT_ONLY)) {
+ Char &ch1 = _encoding[ch->built_in1];
+ Char &ch2 = _encoding[ch->built_in2];
+ if (!ch1.flag(Char::LIVE) || !ch2.flag(Char::LIVE)) {
+ ch1.flags |= Char::LIVE;
+ ch2.flags |= Char::LIVE;
+ changed = true;
+ }
+ }
if (changed)
- goto redo_live_reachable;
+ goto redo_live_reachable;
/* Characters reachable from live settings are base-live. */
for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
- if (ch->flag(Char::LIVE))
- if (VirtualChar *vc = ch->virtual_char) {
- int font_number = 0;
- for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- if (s->op == Setting::SHOW && font_number == 0
- && _encoding[s->x].base_code >= 0)
- _encoding[s->x].flags |= Char::BASE_LIVE;
- else if (s->op == Setting::FONT)
- font_number = s->x;
- }
+ if (ch->flag(Char::LIVE))
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0
+ && _encoding[s->x].base_code >= 0)
+ _encoding[s->x].flags |= Char::BASE_LIVE;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
}
void
Metrics::reencode(const Vector<Code> &reencoding)
{
for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
- for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++) {
- l->in2 = reencoding[l->in2];
- l->out = reencoding[l->out];
- }
- for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
- k->in2 = reencoding[k->in2];
- if (VirtualChar *vc = ch->virtual_char) {
- int font_number = 0;
- for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- if (s->op == Setting::SHOW && font_number == 0)
- s->x = reencoding[s->x];
- else if (s->op == Setting::FONT)
- font_number = s->x;
- }
- if (ch->built_in1 >= 0) {
- ch->built_in1 = reencoding[ch->built_in1];
- ch->built_in2 = reencoding[ch->built_in2];
- }
- if (ch->base_code >= 0)
- ch->base_code = reencoding[ch->base_code];
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++) {
+ l->in2 = reencoding[l->in2];
+ l->out = reencoding[l->out];
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ k->in2 = reencoding[k->in2];
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0)
+ s->x = reencoding[s->x];
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (ch->built_in1 >= 0) {
+ ch->built_in1 = reencoding[ch->built_in1];
+ ch->built_in2 = reencoding[ch->built_in2];
+ }
+ if (ch->base_code >= 0)
+ ch->base_code = reencoding[ch->base_code];
}
_emap.clear();
}
/*****************************************************************************/
-/* shrinking the encoding */
+/* shrinking the encoding */
bool
Metrics::Char::context_setting(Code in1, Code in2) const
@@ -988,9 +992,9 @@ Metrics::Char::context_setting(Code in1,
// return true iff this character could represent the context setting of
// 'in1' and 'in2'
if (!virtual_char || ligatures.size())
- return false;
+ return false;
else
- return (in1 == built_in1 || in2 == built_in2);
+ return (in1 == built_in1 || in2 == built_in2);
}
void
@@ -1001,56 +1005,56 @@ Metrics::cut_encoding(int size)
/* Change "emptyslot"s to ".notdef"s. */
for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
- if (ch->glyph == emptyslot_glyph()) {
- ch->glyph = 0;
- ch->base_code = -1;
- // 21.Feb.2007: Character isn't live any more.
- ch->flags &= ~(Char::BASE_LIVE | Char::LIVE);
- }
+ if (ch->glyph == emptyslot_glyph()) {
+ ch->glyph = 0;
+ ch->base_code = -1;
+ // 21.Feb.2007: Character isn't live any more.
+ ch->flags &= ~(Char::BASE_LIVE | Char::LIVE);
+ }
/* Maybe we don't need to do anything else. */
if (_encoding.size() <= size) {
- _encoding.resize(size, Char());
- return;
+ _encoding.resize(size, Char());
+ return;
}
/* Need liveness markings. */
if (!_liveness_marked)
- mark_liveness(size);
+ mark_liveness(size);
/* Characters below 'size' are 'good'.
Characters above 'size' are not 'good'. */
Vector<int> good(_encoding.size(), 1);
for (Code c = size; c < _encoding.size(); c++)
- good[c] = 0;
+ good[c] = 0;
/* Characters encoded via base_code are 'good', though. */
for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
- if (ch->base_code >= size)
- good[ch->base_code] = 1;
+ if (ch->base_code >= size)
+ good[ch->base_code] = 1;
/* Some fake characters might point beyond 'size'; remove them too. No
need for a multipass algorithm since virtual chars never point to
virtual chars. */
for (Code c = 0; c < _encoding.size(); c++) {
- if (VirtualChar *vc = _encoding[c].virtual_char) {
- int font_number = 0;
- for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- if (s->op == Setting::SHOW && font_number == 0 && !good[s->x]) {
- _encoding[c].clear();
- goto bad_virtual_char;
- } else if (s->op == Setting::FONT)
- font_number = s->x;
- }
- if (c < size)
- good[c] = 1;
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0 && !good[s->x]) {
+ _encoding[c].clear();
+ goto bad_virtual_char;
+ } else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (c < size)
+ good[c] = 1;
bad_virtual_char: ;
}
/* Certainly none of the later ligatures or kerns will be meaningful. */
for (Code c = size; c < _encoding.size(); c++) {
- _encoding[c].ligatures.clear();
- _encoding[c].kerns.clear();
+ _encoding[c].ligatures.clear();
+ _encoding[c].kerns.clear();
}
/* Remove ligatures and kerns that point beyond 'size', except for valid
@@ -1059,20 +1063,20 @@ Metrics::cut_encoding(int size)
/* 30.May.2005 -- Kerns might point involve a too-high character; kill
them. */
for (Code c = 0; c < size; c++) {
- Char &ch = _encoding[c];
- for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
- if (!good[l->in2] || l->in2 >= size
- || (!good[l->out] && !_encoding[l->out].context_setting(c, l->in2))) {
- *l = ch.ligatures.back();
- ch.ligatures.pop_back();
- l--;
- }
- for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
- if (!good[k->in2] || k->in2 >= size) {
- *k = ch.kerns.back();
- ch.kerns.pop_back();
- k--;
- }
+ Char &ch = _encoding[c];
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (!good[l->in2] || l->in2 >= size
+ || (!good[l->out] && !_encoding[l->out].context_setting(c, l->in2))) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ l--;
+ }
+ for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (!good[k->in2] || k->in2 >= size) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ k--;
+ }
}
/* We are done! */
@@ -1097,19 +1101,19 @@ static int
unicode_score(uint32_t u)
{
if (u == 0)
- return NOCHAR_SCORE;
+ return NOCHAR_SCORE;
else if (u >= 'a' && u <= 'z')
- return BASIC_LATIN_LOWER_SCORE;
+ return BASIC_LATIN_LOWER_SCORE;
else if (u >= 'A' && u <= 'Z')
- return BASIC_LATIN_UPPER_SCORE;
+ return BASIC_LATIN_UPPER_SCORE;
else if (u < 0x0080)
- return BASIC_LATIN_OTHER_SCORE;
+ return BASIC_LATIN_OTHER_SCORE;
else if (u < 0x0100)
- return LATIN1_SUPPLEMENT_SCORE;
+ return LATIN1_SUPPLEMENT_SCORE;
else if (u < 0x8000)
- return LOW_16_SCORE;
+ return LOW_16_SCORE;
else
- return OTHER_SCORE;
+ return OTHER_SCORE;
}
struct Slot {
@@ -1145,8 +1149,8 @@ Metrics::shrink_encoding(int size, const
/* Maybe we don't need to do anything. */
if (_encoding.size() <= size) {
- cut_encoding(size);
- return;
+ cut_encoding(size);
+ return;
}
/* Need a list of all ligatures.. */
@@ -1155,7 +1159,7 @@ Metrics::shrink_encoding(int size, const
/* Need liveness markings. */
if (!_liveness_marked)
- mark_liveness(size, &all_ligs);
+ mark_liveness(size, &all_ligs);
/* Score characters by importance. Importance relates first to Unicode
values, and then recursively to the importances of characters that form
@@ -1164,8 +1168,8 @@ Metrics::shrink_encoding(int size, const
/* Create an initial set of scores, based on Unicode values. */
Vector<int> scores(_encoding.size(), NOCHAR_SCORE);
for (int i = 0; i < _encoding.size(); i++)
- if (_encoding[i].unicode)
- scores[i] = unicode_score(_encoding[i].unicode);
+ if (_encoding[i].unicode)
+ scores[i] = unicode_score(_encoding[i].unicode);
/* Prefer conventional f-ligatures. */
bool has_ff = false;
@@ -1194,121 +1198,121 @@ Metrics::shrink_encoding(int size, const
only by fakes. */
bool changed = true;
while (changed) {
- changed = false;
- for (Ligature3 *l = all_ligs.begin(); l != all_ligs.end(); l++) {
- int score = scores[l->in1] + scores[l->in2];
- if (scores[l->out] > score)
+ changed = false;
+ for (Ligature3 *l = all_ligs.begin(); l != all_ligs.end(); l++) {
+ int score = scores[l->in1] + scores[l->in2];
+ if (scores[l->out] > score)
scores[l->out] = score, changed = true;
- }
+ }
- for (Code c = 0; c < _encoding.size(); c++)
- if (VirtualChar *vc = _encoding[c].virtual_char) {
- /* Make sure that if this virtual character appears, its parts
- will also appear, by scoring the parts less */
- int score = scores[c] - 1, font_number = 0;
- for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- if (s->op == Setting::SHOW && font_number == 0
- && score < scores[s->x])
- scores[s->x] = score, changed = true;
- else if (s->op == Setting::FONT)
- font_number = s->x;
- }
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ /* Make sure that if this virtual character appears, its parts
+ will also appear, by scoring the parts less */
+ int score = scores[c] - 1, font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0
+ && score < scores[s->x])
+ scores[s->x] = score, changed = true;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
}
/* Rescore intermediates to not be better off than their endpoints. */
/* XXX multiple layers of intermediate? */
for (Code c = 0; c < _encoding.size(); c++) {
- Char &ch = _encoding[c];
- if (ch.flag(Char::INTERMEDIATE))
- for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
- if (scores[c] < scores[l->out] && !_encoding[l->out].context_setting(c, l->in2))
- scores[c] = scores[l->out];
+ Char &ch = _encoding[c];
+ if (ch.flag(Char::INTERMEDIATE))
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (scores[c] < scores[l->out] && !_encoding[l->out].context_setting(c, l->in2))
+ scores[c] = scores[l->out];
}
/* Collect characters that want to be reassigned. */
Vector<Slot> slots;
for (Code c = size; c < _encoding.size(); c++)
- if (scores[c] < NOCHAR_SCORE
- && !(_encoding[c].flags & Char::CONTEXT_ONLY)
- && (_encoding[c].flags & (Char::LIVE | Char::BASE_LIVE))) {
- Slot slot = { c, -1, _encoding[c].glyph, scores[c], _encoding[c].lookup_source };
- slots.push_back(slot);
- }
+ if (scores[c] < NOCHAR_SCORE
+ && !(_encoding[c].flags & Char::CONTEXT_ONLY)
+ && (_encoding[c].flags & (Char::LIVE | Char::BASE_LIVE))) {
+ Slot slot = { c, -1, _encoding[c].glyph, scores[c], _encoding[c].lookup_source };
+ slots.push_back(slot);
+ }
// Sort them by score, then by glyph.
std::sort(slots.begin(), slots.end());
/* Prefer their old slots, if available. */
for (Slot *slot = slots.begin(); slot < slots.end(); slot++)
- if (PermString g = code_name(slot->old_code)) {
- int c = dvipsenc.encoding_of(g);
- if (c >= 0 && _encoding[c].glyph == 0) {
- _encoding[c].swap(_encoding[slot->old_code]);
- slot->new_code = c;
- }
- }
+ if (PermString g = code_name(slot->old_code)) {
+ int c = dvipsenc.encoding_of(g);
+ if (c >= 0 && _encoding[c].glyph == 0) {
+ _encoding[c].swap(_encoding[slot->old_code]);
+ slot->new_code = c;
+ }
+ }
/* List empty slots in two phases: Those not encoded by the input
encoding, then those encoded by the input encoding (but that character
wasn't available). */
Vector<Code> empty_codes;
for (int want_encoded = 0; want_encoded < 2; want_encoded++)
- for (Code c = 0; c < size; c++)
- if (_encoding[c].base_code < 0
- && dvipsenc.encoded(c) == (bool) want_encoded)
- empty_codes.push_back(c);
+ for (Code c = 0; c < size; c++)
+ if (_encoding[c].base_code < 0
+ && dvipsenc.encoded(c) == (bool) want_encoded)
+ empty_codes.push_back(c);
/* Then, assign codes to the unencoded characters. */
int nunencoded = 0;
for (Slot *slot = slots.begin(); slot != slots.end(); slot++) {
- if (slot->new_code >= 0)
- continue;
+ if (slot->new_code >= 0)
+ continue;
- int needs = (_encoding[slot->old_code].visible_base() ? 1 : 0)
- + (_encoding[slot->old_code].flag(Char::LIVE) ? 2 : 0);
- assert(needs > 0);
-
- Code dest = -1;
- for (Code *h = empty_codes.begin(); h < empty_codes.end() && dest < 0; h++) {
- int haves = (_encoding[*h].base_code < 0 ? 1 : 0)
- + (!_encoding[*h].visible() ? 2 : 0);
- if ((needs & haves) == needs)
- dest = *h;
- }
-
- if (dest >= 0) {
- if (needs & 2) {
- assert(!_encoding[dest].visible());
- _encoding[dest].swap(_encoding[slot->old_code]);
- slot->new_code = dest;
- } else {
- _encoding[slot->old_code].base_code = dest;
- slot->new_code = slot->old_code;
- }
- if (needs & 1) {
- assert(_encoding[dest].base_code < 0 || _encoding[dest].base_code == slot->old_code);
- _encoding[dest].base_code = slot->old_code;
- }
- } else
- nunencoded++;
+ int needs = (_encoding[slot->old_code].visible_base() ? 1 : 0)
+ + (_encoding[slot->old_code].flag(Char::LIVE) ? 2 : 0);
+ assert(needs > 0);
+
+ Code dest = -1;
+ for (Code *h = empty_codes.begin(); h < empty_codes.end() && dest < 0; h++) {
+ int haves = (_encoding[*h].base_code < 0 ? 1 : 0)
+ + (!_encoding[*h].visible() ? 2 : 0);
+ if ((needs & haves) == needs)
+ dest = *h;
+ }
+
+ if (dest >= 0) {
+ if (needs & 2) {
+ assert(!_encoding[dest].visible());
+ _encoding[dest].swap(_encoding[slot->old_code]);
+ slot->new_code = dest;
+ } else {
+ _encoding[slot->old_code].base_code = dest;
+ slot->new_code = slot->old_code;
+ }
+ if (needs & 1) {
+ assert(_encoding[dest].base_code < 0 || _encoding[dest].base_code == slot->old_code);
+ _encoding[dest].base_code = slot->old_code;
+ }
+ } else
+ nunencoded++;
}
/* Complain if some characters can't fit. */
if (nunencoded) {
- // collect names of unencoded glyphs
- Vector<String> unencoded;
- for (Slot *slot = slots.begin(); slot != slots.end(); slot++)
- if (slot->new_code < 0)
- unencoded.push_back(code_name(slot->old_code));
- std::sort(unencoded.begin(), unencoded.end());
- StringAccum sa;
- for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
- sa << *a << ' ';
- sa.pop_back();
- sa.append_break_lines(sa.take_string(), 68, " ");
- sa.pop_back();
- errh->lwarning(" ", (unencoded.size() == 1 ? "not enough room in encoding, ignoring %d glyph" : "not enough room in encoding, ignoring %d glyphs"), unencoded.size());
- errh->lmessage(" ", "(\
+ // collect names of unencoded glyphs
+ Vector<String> unencoded;
+ for (Slot *slot = slots.begin(); slot != slots.end(); slot++)
+ if (slot->new_code < 0)
+ unencoded.push_back(code_name(slot->old_code));
+ std::sort(unencoded.begin(), unencoded.end());
+ StringAccum sa;
+ for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
+ sa << *a << ' ';
+ sa.pop_back();
+ sa.append_break_lines(sa.take_string(), 68, " ");
+ sa.pop_back();
+ errh->lwarning(" ", (unencoded.size() == 1 ? "not enough room in encoding, ignoring %d glyph" : "not enough room in encoding, ignoring %d glyphs"), unencoded.size());
+ errh->lmessage(" ", "(\
The font uses more glyphs than the encoding has available slots,\n\
so these glyphs have been left out:\n%s\n\
To select specific glyphs, add them to the input encoding.)", sa.c_str());
@@ -1317,10 +1321,10 @@ To select specific glyphs, add them to t
/* Reencode changed slots. */
Vector<Code> reencoding;
for (Code c = 0; c < _encoding.size(); c++)
- reencoding.push_back(c);
+ reencoding.push_back(c);
for (Slot *s = slots.begin(); s != slots.end(); s++)
- if (s->new_code >= 0)
- reencoding[s->old_code] = s->new_code;
+ if (s->new_code >= 0)
+ reencoding[s->old_code] = s->new_code;
reencode(reencoding);
check();
@@ -1331,38 +1335,38 @@ Metrics::make_base(int size)
{
Vector<Code> reencoding;
for (Code c = 0; c < size && c < _encoding.size(); c++) {
- Char &ch = _encoding[c];
- if (ch.base_code >= 0 && ch.base_code != c) {
- if (!reencoding.size())
- for (Code cc = 0; cc < _encoding.size(); cc++)
- reencoding.push_back(cc);
- reencoding[ch.base_code] = c;
- reencoding[c] = ch.base_code;
- _encoding[c].swap(_encoding[ch.base_code]);
- }
- if (ch.virtual_char) // remove it
- ch.clear();
+ Char &ch = _encoding[c];
+ if (ch.base_code >= 0 && ch.base_code != c) {
+ if (!reencoding.size())
+ for (Code cc = 0; cc < _encoding.size(); cc++)
+ reencoding.push_back(cc);
+ reencoding[ch.base_code] = c;
+ reencoding[c] = ch.base_code;
+ _encoding[c].swap(_encoding[ch.base_code]);
+ }
+ if (ch.virtual_char) // remove it
+ ch.clear();
}
if (reencoding.size()) {
- reencode(reencoding);
- cut_encoding(size);
+ reencode(reencoding);
+ cut_encoding(size);
}
check();
}
/*****************************************************************************/
-/* output */
+/* output */
bool
Metrics::need_virtual(int size) const
{
if (size > _encoding.size())
- size = _encoding.size();
+ size = _encoding.size();
for (const Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
- if (ch->glyph /* actually encoded */
- && (ch->pdx || ch->pdy || ch->adx || ch->virtual_char))
- return true;
+ if (ch->glyph /* actually encoded */
+ && (ch->pdx || ch->pdy || ch->adx || ch->virtual_char))
+ return true;
return false;
}
@@ -1370,10 +1374,10 @@ bool
Metrics::need_base()
{
if (!_liveness_marked)
- mark_liveness(_encoding.size());
+ mark_liveness(_encoding.size());
for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
- if ((ch->flags & Char::BASE_LIVE) && ch->glyph != _boundary_glyph)
- return true;
+ if ((ch->flags & Char::BASE_LIVE) && ch->glyph != _boundary_glyph)
+ return true;
return false;
}
@@ -1383,72 +1387,72 @@ Metrics::setting(Code code, Vector<Setti
extern int letterspace;
if (!(sm & SET_KEEP))
- v.clear();
+ v.clear();
if (!valid_code(code) || _encoding[code].glyph == 0)
- return false;
+ return false;
const Char &ch = _encoding[code];
if (const VirtualChar *vc = ch.virtual_char) {
- bool good = true;
- int font_number = 0;
+ bool good = true;
+ int font_number = 0;
- if (ch.pdx != 0 || ch.pdy != 0)
- v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
- for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- switch (s->op) {
- case Setting::MOVE:
- case Setting::RULE:
- case Setting::PUSH:
- case Setting::POP:
- case Setting::SPECIAL:
- v.push_back(*s);
- break;
- case Setting::FONT:
- v.push_back(*s);
- font_number = s->x;
- break;
- case Setting::SHOW:
- if (font_number == 0)
- good &= setting(s->x, v, (SettingMode)(sm | SET_KEEP));
- else
- v.push_back(*s);
- break;
- case Setting::KERN:
- case Setting::KERNX:
- if (sm & SET_INTERMEDIATE)
- v.push_back(*s);
- else if (font_number == 0 && s > vc->setting.begin()
- && s + 1 < vc->setting.end()
- && s[-1].op == Setting::SHOW
- && s[1].op == Setting::SHOW) {
- int k = kern(s[-1].x, s[1].x);
- if (s->op == Setting::KERNX)
- k -= letterspace;
- if (k)
- v.push_back(Setting(Setting::MOVE, k, 0));
- }
- break;
- }
-
- if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
- v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
- return good;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::MOVE:
+ case Setting::RULE:
+ case Setting::PUSH:
+ case Setting::POP:
+ case Setting::SPECIAL:
+ v.push_back(*s);
+ break;
+ case Setting::FONT:
+ v.push_back(*s);
+ font_number = s->x;
+ break;
+ case Setting::SHOW:
+ if (font_number == 0)
+ good &= setting(s->x, v, (SettingMode)(sm | SET_KEEP));
+ else
+ v.push_back(*s);
+ break;
+ case Setting::KERN:
+ case Setting::KERNX:
+ if (sm & SET_INTERMEDIATE)
+ v.push_back(*s);
+ else if (font_number == 0 && s > vc->setting.begin()
+ && s + 1 < vc->setting.end()
+ && s[-1].op == Setting::SHOW
+ && s[1].op == Setting::SHOW) {
+ int k = kern(s[-1].x, s[1].x);
+ if (s->op == Setting::KERNX)
+ k -= letterspace;
+ if (k)
+ v.push_back(Setting(Setting::MOVE, k, 0));
+ }
+ break;
+ }
+
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ return good;
} else if (ch.base_code >= 0) {
- if (ch.pdx != 0 || ch.pdy != 0)
- v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
- v.push_back(Setting(Setting::SHOW, ch.base_code, ch.glyph));
+ v.push_back(Setting(Setting::SHOW, ch.base_code, ch.glyph));
- if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
- v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
- return true;
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ return true;
} else
- return false;
+ return false;
}
int
@@ -1460,22 +1464,22 @@ Metrics::ligatures(Code in1, Vector<Code
const Char &in1ch = _encoding[in1];
for (const Ligature *l = in1ch.ligatures.begin(); l != in1ch.ligatures.end(); l++) {
- in2.push_back(l->in2);
- const Char &outch = _encoding[l->out];
- if (outch.context_setting(in1, l->in2)) {
- if (in1 == outch.built_in1 && l->in2 == outch.built_in2)
- in2.pop_back();
- else if (in1 == outch.built_in1) {
- out.push_back(outch.built_in2);
- context.push_back(-1);
- } else {
- out.push_back(outch.built_in1);
- context.push_back(1);
- }
- } else {
- out.push_back(l->out);
- context.push_back(0);
- }
+ in2.push_back(l->in2);
+ const Char &outch = _encoding[l->out];
+ if (outch.context_setting(in1, l->in2)) {
+ if (in1 == outch.built_in1 && l->in2 == outch.built_in2)
+ in2.pop_back();
+ else if (in1 == outch.built_in1) {
+ out.push_back(outch.built_in2);
+ context.push_back(-1);
+ } else {
+ out.push_back(outch.built_in1);
+ context.push_back(1);
+ }
+ } else {
+ out.push_back(l->out);
+ context.push_back(0);
+ }
}
return in2.size();
@@ -1489,74 +1493,74 @@ Metrics::kerns(Code in1, Vector<Code> &i
const Char &in1ch = _encoding[in1];
for (const Kern *k = in1ch.kerns.begin(); k != in1ch.kerns.end(); k++)
- if (k->kern != 0) {
- in2.push_back(k->in2);
- kern.push_back(k->kern);
- }
+ if (k->kern != 0) {
+ in2.push_back(k->in2);
+ kern.push_back(k->kern);
+ }
return in2.size();
}
/*****************************************************************************/
-/* debugging */
+/* debugging */
void
Metrics::unparse(const Char *ch) const
{
Code c;
if (ch >= _encoding.begin() && ch < _encoding.end())
- c = ch - _encoding.begin();
+ c = ch - _encoding.begin();
else
- c = -1;
+ c = -1;
fprintf(stderr, "%4d/%s%s%s%s%s%s\n", c, code_str(c),
- (ch->flag(Char::LIVE) ? " [L]" : ""),
- (ch->flag(Char::BASE_LIVE) ? " [B]" : ""),
- (ch->flag(Char::CONTEXT_ONLY) ? " [C]" : ""),
- (ch->flag(Char::BUILT) ? " [!]" : ""),
- (ch->base_code >= 0 ? " <BC>" : ""));
+ (ch->flag(Char::LIVE) ? " [L]" : ""),
+ (ch->flag(Char::BASE_LIVE) ? " [B]" : ""),
+ (ch->flag(Char::CONTEXT_ONLY) ? " [C]" : ""),
+ (ch->flag(Char::BUILT) ? " [!]" : ""),
+ (ch->base_code >= 0 ? " <BC>" : ""));
if (ch->base_code >= 0 && ch->base_code != c)
- fprintf(stderr, "\tBASE %d/%s\n", ch->base_code, code_str(ch->base_code));
+ fprintf(stderr, "\tBASE %d/%s\n", ch->base_code, code_str(ch->base_code));
if (const VirtualChar *vc = ch->virtual_char) {
- fprintf(stderr, "\t*");
- int curfont = 0;
- for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
- switch (s->op) {
- case Setting::FONT:
- fprintf(stderr, " {F%d}", s->x);
- curfont = s->x;
- break;
- case Setting::SHOW:
- fprintf(stderr, " %d", s->x);
- if (curfont == 0)
- fprintf(stderr, "/%s", code_str(s->x));
- break;
- case Setting::KERN:
- fprintf(stderr, " <>");
- break;
- case Setting::MOVE:
- fprintf(stderr, " <%+d,%+d>", s->x, s->y);
- break;
- case Setting::RULE:
- fprintf(stderr, " [%d,%d]", s->x, s->y);
- break;
- case Setting::PUSH:
- fprintf(stderr, " (");
- break;
- case Setting::POP:
- fprintf(stderr, " )");
- break;
- case Setting::SPECIAL:
- fprintf(stderr, " S{%s}", s->s.c_str());
- break;
- }
- fprintf(stderr, " ((%d/%s, %d/%s))\n", ch->built_in1, code_str(ch->built_in1), ch->built_in2, code_str(ch->built_in2));
+ fprintf(stderr, "\t*");
+ int curfont = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::FONT:
+ fprintf(stderr, " {F%d}", s->x);
+ curfont = s->x;
+ break;
+ case Setting::SHOW:
+ fprintf(stderr, " %d", s->x);
+ if (curfont == 0)
+ fprintf(stderr, "/%s", code_str(s->x));
+ break;
+ case Setting::KERN:
+ fprintf(stderr, " <>");
+ break;
+ case Setting::MOVE:
+ fprintf(stderr, " <%+d,%+d>", s->x, s->y);
+ break;
+ case Setting::RULE:
+ fprintf(stderr, " [%d,%d]", s->x, s->y);
+ break;
+ case Setting::PUSH:
+ fprintf(stderr, " (");
+ break;
+ case Setting::POP:
+ fprintf(stderr, " )");
+ break;
+ case Setting::SPECIAL:
+ fprintf(stderr, " S{%s}", s->s.c_str());
+ break;
+ }
+ fprintf(stderr, " ((%d/%s, %d/%s))\n", ch->built_in1, code_str(ch->built_in1), ch->built_in2, code_str(ch->built_in2));
}
for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
- fprintf(stderr, "\t[%d/%s => %d/%s]%s\n", l->in2, code_str(l->in2), l->out, code_str(l->out), (_encoding[l->out].context_setting(c, l->in2) ? " [C]" : ""));
+ fprintf(stderr, "\t[%d/%s => %d/%s]%s\n", l->in2, code_str(l->in2), l->out, code_str(l->out), (_encoding[l->out].context_setting(c, l->in2) ? " [C]" : ""));
#if 0
for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
- fprintf(stderr, "\t{%d/%s %+d}\n", k->in2, code_str(k->in2), k->kern);
+ fprintf(stderr, "\t{%d/%s %+d}\n", k->in2, code_str(k->in2), k->kern);
#endif
}
@@ -1564,6 +1568,6 @@ void
Metrics::unparse() const
{
for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
- if (ch->glyph)
- unparse(ch);
+ if (ch->glyph)
+ unparse(ch);
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh 2018-02-23 12:47:54.092971728 -0500
@@ -2,23 +2,11 @@
#define OTFTOTFM_METRICS_HH
#include <efont/otfgsub.hh>
#include <efont/otfgpos.hh>
+#include "setting.hh"
namespace Efont { class CharstringProgram; }
class DvipsEncoding;
class GlyphFilter;
-struct Setting {
- enum { NONE, FONT, SHOW, KERN, KERNX, MOVE, RULE, PUSH, POP,
- SPECIAL, DEAD };
- int op;
- int x;
- int y;
- String s;
- Setting(int op_in, int x_in = 0, int y_in = 0)
- : op(op_in), x(x_in), y(y_in) { }
- Setting(int op_in, const String &s_in) : op(op_in), s(s_in) { }
- bool valid_op() const { return op >= FONT && op <= SPECIAL; }
-};
-
class Metrics { public:
typedef int Code;
@@ -33,22 +21,22 @@ class Metrics { public:
void check() const;
- Glyph boundary_glyph() const { return _boundary_glyph; }
- Glyph emptyslot_glyph() const { return _emptyslot_glyph; }
+ Glyph boundary_glyph() const { return _boundary_glyph; }
+ Glyph emptyslot_glyph() const { return _emptyslot_glyph; }
- String coding_scheme() const { return _coding_scheme; }
- void set_coding_scheme(const String &s) { _coding_scheme = s; }
+ String coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
- int design_units() const { return _design_units; }
- int units_per_em() const { return _units_per_em; }
- void set_design_units(int du) { _design_units = du; }
+ int design_units() const { return _design_units; }
+ int units_per_em() const { return _units_per_em; }
+ void set_design_units(int du) { _design_units = du; }
- int n_mapped_fonts() const { return _mapped_fonts.size();}
+ int n_mapped_fonts() const { return _mapped_fonts.size();}
const Efont::CharstringProgram *mapped_font(int i) const { return _mapped_fonts[i]; }
const String &mapped_font_name(int i) const { return _mapped_font_names[i]; }
int add_mapped_font(const Efont::CharstringProgram *, const String &);
- inline int encoding_size() const { return _encoding.size(); }
+ inline int encoding_size() const { return _encoding.size(); }
inline bool valid_code(Code) const;
inline bool nonvirtual_code(Code) const;
PermString code_name(Code) const;
@@ -63,7 +51,7 @@ class Metrics { public:
void encode_virtual(Code, PermString, uint32_t uni, const Vector<Setting> &, bool base_char);
void add_altselector_code(Code, int altselector_type);
- bool altselectors() const { return _altselectors.size() > 0; }
+ bool altselectors() const { return _altselectors.size() > 0; }
inline bool was_base_glyph(Code) const;
inline Code base_code(Code) const;
@@ -101,57 +89,57 @@ class Metrics { public:
void unparse() const;
struct Ligature {
- Code in2;
- Code out;
- Ligature(Code in2_, Code out_) : in2(in2_), out(out_) { }
+ Code in2;
+ Code out;
+ Ligature(Code in2_, Code out_) : in2(in2_), out(out_) { }
};
struct Kern {
- Code in2;
- int kern;
- Kern(Code in2_, int kern_) : in2(in2_), kern(kern_) { }
+ Code in2;
+ int kern;
+ Kern(Code in2_, int kern_) : in2(in2_), kern(kern_) { }
};
struct VirtualChar {
- PermString name;
- Vector<Setting> setting;
+ PermString name;
+ Vector<Setting> setting;
};
struct Ligature3 {
- Code in1;
- Code in2;
- Code out;
- Ligature3(Code in1_, Code in2_, Code out_) : in1(in1_), in2(in2_), out(out_) { }
+ Code in1;
+ Code in2;
+ Code out;
+ Ligature3(Code in1_, Code in2_, Code out_) : in1(in1_), in2(in2_), out(out_) { }
String unparse(const Metrics& m) const;
};
private:
struct Char {
- Glyph glyph;
- Code base_code;
- uint32_t unicode;
- Vector<Ligature> ligatures;
- Vector<Kern> kerns;
- VirtualChar *virtual_char;
- int pdx;
- int pdy;
- int adx;
- Code built_in1;
- Code built_in2;
- int lookup_source;
- enum { BUILT = 1, INTERMEDIATE = 2, CONTEXT_ONLY = 4, LIVE = 8,
- BASE_LIVE = 16, BASE_REP = 32, IS_FF = 64 };
- int flags;
-
- Char() : virtual_char(0) { clear(); }
- void clear();
- void swap(Char &);
- bool visible() const { return glyph != 0; }
- bool visible_base() const { return glyph != 0 && glyph != VIRTUAL_GLYPH; }
- bool flag(int f) const { return (flags & f) != 0; }
- inline bool base_glyph() const;
- bool context_setting(Code in1, Code in2) const;
+ Glyph glyph;
+ Code base_code;
+ uint32_t unicode;
+ Vector<Ligature> ligatures;
+ Vector<Kern> kerns;
+ VirtualChar *virtual_char;
+ int pdx;
+ int pdy;
+ int adx;
+ Code built_in1;
+ Code built_in2;
+ int lookup_source;
+ enum { BUILT = 1, INTERMEDIATE = 2, CONTEXT_ONLY = 4, LIVE = 8,
+ BASE_LIVE = 16, BASE_REP = 32, IS_FF = 64 };
+ int flags;
+
+ Char() : virtual_char(0) { clear(); }
+ void clear();
+ void swap(Char &);
+ bool visible() const { return glyph != 0; }
+ bool visible_base() const { return glyph != 0 && glyph != VIRTUAL_GLYPH; }
+ bool flag(int f) const { return (flags & f) != 0; }
+ inline bool base_glyph() const;
+ bool context_setting(Code in1, Code in2) const;
};
Vector<Char> _encoding;
@@ -171,7 +159,7 @@ class Metrics { public:
Vector<const Efont::CharstringProgram *> _mapped_fonts;
Vector<String> _mapped_font_names;
- Metrics(const Metrics &); // does not exist
+ Metrics(const Metrics &); // does not exist
Metrics &operator=(const Metrics &); // does not exist
inline void assign_emap(Glyph, Code);
@@ -191,17 +179,19 @@ class Metrics { public:
class ChangedContext;
void apply_ligature(const Vector<Code> &, const Substitution *, int lookup);
void apply_single(Code cin, const Substitution *s, int lookup,
- ChangedContext &ctx, const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names);
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
void apply_simple_context_ligature(const Vector<Code> &codes,
- const Substitution *s, int lookup, ChangedContext &ctx);
+ const Substitution *s, int lookup, ChangedContext &ctx,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
void apply_alternates_single(Code cin, const Substitution *s, int lookup,
- const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names);
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
void apply_alternates_ligature(const Vector<Code> &codes,
- const Substitution *s, int lookup,
- const GlyphFilter &glyph_filter,
- const Vector<PermString> &glyph_names);
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
void unparse(const Char *) const;
@@ -224,36 +214,36 @@ inline Metrics::Glyph
Metrics::glyph(Code code) const
{
if (code < 0 || code >= _encoding.size())
- return 0;
+ return 0;
else
- return _encoding[code].glyph;
+ return _encoding[code].glyph;
}
inline uint32_t
Metrics::unicode(Code code) const
{
if (code < 0 || code >= _encoding.size())
- return 0;
+ return 0;
else
- return _encoding[code].unicode;
+ return _encoding[code].unicode;
}
inline Metrics::Glyph
Metrics::base_glyph(Code code) const
{
if (code < 0 || code >= _encoding.size() || _encoding[code].base_code < 0)
- return 0;
+ return 0;
else
- return _encoding[code].glyph;
+ return _encoding[code].glyph;
}
inline Metrics::Code
Metrics::base_code(Code code) const
{
if (code < 0 || code >= _encoding.size())
- return 0;
+ return 0;
else
- return _encoding[code].base_code;
+ return _encoding[code].base_code;
}
inline Metrics::Code
@@ -261,16 +251,16 @@ Metrics::encoding(Glyph g, Code after) c
{
Code c;
if (g >= 0 && g < _emap.size() && (c = _emap.at_u(g)) >= -1)
- return c < 0 || c >= after ? c : -1;
+ return c < 0 || c >= after ? c : -1;
else
- return hard_encoding(g, after);
+ return hard_encoding(g, after);
}
inline void
Metrics::assign_emap(Glyph g, Code code)
{
if (g >= _emap.size())
- _emap.resize(g + 1, -1);
+ _emap.resize(g + 1, -1);
_emap[g] = (_emap[g] == -1 || _emap[g] == code ? code : -2);
}
@@ -290,9 +280,9 @@ inline bool
Metrics::was_base_glyph(Code code) const
{
if (code < 0 || code >= _encoding.size())
- return 0;
+ return 0;
else
- return _encoding[code].base_glyph();
+ return _encoding[code].base_glyph();
}
#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1 2018-02-23 12:47:54.092971728 -0500
@@ -1,5 +1,5 @@
'\"t
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
@@ -868,15 +868,19 @@ Do not generate a font map line for the
.BI \-\-truetype\-directory= dir
.TP 5
.BI \-\-type42\-directory= dir
+.TP 5
+.BI \-\-directory= dir
Set the directory used for various output types. Each directory may be set
by an environment variable, and defaults to a TDS directory in automatic
mode, or to "." otherwise. Environment variable names and default TDS
-locations are described in the Automatic Mode section above.
+locations are described in the Automatic Mode section above. The
+.B \-\-directory
+option sets the default directory for all output types.
'
.Sp
.TP 5
.BI \-\-map\-file= filename
-Set file in which
+Set file in which
.B otftotfm
will write a font map
line for the font. The default is the standard output in manual mode, and
@@ -956,7 +960,7 @@ have the following format:
This tells
.B otftotfm
that the glyph named
-.I glyph
+.I glyph
translates into the first Unicode value in the
.I choice
list that has a character in the font. \fIGlyph\fR and the
@@ -1042,7 +1046,7 @@ and
.IR glyph2 .
"{LK}" and "{KL}" inhibit both ligatures and kerns.
.PP
-You can set the
+You can set the
.B \-\-boundary\-char
and
.B \-\-altselector\-char
@@ -1060,7 +1064,7 @@ has a default set of eight ligatures, na
space l =: lslash ; space L =: Lslash ;
question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
hyphen hyphen =: endash ; endash hyphen =: emdash ;
- quoteleft quoteleft =: quotedblleft ;
+ quoteleft quoteleft =: quotedblleft ;
quoteright quoteright =: quotedblright
.fi
LIGKERN commands in the encoding file and
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc 2018-02-23 12:47:54.094971678 -0500
@@ -1,6 +1,6 @@
/* otftotfm.cc -- driver for translating OpenType fonts to TeX metrics
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -63,91 +63,89 @@
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
-#ifdef _MSC_VER
-# include <io.h>
-#endif
using namespace Efont;
-#define VERSION_OPT 301
-#define HELP_OPT 302
-#define QUERY_SCRIPTS_OPT 303
-#define QUERY_FEATURES_OPT 304
-#define KPATHSEA_DEBUG_OPT 305
-
-#define SCRIPT_OPT 311
-#define FEATURE_OPT 312
-#define ENCODING_OPT 313
-#define LITERAL_ENCODING_OPT 314
-#define EXTEND_OPT 315
-#define SLANT_OPT 316
-#define LETTERSPACE_OPT 317
-#define LIGKERN_OPT 318
-#define CODINGSCHEME_OPT 319
-#define UNICODING_OPT 320
-#define BOUNDARY_CHAR_OPT 321
-#define DESIGN_SIZE_OPT 322
-#define MINIMUM_KERN_OPT 323
-#define ALTSELECTOR_CHAR_OPT 324
-#define INCLUDE_ALTERNATES_OPT 325
-#define EXCLUDE_ALTERNATES_OPT 326
-#define CLEAR_ALTERNATES_OPT 327
-#define ALTSELECTOR_FEATURE_OPT 328
-#define DEFAULT_LIGKERN_OPT 329
-#define NO_ECOMMAND_OPT 330
-#define LETTER_FEATURE_OPT 331
-#define INCLUDE_SUBS_OPT 332
-#define EXCLUDE_SUBS_OPT 333
-#define CLEAR_SUBS_OPT 334
-#define SUBS_FILTER_OPT 335
-#define ALTERNATES_FILTER_OPT 336
-#define SPACE_FACTOR_OPT 337
-#define MATH_SPACING_OPT 338
-#define POSITION_OPT 339
-#define WARN_MISSING_OPT 340
-#define BASE_ENCODINGS_OPT 341
-#define FIXED_PITCH_OPT 342
-#define ITALIC_ANGLE_OPT 343
-#define PROPORTIONAL_WIDTH_OPT 344
-#define X_HEIGHT_OPT 345
-
-#define AUTOMATIC_OPT 350
-#define FONT_NAME_OPT 351
-#define QUIET_OPT 352
-#define GLYPHLIST_OPT 353
-#define VENDOR_OPT 354
-#define TYPEFACE_OPT 355
-#define NOCREATE_OPT 356
-#define VERBOSE_OPT 357
-#define FORCE_OPT 358
-
-#define VIRTUAL_OPT 360
-#define PL_OPT 361
-#define TFM_OPT 362
-#define MAP_FILE_OPT 363
-#define OUTPUT_ENCODING_OPT 364
-
-#define DIR_OPTS 380
-#define ENCODING_DIR_OPT (DIR_OPTS + O_ENCODING)
-#define TFM_DIR_OPT (DIR_OPTS + O_TFM)
-#define PL_DIR_OPT (DIR_OPTS + O_PL)
-#define VF_DIR_OPT (DIR_OPTS + O_VF)
-#define VPL_DIR_OPT (DIR_OPTS + O_VPL)
-#define TYPE1_DIR_OPT (DIR_OPTS + O_TYPE1)
-#define TYPE42_DIR_OPT (DIR_OPTS + O_TYPE42)
-#define TRUETYPE_DIR_OPT (DIR_OPTS + O_TRUETYPE)
-
-#define NO_OUTPUT_OPTS 400
-#define NO_ENCODING_OPT (NO_OUTPUT_OPTS + G_ENCODING)
-#define NO_TYPE1_OPT (NO_OUTPUT_OPTS + G_TYPE1)
-#define NO_DOTLESSJ_OPT (NO_OUTPUT_OPTS + G_DOTLESSJ)
-#define NO_UPDMAP_OPT (NO_OUTPUT_OPTS + G_UPDMAP)
-
-#define YES_OUTPUT_OPTS 2000
-#define TRUETYPE_OPT (YES_OUTPUT_OPTS + G_TRUETYPE)
-#define TYPE42_OPT (YES_OUTPUT_OPTS + G_TYPE42)
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUERY_SCRIPTS_OPT 303
+#define QUERY_FEATURES_OPT 304
+#define KPATHSEA_DEBUG_OPT 305
+
+#define SCRIPT_OPT 311
+#define FEATURE_OPT 312
+#define ENCODING_OPT 313
+#define LITERAL_ENCODING_OPT 314
+#define EXTEND_OPT 315
+#define SLANT_OPT 316
+#define LETTERSPACE_OPT 317
+#define LIGKERN_OPT 318
+#define CODINGSCHEME_OPT 319
+#define UNICODING_OPT 320
+#define BOUNDARY_CHAR_OPT 321
+#define DESIGN_SIZE_OPT 322
+#define MINIMUM_KERN_OPT 323
+#define ALTSELECTOR_CHAR_OPT 324
+#define INCLUDE_ALTERNATES_OPT 325
+#define EXCLUDE_ALTERNATES_OPT 326
+#define CLEAR_ALTERNATES_OPT 327
+#define ALTSELECTOR_FEATURE_OPT 328
+#define DEFAULT_LIGKERN_OPT 329
+#define NO_ECOMMAND_OPT 330
+#define LETTER_FEATURE_OPT 331
+#define INCLUDE_SUBS_OPT 332
+#define EXCLUDE_SUBS_OPT 333
+#define CLEAR_SUBS_OPT 334
+#define SUBS_FILTER_OPT 335
+#define ALTERNATES_FILTER_OPT 336
+#define SPACE_FACTOR_OPT 337
+#define MATH_SPACING_OPT 338
+#define POSITION_OPT 339
+#define WARN_MISSING_OPT 340
+#define BASE_ENCODINGS_OPT 341
+#define FIXED_PITCH_OPT 342
+#define ITALIC_ANGLE_OPT 343
+#define PROPORTIONAL_WIDTH_OPT 344
+#define X_HEIGHT_OPT 345
+
+#define AUTOMATIC_OPT 350
+#define FONT_NAME_OPT 351
+#define QUIET_OPT 352
+#define GLYPHLIST_OPT 353
+#define VENDOR_OPT 354
+#define TYPEFACE_OPT 355
+#define NOCREATE_OPT 356
+#define VERBOSE_OPT 357
+#define FORCE_OPT 358
+
+#define VIRTUAL_OPT 360
+#define PL_OPT 361
+#define TFM_OPT 362
+#define MAP_FILE_OPT 363
+#define OUTPUT_ENCODING_OPT 364
+
+#define DIR_OPTS 380
+#define ENCODING_DIR_OPT (DIR_OPTS + O_ENCODING)
+#define TFM_DIR_OPT (DIR_OPTS + O_TFM)
+#define PL_DIR_OPT (DIR_OPTS + O_PL)
+#define VF_DIR_OPT (DIR_OPTS + O_VF)
+#define VPL_DIR_OPT (DIR_OPTS + O_VPL)
+#define TYPE1_DIR_OPT (DIR_OPTS + O_TYPE1)
+#define TYPE42_DIR_OPT (DIR_OPTS + O_TYPE42)
+#define TRUETYPE_DIR_OPT (DIR_OPTS + O_TRUETYPE)
+#define DIR_OPT (DIR_OPTS + NUMODIR)
+
+#define NO_OUTPUT_OPTS 400
+#define NO_ENCODING_OPT (NO_OUTPUT_OPTS + G_ENCODING)
+#define NO_TYPE1_OPT (NO_OUTPUT_OPTS + G_TYPE1)
+#define NO_DOTLESSJ_OPT (NO_OUTPUT_OPTS + G_DOTLESSJ)
+#define NO_UPDMAP_OPT (NO_OUTPUT_OPTS + G_UPDMAP)
+
+#define YES_OUTPUT_OPTS 2000
+#define TRUETYPE_OPT (YES_OUTPUT_OPTS + G_TRUETYPE)
+#define TYPE42_OPT (YES_OUTPUT_OPTS + G_TYPE42)
-#define CHAR_OPTTYPE (Clp_ValFirstUser)
+#define CHAR_OPTTYPE (Clp_ValFirstUser)
static Clp_Option options[] = {
@@ -194,7 +192,8 @@ static Clp_Option options[] = {
{ "italic-angle", 0, ITALIC_ANGLE_OPT, Clp_ValDouble, 0 },
{ "x-height", 0, X_HEIGHT_OPT, Clp_ValString, 0 },
- { "pl", 'p', PL_OPT, 0, 0 },
+ { "pl", 'p', PL_OPT, 0, Clp_Negate },
+ { "tfm", 't', TFM_OPT, 0, Clp_Negate }, // not in documentation
{ "virtual", 0, VIRTUAL_OPT, 0, Clp_Negate },
{ "no-encoding", 0, NO_ENCODING_OPT, 0, 0 },
{ "no-type1", 0, NO_TYPE1_OPT, 0, 0 },
@@ -210,6 +209,7 @@ static Clp_Option options[] = {
{ "vendor", 'v', VENDOR_OPT, Clp_ValString, 0 },
{ "typeface", 0, TYPEFACE_OPT, Clp_ValString, 0 },
+ { "directory", 0, DIR_OPT, Clp_ValString, 0 },
{ "encoding-directory", 0, ENCODING_DIR_OPT, Clp_ValString, 0 },
{ "pl-directory", 0, PL_DIR_OPT, Clp_ValString, 0 },
{ "tfm-directory", 0, TFM_DIR_OPT, Clp_ValString, 0 },
@@ -229,7 +229,6 @@ static Clp_Option options[] = {
{ "help", 'h', HELP_OPT, 0, 0 },
{ "version", 0, VERSION_OPT, 0, 0 },
- { "tfm", 't', TFM_OPT, 0, 0 }, // deprecated
{ "query-features", 0, QUERY_FEATURES_OPT, 0, 0 },
{ "qf", 0, QUERY_FEATURES_OPT, 0, 0 },
{ "query-scripts", 0, QUERY_SCRIPTS_OPT, 0, 0 },
@@ -286,7 +285,7 @@ static double x_height;
static String out_encoding_file;
static String out_encoding_name;
-int output_flags = G_ENCODING | G_METRICS | G_VMETRICS | G_PSFONTSMAP | G_TYPE1 | G_DOTLESSJ | G_UPDMAP | G_BINARY | G_TRUETYPE;
+unsigned output_flags = G_ENCODING | G_METRICS | G_VMETRICS | G_PSFONTSMAP | G_TYPE1 | G_DOTLESSJ | G_UPDMAP | G_TRUETYPE;
bool automatic = false;
bool verbose = false;
@@ -303,9 +302,9 @@ usage_error(ErrorHandler *errh, const ch
va_list val;
va_start(val, error_message);
if (!error_message)
- errh->message("Usage: %s [OPTION]... FONT", program_name);
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
else
- errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
errh->message("Type %s --help for more information.", program_name);
exit(1);
}
@@ -323,7 +322,7 @@ encoding. Output files are written to th
%<--automatic%> and the %<directory%> options).\n\
\n\
Usage: %s [-a] [OPTIONS] OTFFILE FONTNAME\n\n",
- program_name);
+ program_name);
uerrh.message("\
Font feature and transformation options:\n\
-s, --script=SCRIPT[.LANG] Use features for script SCRIPT[.LANG] [latn].\n\
@@ -391,6 +390,7 @@ File location options:\n\
--encoding-directory=DIR Put encoding files in DIR [.|automatic].\n\
--type1-directory=DIR Put Type 1 fonts in DIR [automatic].\n\
--truetype-directory=DIR Put TrueType fonts in DIR [automatic].\n\
+ --directory=DIR Put output in DIR [.|automatic].\n\
--map-file=FILE Update FILE with psfonts.map information [-].\n\
\n\
Other options:\n\
@@ -449,14 +449,14 @@ suffix_font_name(const String &font_name
{
const char *begin = font_name.begin(), *end = font_name.end();
while (end > begin && isdigit((unsigned char) end[-1]))
- --end;
+ --end;
if (end < font_name.end() && end > begin && end[-1] != '-' && end[-1] != '+')
- end = font_name.end();
+ end = font_name.end();
else
- while (end > begin && (end[-1] == '-' || end[-1] == '+'))
- --end;
+ while (end > begin && (end[-1] == '-' || end[-1] == '+'))
+ --end;
if (end == begin)
- end = font_name.end();
+ end = font_name.end();
return font_name.substring(begin, end) + suffix + font_name.substring(end, font_name.end());
}
@@ -470,40 +470,40 @@ static double
get_design_size(const FontInfo &finfo)
{
try {
- String gpos_table = finfo.otf->table("GPOS");
- if (!gpos_table)
- throw OpenType::Error();
-
- ErrorHandler *errh = ErrorHandler::silent_handler();
- OpenType::Gpos gpos(gpos_table, errh);
-
- // extract 'size' feature(s)
- int required_fid;
- Vector<int> fids;
- for (const OpenType::Tag *t = interesting_scripts.begin(); t < interesting_scripts.end(); t += 2)
- gpos.script_list().features(t[0], t[1], required_fid, fids, 0, false);
-
- int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
- if (size_fid < 0)
- throw OpenType::Error();
-
- // old Adobe fonts implement an old, incorrect idea
- // of what the FeatureParams offset means.
- OpenType::Name name(finfo.otf->table("name"), errh);
- OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
- if (!size_data.length())
- throw OpenType::Error();
-
- double result = size_data.u16(0) / 10.;
- // check for insane design sizes
- if (result < 1 || result > 1000)
- throw OpenType::Error();
+ String gpos_table = finfo.otf->table("GPOS");
+ if (!gpos_table)
+ throw OpenType::Error();
+
+ ErrorHandler *errh = ErrorHandler::silent_handler();
+ OpenType::Gpos gpos(gpos_table, errh);
+
+ // extract 'size' feature(s)
+ int required_fid;
+ Vector<int> fids;
+ for (const OpenType::Tag *t = interesting_scripts.begin(); t < interesting_scripts.end(); t += 2)
+ gpos.script_list().features(t[0], t[1], required_fid, fids, 0, false);
+
+ int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
+ if (size_fid < 0)
+ throw OpenType::Error();
+
+ // old Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Name name(finfo.otf->table("name"), errh);
+ OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
+ if (!size_data.length())
+ throw OpenType::Error();
+
+ double result = size_data.u16(0) / 10.;
+ // check for insane design sizes
+ if (result < 1 || result > 1000)
+ throw OpenType::Error();
- // return a number in 'pt', not 'bp'
- return result * 72.27 / 72.;
+ // return a number in 'pt', not 'bp'
+ return result * 72.27 / 72.;
} catch (OpenType::Error) {
- return 10.0;
+ return 10.0;
}
}
@@ -556,9 +556,9 @@ void Printer::print(const char* prefix,
String Printer::render(double value) const {
value = transform(value);
if (round_ || value == 0 || (value > 0.01 && value - floor(value) < 0.01))
- return String(value);
+ return String(value);
else {
- char buf[128];
+ char buf[128];
sprintf(buf, "%.4f", value);
return String(buf);
}
@@ -574,21 +574,21 @@ font_slant(const FontInfo &finfo)
static void
output_pl(Metrics &metrics, const String &ps_name, int boundary_char,
- const FontInfo &finfo, bool vpl,
- const String &filename, ErrorHandler *errh)
+ const FontInfo &finfo, bool vpl,
+ const String &filename, ErrorHandler *errh)
{
// create file
if (no_create) {
- errh->message("would create %s", filename.c_str());
- return;
+ errh->message("would create %s", filename.c_str());
+ return;
}
if (verbose)
- errh->message("creating %s", filename.c_str());
- FILE *f = fopen(filename.c_str(), "wb");
+ errh->message("creating %s", filename.c_str());
+ FILE *f = fopen(filename.c_str(), "w");
if (!f) {
- errh->error("%s: %s", filename.c_str(), strerror(errno));
- return;
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return;
}
// XXX check DESIGNSIZE and DESIGNUNITS for correctness
@@ -598,139 +598,139 @@ output_pl(Metrics &metrics, const String
// calculate a TeX FAMILY name using afm2tfm's algorithm
String family_name = String("TeX-") + ps_name;
if (family_name.length() > 19)
- family_name = family_name.substring(0, 9) + family_name.substring(-10);
+ family_name = family_name.substring(0, 9) + family_name.substring(-10);
fprintf(f, "(FAMILY %s)\n", family_name.c_str());
if (metrics.coding_scheme())
- fprintf(f, "(CODINGSCHEME %.39s)\n", String(metrics.coding_scheme()).c_str());
+ fprintf(f, "(CODINGSCHEME %.39s)\n", String(metrics.coding_scheme()).c_str());
int design_units = metrics.design_units();
if (design_size <= 0)
- design_size = get_design_size(finfo);
+ design_size = get_design_size(finfo);
max_printed_real = 0;
fprintf(f, "(DESIGNSIZE R %.1f)\n"
- "(DESIGNUNITS R %d.0)\n"
- "(COMMENT DESIGNSIZE (1 em) IS IN POINTS)\n"
- "(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/%d)\n"
- "(FONTDIMEN\n", design_size, design_units, design_units);
+ "(DESIGNUNITS R %d.0)\n"
+ "(COMMENT DESIGNSIZE (1 em) IS IN POINTS)\n"
+ "(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/%d)\n"
+ "(FONTDIMEN\n", design_size, design_units, design_units);
// figure out font dimensions
Transform font_xform;
if (extend)
- font_xform.scale(extend, 1);
+ font_xform.scale(extend, 1);
if (slant)
- font_xform.shear(slant);
+ font_xform.shear(slant);
double bounds[4], width;
Printer pr(f, design_units, metrics.units_per_em());
double actual_slant = font_slant(finfo);
if (actual_slant)
- fprintf(f, " (SLANT R %g)\n", actual_slant);
+ fprintf(f, " (SLANT R %g)\n", actual_slant);
if (char_bounds(bounds, width, finfo, font_xform, ' ')) {
- // advance space width by letterspacing, scale by space_factor
- double space_width = (width + (vpl ? letterspace : 0)) * space_factor;
- pr.print(" (SPACE", space_width);
- if (finfo.is_fixed_pitch()) {
- // fixed-pitch: no space stretch or shrink
- pr.print(" (STRETCH", 0);
- pr.print(" (SHRINK", 0);
- pr.print(" (EXTRASPACE", space_width);
- } else {
- pr.print(" (STRETCH", space_width / 2.);
- pr.print(" (SHRINK", space_width / 3.);
- pr.print(" (EXTRASPACE", space_width / 6.);
- }
+ // advance space width by letterspacing, scale by space_factor
+ double space_width = (width + (vpl ? letterspace : 0)) * space_factor;
+ pr.print(" (SPACE", space_width);
+ if (finfo.is_fixed_pitch()) {
+ // fixed-pitch: no space stretch or shrink
+ pr.print(" (STRETCH", 0);
+ pr.print(" (SHRINK", 0);
+ pr.print(" (EXTRASPACE", space_width);
+ } else {
+ pr.print(" (STRETCH", space_width / 2.);
+ pr.print(" (SHRINK", space_width / 3.);
+ pr.print(" (EXTRASPACE", space_width / 6.);
+ }
}
double x_height = finfo.x_height(font_xform);
if (x_height < finfo.units_per_em())
- pr.print(" (XHEIGHT", x_height);
+ pr.print(" (XHEIGHT", x_height);
pr.print(" (QUAD", finfo.units_per_em());
fprintf(f, " )\n");
if (boundary_char >= 0)
- fprintf(f, "(BOUNDARYCHAR D %d)\n", boundary_char);
+ fprintf(f, "(BOUNDARYCHAR D %d)\n", boundary_char);
// figure out font mapping
int mapped_font0 = 0;
Vector<int> font_mapping;
if (vpl) {
- int vpl_first_font = (metrics.need_base() ? 0 : 1);
- font_mapping.assign(metrics.n_mapped_fonts(), 0);
- if (vpl_first_font == 1 && font_mapping.size() == 1)
- font_mapping.push_back(0);
- // how many times is each font used?
- Vector<Setting> settings;
- for (int i = 0; i < 256; i++)
- if (metrics.setting(i, settings)) {
- int font_number = 0;
- for (const Setting *s = settings.begin(); s < settings.end(); s++)
- if (s->op == Setting::SHOW)
- font_mapping[font_number]++;
- else if (s->op == Setting::FONT)
- font_number = (int) s->x;
- }
- // make sure the most-used font is number 0
- mapped_font0 = std::max_element(font_mapping.begin(), font_mapping.end()) - font_mapping.begin();
- // prepare the mapping
- for (int i = vpl_first_font; i < font_mapping.size(); i++)
- font_mapping[i] = i - vpl_first_font;
- font_mapping[mapped_font0] = 0;
- font_mapping[vpl_first_font] = mapped_font0 - vpl_first_font;
- if (vpl_first_font != 0)
- font_mapping[0] = font_mapping.size() - 1;
- // write MAPFONT
- for (int i = 0; i < metrics.n_mapped_fonts() - vpl_first_font; i++) {
- int j = std::find(font_mapping.begin(), font_mapping.end(), i) - font_mapping.begin();
- String name = metrics.mapped_font_name(j);
- if (!name)
- name = make_base_font_name(font_name);
- fprintf(f, "(MAPFONT D %d\n (FONTNAME %s)\n (FONTDSIZE R %.1f)\n )\n", i, name.c_str(), design_size);
- }
+ int vpl_first_font = (metrics.need_base() ? 0 : 1);
+ font_mapping.assign(metrics.n_mapped_fonts(), 0);
+ if (vpl_first_font == 1 && font_mapping.size() == 1)
+ font_mapping.push_back(0);
+ // how many times is each font used?
+ Vector<Setting> settings;
+ for (int i = 0; i < 256; i++)
+ if (metrics.setting(i, settings)) {
+ int font_number = 0;
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ if (s->op == Setting::SHOW)
+ font_mapping[font_number]++;
+ else if (s->op == Setting::FONT)
+ font_number = (int) s->x;
+ }
+ // make sure the most-used font is number 0
+ mapped_font0 = std::max_element(font_mapping.begin(), font_mapping.end()) - font_mapping.begin();
+ // prepare the mapping
+ for (int i = vpl_first_font; i < font_mapping.size(); i++)
+ font_mapping[i] = i - vpl_first_font;
+ font_mapping[mapped_font0] = 0;
+ font_mapping[vpl_first_font] = mapped_font0 - vpl_first_font;
+ if (vpl_first_font != 0)
+ font_mapping[0] = font_mapping.size() - 1;
+ // write MAPFONT
+ for (int i = 0; i < metrics.n_mapped_fonts() - vpl_first_font; i++) {
+ int j = std::find(font_mapping.begin(), font_mapping.end(), i) - font_mapping.begin();
+ String name = metrics.mapped_font_name(j);
+ if (!name)
+ name = make_base_font_name(font_name);
+ fprintf(f, "(MAPFONT D %d\n (FONTNAME %s)\n (FONTDSIZE R %.1f)\n )\n", i, name.c_str(), design_size);
+ }
} else
- for (int i = 0; i < metrics.n_mapped_fonts(); i++)
- font_mapping.push_back(i);
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++)
+ font_mapping.push_back(i);
// figure out the proper names and numbers for glyphs
Vector<String> glyph_ids;
Vector<String> glyph_comments(257, String());
Vector<String> glyph_base_comments(257, String());
for (int i = 0; i < metrics.encoding_size(); i++) {
- if (metrics.glyph(i)) {
- PermString name = metrics.code_name(i), expected_name;
- if (i >= '0' && i <= '9')
- expected_name = digit_names[i - '0'];
- else if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z'))
- expected_name = PermString((char)i);
- String glyph_comment;
- if (name != expected_name)
- glyph_comment = " (COMMENT " + String(name) + ")";
-
- int base = metrics.base_code(i);
- if (base >= 0 && base < 256)
- glyph_base_comments[base] = glyph_comment;
+ if (metrics.glyph(i)) {
+ PermString name = metrics.code_name(i), expected_name;
+ if (i >= '0' && i <= '9')
+ expected_name = digit_names[i - '0'];
+ else if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z'))
+ expected_name = PermString((char)i);
+ String glyph_comment;
+ if (name != expected_name)
+ glyph_comment = " (COMMENT " + String(name) + ")";
+
+ int base = metrics.base_code(i);
+ if (base >= 0 && base < 256)
+ glyph_base_comments[base] = glyph_comment;
- if (i >= 256)
- continue;
+ if (i >= 256)
+ continue;
char* expected_name_end;
- if (expected_name
+ if (expected_name
&& (name == expected_name
|| (name.length() == 7
&& memcmp(name.data(), "uni00", 5) == 0
&& strtol(name.c_str() + 3, &expected_name_end, 16) == i
&& *expected_name_end == 0)))
- glyph_ids.push_back("C " + String((char)i));
- else
- glyph_ids.push_back("D " + String(i));
+ glyph_ids.push_back("C " + String((char)i));
+ else
+ glyph_ids.push_back("D " + String(i));
- glyph_comments[i] = glyph_base_comments[i] = glyph_comment;
+ glyph_comments[i] = glyph_base_comments[i] = glyph_comment;
- } else if (i < 256)
- glyph_ids.push_back("D " + String(i));
+ } else if (i < 256)
+ glyph_ids.push_back("D " + String(i));
}
// finally, BOUNDARYCHAR
glyph_ids.push_back("BOUNDARYCHAR");
@@ -741,38 +741,50 @@ output_pl(Metrics &metrics, const String
// don't print KRN x after printing LIG x
uint32_t used[8];
bool any_ligs = false;
+ StringAccum omitted_clig_sa;
for (int i = 0; i <= 256; i++)
- if (metrics.glyph(i) && minimum_kern < 10000) {
- int any_lig = metrics.ligatures(i, lig_code2, lig_outcode, lig_context);
- int any_kern = metrics.kerns(i, kern_code2, kern_amt);
- if (any_lig || any_kern) {
- StringAccum kern_sa;
- memset(&used[0], 0, 32);
- for (int j = 0; j < lig_code2.size(); j++) {
- kern_sa << " (" << lig_context_str(lig_context[j])
- << ' ' << glyph_ids[lig_code2[j]]
- << ' ' << glyph_ids[lig_outcode[j]]
- << ')' << glyph_comments[lig_code2[j]]
- << glyph_comments[lig_outcode[j]] << '\n';
- used[lig_code2[j] >> 5] |= (1 << (lig_code2[j] & 0x1F));
- }
- for (Vector<int>::const_iterator k2 = kern_code2.begin(); k2 < kern_code2.end(); k2++)
- if (!(used[*k2 >> 5] & (1 << (*k2 & 0x1F)))) {
- double this_kern = kern_amt[k2 - kern_code2.begin()];
- if (fabs(this_kern) >= minimum_kern)
- kern_sa << " (KRN " << glyph_ids[*k2]
- << " R " << pr.render(this_kern)
- << ')' << glyph_comments[*k2] << '\n';
- }
- if (kern_sa) {
- if (any_ligs)
- fprintf(f, "\n");
- fprintf(f, " (LABEL %s)%s\n%s (STOP)\n", glyph_ids[i].c_str(), glyph_comments[i].c_str(), kern_sa.c_str());
- any_ligs = true;
- }
- }
- }
+ if (metrics.glyph(i) && minimum_kern < 10000) {
+ int any_lig = metrics.ligatures(i, lig_code2, lig_outcode, lig_context);
+ int any_kern = metrics.kerns(i, kern_code2, kern_amt);
+ if (any_lig || any_kern) {
+ StringAccum kern_sa;
+ memset(used, 0, sizeof(used));
+ for (int j = 0; j < lig_code2.size(); j++) {
+ if (lig_outcode[j] < 257) {
+ kern_sa << " (" << lig_context_str(lig_context[j])
+ << ' ' << glyph_ids[lig_code2[j]]
+ << ' ' << glyph_ids[lig_outcode[j]]
+ << ')' << glyph_comments[lig_code2[j]]
+ << glyph_comments[lig_outcode[j]] << '\n';
+ used[lig_code2[j] >> 5] |= (1 << (lig_code2[j] & 0x1F));
+ } else {
+ omitted_clig_sa << "(COMMENT omitted "
+ << lig_context_str(lig_context[j])
+ << ' ' << metrics.code_name(i)
+ << ' ' << metrics.code_name(lig_code2[j])
+ << ' ' << metrics.code_name(lig_outcode[j])
+ << ")\n";
+ }
+ }
+ for (Vector<int>::const_iterator k2 = kern_code2.begin(); k2 < kern_code2.end(); k2++)
+ if (!(used[*k2 >> 5] & (1 << (*k2 & 0x1F)))) {
+ double this_kern = kern_amt[k2 - kern_code2.begin()];
+ if (fabs(this_kern) >= minimum_kern)
+ kern_sa << " (KRN " << glyph_ids[*k2]
+ << " R " << pr.render(this_kern)
+ << ')' << glyph_comments[*k2] << '\n';
+ }
+ if (kern_sa) {
+ if (any_ligs)
+ fprintf(f, "\n");
+ fprintf(f, " (LABEL %s)%s\n%s (STOP)\n", glyph_ids[i].c_str(), glyph_comments[i].c_str(), kern_sa.c_str());
+ any_ligs = true;
+ }
+ }
+ }
fprintf(f, " )\n");
+ if (omitted_clig_sa)
+ fprintf(f, "%s\n", omitted_clig_sa.c_str());
// CHARACTERs
Vector<Setting> settings;
@@ -780,121 +792,121 @@ output_pl(Metrics &metrics, const String
Vector<Point> push_stack;
for (int i = 0; i < 256; i++)
- if (metrics.setting(i, settings)) {
- fprintf(f, "(CHARACTER %s%s\n", glyph_ids[i].c_str(), glyph_comments[i].c_str());
+ if (metrics.setting(i, settings)) {
+ fprintf(f, "(CHARACTER %s%s\n", glyph_ids[i].c_str(), glyph_comments[i].c_str());
- // unparse settings into DVI commands
- sa.clear();
- push_stack.clear();
- CharstringBounds boundser(font_xform);
- int program_number = mapped_font0;
- const CharstringProgram *program = finfo.program();
- for (const Setting *s = settings.begin(); s < settings.end(); s++)
- switch (s->op) {
-
- case Setting::SHOW:
- if (vpl || program == finfo.program())
- boundser.char_bounds(program->glyph_context(s->y));
- // 3.Aug.2004 -- reported by Marco Kuhlmann: Don't use
- // glyph_ids[] array when looking at a different font.
- if (program_number == 0)
- sa << " (SETCHAR " << glyph_ids[s->x] << ')' << glyph_base_comments[s->x] << "\n";
- else
- sa << " (SETCHAR D " << s->x << ")\n";
- break;
-
- case Setting::MOVE: {
- int x = 0, y = 0;
- while (s+1 < settings.end() && s[1].op == Setting::MOVE)
- x += s->x, y += s->y, s++;
- if (vpl)
- boundser.translate(s->x + x, s->y + y);
- if (s->x + x)
- sa << " (MOVERIGHT R " << pr.render(s->x + x) << ")\n";
- if (s->y + y)
- sa << " (MOVEUP R " << pr.render(s->y + y) << ")\n";
- break;
- }
-
- case Setting::RULE:
- if (vpl) {
- boundser.mark(Point(0, 0));
- boundser.mark(Point(s->x, s->y));
- boundser.translate(s->x, 0);
- }
- sa << " (SETRULE R " << pr.render(s->y) << " R " << pr.render(s->x) << ")\n";
- break;
-
- case Setting::FONT:
- if ((int) s->x != program_number) {
- program = metrics.mapped_font((int) s->x);
- program_number = (int) s->x;
- sa << " (SELECTFONT D " << font_mapping[program_number] << ")\n";
- }
- break;
-
- case Setting::PUSH:
- push_stack.push_back(boundser.transform(Point(0, 0)));
- sa << " (PUSH)\n";
- break;
-
- case Setting::POP: {
- assert(push_stack.size());
- Point p = push_stack.back() - boundser.transform(Point(0, 0));
- if (vpl)
- boundser.translate(p.x, p.y);
- push_stack.pop_back();
- sa << " (POP)\n";
- break;
- }
-
- case Setting::SPECIAL: {
- bool needhex = false;
- for (const char *str = s->s.begin(); str < s->s.end() && !needhex; str++)
- if (*str < ' ' || *str > '~' || *str == '(' || *str == ')')
- needhex = true;
- if (needhex) {
- sa << " (SPECIALHEX ";
- for (const char *str = s->s.begin(); str < s->s.end(); str++) {
- static const char hexdig[] = "0123456789ABCDEF";
- int val = (unsigned char) *str;
- sa << hexdig[val >> 4] << hexdig[val & 0xF];
- }
- sa << ")\n";
- } else
- sa << " (SPECIAL " << s->s << ")\n";
- break;
- }
-
- }
-
- assert(push_stack.size() == 0);
-
- // output information
- boundser.output(bounds, width);
- pr.print(" (CHARWD", width);
- if (bounds[3] > 0)
- pr.print(" (CHARHT", bounds[3]);
- if (bounds[1] < 0)
- pr.print(" (CHARDP", -bounds[1]);
- if (bounds[2] > width)
- pr.print_transformed(" (CHARIC", pr.transform(bounds[2]) - pr.transform(width));
- if (vpl && (settings.size() > 1 || settings[0].op != Setting::SHOW))
- fprintf(f, " (MAP\n%s )\n", sa.c_str());
- fprintf(f, " )\n");
- }
+ // unparse settings into DVI commands
+ sa.clear();
+ push_stack.clear();
+ CharstringBounds boundser(font_xform);
+ int program_number = mapped_font0;
+ const CharstringProgram *program = finfo.program();
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ switch (s->op) {
+
+ case Setting::SHOW:
+ if (vpl || program == finfo.program())
+ boundser.char_bounds(program->glyph_context(s->y));
+ // 3.Aug.2004 -- reported by Marco Kuhlmann: Don't use
+ // glyph_ids[] array when looking at a different font.
+ if (program_number == 0)
+ sa << " (SETCHAR " << glyph_ids[s->x] << ')' << glyph_base_comments[s->x] << "\n";
+ else
+ sa << " (SETCHAR D " << s->x << ")\n";
+ break;
+
+ case Setting::MOVE: {
+ int x = 0, y = 0;
+ while (s+1 < settings.end() && s[1].op == Setting::MOVE)
+ x += s->x, y += s->y, s++;
+ if (vpl)
+ boundser.translate(s->x + x, s->y + y);
+ if (s->x + x)
+ sa << " (MOVERIGHT R " << pr.render(s->x + x) << ")\n";
+ if (s->y + y)
+ sa << " (MOVEUP R " << pr.render(s->y + y) << ")\n";
+ break;
+ }
+
+ case Setting::RULE:
+ if (vpl) {
+ boundser.mark(Point(0, 0));
+ boundser.mark(Point(s->x, s->y));
+ boundser.translate(s->x, 0);
+ }
+ sa << " (SETRULE R " << pr.render(s->y) << " R " << pr.render(s->x) << ")\n";
+ break;
+
+ case Setting::FONT:
+ if ((int) s->x != program_number) {
+ program = metrics.mapped_font((int) s->x);
+ program_number = (int) s->x;
+ sa << " (SELECTFONT D " << font_mapping[program_number] << ")\n";
+ }
+ break;
+
+ case Setting::PUSH:
+ push_stack.push_back(boundser.transform(Point(0, 0)));
+ sa << " (PUSH)\n";
+ break;
+
+ case Setting::POP: {
+ assert(push_stack.size());
+ Point p = push_stack.back() - boundser.transform(Point(0, 0));
+ if (vpl)
+ boundser.translate(p.x, p.y);
+ push_stack.pop_back();
+ sa << " (POP)\n";
+ break;
+ }
+
+ case Setting::SPECIAL: {
+ bool needhex = false;
+ for (const char *str = s->s.begin(); str < s->s.end() && !needhex; str++)
+ if (*str < ' ' || *str > '~' || *str == '(' || *str == ')')
+ needhex = true;
+ if (needhex) {
+ sa << " (SPECIALHEX ";
+ for (const char *str = s->s.begin(); str < s->s.end(); str++) {
+ static const char hexdig[] = "0123456789ABCDEF";
+ int val = (unsigned char) *str;
+ sa << hexdig[val >> 4] << hexdig[val & 0xF];
+ }
+ sa << ")\n";
+ } else
+ sa << " (SPECIAL " << s->s << ")\n";
+ break;
+ }
+
+ }
+
+ assert(push_stack.size() == 0);
+
+ // output information
+ boundser.output(bounds, width);
+ pr.print(" (CHARWD", width);
+ if (bounds[3] > 0)
+ pr.print(" (CHARHT", bounds[3]);
+ if (bounds[1] < 0)
+ pr.print(" (CHARDP", -bounds[1]);
+ if (bounds[2] > width)
+ pr.print_transformed(" (CHARIC", pr.transform(bounds[2]) - pr.transform(width));
+ if (vpl && (settings.size() > 1 || settings[0].op != Setting::SHOW))
+ fprintf(f, " (MAP\n%s )\n", sa.c_str());
+ fprintf(f, " )\n");
+ }
// at last, close the file
fclose(f);
// Did we print a number too big for TeX to handle? If so, try again.
if (max_printed_real >= 2047) {
- if (metrics.design_units() <= 1)
- errh->fatal("This font appears to be broken. It has characters so big that the PL format\ncannot represent them.");
- metrics.set_design_units(metrics.design_units() > 200 ? metrics.design_units() - 250 : 1);
- if (verbose)
- errh->message("the font%,s metrics overflow the limits of PL files\n(reducing DESIGNUNITS to %d and trying again)", metrics.design_units());
- output_pl(metrics, ps_name, boundary_char, finfo, vpl, filename, errh);
+ if (metrics.design_units() <= 1)
+ errh->fatal("This font appears to be broken. It has characters so big that the PL format\ncannot represent them.");
+ metrics.set_design_units(metrics.design_units() > 200 ? metrics.design_units() - 250 : 1);
+ if (verbose)
+ errh->message("the font%,s metrics overflow the limits of PL files\n(reducing DESIGNUNITS to %d and trying again)", metrics.design_units());
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, filename, errh);
}
}
@@ -903,7 +915,7 @@ struct Lookup {
bool required;
Vector<OpenType::Tag> features;
GlyphFilter* filter;
- Lookup() : used(false), required(false), filter(0) { }
+ Lookup() : used(false), required(false), filter(0) { }
};
static void
@@ -914,81 +926,81 @@ find_lookups(const OpenType::ScriptList&
// go over all scripts
for (int i = 0; i < interesting_scripts.size(); i += 2) {
- OpenType::Tag script = interesting_scripts[i];
- OpenType::Tag langsys = interesting_scripts[i+1];
+ OpenType::Tag script = interesting_scripts[i];
+ OpenType::Tag langsys = interesting_scripts[i+1];
- // collect features applying to this script
- scripts.features(script, langsys, required, fids, errh);
+ // collect features applying to this script
+ scripts.features(script, langsys, required, fids, errh);
- // only use the selected features
- features.filter(fids, interesting_features);
+ // only use the selected features
+ features.filter(fids, interesting_features);
- // mark features as having been used
- for (int j = (required < 0 ? 0 : -1); j < fids.size(); j++) {
- int fid = (j < 0 ? required : fids[j]);
- OpenType::Tag ftag = features.tag(fid);
- if (features.lookups(fid, lookupids, errh) < 0)
- lookupids.clear();
- for (int k = 0; k < lookupids.size(); k++) {
- int l = lookupids[k];
- if (l < 0 || l >= lookups.size())
- errh->error("lookup for %<%s%> feature out of range", OpenType::Tag::langsys_text(script, langsys).c_str());
- else {
- lookups[l].used = true;
- lookups[l].features.push_back(ftag);
- if (j < 0)
- lookups[l].required = true;
- }
- }
- }
+ // mark features as having been used
+ for (int j = (required < 0 ? 0 : -1); j < fids.size(); j++) {
+ int fid = (j < 0 ? required : fids[j]);
+ OpenType::Tag ftag = features.tag(fid);
+ if (features.lookups(fid, lookupids, errh) < 0)
+ lookupids.clear();
+ for (int k = 0; k < lookupids.size(); k++) {
+ int l = lookupids[k];
+ if (l < 0 || l >= lookups.size())
+ errh->error("lookup for %<%s%> feature out of range", OpenType::Tag::langsys_text(script, langsys).c_str());
+ else {
+ lookups[l].used = true;
+ lookups[l].features.push_back(ftag);
+ if (j < 0)
+ lookups[l].required = true;
+ }
+ }
+ }
}
// now check for compatible glyph filters
for (Lookup* l = lookups.begin(); l < lookups.end(); l++)
- if (l->used && !l->required) {
- l->filter = feature_filters[l->features[0]];
- for (OpenType::Tag* ft = l->features.begin() + 1; ft < l->features.end(); ft++)
- if (!l->filter->check_eq(*feature_filters[*ft])) {
- errh->error("%<%s%> and %<%s%> features share a lookup, but have different filters", l->features[0].text().c_str(), ft->text().c_str());
- break;
- }
- }
+ if (l->used && !l->required) {
+ l->filter = feature_filters[l->features[0]];
+ for (OpenType::Tag* ft = l->features.begin() + 1; ft < l->features.end(); ft++)
+ if (!l->filter->check_eq(*feature_filters[*ft])) {
+ errh->error("%<%s%> and %<%s%> features share a lookup, but have different filters", l->features[0].text().c_str(), ft->text().c_str());
+ break;
+ }
+ }
}
static int
write_encoding_file(String &filename, const String &encoding_name,
- StringAccum &contents, ErrorHandler *errh)
+ StringAccum &contents, ErrorHandler *errh)
{
FILE *f;
int ok_retval = (access(filename.c_str(), R_OK) >= 0 ? 0 : 1);
if (no_create) {
- errh->message((ok_retval ? "would create encoding file %s" : "would update encoding file %s"), filename.c_str());
- return ok_retval;
+ errh->message((ok_retval ? "would create encoding file %s" : "would update encoding file %s"), filename.c_str());
+ return ok_retval;
} else if (verbose)
- errh->message((ok_retval ? "creating encoding file %s" : "updating encoding file %s"), filename.c_str());
+ errh->message((ok_retval ? "creating encoding file %s" : "updating encoding file %s"), filename.c_str());
int fd = open(filename.c_str(), O_RDWR | O_CREAT, 0666);
if (fd < 0)
- return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
f = fdopen(fd, "r+");
// NB: also change update_autofont_map if you change this code
#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
{
- struct flock lock;
- lock.l_type = F_WRLCK;
- lock.l_whence = SEEK_SET;
- lock.l_start = 0;
- lock.l_len = 0;
- int result;
- while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
- /* try again */;
- if (result < 0) {
- result = errno;
- fclose(f);
- return errh->error("locking %s: %s", filename.c_str(), strerror(result));
- }
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", filename.c_str(), strerror(result));
+ }
}
#endif
@@ -996,32 +1008,32 @@ write_encoding_file(String &filename, co
StringAccum sa;
int amt;
do {
- if (char *x = sa.reserve(8192)) {
- amt = fread(x, 1, 8192, f);
- sa.adjust_length(amt);
- } else
- amt = 0;
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
} while (amt != 0);
if (!feof(f) || ferror(f))
- return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
String old_encodings = sa.take_string();
bool created = (!old_encodings);
// append old encodings
int pos1 = old_encodings.find_left("\n%%");
while (pos1 >= 0 && pos1 < old_encodings.length()) {
- int pos2 = old_encodings.find_left("\n%%", pos1 + 1);
- if (pos2 < 0)
- pos2 = old_encodings.length();
- if (old_encodings.substring(pos1 + 3, encoding_name.length()) == encoding_name) {
- // encoding already exists, don't change it
- fclose(f);
- if (verbose)
- errh->message("%s unchanged", filename.c_str());
- return 0;
- } else
- contents << old_encodings.substring(pos1, pos2 - pos1);
- pos1 = pos2;
+ int pos2 = old_encodings.find_left("\n%%", pos1 + 1);
+ if (pos2 < 0)
+ pos2 = old_encodings.length();
+ if (old_encodings.substring(pos1 + 3, encoding_name.length()) == encoding_name) {
+ // encoding already exists, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", filename.c_str());
+ return 0;
+ } else
+ contents << old_encodings.substring(pos1, pos2 - pos1);
+ pos1 = pos2;
}
// rewind file
@@ -1030,9 +1042,9 @@ write_encoding_file(String &filename, co
if (ftruncate(fd, 0) < 0)
#endif
{
- fclose(f);
- f = fopen(filename.c_str(), "wb");
- fd = fileno(f);
+ fclose(f);
+ f = fopen(filename.c_str(), "w");
+ fd = fileno(f);
}
ignore_result(fwrite(contents.data(), 1, contents.length(), f));
@@ -1041,33 +1053,33 @@ write_encoding_file(String &filename, co
// inform about the new file if necessary
if (created)
- update_odir(O_ENCODING, filename, errh);
+ update_odir(O_ENCODING, filename, errh);
return 0;
}
static bool
output_encoding(const Metrics &metrics,
- const Vector<PermString> &glyph_names,
- ErrorHandler *errh)
+ const Vector<PermString> &glyph_names,
+ ErrorHandler *errh)
{
static const char * const hex_digits = "0123456789ABCDEF";
// collect encoding data
Vector<Metrics::Glyph> glyphs;
if (!metrics.base_glyphs(glyphs, 256))
- return false;
+ return false;
StringAccum sa;
for (int i = 0; i < 256; i++) {
- if ((i & 0xF) == 0)
- sa << (i ? "\n%" : "%") << hex_digits[(i >> 4) & 0xF] << '0' << '\n' << ' ';
- else if ((i & 0x7) == 0)
- sa << '\n' << ' ';
- int g = glyphs[i];
- if (g > 0 && g < glyph_names.size())
- sa << ' ' << '/' << glyph_names[g];
- else
- sa << " /.notdef";
+ if ((i & 0xF) == 0)
+ sa << (i ? "\n%" : "%") << hex_digits[(i >> 4) & 0xF] << '0' << '\n' << ' ';
+ else if ((i & 0x7) == 0)
+ sa << '\n' << ' ';
+ int g = glyphs[i];
+ if (g > 0 && g < glyph_names.size())
+ sa << ' ' << '/' << glyph_names[g];
+ else
+ sa << " /.notdef";
}
sa << '\n';
@@ -1084,18 +1096,18 @@ output_encoding(const Metrics &metrics,
// create encoding filename
bool output_encoding_only = (bool) out_encoding_file;
if (!out_encoding_file)
- out_encoding_file = getodir(O_ENCODING, errh) + String("/a_") + String(text_digest).substring(0, 6) + ".enc";
+ out_encoding_file = getodir(O_ENCODING, errh) + String("/a_") + String(text_digest).substring(0, 6) + ".enc";
// exit if we're not responsible for generating an encoding
if (!(output_flags & G_ENCODING))
- return true;
+ return true;
// put encoding block in a StringAccum
// 3.Jun.2003: stick command line definition at the end of the encoding,
// where it won't confuse idiotic ps2pk
StringAccum contents;
if (!output_encoding_only)
- contents << "% THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT\n\n\
+ contents << "% THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT\n\n\
%%" << out_encoding_name << "\n";
contents << "% Encoding created by otftotfm" << current_time << "\n\
% Command line follows encoding\n";
@@ -1108,156 +1120,199 @@ output_encoding(const Metrics &metrics,
char *buf = banner.mutable_data();
// get rid of crap characters
for (int i = 0; i < banner.length(); i++)
- if (buf[i] < ' ' || buf[i] > 0176) {
- if (buf[i] == '\n' || buf[i] == '\r')
- buf[i] = ' ';
- else
- buf[i] = '.';
- }
+ if (buf[i] < ' ' || buf[i] > 0176) {
+ if (buf[i] == '\n' || buf[i] == '\r')
+ buf[i] = ' ';
+ else
+ buf[i] = '.';
+ }
// break lines at 80 characters -- it would be nice if this were in a
// library
while (banner.length() > 0) {
- int pos = banner.find_left(' '), last_pos = pos;
- while (pos < 75 && pos >= 0) {
- last_pos = pos;
- pos = banner.find_left(' ', pos + 1);
- }
- if (last_pos < 0 || (pos < 0 && banner.length() < 75))
- last_pos = banner.length();
- contents << "% " << banner.substring(0, last_pos) << '\n';
- banner = banner.substring(last_pos + 1);
+ int pos = banner.find_left(' '), last_pos = pos;
+ while (pos < 75 && pos >= 0) {
+ last_pos = pos;
+ pos = banner.find_left(' ', pos + 1);
+ }
+ if (last_pos < 0 || (pos < 0 && banner.length() < 75))
+ last_pos = banner.length();
+ contents << "% " << banner.substring(0, last_pos) << '\n';
+ banner = banner.substring(last_pos + 1);
}
// open encoding file
if (out_encoding_file == "-")
- ignore_result(fwrite(contents.data(), 1, contents.length(), stdout));
+ ignore_result(fwrite(contents.data(), 1, contents.length(), stdout));
else if (write_encoding_file(out_encoding_file, out_encoding_name, contents, errh) == 1)
- update_odir(O_ENCODING, out_encoding_file, errh);
+ update_odir(O_ENCODING, out_encoding_file, errh);
return true;
}
static void
output_tfm(Metrics &metrics, const String &ps_name, int boundary_char,
- const FontInfo &finfo, String tfm_filename, String vf_filename,
- ErrorHandler *errh)
+ const FontInfo &finfo, String tfm_filename, String vf_filename,
+ String pl_filename, ErrorHandler *errh)
{
- String pl_filename;
+ bool had_pl_filename = !pl_filename.empty();
bool vpl = vf_filename;
- if (no_create) {
- errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));
- pl_filename = "<temporary>";
- } else {
- int pl_fd = temporary_file(pl_filename, errh);
- if (pl_fd < 0)
- return;
- output_pl(metrics, ps_name, boundary_char, finfo, vpl, pl_filename, errh);
- close(pl_fd);
+ if (!pl_filename) {
+ if (no_create) {
+ errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));
+ pl_filename = "<temporary>";
+ } else {
+ int pl_fd = temporary_file(pl_filename, errh);
+ if (pl_fd < 0)
+ return;
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, pl_filename, errh);
+ close(pl_fd);
+ }
}
StringAccum command;
if (vpl)
- command << "vptovf " << shell_quote(pl_filename) << ' ' << shell_quote(vf_filename) << ' ' << shell_quote(tfm_filename) << " >&2";
+ command << "vptovf " << shell_quote(pl_filename) << ' ' << shell_quote(vf_filename) << ' ' << shell_quote(tfm_filename) << " 2>&1";
else
- command << "pltotf " << shell_quote(pl_filename) << ' ' << shell_quote(tfm_filename) << " >&2";
+ command << "pltotf " << shell_quote(pl_filename) << ' ' << shell_quote(tfm_filename) << " 2>&1";
- int status = mysystem(command.c_str(), errh);
+ FILE* cmdfile = mypopen(command.c_str(), "r", errh);
+ int status;
+ if (cmdfile) {
+ StringAccum results;
+ while (!feof(cmdfile)) {
+ char* buf = results.reserve(BUFSIZ);
+ results.adjust_length(fread(buf, 1, BUFSIZ, cmdfile));
+ }
+ // compensate for shitty vptovf/pltotf messages
+ char* by_units, *last_line;
+ while (!results.empty()
+ && (by_units = strstr((char*) results.c_str(), " units"))
+ && (last_line = strrchr((char*) results.c_str(), '\n'))
+ && results.end() - last_line > 1
+ && isdigit((unsigned char) last_line[1])) {
+ char* start_number = last_line + 1;
+ char* end_number = last_line + 2;
+ while (end_number < results.end()
+ && isdigit((unsigned char) *end_number))
+ ++end_number;
+ if (end_number < results.end() && *end_number == '.') {
+ char* dot = end_number;
+ ++end_number;
+ while (end_number < results.end()
+ && end_number < dot + 8
+ && isdigit((unsigned char) *end_number))
+ ++end_number;
+ }
+ String number(start_number, end_number);
+ char* by_units_dest = by_units + 1 + (end_number - start_number);
+ memmove(by_units_dest, by_units + 1, start_number - (by_units + 1));
+ memmove(by_units + 1, number.begin(), number.length());
+ }
+ if (!results.empty())
+ fwrite(results.begin(), 1, results.length(), stderr);
+ status = pclose(cmdfile);
+ } else
+ status = -1;
- if (!no_create)
- unlink(pl_filename.c_str());
+ if (!no_create && !had_pl_filename)
+ unlink(pl_filename.c_str());
if (status != 0)
- errh->fatal("%s execution failed", (vpl ? "vptovf" : "pltotf"));
+ errh->fatal("%s execution failed", (vpl ? "vptovf" : "pltotf"));
else {
- update_odir(O_TFM, tfm_filename, errh);
- if (vpl)
- update_odir(O_VF, vf_filename, errh);
+ update_odir(O_TFM, tfm_filename, errh);
+ if (vpl)
+ update_odir(O_VF, vf_filename, errh);
}
}
void
output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
- const FontInfo &finfo,
- const String &encoding_name, const String &encoding_file,
- const String &font_name,
- String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
- ErrorHandler *errh)
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
+ ErrorHandler *errh)
{
String base_font_name = font_name;
bool need_virtual = metrics.need_virtual(257);
if (need_virtual) {
- if (output_flags & G_VMETRICS)
- base_font_name = make_base_font_name(font_name);
- else if (output_flags & G_METRICS)
- errh->warning("features require virtual fonts");
+ if (output_flags & G_VMETRICS)
+ base_font_name = make_base_font_name(font_name);
+ else if (output_flags & G_METRICS)
+ errh->warning("features require virtual fonts");
}
// output virtual metrics
if (!(output_flags & G_VMETRICS))
- /* do nothing */;
+ /* do nothing */;
else if (!need_virtual) {
- if (automatic) {
- // erase old virtual font
- String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
- if (no_create)
- errh->message("would remove potential VF file %<%s%>", vf.c_str());
- else {
- if (verbose)
- errh->message("removing potential VF file %<%s%>", vf.c_str());
- if (unlink(vf.c_str()) < 0 && errno != ENOENT)
- errh->error("removing %s: %s", vf.c_str(), strerror(errno));
- }
- }
+ if (automatic) {
+ // erase old virtual font
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ if (no_create)
+ errh->message("would remove potential VF file %<%s%>", vf.c_str());
+ else {
+ if (verbose)
+ errh->message("removing potential VF file %<%s%>", vf.c_str());
+ if (unlink(vf.c_str()) < 0 && errno != ENOENT)
+ errh->error("removing %s: %s", vf.c_str(), strerror(errno));
+ }
+ }
} else {
- if (output_flags & G_BINARY) {
- String tfm = getodir(O_TFM, errh) + "/" + font_name + ".tfm";
- String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
- output_tfm(metrics, ps_name, boundary_char, finfo, tfm, vf, errh);
- } else {
- String outfile = getodir(O_VPL, errh) + "/" + font_name + ".vpl";
- output_pl(metrics, ps_name, boundary_char, finfo, true, outfile, errh);
- update_odir(O_VPL, outfile, errh);
- }
+ String vplfile;
+ if (output_flags & G_ASCII) {
+ vplfile = getodir(O_VPL, errh) + "/" + font_name + ".vpl";
+ output_pl(metrics, ps_name, boundary_char, finfo, true, vplfile, errh);
+ update_odir(O_VPL, vplfile, errh);
+ }
+ if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + font_name + ".tfm";
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, vf, vplfile, errh);
+ }
}
// quit if no base needed
metrics.make_base(257);
if (!metrics.need_base())
- return;
+ return;
// output metrics
double save_minimum_kern = minimum_kern;
if (need_virtual)
- minimum_kern = 100000;
- if (!(output_flags & G_METRICS))
- /* do nothing */;
- else if (output_flags & G_BINARY) {
- String tfm = getodir(O_TFM, errh) + "/" + base_font_name + ".tfm";
- output_tfm(metrics, ps_name, boundary_char, finfo, tfm, String(), errh);
- } else {
- String outfile = getodir(O_PL, errh) + "/" + base_font_name + ".pl";
- output_pl(metrics, ps_name, boundary_char, finfo, false, outfile, errh);
- update_odir(O_PL, outfile, errh);
+ minimum_kern = 100000;
+ if (output_flags & G_METRICS) {
+ String plfile;
+ if (output_flags & G_ASCII) {
+ plfile = getodir(O_PL, errh) + "/" + base_font_name + ".pl";
+ output_pl(metrics, ps_name, boundary_char, finfo, false, plfile, errh);
+ update_odir(O_PL, plfile, errh);
+ }
+ if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + base_font_name + ".tfm";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, String(), plfile, errh);
+ }
}
minimum_kern = save_minimum_kern;
// print DVIPS map line
if (errh->nerrors() == 0 && (output_flags & G_PSFONTSMAP)) {
- StringAccum sa;
- sa << base_font_name << ' ' << ps_name << " \"";
- if (extend)
- sa << extend << " ExtendFont ";
- if (slant)
- sa << slant << " SlantFont ";
- if (encoding_name)
- sa << encoding_name << " ReEncodeFont\" <[" << pathname_filename(encoding_file);
- else
- sa << "\"";
- sa << ' ' << dvips_include(ps_name, finfo, errh) << '\n';
- update_autofont_map(base_font_name, sa.take_string(), errh);
- // if virtual font, remove any map line for base font name
- if (base_font_name != font_name)
- update_autofont_map(font_name, "", errh);
+ StringAccum sa;
+ sa << base_font_name << ' ' << ps_name << " \"";
+ if (extend)
+ sa << extend << " ExtendFont ";
+ if (slant)
+ sa << slant << " SlantFont ";
+ if (encoding_name)
+ sa << encoding_name << " ReEncodeFont\" <[" << pathname_filename(encoding_file);
+ else
+ sa << "\"";
+ sa << ' ' << dvips_include(ps_name, finfo, errh) << '\n';
+ update_autofont_map(base_font_name, sa.take_string(), errh);
+ // if virtual font, remove any map line for base font name
+ if (base_font_name != font_name)
+ update_autofont_map(font_name, "", errh);
}
}
@@ -1281,48 +1336,48 @@ report_underused_features(const HashMap<
{
Vector<String> x[X_COUNT];
for (int i = 0; i < interesting_features.size(); i++) {
- OpenType::Tag f = interesting_features[i];
- int fu = feature_usage[f.value()];
- String ftext = errh->format("%<%s%>", f.text().c_str());
- if (fu == 0)
- x[X_UNUSED].push_back(ftext);
- else if ((fu & (F_GSUB_TRY | F_GPOS_TRY)) == fu)
- x[X_BOTH_NONE].push_back(ftext);
- else {
- if (fu & F_GSUB_TRY) {
- if ((fu & (F_GSUB_PART | F_GSUB_ALL)) == 0)
- x[X_GSUB_NONE].push_back(ftext);
- else if (fu & F_GSUB_PART)
- x[X_GSUB_PART].push_back(ftext);
- }
- if (fu & F_GPOS_TRY) {
- if ((fu & (F_GPOS_PART | F_GPOS_ALL)) == 0)
- x[X_GPOS_NONE].push_back(ftext);
- else if (fu & F_GPOS_PART)
- x[X_GPOS_PART].push_back(ftext);
- }
- }
+ OpenType::Tag f = interesting_features[i];
+ int fu = feature_usage[f.value()];
+ String ftext = errh->format("%<%s%>", f.text().c_str());
+ if (fu == 0)
+ x[X_UNUSED].push_back(ftext);
+ else if ((fu & (F_GSUB_TRY | F_GPOS_TRY)) == fu)
+ x[X_BOTH_NONE].push_back(ftext);
+ else {
+ if (fu & F_GSUB_TRY) {
+ if ((fu & (F_GSUB_PART | F_GSUB_ALL)) == 0)
+ x[X_GSUB_NONE].push_back(ftext);
+ else if (fu & F_GSUB_PART)
+ x[X_GSUB_PART].push_back(ftext);
+ }
+ if (fu & F_GPOS_TRY) {
+ if ((fu & (F_GPOS_PART | F_GPOS_ALL)) == 0)
+ x[X_GPOS_NONE].push_back(ftext);
+ else if (fu & F_GPOS_PART)
+ x[X_GPOS_PART].push_back(ftext);
+ }
+ }
}
for (int i = 0; i < X_COUNT; i++)
- if (x[i].size())
- goto found;
+ if (x[i].size())
+ goto found;
return;
found:
for (int i = 0; i < X_COUNT; i++)
- if (x[i].size()) {
- StringAccum sa;
- const char* msg_pct = strchr(x_messages[i], '%');
- sa.append(x_messages[i], msg_pct - x_messages[i]);
- const char* sep = (x[i].size() > 2 ? ", " : " ");
- for (const String* a = x[i].begin(); a < x[i].end() - 1; a++)
- sa << *a << sep;
- sa << (x[i].size() > 1 ? "and " : "") << x[i].back()
- << (x[i].size() > 1 ? " features" : " feature") << (msg_pct+1);
- sa.append_break_lines(sa.take_string(), 58);
- errh->warning("%s", sa.c_str());
- }
+ if (x[i].size()) {
+ StringAccum sa;
+ const char* msg_pct = strchr(x_messages[i], '%');
+ sa.append(x_messages[i], msg_pct - x_messages[i]);
+ const char* sep = (x[i].size() > 2 ? ", " : " ");
+ for (const String* a = x[i].begin(); a < x[i].end() - 1; a++)
+ sa << *a << sep;
+ sa << (x[i].size() > 1 ? "and " : "") << x[i].back()
+ << (x[i].size() > 1 ? " features" : " feature") << (msg_pct+1);
+ sa.append_break_lines(sa.take_string(), 58);
+ errh->warning("%s", sa.c_str());
+ }
}
static String otf_filename;
@@ -1331,24 +1386,24 @@ static String
main_dvips_map(const String &ps_name, const FontInfo &finfo, ErrorHandler *errh)
{
if (String fn = installed_type1(otf_filename, ps_name, (output_flags & G_TYPE1) != 0, errh))
- return "<" + pathname_filename(fn);
+ return "<" + pathname_filename(fn);
if (!finfo.cff) {
- String ttf_fn, t42_fn;
- ttf_fn = installed_truetype(otf_filename, (output_flags & G_TRUETYPE) != 0, errh);
- t42_fn = installed_type42(otf_filename, ps_name, (output_flags & G_TYPE42) != 0, errh);
- if (t42_fn && (!ttf_fn || (output_flags & G_TYPE42) != 0))
- return "<" + pathname_filename(t42_fn);
- else if (ttf_fn)
- return "<" + pathname_filename(ttf_fn);
+ String ttf_fn, t42_fn;
+ ttf_fn = installed_truetype(otf_filename, (output_flags & G_TRUETYPE) != 0, errh);
+ t42_fn = installed_type42(otf_filename, ps_name, (output_flags & G_TYPE42) != 0, errh);
+ if (t42_fn && (!ttf_fn || (output_flags & G_TYPE42) != 0))
+ return "<" + pathname_filename(t42_fn);
+ else if (ttf_fn)
+ return "<" + pathname_filename(ttf_fn);
}
return "<" + pathname_filename(otf_filename);
}
static void
do_gsub(Metrics& metrics, const OpenType::Font& otf,
- DvipsEncoding& dvipsenc, bool dvipsenc_literal,
- HashMap<uint32_t, int>& feature_usage,
- const Vector<PermString>& glyph_names, ErrorHandler* errh)
+ DvipsEncoding& dvipsenc, bool dvipsenc_literal,
+ HashMap<uint32_t, int>& feature_usage,
+ const Vector<PermString>& glyph_names, ErrorHandler* errh)
{
// find activated GSUB features
OpenType::Gsub gsub(otf.table("GSUB"), &otf, errh);
@@ -1358,70 +1413,70 @@ do_gsub(Metrics& metrics, const OpenType
// find all characters that might result
Vector<bool> used(glyph_names.size(), false);
for (Metrics::Code c = 0; c < metrics.encoding_size(); ++c) {
- Metrics::Glyph g = metrics.glyph(c);
- if (g >= 0 && g < used.size())
- used[g] = true;
+ Metrics::Glyph g = metrics.glyph(c);
+ if (g >= 0 && g < used.size())
+ used[g] = true;
}
for (int i = 0; i < lookups.size(); ++i)
- if (lookups[i].used) {
- OpenType::GsubLookup l = gsub.lookup(i);
- l.mark_out_glyphs(gsub, used);
- }
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ l.mark_out_glyphs(gsub, used);
+ }
OpenType::Coverage used_coverage(used);
// apply activated GSUB features
Vector<OpenType::Substitution> subs;
for (int i = 0; i < lookups.size(); i++)
- if (lookups[i].used) {
- OpenType::GsubLookup l = gsub.lookup(i);
- subs.clear();
- bool understood = l.unparse_automatics(gsub, subs, used_coverage);
-
- // check for -ffina, which should apply only at the ends of words,
- // and -finit, which should apply only at the beginnings.
- OpenType::Tag feature = (lookups[i].features.size() == 1 ? lookups[i].features[0] : OpenType::Tag());
- if (feature == OpenType::Tag("fina") || feature == OpenType::Tag("fin2") || feature == OpenType::Tag("fin3")) {
- if (dvipsenc.boundary_char() < 0)
- errh->warning("%<-ffina%> requires a boundary character\n(The input encoding didn%,t specify a boundary character, but\nI need one to implement %<-ffina%> features correctly. Try\nthe %<--boundary-char%> option.)");
- else {
- int bg = metrics.boundary_glyph();
- for (int j = 0; j < subs.size(); j++)
- subs[j].add_outer_right(bg);
- }
- } else if (feature == OpenType::Tag("init")) {
- int bg = metrics.boundary_glyph();
- for (int j = 0; j < subs.size(); j++)
- subs[j].add_outer_left(bg);
- }
-
- //for (int subno = 0; subno < subs.size(); subno++) fprintf(stderr, "%5d\t%s\n", i, subs[subno].unparse().c_str());
-
- // figure out which glyph filter to use
- int nunderstood = metrics.apply(subs, !dvipsenc_literal, i, *lookups[i].filter, glyph_names);
-
- // mark as used
- int d = (understood && nunderstood == subs.size() ? F_GSUB_ALL : (nunderstood ? F_GSUB_PART : 0)) + F_GSUB_TRY;
- for (int j = 0; j < lookups[i].features.size(); j++)
- feature_usage.find_force(lookups[i].features[j].value()) |= d;
- }
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ subs.clear();
+ bool understood = l.unparse_automatics(gsub, subs, used_coverage);
+
+ // check for -ffina, which should apply only at the ends of words,
+ // and -finit, which should apply only at the beginnings.
+ OpenType::Tag feature = (lookups[i].features.size() == 1 ? lookups[i].features[0] : OpenType::Tag());
+ if (feature == OpenType::Tag("fina") || feature == OpenType::Tag("fin2") || feature == OpenType::Tag("fin3")) {
+ if (dvipsenc.boundary_char() < 0)
+ errh->warning("%<-ffina%> requires a boundary character\n(The input encoding didn%,t specify a boundary character, but\nI need one to implement %<-ffina%> features correctly. Try\nthe %<--boundary-char%> option.)");
+ else {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_right(bg);
+ }
+ } else if (feature == OpenType::Tag("init")) {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_left(bg);
+ }
+
+ //for (int subno = 0; subno < subs.size(); subno++) fprintf(stderr, "%5d\t%s\n", i, subs[subno].unparse().c_str());
+
+ // figure out which glyph filter to use
+ int nunderstood = metrics.apply(subs, !dvipsenc_literal, i, *lookups[i].filter, glyph_names);
+
+ // mark as used
+ int d = (understood && nunderstood == subs.size() ? F_GSUB_ALL : (nunderstood ? F_GSUB_PART : 0)) + F_GSUB_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
// apply alternate selectors
if (metrics.altselectors() && !dvipsenc_literal) {
- // do lookups
- altselector_features.swap(interesting_features);
- altselector_feature_filters.swap(feature_filters);
- Vector<Lookup> alt_lookups(gsub.nlookups(), Lookup());
- find_lookups(gsub.script_list(), gsub.feature_list(), alt_lookups, ErrorHandler::silent_handler());
- Vector<OpenType::Substitution> alt_subs;
- for (int i = 0; i < alt_lookups.size(); i++)
- if (alt_lookups[i].used) {
- OpenType::GsubLookup l = gsub.lookup(i);
- alt_subs.clear();
- (void) l.unparse_automatics(gsub, alt_subs, used_coverage);
- metrics.apply_alternates(alt_subs, i, *alt_lookups[i].filter, glyph_names);
- }
- altselector_features.swap(interesting_features);
- altselector_feature_filters.swap(feature_filters);
+ // do lookups
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ Vector<Lookup> alt_lookups(gsub.nlookups(), Lookup());
+ find_lookups(gsub.script_list(), gsub.feature_list(), alt_lookups, ErrorHandler::silent_handler());
+ Vector<OpenType::Substitution> alt_subs;
+ for (int i = 0; i < alt_lookups.size(); i++)
+ if (alt_lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ alt_subs.clear();
+ (void) l.unparse_automatics(gsub, alt_subs, used_coverage);
+ metrics.apply_alternates(alt_subs, i, *alt_lookups[i].filter, glyph_names);
+ }
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
}
}
@@ -1429,7 +1484,7 @@ static bool
kern_feature_requested()
{
return std::find(interesting_features.begin(), interesting_features.end(),
- OpenType::Tag("kern")) != interesting_features.end();
+ OpenType::Tag("kern")) != interesting_features.end();
}
static void
@@ -1437,20 +1492,20 @@ do_try_ttf_kern(Metrics& metrics, const
{
// if no GPOS "kern" lookups and "kern" requested, try "kern" table
if (!kern_feature_requested())
- return;
+ return;
try {
- OpenType::KernTable kern(otf.table("kern"), errh);
- Vector<OpenType::Positioning> poss;
- bool understood = kern.unparse_automatics(poss, errh);
- int nunderstood = metrics.apply(poss);
-
- // mark as used
- int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
- feature_usage.find_force(OpenType::Tag("kern").value()) |= d;
+ OpenType::KernTable kern(otf.table("kern"), errh);
+ Vector<OpenType::Positioning> poss;
+ bool understood = kern.unparse_automatics(poss, errh);
+ int nunderstood = metrics.apply(poss);
+
+ // mark as used
+ int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
+ feature_usage.find_force(OpenType::Tag("kern").value()) |= d;
} catch (OpenType::BlankTable) {
- // nada
+ // nada
} catch (OpenType::Error e) {
- errh->warning("kern %<%s%> error, continuing", e.description.c_str());
+ errh->warning("kern %<%s%> error, continuing", e.description.c_str());
}
}
@@ -1464,77 +1519,78 @@ do_gpos(Metrics& metrics, const OpenType
// OpenType recommends that if GPOS exists, but the "kern" feature loads
// no lookups, we use the TrueType "kern" table, if any.
if (kern_feature_requested()) {
- OpenType::Tag kern_tag("kern");
- for (Lookup *l = lookups.begin(); l != lookups.end(); ++l)
- if (std::find(l->features.begin(), l->features.end(), kern_tag) != l->features.end())
- goto skip_ttf_kern;
- do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ OpenType::Tag kern_tag("kern");
+ for (Lookup *l = lookups.begin(); l != lookups.end(); ++l)
+ if (std::find(l->features.begin(), l->features.end(), kern_tag) != l->features.end())
+ goto skip_ttf_kern;
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
skip_ttf_kern: ;
}
Vector<OpenType::Positioning> poss;
for (int i = 0; i < lookups.size(); i++)
- if (lookups[i].used) {
- OpenType::GposLookup l = gpos.lookup(i);
- poss.clear();
- bool understood = l.unparse_automatics(poss, errh);
- int nunderstood = metrics.apply(poss);
-
- // mark as used
- int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
- for (int j = 0; j < lookups[i].features.size(); j++)
- feature_usage.find_force(lookups[i].features[j].value()) |= d;
- }
+ if (lookups[i].used) {
+ OpenType::GposLookup l = gpos.lookup(i);
+ poss.clear();
+ bool understood = l.unparse_automatics(poss, errh);
+ int nunderstood = metrics.apply(poss);
+
+ // mark as used
+ int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
}
static void
do_math_spacing(Metrics &metrics, const FontInfo &finfo,
- const DvipsEncoding &dvipsenc)
+ const DvipsEncoding &dvipsenc)
{
Transform font_xform;
if (extend)
- font_xform.scale(extend, 1);
+ font_xform.scale(extend, 1);
if (slant)
- font_xform.shear(slant);
+ font_xform.shear(slant);
CharstringBounds boundser(font_xform);
double x_height = finfo.x_height(font_xform);
- double slant = font_slant(finfo);
+ double actual_slant = font_slant(finfo);
int boundary_char = dvipsenc.boundary_char();
double bounds[4], width;
for (int code = 0; code < metrics.encoding_size(); code++)
- if (metrics.was_base_glyph(code) && code != boundary_char
- && char_bounds(bounds, width, finfo, font_xform, code)) {
- int left_sb = (bounds[0] < 0 ? (int) ceil(-bounds[0]) : 0);
- metrics.add_single_positioning(code, left_sb, 0, left_sb);
-
- if (skew_char >= 0 && code < 256) {
- double virtual_height =
- (bounds[3] > x_height ? bounds[3] : x_height)
- - 0.5 * x_height;
- double right_sb = (bounds[2] > width ? bounds[2] - width : 0);
- int skew = (int) (slant * virtual_height + left_sb - right_sb);
- metrics.add_kern(code, skew_char, skew);
- }
- }
+ if (metrics.was_base_glyph(code)
+ && code != boundary_char
+ && char_bounds(bounds, width, finfo, font_xform, metrics.unicode(code))) {
+ int left_sb = (bounds[0] < 0 ? (int) ceil(-bounds[0]) : 0);
+ metrics.add_single_positioning(code, left_sb, 0, left_sb);
+
+ if (skew_char >= 0 && code < 256) {
+ double sheight = std::max(bounds[3], x_height) - 0.5 * x_height;
+ double right_sb = std::max(bounds[2] - width, 0.0);
+ double desired = left_sb + 0.5 * width + actual_slant * sheight + 0.25 * right_sb;
+ double computed = 0.5 * (left_sb + width + right_sb);
+ int skew = (int) (desired - computed);
+ metrics.add_kern(code, skew_char, skew);
+ }
+ }
}
static void
do_file(const String &otf_filename, const OpenType::Font &otf,
- const DvipsEncoding &dvipsenc_in, bool dvipsenc_literal,
- ErrorHandler *errh)
+ const DvipsEncoding &dvipsenc_in, bool dvipsenc_literal,
+ ErrorHandler *errh)
{
FontInfo finfo(&otf, errh);
if (!finfo.ok())
- return;
+ return;
if (!finfo.cff)
- errh->warning("TrueType-flavored font support is experimental");
+ errh->warning("TrueType-flavored font support is experimental");
if (override_is_fixed_pitch)
- finfo.set_is_fixed_pitch(is_fixed_pitch);
+ finfo.set_is_fixed_pitch(is_fixed_pitch);
if (override_italic_angle)
- finfo.set_italic_angle(italic_angle);
+ finfo.set_italic_angle(italic_angle);
if (override_x_height != FontInfo::x_height_auto)
finfo.set_x_height(override_x_height, x_height);
@@ -1545,15 +1601,15 @@ do_file(const String &otf_filename, cons
// set typeface name from font family name
{
- String typeface = finfo.family_name();
+ String typeface = finfo.family_name();
- // make it reasonable for the shell
- StringAccum sa;
- for (int i = 0; i < typeface.length(); i++)
- if (isalnum((unsigned char) typeface[i]) || typeface[i] == '_' || typeface[i] == '-' || typeface[i] == '.' || typeface[i] == ',' || typeface[i] == '+')
- sa << typeface[i];
+ // make it reasonable for the shell
+ StringAccum sa;
+ for (int i = 0; i < typeface.length(); i++)
+ if (isalnum((unsigned char) typeface[i]) || typeface[i] == '_' || typeface[i] == '-' || typeface[i] == '.' || typeface[i] == ',' || typeface[i] == '+')
+ sa << typeface[i];
- set_typeface(sa.length() ? sa.take_string() : font_name, false);
+ set_typeface(sa.length() ? sa.take_string() : font_name, false);
}
// initialize encoding
@@ -1562,10 +1618,10 @@ do_file(const String &otf_filename, cons
// encode boundary glyph at 256; pretend its Unicode value is '\n'
metrics.encode(256, '\n', metrics.boundary_glyph());
if (dvipsenc_literal)
- dvipsenc.make_metrics(metrics, finfo, 0, true, errh);
+ dvipsenc.make_metrics(metrics, finfo, 0, true, errh);
else {
- T1Secondary secondary(finfo, font_name, otf_filename);
- dvipsenc.make_metrics(metrics, finfo, &secondary, false, errh);
+ T1Secondary secondary(finfo, font_name, otf_filename);
+ dvipsenc.make_metrics(metrics, finfo, &secondary, false, errh);
}
// maintain statistics about features
@@ -1573,11 +1629,11 @@ do_file(const String &otf_filename, cons
// apply activated GSUB features
try {
- do_gsub(metrics, otf, dvipsenc, dvipsenc_literal, feature_usage, glyph_names, errh);
+ do_gsub(metrics, otf, dvipsenc, dvipsenc_literal, feature_usage, glyph_names, errh);
} catch (OpenType::BlankTable) {
- // nada
+ // nada
} catch (OpenType::Error e) {
- errh->warning("GSUB %<%s%> error, continuing", e.description.c_str());
+ errh->warning("GSUB %<%s%> error, continuing", e.description.c_str());
}
// apply LIGKERN ligature commands to the result
@@ -1588,15 +1644,15 @@ do_file(const String &otf_filename, cons
// reencode characters to fit within 8 bytes (+ 1 for the boundary)
if (!dvipsenc_literal)
- metrics.shrink_encoding(257, dvipsenc_in, errh);
+ metrics.shrink_encoding(257, dvipsenc_in, errh);
// apply activated GPOS features
try {
- do_gpos(metrics, otf, feature_usage, errh);
+ do_gpos(metrics, otf, feature_usage, errh);
} catch (OpenType::BlankTable) {
- do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
} catch (OpenType::Error e) {
- errh->warning("GPOS %<%s%> error, continuing", e.description.c_str());
+ errh->warning("GPOS %<%s%> error, continuing", e.description.c_str());
}
// apply LIGKERN kerning and POS positioning commands to the result
@@ -1605,11 +1661,11 @@ do_file(const String &otf_filename, cons
// use prespecified raw fonts
for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
- if (!(*be)->secondary) {
- Vector<int> mapp;
- (*be)->encoding.make_base_mappings(mapp, finfo);
- metrics.apply_base_encoding((*be)->font_name, (*be)->encoding, mapp);
- }
+ if (!(*be)->secondary) {
+ Vector<int> mapp;
+ (*be)->encoding.make_base_mappings(mapp, finfo);
+ metrics.apply_base_encoding((*be)->font_name, (*be)->encoding, mapp);
+ }
// remove extra characters
metrics.cut_encoding(257);
@@ -1618,24 +1674,24 @@ do_file(const String &otf_filename, cons
// apply letterspacing, if any
if (letterspace)
- for (int code = 0; code < metrics.encoding_size(); code++)
- if (metrics.was_base_glyph(code) && code != boundary_char) {
- metrics.add_single_positioning(code, letterspace / 2, 0, letterspace);
- if (code < 256) {
- metrics.add_kern(code, 256, -letterspace / 2);
- metrics.add_kern(256, code, -letterspace / 2);
- }
- }
+ for (int code = 0; code < metrics.encoding_size(); code++)
+ if (metrics.was_base_glyph(code) && code != boundary_char) {
+ metrics.add_single_positioning(code, letterspace / 2, 0, letterspace);
+ if (code < 256) {
+ metrics.add_kern(code, 256, -letterspace / 2);
+ metrics.add_kern(256, code, -letterspace / 2);
+ }
+ }
// apply math letterspacing, if any
if (math_spacing)
- do_math_spacing(metrics, finfo, dvipsenc);
+ do_math_spacing(metrics, finfo, dvipsenc);
// reencode right components of boundary_glyph as boundary_char
if (metrics.reencode_right_ligkern(256, boundary_char) > 0
- && boundary_char < 0) {
- errh->warning("no boundary character, ignoring some ligatures and/or kerns\n");
- errh->message("(You may want to try the --boundary-char option.)");
+ && boundary_char < 0) {
+ errh->warning("no boundary character, ignoring some ligatures and/or kerns\n");
+ errh->message("(You may want to try the --boundary-char option.)");
}
// report unused and underused features if any
@@ -1643,51 +1699,51 @@ do_file(const String &otf_filename, cons
// figure out our FONTNAME
if (!font_name) {
- // derive font name from OpenType font name
- font_name = finfo.postscript_name();
- if (encoding_file) {
- int slash = encoding_file.find_right('/') + 1;
- int dot = encoding_file.find_right('.');
- if (dot < slash) // includes dot < 0 case
- dot = encoding_file.length();
- font_name += String("--") + encoding_file.substring(slash, dot - slash);
- }
- if (interesting_scripts.size() != 2 || interesting_scripts[0] != OpenType::Tag("latn") || interesting_scripts[1].valid())
- for (int i = 0; i < interesting_scripts.size(); i += 2) {
- font_name += String("--S") + interesting_scripts[i].text();
- if (interesting_scripts[i+1].valid())
- font_name += String(".") + interesting_scripts[i+1].text();
- }
- for (int i = 0; i < interesting_features.size(); i++)
- if (feature_usage[interesting_features[i].value()])
- font_name += String("--F") + interesting_features[i].text();
+ // derive font name from OpenType font name
+ font_name = finfo.postscript_name();
+ if (encoding_file) {
+ int slash = encoding_file.find_right('/') + 1;
+ int dot = encoding_file.find_right('.');
+ if (dot < slash) // includes dot < 0 case
+ dot = encoding_file.length();
+ font_name += String("--") + encoding_file.substring(slash, dot - slash);
+ }
+ if (interesting_scripts.size() != 2 || interesting_scripts[0] != OpenType::Tag("latn") || interesting_scripts[1].valid())
+ for (int i = 0; i < interesting_scripts.size(); i += 2) {
+ font_name += String("--S") + interesting_scripts[i].text();
+ if (interesting_scripts[i+1].valid())
+ font_name += String(".") + interesting_scripts[i+1].text();
+ }
+ for (int i = 0; i < interesting_features.size(); i++)
+ if (feature_usage[interesting_features[i].value()])
+ font_name += String("--F") + interesting_features[i].text();
}
// output encoding
if (dvipsenc_literal) {
- out_encoding_name = dvipsenc_in.name();
- out_encoding_file = dvipsenc_in.filename();
+ out_encoding_name = dvipsenc_in.name();
+ out_encoding_file = dvipsenc_in.filename();
} else
- output_encoding(metrics, glyph_names, errh);
+ output_encoding(metrics, glyph_names, errh);
// set up coding scheme
if (metrics.coding_scheme())
- metrics.set_design_units(1);
+ metrics.set_design_units(1);
else
- metrics.set_coding_scheme(out_encoding_name);
+ metrics.set_coding_scheme(out_encoding_name);
// force no type 1
if (!finfo.cff && (output_flags & G_TYPE1)) {
- errh->warning("assuming --no-type1 since this font is TrueType-flavored");
- output_flags &= ~G_TYPE1;
+ errh->warning("assuming --no-type1 since this font is TrueType-flavored");
+ output_flags &= ~G_TYPE1;
}
// output
::otf_filename = otf_filename;
output_metrics(metrics, finfo.postscript_name(), dvipsenc.boundary_char(),
- finfo,
- out_encoding_name, out_encoding_file,
- font_name, main_dvips_map, errh);
+ finfo,
+ out_encoding_name, out_encoding_file,
+ font_name, main_dvips_map, errh);
}
@@ -1695,8 +1751,8 @@ String
installed_metrics_font_name(const String &base_font_name, const String &secondary)
{
for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
- if ((*be)->secondary == secondary && ::font_name == base_font_name)
- return (*be)->font_name;
+ if ((*be)->secondary == secondary && ::font_name == base_font_name)
+ return (*be)->font_name;
return String();
}
@@ -1706,16 +1762,16 @@ static int
clp_parse_char(Clp_Parser *clp, const char *arg, int complain, void *)
{
if (arg[0] && !arg[1] && !isdigit((unsigned char) arg[0])) {
- clp->val.i = (unsigned char)arg[0];
- return 1;
+ clp->val.i = (unsigned char)arg[0];
+ return 1;
} else if (arg[0] == '-' || isdigit((unsigned char) arg[0])) {
- char *end;
- clp->val.i = strtol(arg, &end, 10);
- if (clp->val.i <= 255 && !*end)
- return 1;
+ char *end;
+ clp->val.i = strtol(arg, &end, 10);
+ if (clp->val.i <= 255 && !*end)
+ return 1;
}
if (complain)
- Clp_OptionError(clp, "'%O' expects a character, not '%s'", arg);
+ Clp_OptionError(clp, "'%O' expects a character, not '%s'", arg);
return 0;
}
}
@@ -1729,51 +1785,51 @@ parse_base_encodings(const String &filen
str.c_str();
const char *s_end = str.end();
for (const char *s = str.begin(); s != s_end; ) {
- while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
- s++;
- // skip comments and blank lines
- if (s != s_end && *s != '%' && *s != '#' && *s != '\n' && *s != '\r') {
- const char *w1 = s;
- while (s != s_end && !isspace((unsigned char) *s))
- s++;
- BaseEncoding *be = new BaseEncoding;
- be->font_name = str.substring(w1, s);
- while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
- s++;
- const char *w2 = s;
- while (s != s_end && !isspace((unsigned char) *s))
- s++;
- String efile = str.substring(w2, s);
- while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
- s++;
- if (s != s_end && !isspace((unsigned char) *s) && *s != '%' && *s != '#') {
- const char *w3 = s;
- while (s != s_end && !isspace((unsigned char) *s))
- s++;
- be->secondary = str.substring(w3, s);
- }
- LandmarkErrorHandler lerrh(errh, print_filename + String(lineno));
- int before = lerrh.nerrors();
- if (be->secondary)
- /* encoding ignored */;
- else if (!efile)
- lerrh.error("missing encoding name");
- else if (String path = locate_encoding(efile, errh))
- be->encoding.parse(path, true, true, &lerrh);
- else
- lerrh.error("encoding %<%s%> not found", efile.c_str());
- if (lerrh.nerrors() == before)
- base_encodings.push_back(be);
- else
- delete be;
- }
- while (s != s_end && *s != '\n' && *s != '\r')
- s++;
- if (s != s_end && *s == '\r')
- s++;
- if (s != s_end && *s == '\n')
- s++;
- lineno++;
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ // skip comments and blank lines
+ if (s != s_end && *s != '%' && *s != '#' && *s != '\n' && *s != '\r') {
+ const char *w1 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ BaseEncoding *be = new BaseEncoding;
+ be->font_name = str.substring(w1, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ const char *w2 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ String efile = str.substring(w2, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && !isspace((unsigned char) *s) && *s != '%' && *s != '#') {
+ const char *w3 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ be->secondary = str.substring(w3, s);
+ }
+ LandmarkErrorHandler lerrh(errh, print_filename + String(lineno));
+ int before = lerrh.nerrors();
+ if (be->secondary)
+ /* encoding ignored */;
+ else if (!efile)
+ lerrh.error("missing encoding name");
+ else if (String path = locate_encoding(efile, errh))
+ be->encoding.parse(path, true, true, &lerrh);
+ else
+ lerrh.error("encoding %<%s%> not found", efile.c_str());
+ if (lerrh.nerrors() == before)
+ base_encodings.push_back(be);
+ else
+ delete be;
+ }
+ while (s != s_end && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && *s == '\r')
+ s++;
+ if (s != s_end && *s == '\n')
+ s++;
+ lineno++;
}
}
@@ -1784,7 +1840,7 @@ main(int argc, char *argv[])
handle_sigchld();
#endif
Clp_Parser *clp =
- Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
Clp_AddType(clp, CHAR_OPTTYPE, 0, clp_parse_char, 0);
program_name = Clp_ProgramName(clp);
#if HAVE_KPATHSEA
@@ -1792,13 +1848,13 @@ main(int argc, char *argv[])
#endif
#ifdef HAVE_CTIME
{
- time_t t = time(0);
- char *c = ctime(&t);
- current_time = " on " + String(c).substring(0, -1); // get rid of \n
+ time_t t = time(0);
+ char *c = ctime(&t);
+ current_time = " on " + String(c).substring(0, -1); // get rid of \n
}
#endif
for (int i = 0; i < argc; i++)
- invocation << (i ? " " : "") << argv[i];
+ invocation << (i ? " " : "") << argv[i];
ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
const char *input_file = 0;
@@ -1811,350 +1867,376 @@ main(int argc, char *argv[])
Vector<String> base_encoding_files;
bool no_ecommand = false, default_ligkern = true;
int warn_missing = -1;
+ unsigned specified_output_flags = 0;
String codingscheme;
+ const char* odirs[NUMODIR + 1];
+ for (int i = 0; i <= NUMODIR; ++i) {
+ odirs[i] = 0;
+ }
GlyphFilter current_substitution_filter;
GlyphFilter current_alternate_filter;
GlyphFilter* current_filter_ptr = &null_filter;
+ Vector<GlyphFilter*> allocated_filters;
while (1) {
- int opt = Clp_Next(clp);
- switch (opt) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
- case SCRIPT_OPT: {
- String arg = clp->vstr;
- int period = arg.find_left('.');
- OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
- if (scr.valid() && period > 0) {
- OpenType::Tag lang(arg.substring(period + 1));
- if (lang.valid()) {
- interesting_scripts.push_back(scr);
- interesting_scripts.push_back(lang);
- } else
- usage_error(errh, "bad language tag");
- } else if (scr.valid()) {
- interesting_scripts.push_back(scr);
- interesting_scripts.push_back(OpenType::Tag());
- } else
- usage_error(errh, "bad script tag");
- break;
- }
-
- case FEATURE_OPT: {
- OpenType::Tag t(clp->vstr);
- if (!t.valid())
- usage_error(errh, "bad feature tag");
- else if (feature_filters[t])
- usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
- else {
- if (!current_filter_ptr)
- current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
- interesting_features.push_back(t);
- feature_filters.insert(t, current_filter_ptr);
- }
- break;
- }
-
- case LETTER_FEATURE_OPT: {
- OpenType::Tag t(clp->vstr);
- if (!t.valid())
- usage_error(errh, "bad feature tag");
- else if (feature_filters[t])
- usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
- else {
- interesting_features.push_back(t);
- GlyphFilter* gf = new GlyphFilter;
- gf->add_substitution_filter("<Letter>", false, errh);
- *gf += current_alternate_filter;
- feature_filters.insert(t, gf);
- }
- break;
- }
-
- case SUBS_FILTER_OPT:
- current_substitution_filter = null_filter;
- /* fallthru */
- case EXCLUDE_SUBS_OPT:
- case INCLUDE_SUBS_OPT:
- current_substitution_filter.add_substitution_filter(clp->vstr, opt == EXCLUDE_SUBS_OPT, errh);
- current_filter_ptr = 0;
- break;
-
- case CLEAR_SUBS_OPT:
- current_substitution_filter = null_filter;
- current_filter_ptr = 0;
- break;
-
- case ENCODING_OPT:
- if (encoding_file)
- usage_error(errh, "encoding specified twice");
- encoding_file = clp->vstr;
+ case SCRIPT_OPT: {
+ String arg = clp->vstr;
+ int period = arg.find_left('.');
+ OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
+ if (scr.valid() && period > 0) {
+ OpenType::Tag lang(arg.substring(period + 1));
+ if (lang.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(lang);
+ } else
+ usage_error(errh, "bad language tag");
+ } else if (scr.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(OpenType::Tag());
+ } else
+ usage_error(errh, "bad script tag");
+ break;
+ }
+
+ case FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ interesting_features.push_back(t);
+ feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case LETTER_FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
+ else {
+ interesting_features.push_back(t);
+ GlyphFilter* gf = new GlyphFilter;
+ gf->add_substitution_filter("<Letter>", false, errh);
+ *gf += current_alternate_filter;
+ feature_filters.insert(t, gf);
+ }
+ break;
+ }
+
+ case SUBS_FILTER_OPT:
+ current_substitution_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_SUBS_OPT:
+ case INCLUDE_SUBS_OPT:
+ current_substitution_filter.add_substitution_filter(clp->vstr, opt == EXCLUDE_SUBS_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_SUBS_OPT:
+ current_substitution_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->vstr;
have_encoding_file = true;
- break;
+ break;
- case LITERAL_ENCODING_OPT:
- if (encoding_file)
- usage_error(errh, "encoding specified twice");
- encoding_file = clp->vstr;
+ case LITERAL_ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->vstr;
have_encoding_file = true;
- literal_encoding = true;
- break;
+ literal_encoding = true;
+ break;
+
+ case BASE_ENCODINGS_OPT:
+ base_encoding_files.push_back(clp->vstr);
+ break;
+
+ case EXTEND_OPT:
+ if (extend)
+ usage_error(errh, "extend value specified twice");
+ extend = clp->val.d;
+ break;
+
+ case SLANT_OPT:
+ if (slant)
+ usage_error(errh, "slant value specified twice");
+ slant = clp->val.d;
+ break;
+
+ case LETTERSPACE_OPT:
+ if (letterspace)
+ usage_error(errh, "letterspacing value specified twice");
+ letterspace = clp->val.i;
+ break;
+
+ case SPACE_FACTOR_OPT:
+ if (space_factor != 1)
+ usage_error(errh, "space factor specified twice");
+ space_factor = clp->val.d;
+ break;
+
+ case MATH_SPACING_OPT:
+ math_spacing = !clp->negated;
+ if (math_spacing && clp->have_val) {
+ if (clp->val.i < 0 || clp->val.i > 255)
+ usage_error(errh, "--math-spacing skew character must be between 0 and 255");
+ skew_char = clp->val.i;
+ }
+ break;
+
+ case DESIGN_SIZE_OPT:
+ if (design_size > 0)
+ usage_error(errh, "design size value specified twice");
+ else if (clp->val.d <= 0)
+ usage_error(errh, "design size must be > 0");
+ design_size = clp->val.d;
+ break;
+
+ case LIGKERN_OPT:
+ ligkern.push_back(clp->vstr);
+ break;
+
+ case POSITION_OPT:
+ pos.push_back(clp->vstr);
+ break;
+
+ case WARN_MISSING_OPT:
+ warn_missing = !clp->negated;
+ break;
+
+ case NO_ECOMMAND_OPT:
+ no_ecommand = true;
+ break;
+
+ case DEFAULT_LIGKERN_OPT:
+ default_ligkern = !clp->negated;
+ break;
+
+ case BOUNDARY_CHAR_OPT:
+ ligkern.push_back(String("|| = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_CHAR_OPT:
+ ligkern.push_back(String("^^ = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (altselector_feature_filters[t])
+ usage_error(errh, "altselector feature %<%s%> included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ altselector_features.push_back(t);
+ altselector_feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case ALTERNATES_FILTER_OPT:
+ current_alternate_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_ALTERNATES_OPT:
+ case INCLUDE_ALTERNATES_OPT:
+ current_alternate_filter.add_alternate_filter(clp->vstr, opt == EXCLUDE_ALTERNATES_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_ALTERNATES_OPT:
+ current_alternate_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case UNICODING_OPT:
+ unicoding.push_back(clp->vstr);
+ break;
+
+ case CODINGSCHEME_OPT:
+ if (codingscheme)
+ usage_error(errh, "coding scheme specified twice");
+ codingscheme = clp->vstr;
+ if (codingscheme.length() > 39)
+ errh->warning("only first 39 characters of coding scheme are significant");
+ if (codingscheme.find_left('(') >= 0 || codingscheme.find_left(')') >= 0)
+ usage_error(errh, "coding scheme cannot contain parentheses");
+ break;
+
+ case AUTOMATIC_OPT:
+ automatic = !clp->negated;
+ break;
+
+ case VENDOR_OPT:
+ if (!set_vendor(clp->vstr))
+ usage_error(errh, "vendor name specified twice");
+ break;
+
+ case TYPEFACE_OPT:
+ if (!set_typeface(clp->vstr, true))
+ usage_error(errh, "typeface name specified twice");
+ break;
+
+ case VIRTUAL_OPT:
+ if (clp->negated)
+ output_flags &= ~G_VMETRICS;
+ else
+ output_flags |= G_VMETRICS;
+ specified_output_flags |= G_VMETRICS;
+ break;
+
+ case NO_ENCODING_OPT:
+ case NO_TYPE1_OPT:
+ case NO_DOTLESSJ_OPT:
+ case NO_UPDMAP_OPT:
+ output_flags &= ~(opt - NO_OUTPUT_OPTS);
+ specified_output_flags |= opt - NO_OUTPUT_OPTS;
+ break;
+
+ case TRUETYPE_OPT:
+ case TYPE42_OPT:
+ if (!clp->negated)
+ output_flags |= (opt - YES_OUTPUT_OPTS);
+ else
+ output_flags &= ~(opt - YES_OUTPUT_OPTS);
+ specified_output_flags |= opt - YES_OUTPUT_OPTS;
+ break;
- case BASE_ENCODINGS_OPT:
- base_encoding_files.push_back(clp->vstr);
- break;
-
- case EXTEND_OPT:
- if (extend)
- usage_error(errh, "extend value specified twice");
- extend = clp->val.d;
- break;
-
- case SLANT_OPT:
- if (slant)
- usage_error(errh, "slant value specified twice");
- slant = clp->val.d;
- break;
-
- case LETTERSPACE_OPT:
- if (letterspace)
- usage_error(errh, "letterspacing value specified twice");
- letterspace = clp->val.i;
- break;
-
- case SPACE_FACTOR_OPT:
- if (space_factor != 1)
- usage_error(errh, "space factor specified twice");
- space_factor = clp->val.d;
- break;
-
- case MATH_SPACING_OPT:
- math_spacing = !clp->negated;
- if (math_spacing && clp->have_val) {
- if (clp->val.i < 0 || clp->val.i > 255)
- usage_error(errh, "--math-spacing skew character must be between 0 and 255");
- skew_char = clp->val.i;
- }
- break;
-
- case DESIGN_SIZE_OPT:
- if (design_size > 0)
- usage_error(errh, "design size value specified twice");
- else if (clp->val.d <= 0)
- usage_error(errh, "design size must be > 0");
- design_size = clp->val.d;
- break;
-
- case LIGKERN_OPT:
- ligkern.push_back(clp->vstr);
- break;
-
- case POSITION_OPT:
- pos.push_back(clp->vstr);
- break;
-
- case WARN_MISSING_OPT:
- warn_missing = !clp->negated;
- break;
-
- case NO_ECOMMAND_OPT:
- no_ecommand = true;
- break;
-
- case DEFAULT_LIGKERN_OPT:
- default_ligkern = !clp->negated;
- break;
-
- case BOUNDARY_CHAR_OPT:
- ligkern.push_back(String("|| = ") + String(clp->val.i));
- break;
-
- case ALTSELECTOR_CHAR_OPT:
- ligkern.push_back(String("^^ = ") + String(clp->val.i));
- break;
-
- case ALTSELECTOR_FEATURE_OPT: {
- OpenType::Tag t(clp->vstr);
- if (!t.valid())
- usage_error(errh, "bad feature tag");
- else if (altselector_feature_filters[t])
- usage_error(errh, "altselector feature %<%s%> included twice", t.text().c_str());
- else {
- if (!current_filter_ptr)
- current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
- altselector_features.push_back(t);
- altselector_feature_filters.insert(t, current_filter_ptr);
- }
- break;
- }
-
- case ALTERNATES_FILTER_OPT:
- current_alternate_filter = null_filter;
- /* fallthru */
- case EXCLUDE_ALTERNATES_OPT:
- case INCLUDE_ALTERNATES_OPT:
- current_alternate_filter.add_alternate_filter(clp->vstr, opt == EXCLUDE_ALTERNATES_OPT, errh);
- current_filter_ptr = 0;
- break;
-
- case CLEAR_ALTERNATES_OPT:
- current_alternate_filter = null_filter;
- current_filter_ptr = 0;
- break;
-
- case UNICODING_OPT:
- unicoding.push_back(clp->vstr);
- break;
-
- case CODINGSCHEME_OPT:
- if (codingscheme)
- usage_error(errh, "coding scheme specified twice");
- codingscheme = clp->vstr;
- if (codingscheme.length() > 39)
- errh->warning("only first 39 characters of coding scheme are significant");
- if (codingscheme.find_left('(') >= 0 || codingscheme.find_left(')') >= 0)
- usage_error(errh, "coding scheme cannot contain parentheses");
- break;
-
- case AUTOMATIC_OPT:
- automatic = !clp->negated;
- break;
-
- case VENDOR_OPT:
- if (!set_vendor(clp->vstr))
- usage_error(errh, "vendor name specified twice");
- break;
-
- case TYPEFACE_OPT:
- if (!set_typeface(clp->vstr, true))
- usage_error(errh, "typeface name specified twice");
- break;
-
- case VIRTUAL_OPT:
- if (clp->negated)
- output_flags &= ~G_VMETRICS;
- else
- output_flags |= G_VMETRICS;
- break;
-
- case NO_ENCODING_OPT:
- case NO_TYPE1_OPT:
- case NO_DOTLESSJ_OPT:
- case NO_UPDMAP_OPT:
- output_flags &= ~(opt - NO_OUTPUT_OPTS);
- break;
-
- case TRUETYPE_OPT:
- case TYPE42_OPT:
- if (!clp->negated)
- output_flags |= (opt - YES_OUTPUT_OPTS);
- else
- output_flags &= ~(opt - YES_OUTPUT_OPTS);
- break;
-
- case OUTPUT_ENCODING_OPT:
- if (out_encoding_file)
- usage_error(errh, "encoding output file specified twice");
- out_encoding_file = (clp->have_val ? clp->vstr : "-");
- output_flags = G_ENCODING;
- break;
-
- case MINIMUM_KERN_OPT:
- minimum_kern = clp->val.d;
- break;
-
- case MAP_FILE_OPT:
- if (clp->negated)
- output_flags &= ~G_PSFONTSMAP;
- else {
- output_flags |= G_PSFONTSMAP;
- if (!set_map_file(clp->vstr))
- usage_error(errh, "map file specified twice");
- }
- break;
-
- case PL_OPT:
- output_flags = (output_flags & ~G_BINARY) | G_ASCII;
- break;
-
- case TFM_OPT:
- output_flags = (output_flags & ~G_ASCII) | G_BINARY;
- break;
-
- case ENCODING_DIR_OPT:
- case TFM_DIR_OPT:
- case PL_DIR_OPT:
- case VF_DIR_OPT:
- case VPL_DIR_OPT:
- case TYPE1_DIR_OPT:
- case TRUETYPE_DIR_OPT:
- case TYPE42_DIR_OPT:
- if (!setodir(opt - DIR_OPTS, clp->vstr))
- usage_error(errh, "%s directory specified twice", odirname(opt - DIR_OPTS));
- break;
-
- case FONT_NAME_OPT:
- font_name:
- if (font_name)
- usage_error(errh, "font name specified twice");
- font_name = clp->vstr;
- break;
-
- case FIXED_PITCH_OPT:
- override_is_fixed_pitch = true;
- is_fixed_pitch = !clp->negated;
- break;
-
- case PROPORTIONAL_WIDTH_OPT:
- override_is_fixed_pitch = true;
- is_fixed_pitch = !!clp->negated;
- break;
-
- case ITALIC_ANGLE_OPT:
- override_italic_angle = true;
- italic_angle = clp->val.d;
- break;
-
- case GLYPHLIST_OPT:
- glyphlist_files.push_back(clp->vstr);
- break;
-
- case QUERY_FEATURES_OPT:
- usage_error(errh, "run %<otfinfo --query-features%> instead");
- break;
-
- case QUERY_SCRIPTS_OPT:
- usage_error(errh, "run %<otfinfo --query-scripts%> instead");
- break;
-
- case QUIET_OPT:
- if (clp->negated)
- errh = ErrorHandler::default_handler();
- else
- // 9.Nov.05 -- need a new SilentErrorHandler, because we use
- // the base SilentErrorHandler elsewhere to ignore errors
- errh = new SilentErrorHandler;
- break;
-
- case VERBOSE_OPT:
- verbose = !clp->negated;
- break;
-
- case NOCREATE_OPT:
- no_create = clp->negated;
- break;
-
- case FORCE_OPT:
- force = !clp->negated;
- break;
+ case OUTPUT_ENCODING_OPT:
+ if (out_encoding_file)
+ usage_error(errh, "encoding output file specified twice");
+ out_encoding_file = (clp->have_val ? clp->vstr : "-");
+ output_flags = G_ENCODING;
+ specified_output_flags = -1;
+ break;
+
+ case MINIMUM_KERN_OPT:
+ minimum_kern = clp->val.d;
+ break;
+
+ case MAP_FILE_OPT:
+ if (clp->negated)
+ output_flags &= ~G_PSFONTSMAP;
+ else {
+ output_flags |= G_PSFONTSMAP;
+ if (!set_map_file(clp->vstr))
+ usage_error(errh, "map file specified twice");
+ }
+ specified_output_flags |= G_PSFONTSMAP;
+ break;
+
+ case PL_OPT:
+ if (clp->negated)
+ output_flags &= ~G_ASCII;
+ else
+ output_flags |= G_ASCII;
+ specified_output_flags |= G_ASCII;
+ break;
+
+ case TFM_OPT:
+ if (clp->negated)
+ output_flags &= ~G_BINARY;
+ else
+ output_flags |= G_BINARY;
+ specified_output_flags |= G_BINARY;
+ break;
+
+ case ENCODING_DIR_OPT:
+ case TFM_DIR_OPT:
+ case PL_DIR_OPT:
+ case VF_DIR_OPT:
+ case VPL_DIR_OPT:
+ case TYPE1_DIR_OPT:
+ case TRUETYPE_DIR_OPT:
+ case TYPE42_DIR_OPT:
+ case DIR_OPT:
+ if (!odirs[opt - DIR_OPTS])
+ odirs[opt - DIR_OPTS] = clp->vstr;
+ else
+ usage_error(errh, "%s directory specified twice", odirname(opt - DIR_OPTS));
+ break;
- case KPATHSEA_DEBUG_OPT:
+ case FONT_NAME_OPT:
+ font_name:
+ if (font_name)
+ usage_error(errh, "font name specified twice");
+ font_name = clp->vstr;
+ break;
+
+ case FIXED_PITCH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !clp->negated;
+ break;
+
+ case PROPORTIONAL_WIDTH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !!clp->negated;
+ break;
+
+ case ITALIC_ANGLE_OPT:
+ override_italic_angle = true;
+ italic_angle = clp->val.d;
+ break;
+
+ case GLYPHLIST_OPT:
+ glyphlist_files.push_back(clp->vstr);
+ break;
+
+ case QUERY_FEATURES_OPT:
+ usage_error(errh, "run %<otfinfo --query-features%> instead");
+ break;
+
+ case QUERY_SCRIPTS_OPT:
+ usage_error(errh, "run %<otfinfo --query-scripts%> instead");
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ // 9.Nov.05 -- need a new SilentErrorHandler, because we use
+ // the base SilentErrorHandler elsewhere to ignore errors
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case NOCREATE_OPT:
+ no_create = clp->negated;
+ break;
+
+ case FORCE_OPT:
+ force = !clp->negated;
+ break;
+
+ case KPATHSEA_DEBUG_OPT:
#if HAVE_KPATHSEA
- kpsei_set_debug_flags(clp->val.u);
+ kpsei_set_debug_flags(clp->val.u);
#else
- errh->warning("Not compiled with kpathsea!");
+ errh->warning("Not compiled with kpathsea!");
#endif
- break;
+ break;
case X_HEIGHT_OPT: {
char* ends;
@@ -2169,127 +2251,141 @@ main(int argc, char *argv[])
&& *ends == 0 && *clp->vstr != 0)
override_x_height = FontInfo::x_height_explicit;
else
- usage_error(errh, "bad --x-height option");
+ usage_error(errh, "bad --x-height option");
break;
}
- case VERSION_OPT:
- printf("otftotfm (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2002-2016 Eddie Kohler\n\
+ case VERSION_OPT:
+ printf("otftotfm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
- exit(0);
- break;
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && font_name)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto font_name;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
- case HELP_OPT:
- usage();
- exit(0);
- break;
-
- case Clp_NotOption:
- if (input_file && font_name)
- usage_error(errh, "too many arguments");
- else if (input_file)
- goto font_name;
- else
- input_file = clp->vstr;
- break;
-
- case Clp_Done:
- goto done;
-
- case Clp_BadOption:
- usage_error(errh, 0);
- break;
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
- default:
- break;
+ default:
+ break;
- }
+ }
}
done:
// check for odd option combinations
if (warn_missing > 0 && !(output_flags & G_VMETRICS))
- errh->warning("%<--warn-missing%> has no effect with %<--no-virtual%>");
+ errh->warning("%<--warn-missing%> has no effect with %<--no-virtual%>");
+ if (!(specified_output_flags & (G_BINARY | G_ASCII)))
+ output_flags |= G_BINARY;
// set up file names
if (!input_file)
- usage_error(errh, "no font filename provided");
+ usage_error(errh, "no font filename provided");
if (encoding_file == "-")
- encoding_file = "";
+ encoding_file = "";
+
+ // set up output directories
+ if (odirs[NUMODIR]) {
+ for (int i = 0; i < NUMODIR; ++i)
+ if (!odirs[i])
+ odirs[i] = odirs[NUMODIR];
+ }
+ for (int i = 0; i < NUMODIR; ++i)
+ if (odirs[i])
+ setodir(i, odirs[i]);
// set up feature filters
if (!altselector_features.size()) {
- if (!current_filter_ptr)
- current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
- altselector_features.push_back(OpenType::Tag("dlig"));
- altselector_feature_filters.insert(OpenType::Tag("dlig"), current_filter_ptr);
- altselector_features.push_back(OpenType::Tag("salt"));
- altselector_feature_filters.insert(OpenType::Tag("salt"), current_filter_ptr);
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ altselector_features.push_back(OpenType::Tag("dlig"));
+ altselector_feature_filters.insert(OpenType::Tag("dlig"), current_filter_ptr);
+ altselector_features.push_back(OpenType::Tag("salt"));
+ altselector_feature_filters.insert(OpenType::Tag("salt"), current_filter_ptr);
} else if (!current_filter_ptr) {
- errh->warning("some filtering options ignored");
- errh->message("(--include-*, --exclude-*, and --*-filter options must occur\nbefore the feature options to which they should apply.)");
+ errh->warning("some filtering options ignored");
+ errh->message("(--include-*, --exclude-*, and --*-filter options must occur\nbefore the feature options to which they should apply.)");
}
try {
- // read font
- otf_data = read_file(input_file, errh);
- if (errh->nerrors())
- exit(1);
-
- LandmarkErrorHandler cerrh(errh, printable_filename(input_file));
- BailErrorHandler bail_errh(&cerrh);
-
- OpenType::Font otf(otf_data, &bail_errh);
- assert(otf.ok());
-
- // figure out scripts we care about
- if (!interesting_scripts.size()) {
- interesting_scripts.push_back(Efont::OpenType::Tag("latn"));
- interesting_scripts.push_back(Efont::OpenType::Tag());
- }
- std::sort(interesting_features.begin(), interesting_features.end());
- std::sort(altselector_features.begin(), altselector_features.end());
+ // read font
+ otf_data = read_file(input_file, errh);
+ if (errh->nerrors())
+ exit(1);
+
+ LandmarkErrorHandler cerrh(errh, printable_filename(input_file));
+ BailErrorHandler bail_errh(&cerrh);
+
+ OpenType::Font otf(otf_data, &bail_errh);
+ assert(otf.ok());
+
+ // figure out scripts we care about
+ if (!interesting_scripts.size()) {
+ interesting_scripts.push_back(Efont::OpenType::Tag("latn"));
+ interesting_scripts.push_back(Efont::OpenType::Tag());
+ }
+ std::sort(interesting_features.begin(), interesting_features.end());
+ std::sort(altselector_features.begin(), altselector_features.end());
- // find glyphlist
- if (!glyphlist_files.size()) {
+ // find glyphlist
+ if (!glyphlist_files.size()) {
#if HAVE_KPATHSEA
- if (String g = kpsei_find_file("glyphlist.txt", KPSEI_FMT_MAP)) {
- glyphlist_files.push_back(g);
- if (verbose)
- errh->message("glyphlist.txt found with kpathsea at %s", g.c_str());
- } else
+ if (String g = kpsei_find_file("glyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("glyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
#endif
- glyphlist_files.push_back(GLYPHLISTDIR "/glyphlist.txt");
+ glyphlist_files.push_back(GLYPHLISTDIR "/glyphlist.txt");
#if HAVE_KPATHSEA
- if (String g = kpsei_find_file("texglyphlist.txt", KPSEI_FMT_MAP)) {
- glyphlist_files.push_back(g);
- if (verbose)
- errh->message("texglyphlist.txt found with kpathsea at %s", g.c_str());
- } else
+ if (String g = kpsei_find_file("texglyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("texglyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
#endif
- glyphlist_files.push_back(GLYPHLISTDIR "/texglyphlist.txt");
- }
+ glyphlist_files.push_back(GLYPHLISTDIR "/texglyphlist.txt");
+ }
- // read glyphlist
- for (String *g = glyphlist_files.begin(); g < glyphlist_files.end(); g++)
- if (String s = read_file(*g, errh, true))
- DvipsEncoding::add_glyphlist(s);
-
- // read base encodings
- for (String *s = base_encoding_files.begin(); s < base_encoding_files.end(); s++)
- parse_base_encodings(*s, errh);
-
- // read encoding
- DvipsEncoding dvipsenc;
- if (encoding_file) {
- if (String path = locate_encoding(encoding_file, errh))
- dvipsenc.parse(path, no_ecommand, no_ecommand, errh);
- else
- errh->fatal("encoding %<%s%> not found", encoding_file.c_str());
- } else {
+ // read glyphlist
+ for (String *g = glyphlist_files.begin(); g < glyphlist_files.end(); g++)
+ if (String s = read_file(*g, errh, true))
+ DvipsEncoding::add_glyphlist(s);
+
+ // read base encodings
+ for (String *s = base_encoding_files.begin(); s < base_encoding_files.end(); s++)
+ parse_base_encodings(*s, errh);
+
+ // read encoding
+ DvipsEncoding dvipsenc;
+ if (encoding_file) {
+ if (String path = locate_encoding(encoding_file, errh))
+ dvipsenc.parse(path, no_ecommand, no_ecommand, errh);
+ else
+ errh->fatal("encoding %<%s%> not found", encoding_file.c_str());
+ } else {
String cff_data(otf.table("CFF"));
if (!cff_data) {
errh->error("explicit encoding required for TrueType fonts");
@@ -2300,42 +2396,44 @@ particular purpose.\n");
errh->message("(Use %<-e ENCODING%> to choose an encoding. %<-e texnansx%> often works,\nor say %<-e -%> to turn off this warning.)");
}
- // use encoding from font
- Cff cff(cff_data, otf.units_per_em(), &bail_errh);
- Cff::FontParent *font = cff.font(PermString(), &bail_errh);
- assert(cff.ok() && font->ok());
- if (Type1Encoding *t1e = font->type1_encoding()) {
- for (int i = 0; i < 256; i++)
- dvipsenc.encode(i, (*t1e)[i]);
- } else
- errh->fatal("font has no encoding, specify one explicitly");
- delete font;
- }
-
- // apply default ligkern commands
- if (default_ligkern)
- dvipsenc.parse_ligkern(default_ligkerns, 0, ErrorHandler::silent_handler());
-
- // apply command-line ligkern commands and coding scheme
- cerrh.set_landmark("--ligkern command");
- for (int i = 0; i < ligkern.size(); i++)
- dvipsenc.parse_ligkern(ligkern[i], 1, &cerrh);
- cerrh.set_landmark("--position command");
- for (int i = 0; i < pos.size(); i++)
- dvipsenc.parse_position(pos[i], 1, &cerrh);
- cerrh.set_landmark("--unicoding command");
- for (int i = 0; i < unicoding.size(); i++)
- dvipsenc.parse_unicoding(unicoding[i], 1, &cerrh);
- if (codingscheme)
- dvipsenc.set_coding_scheme(codingscheme);
- if (warn_missing >= 0)
- dvipsenc.set_warn_missing(warn_missing);
+ // use encoding from font
+ Cff cff(cff_data, otf.units_per_em(), &bail_errh);
+ Cff::FontParent *font = cff.font(PermString(), &bail_errh);
+ assert(cff.ok() && font->ok());
+ if (Type1Encoding *t1e = font->type1_encoding()) {
+ for (int i = 0; i < 256; i++)
+ dvipsenc.encode(i, (*t1e)[i]);
+ } else
+ errh->fatal("font has no encoding, specify one explicitly");
+ }
+
+ // apply default ligkern commands
+ if (default_ligkern)
+ dvipsenc.parse_ligkern(default_ligkerns, 0, ErrorHandler::silent_handler());
+
+ // apply command-line ligkern commands and coding scheme
+ cerrh.set_landmark("--ligkern command");
+ for (int i = 0; i < ligkern.size(); i++)
+ dvipsenc.parse_ligkern(ligkern[i], 1, &cerrh);
+ cerrh.set_landmark("--position command");
+ for (int i = 0; i < pos.size(); i++)
+ dvipsenc.parse_position(pos[i], 1, &cerrh);
+ cerrh.set_landmark("--unicoding command");
+ for (int i = 0; i < unicoding.size(); i++)
+ dvipsenc.parse_unicoding(unicoding[i], 1, &cerrh);
+ if (codingscheme)
+ dvipsenc.set_coding_scheme(codingscheme);
+ if (warn_missing >= 0)
+ dvipsenc.set_warn_missing(warn_missing);
- do_file(input_file, otf, dvipsenc, literal_encoding, errh);
+ do_file(input_file, otf, dvipsenc, literal_encoding, errh);
} catch (OpenType::Error e) {
- errh->error("unhandled exception %<%s%>", e.description.c_str());
+ errh->error("unhandled exception %<%s%>", e.description.c_str());
}
+ for (int i = 0; i < allocated_filters.size(); ++i)
+ delete allocated_filters[i];
+ Clp_DeleteParser(clp);
return (errh->nerrors() == 0 ? 0 : 1);
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh 2018-02-23 12:47:54.094971678 -0500
@@ -11,11 +11,11 @@ String suffix_font_name(const String &fo
String installed_metrics_font_name(const String &font_name, const String &secondary);
void output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
- const FontInfo &finfo,
- const String &encoding_name, const String &encoding_file,
- const String &font_name,
- String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
- ErrorHandler *errh);
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
+ ErrorHandler *errh);
double font_cap_height(const FontInfo &, const Transform &);
double font_ascender(const FontInfo &, const Transform &);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc 2018-02-23 12:47:54.094971678 -0500
@@ -1,6 +1,6 @@
/* secondary.{cc,hh} -- code for generating fake glyphs
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -33,45 +33,43 @@
#include <algorithm>
enum {
- U_EXCLAMDOWN = 0x00A1, // U+00A1 INVERTED EXCLAMATION MARK
- U_DEGREE = 0x00B0, // U+00B0 DEGREE SIGN
- U_QUESTIONDOWN = 0x00BF, // U+00BF INVERTED QUESTION MARK
- U_IJ = 0x0132, // U+0132 LATIN CAPITAL LIGATURE IJ
- U_ij = 0x0133, // U+0133 LATIN SMALL LIGATURE IJ
- U_DOTLESSJ = 0x0237, // U+0237 LATIN SMALL LETTER DOTLESS J
- U_RINGABOVE = 0x02DA, // U+02DA RING ABOVE
+ U_EXCLAMDOWN = 0x00A1, // U+00A1 INVERTED EXCLAMATION MARK
+ U_DEGREE = 0x00B0, // U+00B0 DEGREE SIGN
+ U_QUESTIONDOWN = 0x00BF, // U+00BF INVERTED QUESTION MARK
+ U_IJ = 0x0132, // U+0132 LATIN CAPITAL LIGATURE IJ
+ U_ij = 0x0133, // U+0133 LATIN SMALL LIGATURE IJ
+ U_DOTLESSJ = 0x0237, // U+0237 LATIN SMALL LETTER DOTLESS J
+ U_RINGABOVE = 0x02DA, // U+02DA RING ABOVE
U_COMBININGRINGABOVE = 0x030A, // U+030A COMBINING RING ABOVE
- U_CWM = 0x200C, // U+200C ZERO WIDTH NON-JOINER
- U_ENDASH = 0x2013, // U+2013 EN DASH
- U_PERTENTHOUSAND = 0x2031, // U+2031 PER TEN THOUSAND SIGN
- U_INTERROBANG = 0x203D, // U+203D INTERROBANG
- U_FRACTION = 0x2044, // U+2044 FRACTION SLASH
- U_CENTIGRADE = 0x2103, // U+2103 DEGREE CELSIUS
- U_ASTERISKMATH = 0x2217, // U+2217 ASTERISK OPERATOR
- U_BARDBL = 0x2225, // U+2225 PARALLEL TO
- U_VISIBLESPACE = 0x2423, // U+2423 OPEN BOX
- U_DBLBRACKETLEFT = 0x27E6, // U+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
- U_DBLBRACKETRIGHT = 0x27E7, // U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ U_CWM = 0x200C, // U+200C ZERO WIDTH NON-JOINER
+ U_ENDASH = 0x2013, // U+2013 EN DASH
+ U_PERTENTHOUSAND = 0x2031, // U+2031 PER TEN THOUSAND SIGN
+ U_INTERROBANG = 0x203D, // U+203D INTERROBANG
+ U_FRACTION = 0x2044, // U+2044 FRACTION SLASH
+ U_CENTIGRADE = 0x2103, // U+2103 DEGREE CELSIUS
+ U_ASTERISKMATH = 0x2217, // U+2217 ASTERISK OPERATOR
+ U_BARDBL = 0x2225, // U+2225 PARALLEL TO
+ U_VISIBLESPACE = 0x2423, // U+2423 OPEN BOX
+ U_DBLBRACKETLEFT = 0x27E6, // U+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ U_DBLBRACKETRIGHT = 0x27E7, // U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
U_INTERROBANGDOWN = 0x2E18, // U+2E18 INVERTED INTERROBANG
- U_EMPTYSLOT = 0xD801, // invalid Unicode (not handled by Secondary)
- U_ALTSELECTOR = 0xD802, // invalid Unicode
- U_CAPITALCWM = 0xD809, // invalid Unicode
- U_ASCENDERCWM = 0xD80A, // invalid Unicode
- U_TWELVEUDASH = 0xD80C, // invalid Unicode
- U_RINGFITTED = 0xD80D, // invalid Unicode
+ U_ALTSELECTOR = 0xD802, // invalid Unicode
+ U_CAPITALCWM = 0xD809, // invalid Unicode
+ U_ASCENDERCWM = 0xD80A, // invalid Unicode
+ U_TWELVEUDASH = 0xD80C, // invalid Unicode
+ U_RINGFITTED = 0xD80D, // invalid Unicode
// BEGIN BACKWARDS COMPATIBILITY -- newer texglyphlist.txt does not include
// these code points
- U_SS = 0xD800, // invalid Unicode
- U_SSSMALL = 0xD803, // invalid Unicode
- U_FFSMALL = 0xD804, // invalid Unicode
- U_FISMALL = 0xD805, // invalid Unicode
- U_FLSMALL = 0xD806, // invalid Unicode
- U_FFISMALL = 0xD807, // invalid Unicode
- U_FFLSMALL = 0xD808, // invalid Unicode
+ U_SS = 0xD800, // invalid Unicode
+ U_SSSMALL = 0xD803, // invalid Unicode
+ U_FFSMALL = 0xD804, // invalid Unicode
+ U_FISMALL = 0xD805, // invalid Unicode
+ U_FLSMALL = 0xD806, // invalid Unicode
+ U_FFISMALL = 0xD807, // invalid Unicode
+ U_FFLSMALL = 0xD808, // invalid Unicode
// END BACKWARDS COMPATIBILITY
- U_USE_KERNX = 0xD80E, // invalid Unicode, not in maps
U_VS1 = 0xFE00,
U_VS16 = 0xFE0F,
U_VS17 = 0xE0100,
@@ -82,7 +80,7 @@ enum {
U_ISMALL = 0xF769,
U_LSMALL = 0xF76C,
U_SSMALL = 0xF773,
- U_MATHDOTLESSJ = 0x1D6A5 // U+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
+ U_MATHDOTLESSJ = 0x1D6A5 // U+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
};
@@ -95,27 +93,27 @@ FontInfo::FontInfo(const Efont::OpenType
assert(cmap->ok());
if (String cff_string = otf->table("CFF")) {
- cff_file = new Efont::Cff(cff_string, otf->units_per_em(), errh);
- if (!cff_file->ok())
- return;
- Efont::Cff::FontParent *fp = cff_file->font(PermString(), errh);
- if (!fp || !fp->ok())
- return;
- if (!(cff = dynamic_cast<Efont::Cff::Font *>(fp))) {
- errh->error("CID-keyed fonts not supported");
- return;
- }
- _nglyphs = cff->nglyphs();
+ cff_file = new Efont::Cff(cff_string, otf->units_per_em(), errh);
+ if (!cff_file->ok())
+ return;
+ Efont::Cff::FontParent *fp = cff_file->font(PermString(), errh);
+ if (!fp || !fp->ok())
+ return;
+ if (!(cff = dynamic_cast<Efont::Cff::Font *>(fp))) {
+ errh->error("CID-keyed fonts not supported");
+ return;
+ }
+ _nglyphs = cff->nglyphs();
}
if (!cff) {
- post = new Efont::OpenType::Post(otf->table("post"), errh);
- // read number of glyphs from 'maxp' -- should probably be elsewhere
- if (Efont::OpenType::Data maxp = otf->table("maxp"))
- if (maxp.length() >= 6)
- _nglyphs = maxp.u16(4);
- if (_nglyphs < 0 && post->ok())
- _nglyphs = post->nglyphs();
+ post = new Efont::OpenType::Post(otf->table("post"), errh);
+ // read number of glyphs from 'maxp' -- should probably be elsewhere
+ if (Efont::OpenType::Data maxp = otf->table("maxp"))
+ if (maxp.length() >= 6)
+ _nglyphs = maxp.u16(4);
+ if (_nglyphs < 0 && post->ok())
+ _nglyphs = post->nglyphs();
}
name = new Efont::OpenType::Name(otf->table("name"), errh);
@@ -125,7 +123,6 @@ FontInfo::~FontInfo()
{
delete cmap;
delete cff_file;
- delete cff;
delete post;
delete name;
delete _ttb_program;
@@ -135,9 +132,9 @@ bool
FontInfo::ok() const
{
if (cff)
- return cmap->ok() && cff->ok();
+ return cmap->ok() && cff->ok();
else
- return post && post->ok() && name && name->ok();
+ return post && post->ok() && name && name->ok();
}
bool
@@ -151,16 +148,16 @@ int
FontInfo::glyphid(PermString name) const
{
if (cff)
- return cff->glyphid(name);
+ return cff->glyphid(name);
else {
- if (!_got_glyph_names) {
- glyph_names(_glyph_names);
- _got_glyph_names = true;
- }
- PermString *found = std::find(_glyph_names.begin(), _glyph_names.end(), name);
- if (found == _glyph_names.end())
- return 0;
- return found - _glyph_names.begin();
+ if (!_got_glyph_names) {
+ glyph_names(_glyph_names);
+ _got_glyph_names = true;
+ }
+ PermString *found = std::find(_glyph_names.begin(), _glyph_names.end(), name);
+ if (found == _glyph_names.end())
+ return 0;
+ return found - _glyph_names.begin();
}
}
@@ -168,29 +165,29 @@ String
FontInfo::family_name() const
{
if (cff)
- return cff->dict_string(Efont::Cff::oFamilyName);
+ return cff->dict_string(Efont::Cff::oFamilyName);
else
- return name->english_name(Efont::OpenType::Name::N_FAMILY);
+ return name->english_name(Efont::OpenType::Name::N_FAMILY);
}
String
FontInfo::postscript_name() const
{
if (cff)
- return cff->font_name();
+ return cff->font_name();
else
- return name->english_name(Efont::OpenType::Name::N_POSTSCRIPT);
+ return name->english_name(Efont::OpenType::Name::N_POSTSCRIPT);
}
const Efont::CharstringProgram *
FontInfo::program() const
{
if (cff)
- return cff;
+ return cff;
else {
- if (!_ttb_program)
- _ttb_program = new Efont::TrueTypeBoundsCharstringProgram(otf);
- return _ttb_program;
+ if (!_ttb_program)
+ _ttb_program = new Efont::TrueTypeBoundsCharstringProgram(otf);
+ return _ttb_program;
}
}
@@ -198,25 +195,25 @@ bool
FontInfo::is_fixed_pitch() const
{
if (_override_is_fixed_pitch)
- return _is_fixed_pitch;
+ return _is_fixed_pitch;
else if (cff) {
- double d;
- return (cff->dict_value(Efont::Cff::oIsFixedPitch, &d) && d);
+ double d;
+ return (cff->dict_value(Efont::Cff::oIsFixedPitch, &d) && d);
} else
- return post->is_fixed_pitch();
+ return post->is_fixed_pitch();
}
double
FontInfo::italic_angle() const
{
if (_override_italic_angle)
- return _italic_angle;
+ return _italic_angle;
else if (cff) {
- double d;
- (void) cff->dict_value(Efont::Cff::oItalicAngle, &d);
- return d;
+ double d;
+ (void) cff->dict_value(Efont::Cff::oItalicAngle, &d);
+ return d;
} else
- return post->italic_angle();
+ return post->italic_angle();
}
double FontInfo::x_height(const Transform& font_xform) const {
@@ -224,8 +221,8 @@ double FontInfo::x_height(const Transfor
return _x_height;
double x1 = -1, x2 = -1;
if (_override_x_height != x_height_os2)
- // XXX what if 'x', 'm', 'z' were subject to substitution?
- x1 = char_one_bound(*this, font_xform, 3, false, units_per_em(),
+ // XXX what if 'x', 'm', 'z' were subject to substitution?
+ x1 = char_one_bound(*this, font_xform, 3, false, units_per_em(),
(int) 'x', (int) 'm', (int) 'z', 0);
if (_override_x_height != x_height_x)
try {
@@ -234,8 +231,10 @@ double FontInfo::x_height(const Transfor
} catch (Efont::OpenType::Bounds) {
}
static bool warned = false;
- if (_override_x_height == x_height_auto && x1 >= 0 && x2 >= 0
- && fabs(x1 - x2) > units_per_em() / 100.) {
+ if (_override_x_height == x_height_auto
+ && x1 >= 0
+ && x2 >= 0
+ && fabs(x1 - x2) > units_per_em() / 50.) {
if (!warned) {
ErrorHandler* errh = ErrorHandler::default_handler();
errh->warning("font x-height and height of %<x%> differ by %d%%", (int) (fabs(x1 - x2) * 100 / units_per_em()));
@@ -256,115 +255,82 @@ Secondary::~Secondary()
bool
Secondary::encode_uni(int code, PermString name,
- const uint32_t *uni_begin, const uint32_t *uni_end,
- Metrics &metrics, ErrorHandler *errh)
+ const uint32_t* uni_begin, const uint32_t* uni_end,
+ Metrics &metrics, ErrorHandler *errh)
{
+ uint32_t uni = 0;
if (uni_begin + 1 == uni_end)
- return encode_uni(code, name, *uni_begin, metrics, errh);
- else {
- Vector<Setting> v;
- int max_s = 0;
- while (uni_begin != uni_end) {
- Vector<Setting> subv;
- int s = setting(*uni_begin, subv, metrics, errh);
- if (s == 0)
- return false;
- if (subv.size() && v.size())
- v.push_back(Setting(Setting::KERN));
- for (Vector<Setting>::const_iterator it = subv.begin();
- it != subv.end(); ++it)
- v.push_back(*it);
- max_s = (max_s > s ? max_s : s);
- ++uni_begin;
- }
- metrics.encode_virtual(code, name, 0, v, max_s > 1);
- return true;
+ uni = *uni_begin;
+
+ SettingSet set(this, metrics);
+ int max_s = 0;
+ while (uni_begin != uni_end) {
+ int s = setting(*uni_begin, set, errh);
+ if (s == 0)
+ return false;
+ max_s = (max_s > s ? max_s : s);
+ ++uni_begin;
+ set.checkpoint();
}
-}
-bool
-Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics &metrics, ErrorHandler *errh)
-{
- Vector<Setting> v;
- if (int s = setting(uni, v, metrics, errh)) {
- metrics.encode_virtual(code, name, uni, v, s > 1);
- return true;
- } else if (_next)
- return _next->encode_uni(code, name, uni, metrics, errh);
- else
- return false;
+ if (uni == U_ALTSELECTOR
+ || (uni >= U_VS1 && uni <= U_VS16)
+ || (uni >= U_VS17 && uni <= U_VS256)) {
+ int selector = 0;
+ if (uni >= U_VS1 && uni <= U_VS16)
+ selector = uni - U_VS1 + 1;
+ else if (uni >= U_VS17 && uni <= U_VS256)
+ selector = uni - U_VS17 + 17;
+ metrics.add_altselector_code(code, selector);
+ name = selector ? permprintf("<vs%d>", selector) : PermString("<altselector>");
+ }
+
+ metrics.encode_virtual(code, name, 0, set.settings(), max_s > 1);
+ return true;
}
T1Secondary::T1Secondary(const FontInfo &finfo, const String &font_name,
- const String &otf_file_name)
- : _finfo(finfo), _font_name(font_name), _otf_file_name(otf_file_name),
+ const String &otf_file_name)
+ : Secondary(finfo), _font_name(font_name), _otf_file_name(otf_file_name),
_units_per_em(finfo.units_per_em()),
_xheight((int) ceil(finfo.x_height(Transform()))),
_spacewidth(_units_per_em)
{
double bounds[4], width;
if (char_bounds(bounds, width, finfo, Transform(), ' '))
- _spacewidth = (int) ceil(width);
+ _spacewidth = (int) ceil(width);
}
int
-Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+Secondary::setting(uint32_t uni, SettingSet& set, ErrorHandler *errh)
{
if (_next)
- return _next->setting(uni, v, metrics, errh);
+ return _next->setting(uni, set, errh);
else
- return 0;
+ return 0;
}
-bool
-T1Secondary::char_setting(Vector<Setting> &v, Metrics &metrics, int uni, ...)
-{
- Vector<int> codes;
-
- // collect codes
- va_list val;
- va_start(val, uni);
-
- int kerntype = Setting::KERN;
- if (uni == U_USE_KERNX) {
- kerntype = Setting::KERNX;
- uni = va_arg(val, int);
- }
-
- for (; uni; uni = va_arg(val, int)) {
- int code = metrics.unicode_encoding(uni);
- if (code < 0) {
- Glyph glyph = _finfo.cmap->map_uni(uni);
- if (glyph == 0 || (code = metrics.force_encoding(glyph)) < 0)
- return false;
- }
- codes.push_back(code);
- }
- va_end(val);
-
- // generate setting
- for (int i = 0; i < codes.size(); i++) {
- if (i)
- v.push_back(Setting(kerntype));
- v.push_back(Setting(Setting::SHOW, codes[i], metrics.base_glyph(codes[i])));
+SettingSet& SettingSet::show(int uni) {
+ if (!ok_)
+ return *this;
+ int code = metrics_.unicode_encoding(uni);
+ if (code < 0) {
+ Glyph glyph = s_->_finfo.cmap->map_uni(uni);
+ if (glyph != 0)
+ code = metrics_.force_encoding(glyph);
+ }
+ if (code < 0) {
+ ok_ = false;
+ while (v_.size() > original_size_)
+ v_.pop_back();
+ } else {
+ if (!v_.empty()
+ && v_.back().op == Setting::SHOW
+ && kern_type_)
+ v_.push_back(Setting(kern_type_));
+ v_.push_back(Setting(Setting::SHOW, code, metrics_.base_glyph(code)));
}
- return true;
-}
-
-bool
-T1Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics &metrics, ErrorHandler *errh)
-{
- if (uni == U_ALTSELECTOR
- || (uni >= U_VS1 && uni <= U_VS16)
- || (uni >= U_VS17 && uni <= U_VS256)) {
- Vector<Setting> v;
- setting(uni, v, metrics, errh);
- int which = (uni == U_ALTSELECTOR ? 0 : (uni <= U_VS16 ? uni - U_VS1 + 1 : uni - U_VS17 + 17));
- metrics.encode_virtual(code, (which ? permprintf("<vs%d>", which) : PermString("<altselector>")), uni, v, false);
- metrics.add_altselector_code(code, which);
- return true;
- } else
- return Secondary::encode_uni(code, name, uni, metrics, errh);
+ return *this;
}
@@ -380,355 +346,333 @@ int
T1Secondary::dotlessj_font(Metrics &metrics, ErrorHandler *errh, Glyph &dj_glyph)
{
if (!_font_name || !_finfo.otf || !_finfo.cff)
- return -1;
+ return -1;
String dj_name;
bool install_metrics;
// XXX make sure dotlessj is for the main font?
if ((dj_name = installed_metrics_font_name(_font_name, "dotlessj")))
- install_metrics = false;
+ install_metrics = false;
else {
- dj_name = suffix_font_name(_font_name, "--lcdfj");
- install_metrics = true;
+ dj_name = suffix_font_name(_font_name, "--lcdfj");
+ install_metrics = true;
}
// is dotlessj already mapped?
for (int i = 0; i < metrics.n_mapped_fonts(); i++)
- if (metrics.mapped_font_name(i) == dj_name)
- return i;
+ if (metrics.mapped_font_name(i) == dj_name)
+ return i;
if (String filename = installed_type1_dotlessj(_otf_file_name, _finfo.cff->font_name(), (output_flags & G_DOTLESSJ), errh)) {
- // check for special case: "\0" means the font's "j" is already
- // dotless
- if (filename == String("\0", 1))
- return J_NODOT;
-
- // open dotless-j font file
- FILE *f = fopen(filename.c_str(), "rb");
- if (!f) {
- errh->error("%s: %s", filename.c_str(), strerror(errno));
- return -1;
- }
-
- // read font
- Efont::Type1Reader *reader;
- int c = getc(f);
- ungetc(c, f);
- if (c == 128)
- reader = new Efont::Type1PFBReader(f);
- else
- reader = new Efont::Type1PFAReader(f);
- Efont::Type1Font *font = new Efont::Type1Font(*reader);
- delete reader;
-
- if (!font->ok()) {
- errh->error("%s: no glyphs in dotless-J font", filename.c_str());
- delete font;
- return -1;
- }
-
- // find dotless-J character
- Vector<PermString> glyph_names;
- font->glyph_names(glyph_names);
- Vector<PermString>::iterator g = std::find(glyph_names.begin(), glyph_names.end(), "uni0237");
- if (g == glyph_names.end()) {
- errh->error("%s: dotless-J font has no %<uni0237%> glyph", filename.c_str());
- delete font;
- return -1;
- }
- dj_glyph = g - glyph_names.begin();
-
- // create metrics for dotless-J
- if (install_metrics) {
- Metrics dj_metrics(font, 256);
- dj_metrics.encode('j', U_DOTLESSJ, dj_glyph);
- ::dotlessj_file_name = filename;
- output_metrics(dj_metrics, font->font_name(), -1, _finfo, String(), String(), dj_name, dotlessj_dvips_include, errh);
- } else if (verbose)
- errh->message("using %<%s%> for dotless-J font metrics", dj_name.c_str());
+ // check for special case: "\0" means the font's "j" is already
+ // dotless
+ if (filename == String("\0", 1))
+ return J_NODOT;
+
+ // open dotless-j font file
+ FILE *f = fopen(filename.c_str(), "rb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return -1;
+ }
- // add font to metrics
- return metrics.add_mapped_font(font, dj_name);
+ // read font
+ Efont::Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == 128)
+ reader = new Efont::Type1PFBReader(f);
+ else
+ reader = new Efont::Type1PFAReader(f);
+ Efont::Type1Font *font = new Efont::Type1Font(*reader);
+ delete reader;
+
+ if (!font->ok()) {
+ errh->error("%s: no glyphs in dotless-J font", filename.c_str());
+ delete font;
+ return -1;
+ }
+
+ // find dotless-J character
+ Vector<PermString> glyph_names;
+ font->glyph_names(glyph_names);
+ Vector<PermString>::iterator g = std::find(glyph_names.begin(), glyph_names.end(), "uni0237");
+ if (g == glyph_names.end()) {
+ errh->error("%s: dotless-J font has no %<uni0237%> glyph", filename.c_str());
+ delete font;
+ return -1;
+ }
+ dj_glyph = g - glyph_names.begin();
+
+ // create metrics for dotless-J
+ if (install_metrics) {
+ Metrics dj_metrics(font, 256);
+ dj_metrics.encode('j', U_DOTLESSJ, dj_glyph);
+ ::dotlessj_file_name = filename;
+ output_metrics(dj_metrics, font->font_name(), -1, _finfo, String(), String(), dj_name, dotlessj_dvips_include, errh);
+ } else if (verbose)
+ errh->message("using %<%s%> for dotless-J font metrics", dj_name.c_str());
+
+ // add font to metrics
+ return metrics.add_mapped_font(font, dj_name);
} else
- return -1;
+ return -1;
}
int
-T1Secondary::setting(uint32_t uni, Vector<Setting> &v, Metrics &metrics, ErrorHandler *errh)
+T1Secondary::setting(uint32_t uni, SettingSet& set, ErrorHandler *errh)
{
Transform xform;
- int vsize = v.size();
extern int letterspace;
- if (char_setting(v, metrics, uni, 0))
- return 1;
+ if (set.show(uni).check())
+ return 1;
switch (uni) {
case U_CWM:
case U_ALTSELECTOR:
- v.push_back(Setting(Setting::RULE, 0, _xheight));
- return 1;
+ set.push_back(Setting::RULE, 0, _xheight);
+ return 1;
case U_CAPITALCWM:
- v.push_back(Setting(Setting::RULE, 0, font_cap_height(_finfo, xform)));
- return 1;
+ set.push_back(Setting::RULE, 0, font_cap_height(_finfo, xform));
+ return 1;
case U_ASCENDERCWM:
- v.push_back(Setting(Setting::RULE, 0, font_ascender(_finfo, xform)));
- return 1;
+ set.push_back(Setting::RULE, 0, font_ascender(_finfo, xform));
+ return 1;
case U_VISIBLESPACE: {
int sb = (int) (0.050 * _units_per_em), h = (int) (0.150 * _units_per_em),
lw = (int) (0.040 * _units_per_em);
- v.push_back(Setting(Setting::MOVE, sb, -h));
- v.push_back(Setting(Setting::RULE, lw, h));
- v.push_back(Setting(Setting::RULE, _spacewidth, lw));
- v.push_back(Setting(Setting::RULE, lw, h));
- v.push_back(Setting(Setting::MOVE, sb, h));
- return 2;
- }
-
- case U_SS:
- if (char_setting(v, metrics, 'S', 'S', 0))
- return 1;
- break;
-
- case U_SSSMALL:
- if (char_setting(v, metrics, U_SSMALL, U_SSMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 's', 's', 0))
- return 1;
- break;
+ set.move(sb, -h);
+ set.push_back(Setting::RULE, lw, h);
+ set.push_back(Setting::RULE, _spacewidth, lw);
+ set.push_back(Setting::RULE, lw, h);
+ set.move(sb, h);
+ return 2;
+ }
+
+ case U_SS:
+ if (set.show('S').show('S').check())
+ return 1;
+ break;
+
+ case U_SSSMALL:
+ if (set.show(U_SSMALL).show(U_SSMALL).check()
+ || set.show('s').show('s').check())
+ return 1;
+ break;
case U_FFSMALL:
- if (char_setting(v, metrics, U_FSMALL, U_FSMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 'f', 'f', 0))
- return 1;
- break;
+ if (set.show(U_FSMALL).show(U_FSMALL).check()
+ || set.show('f').show('f').check())
+ return 1;
+ break;
case U_FISMALL:
- if (char_setting(v, metrics, U_FSMALL, U_ISMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 'f', 'i', 0))
- return 1;
- break;
+ if (set.show(U_FSMALL).show(U_ISMALL).check()
+ || set.show('f').show('i').check())
+ return 1;
+ break;
case U_FLSMALL:
- if (char_setting(v, metrics, U_FSMALL, U_LSMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 'f', 'l', 0))
- return 1;
- break;
+ if (set.show(U_FSMALL).show(U_LSMALL).check()
+ || set.show('f').show('l').check())
+ return 1;
+ break;
case U_FFISMALL:
- if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_ISMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 'f', 'f', 'i', 0))
- return 1;
- break;
+ if (set.show(U_FSMALL).show(U_FSMALL).show(U_ISMALL).check()
+ || set.show('f').show('f').show('i').check())
+ return 1;
+ break;
case U_FFLSMALL:
- if (char_setting(v, metrics, U_FSMALL, U_FSMALL, U_LSMALL, 0))
- return 1;
- else if (char_setting(v, metrics, 'f', 'f', 'l', 0))
- return 1;
- break;
+ if (set.show(U_FSMALL).show(U_FSMALL).show(U_LSMALL).check()
+ || set.show('f').show('f').show('l').check())
+ return 1;
+ break;
case U_IJ:
- if (char_setting(v, metrics, 'I', 'J', 0))
- return 1;
- break;
+ if (set.show('I').show('J').check())
+ return 1;
+ break;
case U_ij:
- if (char_setting(v, metrics, 'i', 'j', 0))
- return 1;
- break;
+ if (set.show('i').show('j').check())
+ return 1;
+ break;
case U_DOTLESSJ:
case U_DOTLESSJ_2:
case U_MATHDOTLESSJ: {
- Glyph dj_glyph;
- int which = dotlessj_font(metrics, errh, dj_glyph);
- if (which >= 0) {
- v.push_back(Setting(Setting::FONT, which));
- v.push_back(Setting(Setting::SHOW, 'j', dj_glyph));
- return 2;
- } else if (which == J_NODOT && char_setting(v, metrics, 'j', 0))
- return 1;
- break;
+ Glyph dj_glyph;
+ int which = dotlessj_font(set.metrics(), errh, dj_glyph);
+ if (which >= 0) {
+ set.push_back(Setting::FONT, which);
+ set.push_back(Setting::SHOW, 'j', dj_glyph);
+ return 2;
+ } else if (which == J_NODOT && set.show('j').check())
+ return 1;
+ break;
}
case U_DBLBRACKETLEFT:
- if (char_setting(v, metrics, '[', 0)) {
- if (!_finfo.is_fixed_pitch()) {
- double d = char_one_bound(_finfo, xform, 4, true, 0, '[', 0);
- v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d - letterspace), 0));
- }
- char_setting(v, metrics, '[', 0);
- return 1;
- }
- break;
+ if (set.show('[').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, '[', 0);
+ set.move((int) (-0.666 * d - letterspace));
+ }
+ set.show('[');
+ return 1;
+ }
+ break;
case U_DBLBRACKETRIGHT:
- if (char_setting(v, metrics, ']', 0)) {
- if (!_finfo.is_fixed_pitch()) {
- double d = char_one_bound(_finfo, xform, 4, true, 0, ']', 0);
- v.push_back(Setting(Setting::MOVE, (int) (-0.666 * d - letterspace), 0));
- }
- char_setting(v, metrics, ']', 0);
- return 1;
- }
- break;
+ if (set.show(']').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, ']', 0);
+ set.move((int) (-0.666 * d - letterspace));
+ }
+ set.show(']');
+ return 1;
+ }
+ break;
case U_BARDBL:
- if (char_setting(v, metrics, '|', 0)) {
- if (!_finfo.is_fixed_pitch()) {
- double d = char_one_bound(_finfo, Transform(), 4, true, 0, '|', 0);
- v.push_back(Setting(Setting::MOVE, (int) (-0.333 * d - letterspace), 0));
- }
- char_setting(v, metrics, '|', 0);
- return 1;
- }
- break;
+ if (set.show('|').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, Transform(), 4, true, 0, '|', 0);
+ set.move((int) (-0.333 * d - letterspace));
+ }
+ set.show('|');
+ return 1;
+ }
+ break;
case U_ASTERISKMATH: {
- double bounds[5];
- double dropdown = 0;
- if (char_bounds(bounds, bounds[4], _finfo, xform, '*'))
- dropdown += std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
- if (char_bounds(bounds, bounds[4], _finfo, xform, '('))
- dropdown -= std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
- v.push_back(Setting(Setting::MOVE, 0, (int) (-dropdown / 2)));
- if (char_setting(v, metrics, '*', 0)) {
- v.push_back(Setting(Setting::MOVE, 0, -(int) (-dropdown / 2)));
- return 1;
- }
- break;
+ double bounds[5];
+ double dropdown = 0;
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '*'))
+ dropdown += std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '('))
+ dropdown -= std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
+ int dy = (int) (-dropdown / 2);
+ if (set.move(0, dy).show('*').move(0, -dy).check())
+ return 1;
+ break;
}
case U_TWELVEUDASH:
- if (char_setting(v, metrics, U_ENDASH, 0)) {
- if (!_finfo.is_fixed_pitch()) {
- double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
- v.push_back(Setting(Setting::MOVE, (int) (_units_per_em * 0.667 - 2 * d - letterspace), 0));
- }
- char_setting(v, metrics, U_ENDASH, 0);
- return 1;
- }
- break;
+ if (set.show(U_ENDASH).check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ set.move((int) (_units_per_em * 0.667 - 2 * d - letterspace));
+ }
+ set.show(U_ENDASH);
+ return 1;
+ }
+ break;
case U_THREEQUARTERSEMDASH:
- if (char_setting(v, metrics, U_ENDASH, 0)) {
- if (!_finfo.is_fixed_pitch()) {
- double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
- v.push_back(Setting(Setting::MOVE, (int) (_units_per_em * 0.750 - 2 * d - letterspace), 0));
- }
- char_setting(v, metrics, U_ENDASH, 0);
- return 1;
- }
- break;
+ if (set.show(U_ENDASH).check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ set.move((int) (_units_per_em * 0.750 - 2 * d - letterspace));
+ }
+ set.show(U_ENDASH);
+ return 1;
+ }
+ break;
case U_CENTIGRADE:
// TODO: set italic correction to that of a 'C'
- if (char_setting(v, metrics, U_USE_KERNX, U_DEGREE, 'C', 0))
- return 1;
- break;
+ if (set.show(U_DEGREE).kernx(true).show('C').kernx(false).check())
+ return 1;
+ break;
case U_INTERROBANG: {
- double exclam_offset =
- (char_one_bound(_finfo, xform, 4, true, 0, '?', 0)
- - char_one_bound(_finfo, xform, 4, true, 0, '!', 0)) * 0.5
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, '?', 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, '!', 0)) * 0.5
+ 0.050 * _units_per_em;
- v.push_back(Setting(Setting::PUSH));
- v.push_back(Setting(Setting::MOVE, (int) exclam_offset, 0));
- if (char_setting(v, metrics, '!', 0)) {
- v.push_back(Setting(Setting::POP));
- if (char_setting(v, metrics, '?', 0))
- return 1;
- }
- break;
+ if (set.push_back(Setting::PUSH).move((int) exclam_offset)
+ .show('!').push_back(Setting::POP).show('?').check())
+ return 1;
+ break;
}
case U_INTERROBANGDOWN: {
- double exclam_offset =
- (char_one_bound(_finfo, xform, 4, true, 0, U_QUESTIONDOWN, 0)
- - char_one_bound(_finfo, xform, 4, true, 0, U_EXCLAMDOWN, 0)) * 0.5
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, U_QUESTIONDOWN, 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, U_EXCLAMDOWN, 0)) * 0.5
+ 0.050 * _units_per_em;
- v.push_back(Setting(Setting::PUSH));
- v.push_back(Setting(Setting::MOVE, (int) exclam_offset, 0));
- if (char_setting(v, metrics, U_EXCLAMDOWN, 0)) {
- v.push_back(Setting(Setting::POP));
- if (char_setting(v, metrics, U_QUESTIONDOWN, 0))
- return 1;
- }
- break;
+ if (set.push_back(Setting::PUSH).move((int) exclam_offset)
+ .show(U_EXCLAMDOWN).push_back(Setting::POP).show(U_QUESTIONDOWN).check())
+ return 1;
+ break;
}
case U_PERTENTHOUSAND:
- if (char_setting(v, metrics, U_USE_KERNX, 0xF661, U_FRACTION, 0xF655, 0xF655, 0xF655, 0))
- return 1;
- break;
+ if (set.show(0xF661).kernx(true).show(U_FRACTION)
+ .show(0xF655).show(0xF655).show(0xF655).kernx(false).check())
+ return 1;
+ break;
case U_RINGFITTED: {
- int A_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, 'A', 0);
- uint32_t ring_char = U_RINGABOVE;
- int ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
- if (ring_width <= -_units_per_em) {
- ring_char = U_COMBININGRINGABOVE;
- ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
- }
- if (A_width > -_units_per_em && ring_width > -_units_per_em) {
- int offset = (A_width - ring_width) / 2;
- v.push_back(Setting(Setting::MOVE, offset, 0));
- if (char_setting(v, metrics, ring_char, 0)) {
- v.push_back(Setting(Setting::MOVE, A_width - ring_width - offset, 0));
- return 1;
- }
- }
- break;
+ int A_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, 'A', 0);
+ uint32_t ring_char = U_RINGABOVE;
+ int ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ if (ring_width <= -_units_per_em) {
+ ring_char = U_COMBININGRINGABOVE;
+ ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ }
+ if (A_width > -_units_per_em && ring_width > -_units_per_em) {
+ int offset = (A_width - ring_width) / 2;
+ if (set.move(offset).show(ring_char).move(A_width - ring_width - offset).check()) {
+ return 1;
+ }
+ }
+ break;
}
}
- // didn't find a good setting, restore v to pristine state
- while (v.size() > vsize)
- v.pop_back();
-
// variant selectors get the same setting as ALTSELECTOR
if ((uni >= U_VS1 && uni <= U_VS16) || (uni >= U_VS17 && uni <= U_VS256))
- return setting(U_ALTSELECTOR, v, metrics, errh);
+ return setting(U_ALTSELECTOR, set, errh);
// otherwise, try other secondaries
- return Secondary::setting(uni, v, metrics, errh);
+ return Secondary::setting(uni, set, errh);
}
bool
char_bounds(double bounds[4], double& width, const FontInfo &finfo,
- const Transform &transform, uint32_t uni)
+ const Transform &transform, uint32_t uni)
{
if (Efont::OpenType::Glyph g = finfo.cmap->map_uni(uni))
- return Efont::CharstringBounds::bounds(transform, finfo.program()->glyph_context(g), bounds, width);
+ return Efont::CharstringBounds::bounds(transform, finfo.program()->glyph_context(g), bounds, width);
else
- return false;
+ return false;
}
double
char_one_bound(const FontInfo &finfo, const Transform &transform,
- int dimen, bool max, double best, int uni, ...)
+ int dimen, bool max, double best, int uni, ...)
{
double bounds[5];
va_list val;
va_start(val, uni);
while (uni != 0) {
- if (char_bounds(bounds, bounds[4], finfo, transform, uni))
- if (max ? bounds[dimen] > best : bounds[dimen] < best)
- best = bounds[dimen];
- uni = va_arg(val, int);
+ if (char_bounds(bounds, bounds[4], finfo, transform, uni))
+ if (max ? bounds[dimen] > best : bounds[dimen] < best)
+ best = bounds[dimen];
+ uni = va_arg(val, int);
}
va_end(val);
return best;
@@ -738,12 +682,12 @@ double
font_cap_height(const FontInfo &finfo, const Transform &font_xform)
{
try {
- Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
- return os2.cap_height();
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.cap_height();
} catch (Efont::OpenType::Bounds) {
- // XXX what if 'H', 'O', 'B' were subject to substitution?
- return char_one_bound(finfo, font_xform, 3, false, finfo.units_per_em(),
- (int) 'H', (int) 'O', (int) 'B', 0);
+ // XXX what if 'H', 'O', 'B' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, false, finfo.units_per_em(),
+ (int) 'H', (int) 'O', (int) 'B', 0);
}
}
@@ -751,12 +695,12 @@ double
font_ascender(const FontInfo &finfo, const Transform &font_xform)
{
try {
- Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
- return os2.typo_ascender();
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.typo_ascender();
} catch (Efont::OpenType::Bounds) {
- // XXX what if 'd', 'l' were subject to substitution?
- return char_one_bound(finfo, font_xform, 3, true,
- finfo.x_height(font_xform),
- (int) 'd', (int) 'l', 0);
+ // XXX what if 'd', 'l' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, true,
+ finfo.x_height(font_xform),
+ (int) 'd', (int) 'l', 0);
}
}
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh 2018-02-23 12:47:54.094971678 -0500
@@ -2,9 +2,10 @@
#define OTFTOTFM_SECONDARY_HH
#include <efont/otfcmap.hh>
#include <efont/cff.hh>
+#include "setting.hh"
class Metrics;
+class Secondary;
class Transform;
-struct Setting;
namespace Efont { class TrueTypeBoundsCharstringProgram; }
struct FontInfo {
@@ -23,12 +24,12 @@ struct FontInfo {
bool ok() const;
- int nglyphs() const { return _nglyphs; }
+ int nglyphs() const { return _nglyphs; }
bool glyph_names(Vector<PermString> &) const;
int glyphid(PermString) const;
const Efont::CharstringProgram *program() const;
int units_per_em() const {
- return program()->units_per_em();
+ return program()->units_per_em();
}
bool is_fixed_pitch() const;
@@ -36,12 +37,12 @@ struct FontInfo {
double x_height(const Transform& font_xform) const;
void set_is_fixed_pitch(bool is_fixed_pitch) {
- _override_is_fixed_pitch = true;
- _is_fixed_pitch = is_fixed_pitch;
+ _override_is_fixed_pitch = true;
+ _is_fixed_pitch = is_fixed_pitch;
}
void set_italic_angle(double italic_angle) {
- _override_italic_angle = true;
- _italic_angle = italic_angle;
+ _override_italic_angle = true;
+ _italic_angle = italic_angle;
}
enum { x_height_auto = 0, x_height_explicit,
x_height_os2, x_height_x };
@@ -69,38 +70,108 @@ struct FontInfo {
};
+class SettingSet {
+public:
+ inline SettingSet(Secondary* s, Metrics& m);
+ inline SettingSet& push_back(Setting s);
+ inline SettingSet& push_back(int op, int x = 0, int y = 0);
+ inline SettingSet& move(int x, int y = 0);
+ SettingSet& show(int uni);
+ inline SettingSet& kernx(bool is_kernx);
+ inline bool check();
+ inline void checkpoint();
+ inline Metrics& metrics() const;
+ inline const Vector<Setting>& settings() const;
+private:
+ Secondary* s_;
+ Vector<Setting> v_;
+ int original_size_;
+ Metrics& metrics_;
+ int kern_type_;
+ bool ok_;
+ typedef Efont::OpenType::Glyph Glyph;
+};
+
class Secondary { public:
- Secondary() : _next(0) { }
+ Secondary(const FontInfo& finfo) : _finfo(finfo), _next(0) { }
virtual ~Secondary();
- void set_next(Secondary *s) { _next = s; }
+ void set_next(Secondary *s) { _next = s; }
typedef Efont::OpenType::Glyph Glyph;
- bool encode_uni(int code, PermString name, const uint32_t *uni_begin, const uint32_t *uni_end, Metrics &metrics, ErrorHandler *errh);
- virtual bool encode_uni(int code, PermString name, uint32_t uni, Metrics &, ErrorHandler *);
- virtual int setting(uint32_t uni, Vector<Setting> &, Metrics &, ErrorHandler *);
+ bool encode_uni(int code, PermString name, const uint32_t* uni_first, const uint32_t* uni_last, Metrics &metrics, ErrorHandler *errh);
+ inline bool encode_uni(int code, PermString name, uint32_t uni, Metrics& m, ErrorHandler* errh);
+ virtual int setting(uint32_t uni, SettingSet&, ErrorHandler *);
+ protected:
+ const FontInfo& _finfo;
+
+ friend class SettingSet;
private:
Secondary *_next;
};
class T1Secondary : public Secondary { public:
T1Secondary(const FontInfo &, const String &font_name, const String &otf_file_name);
- bool encode_uni(int code, PermString name, uint32_t uni, Metrics &, ErrorHandler *);
- int setting(uint32_t uni, Vector<Setting> &, Metrics &, ErrorHandler *);
+ int setting(uint32_t uni, SettingSet&, ErrorHandler *);
private:
- const FontInfo &_finfo;
String _font_name;
String _otf_file_name;
int _units_per_em;
int _xheight;
int _spacewidth;
- bool char_setting(Vector<Setting> &, Metrics &, int uni, ...);
enum { J_NODOT = -1031892 /* unlikely value */ };
int dotlessj_font(Metrics &, ErrorHandler *, Glyph &dj_glyph);
};
bool char_bounds(double bounds[4], double& width, const FontInfo &,
- const Transform &, uint32_t uni);
+ const Transform &, uint32_t uni);
double char_one_bound(const FontInfo &, const Transform &,
int dimen, bool max, double best, int uni, ...);
+inline SettingSet::SettingSet(Secondary* s, Metrics& m)
+ : s_(s), original_size_(0), metrics_(m),
+ kern_type_(Setting::KERN), ok_(true) {
+}
+
+inline SettingSet& SettingSet::kernx(bool is_kernx) {
+ kern_type_ = is_kernx ? Setting::KERNX : Setting::KERN;
+ return *this;
+}
+
+inline SettingSet& SettingSet::push_back(Setting s) {
+ if (ok_)
+ v_.push_back(s);
+ return *this;
+}
+
+inline SettingSet& SettingSet::push_back(int op, int x, int y) {
+ return push_back(Setting(op, x, y));
+}
+
+inline SettingSet& SettingSet::move(int x, int y) {
+ return push_back(Setting(Setting::MOVE, x, y));
+}
+
+inline bool SettingSet::check() {
+ bool ok = ok_;
+ ok_ = true;
+ return ok;
+}
+
+inline void SettingSet::checkpoint() {
+ assert(ok_);
+ original_size_ = v_.size();
+}
+
+inline Metrics& SettingSet::metrics() const {
+ return metrics_;
+}
+
+inline const Vector<Setting>& SettingSet::settings() const {
+ return v_;
+}
+
+inline bool Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics& m, ErrorHandler* errh) {
+ return encode_uni(code, name, &uni, &uni + 1, m, errh);
+}
+
#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh.git4166ff9 2018-02-23 12:59:25.406658041 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh 2018-02-23 12:59:10.984019250 -0500
@@ -0,0 +1,18 @@
+#ifndef OTFTOTFM_SETTING_HH
+#define OTFTOTFM_SETTING_HH
+#include <lcdf/string.hh>
+
+struct Setting {
+ enum { NONE, FONT, SHOW, KERN, KERNX, MOVE, RULE, PUSH, POP,
+ SPECIAL, DEAD };
+ int op;
+ int x;
+ int y;
+ String s;
+ Setting(int op_in, int x_in = 0, int y_in = 0)
+ : op(op_in), x(x_in), y(y_in) { }
+ Setting(int op_in, const String &s_in) : op(op_in), s(s_in) { }
+ bool valid_op() const { return op >= FONT && op <= SPECIAL; }
+};
+
+#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc 2018-02-23 12:47:54.095971653 -0500
@@ -1,6 +1,6 @@
/* uniprop.{cc,hh} -- code for Unicode character properties
*
- * Copyright (c) 2004-2016 Eddie Kohler
+ * Copyright (c) 2004-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -25,12 +25,12 @@ const unsigned char UnicodeProperty::pro
0, P_Lul, 48, P_Cn, 49, P_Lu, 87, P_Cn, 89, P_Lm, 90, P_Po, 96, P_Cn, 97, P_Ll, 136, P_Cn, 137, P_Po, 138, P_Pd, 139, P_Cn, 141, P_So, 143, P_Sc, 144, P_Cn, 145, P_Mn, 190, P_Pd, 191, P_Mn, 192, P_Po, 193, P_Mn, 195, P_Po, 196, P_Mn, 198, P_Po, 199, P_Mn, 200, P_Cn, 208, P_Lo, 235, P_Cn, 240, P_Lo, 243, P_Po, 245, P_Cn,
0, P_Cf, 6, P_Sm, 9, P_Po, 11, P_Sc, 12, P_Po, 14, P_So, 16, P_Mn, 27, P_Po, 28, P_Cf, 29, P_Cn, 30, P_Po, 32, P_Lo, 64, P_Lm, 65, P_Lo, 75, P_Mn, 96, P_Nd, 106, P_Po, 110, P_Lo, 112, P_Mn, 113, P_Lo, 212, P_Po, 213, P_Lo, 214, P_Mn, 221, P_Cf, 222, P_So, 223, P_Mn, 229, P_Lm, 231, P_Mn, 233, P_So, 234, P_Mn, 238, P_Lo, 240, P_Nd, 250, P_Lo, 253, P_So, 255, P_Lo,
0, P_Po, 14, P_Cn, 15, P_Cf, 16, P_Lo, 17, P_Mn, 18, P_Lo, 48, P_Mn, 75, P_Cn, 77, P_Lo, 166, P_Mn, 177, P_Lo, 178, P_Cn, 192, P_Nd, 202, P_Lo, 235, P_Mn, 244, P_Lm, 246, P_So, 247, P_Po, 250, P_Lm, 251, P_Cn,
- 0, P_Lo, 22, P_Mn, 26, P_Lm, 27, P_Mn, 36, P_Lm, 37, P_Mn, 40, P_Lm, 41, P_Mn, 46, P_Cn, 48, P_Po, 63, P_Cn, 64, P_Lo, 89, P_Mn, 92, P_Cn, 94, P_Po, 95, P_Cn, 160, P_Lo, 181, P_Cn, 227, P_Mn,
+ 0, P_Lo, 22, P_Mn, 26, P_Lm, 27, P_Mn, 36, P_Lm, 37, P_Mn, 40, P_Lm, 41, P_Mn, 46, P_Cn, 48, P_Po, 63, P_Cn, 64, P_Lo, 89, P_Mn, 92, P_Cn, 94, P_Po, 95, P_Cn, 160, P_Lo, 181, P_Cn, 182, P_Lo, 190, P_Cn, 212, P_Mn, 226, P_Cf, 227, P_Mn,
0, P_Mn, 3, P_Mc, 4, P_Lo, 58, P_Mn, 59, P_Mc, 60, P_Mn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 73, P_Mc, 77, P_Mn, 78, P_Mc, 80, P_Lo, 81, P_Mn, 88, P_Lo, 98, P_Mn, 100, P_Po, 102, P_Nd, 112, P_Po, 113, P_Lm, 114, P_Lo, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 143, P_Lo, 145, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 179, P_Cn, 182, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 197, P_Cn, 199, P_Mc, 201, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Lo, 207, P_Cn, 215, P_Mc, 216, P_Cn, 220, P_Lo, 222, P_Cn, 223, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Lo, 242, P_Sc, 244, P_No, 250, P_So, 251, P_Sc, 252, P_Cn,
0, P_Cn, 1, P_Mn, 3, P_Mc, 4, P_Cn, 5, P_Lo, 11, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 55, P_Cn, 56, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Cn, 62, P_Mc, 65, P_Mn, 67, P_Cn, 71, P_Mn, 73, P_Cn, 75, P_Mn, 78, P_Cn, 81, P_Mn, 82, P_Cn, 89, P_Lo, 93, P_Cn, 94, P_Lo, 95, P_Cn, 102, P_Nd, 112, P_Mn, 114, P_Lo, 117, P_Mn, 118, P_Cn, 129, P_Mn, 131, P_Mc, 132, P_Cn, 133, P_Lo, 142, P_Cn, 143, P_Lo, 146, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 198, P_Cn, 199, P_Mn, 201, P_Mc, 202, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Cn, 208, P_Lo, 209, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Po, 241, P_Sc, 242, P_Cn, 249, P_Lo, 250, P_Cn,
0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 63, P_Mn, 64, P_Mc, 65, P_Mn, 69, P_Cn, 71, P_Mc, 73, P_Cn, 75, P_Mc, 77, P_Mn, 78, P_Cn, 86, P_Mn, 87, P_Mc, 88, P_Cn, 92, P_Lo, 94, P_Cn, 95, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_So, 113, P_Lo, 114, P_No, 120, P_Cn, 130, P_Mn, 131, P_Lo, 132, P_Cn, 133, P_Lo, 139, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 150, P_Cn, 153, P_Lo, 155, P_Cn, 156, P_Lo, 157, P_Cn, 158, P_Lo, 160, P_Cn, 163, P_Lo, 165, P_Cn, 168, P_Lo, 171, P_Cn, 174, P_Lo, 186, P_Cn, 190, P_Mc, 192, P_Mn, 193, P_Mc, 195, P_Cn, 198, P_Mc, 201, P_Cn, 202, P_Mc, 205, P_Mn, 206, P_Cn, 208, P_Lo, 209, P_Cn, 215, P_Mc, 216, P_Cn, 230, P_Nd, 240, P_No, 243, P_So, 249, P_Sc, 250, P_So, 251, P_Cn,
- 0, P_Mn, 1, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 41, P_Cn, 42, P_Lo, 58, P_Cn, 61, P_Lo, 62, P_Mn, 65, P_Mc, 69, P_Cn, 70, P_Mn, 73, P_Cn, 74, P_Mn, 78, P_Cn, 85, P_Mn, 87, P_Cn, 88, P_Lo, 91, P_Cn, 96, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_Cn, 120, P_No, 127, P_So, 128, P_Cn, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 169, P_Cn, 170, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 191, P_Mn, 192, P_Mc, 197, P_Cn, 198, P_Mn, 199, P_Mc, 201, P_Cn, 202, P_Mc, 204, P_Mn, 206, P_Cn, 213, P_Mc, 215, P_Cn, 222, P_Lo, 223, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Cn, 241, P_Lo, 243, P_Cn,
- 0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 59, P_Cn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 69, P_Cn, 70, P_Mc, 73, P_Cn, 74, P_Mc, 77, P_Mn, 78, P_Lo, 79, P_Cn, 87, P_Mc, 88, P_Cn, 95, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_No, 118, P_Cn, 121, P_So, 122, P_Lo, 128, P_Cn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 151, P_Cn, 154, P_Lo, 178, P_Cn, 179, P_Lo, 188, P_Cn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 199, P_Cn, 202, P_Mn, 203, P_Cn, 207, P_Mc, 210, P_Mn, 213, P_Cn, 214, P_Mn, 215, P_Cn, 216, P_Mc, 224, P_Cn, 230, P_Nd, 240, P_Cn, 242, P_Mc, 244, P_Po, 245, P_Cn,
+ 0, P_Mn, 1, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 41, P_Cn, 42, P_Lo, 58, P_Cn, 61, P_Lo, 62, P_Mn, 65, P_Mc, 69, P_Cn, 70, P_Mn, 73, P_Cn, 74, P_Mn, 78, P_Cn, 85, P_Mn, 87, P_Cn, 88, P_Lo, 91, P_Cn, 96, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_Cn, 120, P_No, 127, P_So, 128, P_Lo, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 169, P_Cn, 170, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 191, P_Mn, 192, P_Mc, 197, P_Cn, 198, P_Mn, 199, P_Mc, 201, P_Cn, 202, P_Mc, 204, P_Mn, 206, P_Cn, 213, P_Mc, 215, P_Cn, 222, P_Lo, 223, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Cn, 241, P_Lo, 243, P_Cn,
+ 0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 59, P_Cn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 69, P_Cn, 70, P_Mc, 73, P_Cn, 74, P_Mc, 77, P_Mn, 78, P_Lo, 79, P_So, 80, P_Cn, 84, P_Lo, 87, P_Mc, 88, P_No, 95, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_No, 121, P_So, 122, P_Lo, 128, P_Cn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 151, P_Cn, 154, P_Lo, 178, P_Cn, 179, P_Lo, 188, P_Cn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 199, P_Cn, 202, P_Mn, 203, P_Cn, 207, P_Mc, 210, P_Mn, 213, P_Cn, 214, P_Mn, 215, P_Cn, 216, P_Mc, 224, P_Cn, 230, P_Nd, 240, P_Cn, 242, P_Mc, 244, P_Po, 245, P_Cn,
0, P_Cn, 1, P_Lo, 49, P_Mn, 50, P_Lo, 52, P_Mn, 59, P_Cn, 63, P_Sc, 64, P_Lo, 70, P_Lm, 71, P_Mn, 79, P_Po, 80, P_Nd, 90, P_Po, 92, P_Cn, 129, P_Lo, 131, P_Cn, 132, P_Lo, 133, P_Cn, 135, P_Lo, 137, P_Cn, 138, P_Lo, 139, P_Cn, 141, P_Lo, 142, P_Cn, 148, P_Lo, 152, P_Cn, 153, P_Lo, 160, P_Cn, 161, P_Lo, 164, P_Cn, 165, P_Lo, 166, P_Cn, 167, P_Lo, 168, P_Cn, 170, P_Lo, 172, P_Cn, 173, P_Lo, 177, P_Mn, 178, P_Lo, 180, P_Mn, 186, P_Cn, 187, P_Mn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 197, P_Cn, 198, P_Lm, 199, P_Cn, 200, P_Mn, 206, P_Cn, 208, P_Nd, 218, P_Cn, 220, P_Lo, 224, P_Cn,
0, P_Lo, 1, P_So, 4, P_Po, 19, P_So, 20, P_Po, 21, P_So, 24, P_Mn, 26, P_So, 32, P_Nd, 42, P_No, 52, P_So, 53, P_Mn, 54, P_So, 55, P_Mn, 56, P_So, 57, P_Mn, 58, P_Ps, 59, P_Pe, 60, P_Ps, 61, P_Pe, 62, P_Mc, 64, P_Lo, 72, P_Cn, 73, P_Lo, 109, P_Cn, 113, P_Mn, 127, P_Mc, 128, P_Mn, 133, P_Po, 134, P_Mn, 136, P_Lo, 141, P_Mn, 152, P_Cn, 153, P_Mn, 189, P_Cn, 190, P_So, 198, P_Mn, 199, P_So, 205, P_Cn, 206, P_So, 208, P_Po, 213, P_So, 217, P_Po, 219, P_Cn,
0, P_Lo, 43, P_Mc, 45, P_Mn, 49, P_Mc, 50, P_Mn, 56, P_Mc, 57, P_Mn, 59, P_Mc, 61, P_Mn, 63, P_Lo, 64, P_Nd, 74, P_Po, 80, P_Lo, 86, P_Mc, 88, P_Mn, 90, P_Lo, 94, P_Mn, 97, P_Lo, 98, P_Mc, 101, P_Lo, 103, P_Mc, 110, P_Lo, 113, P_Mn, 117, P_Lo, 130, P_Mn, 131, P_Mc, 133, P_Mn, 135, P_Mc, 141, P_Mn, 142, P_Lo, 143, P_Mc, 144, P_Nd, 154, P_Mc, 157, P_Mn, 158, P_So, 160, P_Lu, 198, P_Cn, 199, P_Lu, 200, P_Cn, 205, P_Lu, 206, P_Cn, 208, P_Lo, 251, P_Po, 252, P_Lm, 253, P_Lo,
@@ -40,18 +40,18 @@ const unsigned char UnicodeProperty::pro
0, P_Pd, 1, P_Lo,
0, P_Lo, 109, P_Po, 111, P_Lo, 128, P_Zs, 129, P_Lo, 155, P_Ps, 156, P_Pe, 157, P_Cn, 160, P_Lo, 235, P_Po, 238, P_Nl, 241, P_Lo, 249, P_Cn,
0, P_Lo, 13, P_Cn, 14, P_Lo, 18, P_Mn, 21, P_Cn, 32, P_Lo, 50, P_Mn, 53, P_Po, 55, P_Cn, 64, P_Lo, 82, P_Mn, 84, P_Cn, 96, P_Lo, 109, P_Cn, 110, P_Lo, 113, P_Cn, 114, P_Mn, 116, P_Cn, 128, P_Lo, 180, P_Mn, 182, P_Mc, 183, P_Mn, 190, P_Mc, 198, P_Mn, 199, P_Mc, 201, P_Mn, 212, P_Po, 215, P_Lm, 216, P_Po, 219, P_Sc, 220, P_Lo, 221, P_Mn, 222, P_Cn, 224, P_Nd, 234, P_Cn, 240, P_No, 250, P_Cn,
- 0, P_Po, 6, P_Pd, 7, P_Po, 11, P_Mn, 14, P_Cf, 15, P_Cn, 16, P_Nd, 26, P_Cn, 32, P_Lo, 67, P_Lm, 68, P_Lo, 120, P_Cn, 128, P_Lo, 169, P_Mn, 170, P_Lo, 171, P_Cn, 176, P_Lo, 246, P_Cn,
+ 0, P_Po, 6, P_Pd, 7, P_Po, 11, P_Mn, 14, P_Cf, 15, P_Cn, 16, P_Nd, 26, P_Cn, 32, P_Lo, 67, P_Lm, 68, P_Lo, 120, P_Cn, 128, P_Lo, 133, P_Mn, 135, P_Lo, 169, P_Mn, 170, P_Lo, 171, P_Cn, 176, P_Lo, 246, P_Cn,
0, P_Lo, 31, P_Cn, 32, P_Mn, 35, P_Mc, 39, P_Mn, 41, P_Mc, 44, P_Cn, 48, P_Mc, 50, P_Mn, 51, P_Mc, 57, P_Mn, 60, P_Cn, 64, P_So, 65, P_Cn, 68, P_Po, 70, P_Nd, 80, P_Lo, 110, P_Cn, 112, P_Lo, 117, P_Cn, 128, P_Lo, 172, P_Cn, 176, P_Lo, 202, P_Cn, 208, P_Nd, 218, P_No, 219, P_Cn, 222, P_So,
0, P_Lo, 23, P_Mn, 25, P_Mc, 27, P_Mn, 28, P_Cn, 30, P_Po, 32, P_Lo, 85, P_Mc, 86, P_Mn, 87, P_Mc, 88, P_Mn, 95, P_Cn, 96, P_Mn, 97, P_Mc, 98, P_Mn, 99, P_Mc, 101, P_Mn, 109, P_Mc, 115, P_Mn, 125, P_Cn, 127, P_Mn, 128, P_Nd, 138, P_Cn, 144, P_Nd, 154, P_Cn, 160, P_Po, 167, P_Lm, 168, P_Po, 174, P_Cn, 176, P_Mn, 190, P_Me, 191, P_Cn,
0, P_Mn, 4, P_Mc, 5, P_Lo, 52, P_Mn, 53, P_Mc, 54, P_Mn, 59, P_Mc, 60, P_Mn, 61, P_Mc, 66, P_Mn, 67, P_Mc, 69, P_Lo, 76, P_Cn, 80, P_Nd, 90, P_Po, 97, P_So, 107, P_Mn, 116, P_So, 125, P_Cn, 128, P_Mn, 130, P_Mc, 131, P_Lo, 161, P_Mc, 162, P_Mn, 166, P_Mc, 168, P_Mn, 170, P_Mc, 171, P_Mn, 174, P_Lo, 176, P_Nd, 186, P_Lo, 230, P_Mn, 231, P_Mc, 232, P_Mn, 234, P_Mc, 237, P_Mn, 238, P_Mc, 239, P_Mn, 242, P_Mc, 244, P_Cn, 252, P_Po,
- 0, P_Lo, 36, P_Mc, 44, P_Mn, 52, P_Mc, 54, P_Mn, 56, P_Cn, 59, P_Po, 64, P_Nd, 74, P_Cn, 77, P_Lo, 80, P_Nd, 90, P_Lo, 120, P_Lm, 126, P_Po, 128, P_Cn, 192, P_Po, 200, P_Cn, 208, P_Mn, 211, P_Po, 212, P_Mn, 225, P_Mc, 226, P_Mn, 233, P_Lo, 237, P_Mn, 238, P_Lo, 242, P_Mc, 244, P_Mn, 245, P_Lo, 247, P_Cn, 248, P_Mn, 250, P_Cn,
- 0, P_Ll, 44, P_Lm, 107, P_Ll, 120, P_Lm, 121, P_Ll, 155, P_Lm, 192, P_Mn, 246, P_Cn, 252, P_Mn,
+ 0, P_Lo, 36, P_Mc, 44, P_Mn, 52, P_Mc, 54, P_Mn, 56, P_Cn, 59, P_Po, 64, P_Nd, 74, P_Cn, 77, P_Lo, 80, P_Nd, 90, P_Lo, 120, P_Lm, 126, P_Po, 128, P_Ll, 137, P_Cn, 192, P_Po, 200, P_Cn, 208, P_Mn, 211, P_Po, 212, P_Mn, 225, P_Mc, 226, P_Mn, 233, P_Lo, 237, P_Mn, 238, P_Lo, 242, P_Mc, 244, P_Mn, 245, P_Lo, 247, P_Cn, 248, P_Mn, 250, P_Cn,
+ 0, P_Ll, 44, P_Lm, 107, P_Ll, 120, P_Lm, 121, P_Ll, 155, P_Lm, 192, P_Mn, 246, P_Cn, 251, P_Mn,
0, P_Lul, 150, P_Ll, 158, P_Lul,
0, P_Ll, 8, P_Lu, 16, P_Ll, 22, P_Cn, 24, P_Lu, 30, P_Cn, 32, P_Ll, 40, P_Lu, 48, P_Ll, 56, P_Lu, 64, P_Ll, 70, P_Cn, 72, P_Lu, 78, P_Cn, 80, P_Ll, 88, P_Cn, 89, P_Lu, 90, P_Cn, 91, P_Lu, 92, P_Cn, 93, P_Lu, 94, P_Cn, 95, P_Lul, 97, P_Ll, 104, P_Lu, 112, P_Ll, 126, P_Cn, 128, P_Ll, 136, P_Lt, 144, P_Ll, 152, P_Lt, 160, P_Ll, 168, P_Lt, 176, P_Ll, 181, P_Cn, 182, P_Ll, 184, P_Lu, 188, P_Lt, 189, P_Sk, 190, P_Ll, 191, P_Sk, 194, P_Ll, 197, P_Cn, 198, P_Ll, 200, P_Lu, 204, P_Lt, 205, P_Sk, 208, P_Ll, 212, P_Cn, 214, P_Ll, 216, P_Lu, 220, P_Cn, 221, P_Sk, 224, P_Ll, 232, P_Lu, 237, P_Sk, 240, P_Cn, 242, P_Ll, 245, P_Cn, 246, P_Ll, 248, P_Lu, 252, P_Lt, 253, P_Sk, 255, P_Cn,
0, P_Zs, 11, P_Cf, 16, P_Pd, 22, P_Po, 24, P_Pi, 25, P_Pf, 26, P_Ps, 27, P_Pi, 29, P_Pf, 30, P_Ps, 31, P_Pi, 32, P_Po, 40, P_Zl, 41, P_Zp, 42, P_Cf, 47, P_Zs, 48, P_Po, 57, P_Pi, 58, P_Pf, 59, P_Po, 63, P_Pc, 65, P_Po, 68, P_Sm, 69, P_Ps, 70, P_Pe, 71, P_Po, 82, P_Sm, 83, P_Po, 84, P_Pc, 85, P_Po, 95, P_Zs, 96, P_Cf, 101, P_Cn, 102, P_Cf, 112, P_No, 113, P_Lm, 114, P_Cn, 116, P_No, 122, P_Sm, 125, P_Ps, 126, P_Pe, 127, P_Lm, 128, P_No, 138, P_Sm, 141, P_Ps, 142, P_Pe, 143, P_Cn, 144, P_Lm, 157, P_Cn, 160, P_Sc, 191, P_Cn, 208, P_Mn, 221, P_Me, 225, P_Mn, 226, P_Me, 229, P_Mn, 241, P_Cn,
0, P_So, 2, P_Lu, 3, P_So, 7, P_Lu, 8, P_So, 10, P_Ll, 11, P_Lu, 14, P_Ll, 16, P_Lu, 19, P_Ll, 20, P_So, 21, P_Lu, 22, P_So, 24, P_Sm, 25, P_Lu, 30, P_So, 36, P_Lu, 37, P_So, 38, P_Lu, 39, P_So, 40, P_Lu, 41, P_So, 42, P_Lu, 46, P_So, 47, P_Ll, 48, P_Lu, 52, P_Ll, 53, P_Lo, 57, P_Ll, 58, P_So, 60, P_Ll, 62, P_Lu, 64, P_Sm, 69, P_Lul, 71, P_Ll, 74, P_So, 75, P_Sm, 76, P_So, 78, P_Ll, 79, P_So, 80, P_No, 96, P_Nl, 131, P_Lul, 133, P_Nl, 137, P_No, 138, P_So, 140, P_Cn, 144, P_Sm, 149, P_So, 154, P_Sm, 156, P_So, 160, P_Sm, 161, P_So, 163, P_Sm, 164, P_So, 166, P_Sm, 167, P_So, 174, P_Sm, 175, P_So, 206, P_Sm, 208, P_So, 210, P_Sm, 211, P_So, 212, P_Sm, 213, P_So, 244, P_Sm,
0, P_Sm,
- 0, P_So, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_So, 32, P_Sm, 34, P_So, 41, P_Ps, 42, P_Pe, 43, P_So, 124, P_Sm, 125, P_So, 155, P_Sm, 180, P_So, 220, P_Sm, 226, P_So, 251, P_Cn,
+ 0, P_So, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_So, 32, P_Sm, 34, P_So, 41, P_Ps, 42, P_Pe, 43, P_So, 124, P_Sm, 125, P_So, 155, P_Sm, 180, P_So, 220, P_Sm, 226, P_So, 255, P_Cn,
0, P_So, 39, P_Cn, 64, P_So, 75, P_Cn, 96, P_No, 156, P_So, 234, P_No,
0, P_So, 183, P_Sm, 184, P_So, 193, P_Sm, 194, P_So, 248, P_Sm,
0, P_So, 111, P_Sm, 112, P_So,
@@ -61,7 +61,7 @@ const unsigned char UnicodeProperty::pro
0, P_So, 48, P_Sm, 69, P_So, 71, P_Sm, 77, P_So, 116, P_Cn, 118, P_So, 150, P_Cn, 152, P_So, 186, P_Cn, 189, P_So, 201, P_Cn, 202, P_So, 210, P_Cn, 236, P_So, 240, P_Cn,
0, P_Lu, 47, P_Cn, 48, P_Ll, 95, P_Cn, 96, P_Lul, 98, P_Lu, 101, P_Ll, 103, P_Lul, 109, P_Lu, 113, P_Ll, 114, P_Lul, 116, P_Ll, 117, P_Lul, 119, P_Ll, 124, P_Lm, 126, P_Lu, 129, P_Ll, 130, P_Lul, 228, P_Ll, 229, P_So, 235, P_Lul, 239, P_Mn, 242, P_Lul, 244, P_Cn, 249, P_Po, 253, P_No, 254, P_Po,
0, P_Ll, 38, P_Cn, 39, P_Ll, 40, P_Cn, 45, P_Ll, 46, P_Cn, 48, P_Lo, 104, P_Cn, 111, P_Lm, 112, P_Po, 113, P_Cn, 127, P_Mn, 128, P_Lo, 151, P_Cn, 160, P_Lo, 167, P_Cn, 168, P_Lo, 175, P_Cn, 176, P_Lo, 183, P_Cn, 184, P_Lo, 191, P_Cn, 192, P_Lo, 199, P_Cn, 200, P_Lo, 207, P_Cn, 208, P_Lo, 215, P_Cn, 216, P_Lo, 223, P_Cn, 224, P_Mn,
- 0, P_Po, 2, P_Pi, 3, P_Pf, 4, P_Pi, 5, P_Pf, 6, P_Po, 9, P_Pi, 10, P_Pf, 11, P_Po, 12, P_Pi, 13, P_Pf, 14, P_Po, 23, P_Pd, 24, P_Po, 26, P_Pd, 27, P_Po, 28, P_Pi, 29, P_Pf, 30, P_Po, 32, P_Pi, 33, P_Pf, 34, P_Ps, 35, P_Pe, 36, P_Ps, 37, P_Pe, 38, P_Ps, 39, P_Pe, 40, P_Ps, 41, P_Pe, 42, P_Po, 47, P_Lm, 48, P_Po, 58, P_Pd, 60, P_Po, 64, P_Pd, 65, P_Po, 66, P_Ps, 67, P_Cn, 128, P_So, 154, P_Cn, 155, P_So, 244, P_Cn,
+ 0, P_Po, 2, P_Pi, 3, P_Pf, 4, P_Pi, 5, P_Pf, 6, P_Po, 9, P_Pi, 10, P_Pf, 11, P_Po, 12, P_Pi, 13, P_Pf, 14, P_Po, 23, P_Pd, 24, P_Po, 26, P_Pd, 27, P_Po, 28, P_Pi, 29, P_Pf, 30, P_Po, 32, P_Pi, 33, P_Pf, 34, P_Ps, 35, P_Pe, 36, P_Ps, 37, P_Pe, 38, P_Ps, 39, P_Pe, 40, P_Ps, 41, P_Pe, 42, P_Po, 47, P_Lm, 48, P_Po, 58, P_Pd, 60, P_Po, 64, P_Pd, 65, P_Po, 66, P_Ps, 67, P_Po, 69, P_Cn, 128, P_So, 154, P_Cn, 155, P_So, 244, P_Cn,
0, P_So, 214, P_Cn, 240, P_So, 252, P_Cn,
0, P_Zs, 1, P_Po, 4, P_So, 5, P_Lm, 6, P_Lo, 7, P_Nl, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_Ps, 13, P_Pe, 14, P_Ps, 15, P_Pe, 16, P_Ps, 17, P_Pe, 18, P_So, 20, P_Ps, 21, P_Pe, 22, P_Ps, 23, P_Pe, 24, P_Ps, 25, P_Pe, 26, P_Ps, 27, P_Pe, 28, P_Pd, 29, P_Ps, 30, P_Pe, 32, P_So, 33, P_Nl, 42, P_Mn, 46, P_Mc, 48, P_Pd, 49, P_Lm, 54, P_So, 56, P_Nl, 59, P_Lm, 60, P_Lo, 61, P_Po, 62, P_So, 64, P_Cn, 65, P_Lo, 151, P_Cn, 153, P_Mn, 155, P_Sk, 157, P_Lm, 159, P_Lo, 160, P_Pd, 161, P_Lo, 251, P_Po, 252, P_Lm, 255, P_Lo,
0, P_Cn, 5, P_Lo, 46, P_Cn, 49, P_Lo, 143, P_Cn, 144, P_So, 146, P_No, 150, P_So, 160, P_Lo, 187, P_Cn, 192, P_So, 228, P_Cn, 240, P_Lo,
@@ -72,8 +72,8 @@ const unsigned char UnicodeProperty::pro
0, P_Lo, 21, P_Lm, 22, P_Lo,
0, P_Lo, 141, P_Cn, 144, P_So, 199, P_Cn, 208, P_Lo, 248, P_Lm, 254, P_Po,
0, P_Lo, 12, P_Lm, 13, P_Po, 16, P_Lo, 32, P_Nd, 42, P_Lo, 44, P_Cn, 64, P_Lul, 110, P_Lo, 111, P_Mn, 112, P_Me, 115, P_Po, 116, P_Mn, 126, P_Po, 127, P_Lm, 128, P_Lul, 156, P_Lm, 158, P_Mn, 160, P_Lo, 230, P_Nl, 240, P_Mn, 242, P_Po, 248, P_Cn,
- 0, P_Sk, 23, P_Lm, 32, P_Sk, 34, P_Lul, 48, P_Ll, 50, P_Lul, 112, P_Lm, 113, P_Ll, 121, P_Lul, 125, P_Lu, 127, P_Ll, 128, P_Lul, 136, P_Lm, 137, P_Sk, 139, P_Lul, 143, P_Lo, 144, P_Lul, 148, P_Ll, 150, P_Lul, 170, P_Lu, 174, P_Cn, 176, P_Lu, 181, P_Ll, 182, P_Lul, 184, P_Cn, 247, P_Lo, 248, P_Lm, 250, P_Ll, 251, P_Lo,
- 0, P_Lo, 2, P_Mn, 3, P_Lo, 6, P_Mn, 7, P_Lo, 11, P_Mn, 12, P_Lo, 35, P_Mc, 37, P_Mn, 39, P_Mc, 40, P_So, 44, P_Cn, 48, P_No, 54, P_So, 56, P_Sc, 57, P_So, 58, P_Cn, 64, P_Lo, 116, P_Po, 120, P_Cn, 128, P_Mc, 130, P_Lo, 180, P_Mc, 196, P_Mn, 197, P_Cn, 206, P_Po, 208, P_Nd, 218, P_Cn, 224, P_Mn, 242, P_Lo, 248, P_Po, 251, P_Lo, 252, P_Po, 253, P_Lo, 254, P_Cn,
+ 0, P_Sk, 23, P_Lm, 32, P_Sk, 34, P_Lul, 48, P_Ll, 50, P_Lul, 112, P_Lm, 113, P_Ll, 121, P_Lul, 125, P_Lu, 127, P_Ll, 128, P_Lul, 136, P_Lm, 137, P_Sk, 139, P_Lul, 143, P_Lo, 144, P_Lul, 148, P_Ll, 150, P_Lul, 170, P_Lu, 175, P_Cn, 176, P_Lu, 181, P_Ll, 182, P_Lul, 184, P_Cn, 247, P_Lo, 248, P_Lm, 250, P_Ll, 251, P_Lo,
+ 0, P_Lo, 2, P_Mn, 3, P_Lo, 6, P_Mn, 7, P_Lo, 11, P_Mn, 12, P_Lo, 35, P_Mc, 37, P_Mn, 39, P_Mc, 40, P_So, 44, P_Cn, 48, P_No, 54, P_So, 56, P_Sc, 57, P_So, 58, P_Cn, 64, P_Lo, 116, P_Po, 120, P_Cn, 128, P_Mc, 130, P_Lo, 180, P_Mc, 196, P_Mn, 198, P_Cn, 206, P_Po, 208, P_Nd, 218, P_Cn, 224, P_Mn, 242, P_Lo, 248, P_Po, 251, P_Lo, 252, P_Po, 253, P_Lo, 254, P_Cn,
0, P_Nd, 10, P_Lo, 38, P_Mn, 46, P_Po, 48, P_Lo, 71, P_Mn, 82, P_Mc, 84, P_Cn, 95, P_Po, 96, P_Lo, 125, P_Cn, 128, P_Mn, 131, P_Mc, 132, P_Lo, 179, P_Mn, 180, P_Mc, 182, P_Mn, 186, P_Mc, 188, P_Mn, 189, P_Mc, 193, P_Po, 206, P_Cn, 207, P_Lm, 208, P_Nd, 218, P_Cn, 222, P_Po, 224, P_Lo, 229, P_Mn, 230, P_Lm, 231, P_Lo, 240, P_Nd, 250, P_Lo, 255, P_Cn,
0, P_Lo, 41, P_Mn, 47, P_Mc, 49, P_Mn, 51, P_Mc, 53, P_Mn, 55, P_Cn, 64, P_Lo, 67, P_Mn, 68, P_Lo, 76, P_Mn, 77, P_Mc, 78, P_Cn, 80, P_Nd, 90, P_Cn, 92, P_Po, 96, P_Lo, 112, P_Lm, 113, P_Lo, 119, P_So, 122, P_Lo, 123, P_Mc, 124, P_Mn, 125, P_Mc, 126, P_Lo, 176, P_Mn, 177, P_Lo, 178, P_Mn, 181, P_Lo, 183, P_Mn, 185, P_Lo, 190, P_Mn, 192, P_Lo, 193, P_Mn, 194, P_Lo, 195, P_Cn, 219, P_Lo, 221, P_Lm, 222, P_Po, 224, P_Lo, 235, P_Mc, 236, P_Mn, 238, P_Mc, 240, P_Po, 242, P_Lo, 243, P_Lm, 245, P_Mc, 246, P_Mn, 247, P_Cn,
0, P_Cn, 1, P_Lo, 7, P_Cn, 9, P_Lo, 15, P_Cn, 17, P_Lo, 23, P_Cn, 32, P_Lo, 39, P_Cn, 40, P_Lo, 47, P_Cn, 48, P_Ll, 91, P_Sk, 92, P_Lm, 96, P_Ll, 102, P_Cn, 112, P_Ll, 192, P_Lo, 227, P_Mc, 229, P_Mn, 230, P_Mc, 232, P_Mn, 233, P_Mc, 235, P_Po, 236, P_Mc, 237, P_Mn, 238, P_Cn, 240, P_Nd, 250, P_Cn,
@@ -89,10 +89,10 @@ const unsigned char UnicodeProperty::pro
0, P_Mn, 16, P_Po, 23, P_Ps, 24, P_Pe, 25, P_Po, 26, P_Cn, 32, P_Mn, 48, P_Po, 49, P_Pd, 51, P_Pc, 53, P_Ps, 54, P_Pe, 55, P_Ps, 56, P_Pe, 57, P_Ps, 58, P_Pe, 59, P_Ps, 60, P_Pe, 61, P_Ps, 62, P_Pe, 63, P_Ps, 64, P_Pe, 65, P_Ps, 66, P_Pe, 67, P_Ps, 68, P_Pe, 69, P_Po, 71, P_Ps, 72, P_Pe, 73, P_Po, 77, P_Pc, 80, P_Po, 83, P_Cn, 84, P_Po, 88, P_Pd, 89, P_Ps, 90, P_Pe, 91, P_Ps, 92, P_Pe, 93, P_Ps, 94, P_Pe, 95, P_Po, 98, P_Sm, 99, P_Pd, 100, P_Sm, 103, P_Cn, 104, P_Po, 105, P_Sc, 106, P_Po, 108, P_Cn, 112, P_Lo, 117, P_Cn, 118, P_Lo, 253, P_Cn, 255, P_Cf,
0, P_Cn, 1, P_Po, 4, P_Sc, 5, P_Po, 8, P_Ps, 9, P_Pe, 10, P_Po, 11, P_Sm, 12, P_Po, 13, P_Pd, 14, P_Po, 16, P_Nd, 26, P_Po, 28, P_Sm, 31, P_Po, 33, P_Lu, 59, P_Ps, 60, P_Po, 61, P_Pe, 62, P_Sk, 63, P_Pc, 64, P_Sk, 65, P_Ll, 91, P_Ps, 92, P_Sm, 93, P_Pe, 94, P_Sm, 95, P_Ps, 96, P_Pe, 97, P_Po, 98, P_Ps, 99, P_Pe, 100, P_Po, 102, P_Lo, 112, P_Lm, 113, P_Lo, 158, P_Lm, 160, P_Lo, 191, P_Cn, 194, P_Lo, 200, P_Cn, 202, P_Lo, 208, P_Cn, 210, P_Lo, 216, P_Cn, 218, P_Lo, 221, P_Cn, 224, P_Sc, 226, P_Sm, 227, P_Sk, 228, P_So, 229, P_Sc, 231, P_Cn, 232, P_So, 233, P_Sm, 237, P_So, 239, P_Cn, 249, P_Cf, 252, P_So, 254, P_Cn,
0, P_Lo, 12, P_Cn, 13, P_Lo, 39, P_Cn, 40, P_Lo, 59, P_Cn, 60, P_Lo, 62, P_Cn, 63, P_Lo, 78, P_Cn, 80, P_Lo, 94, P_Cn, 128, P_Lo, 251, P_Cn,
- 0, P_Po, 3, P_Cn, 7, P_No, 52, P_Cn, 55, P_So, 64, P_Nl, 117, P_No, 121, P_So, 138, P_No, 140, P_So, 141, P_Cn, 144, P_So, 156, P_Cn, 160, P_So, 161, P_Cn, 208, P_So, 253, P_Mn, 254, P_Cn,
+ 0, P_Po, 3, P_Cn, 7, P_No, 52, P_Cn, 55, P_So, 64, P_Nl, 117, P_No, 121, P_So, 138, P_No, 140, P_So, 143, P_Cn, 144, P_So, 156, P_Cn, 160, P_So, 161, P_Cn, 208, P_So, 253, P_Mn, 254, P_Cn,
0, P_Cn, 128, P_Lo, 157, P_Cn, 160, P_Lo, 209, P_Cn, 224, P_Mn, 225, P_No, 252, P_Cn,
0, P_Lo, 32, P_No, 36, P_Cn, 48, P_Lo, 65, P_Nl, 66, P_Lo, 74, P_Nl, 75, P_Cn, 80, P_Lo, 118, P_Mn, 123, P_Cn, 128, P_Lo, 158, P_Cn, 159, P_Po, 160, P_Lo, 196, P_Cn, 200, P_Lo, 208, P_Po, 209, P_Nl, 214, P_Cn,
- 0, P_Lu, 40, P_Ll, 80, P_Lo, 158, P_Cn, 160, P_Nd, 170, P_Cn,
+ 0, P_Lu, 40, P_Ll, 80, P_Lo, 158, P_Cn, 160, P_Nd, 170, P_Cn, 176, P_Lu, 212, P_Cn, 216, P_Ll, 252, P_Cn,
0, P_Lo, 40, P_Cn, 48, P_Lo, 100, P_Cn, 111, P_Po, 112, P_Cn,
0, P_Lo, 55, P_Cn, 64, P_Lo, 86, P_Cn, 96, P_Lo, 104, P_Cn,
0, P_Lo, 6, P_Cn, 8, P_Lo, 9, P_Cn, 10, P_Lo, 54, P_Cn, 55, P_Lo, 57, P_Cn, 60, P_Lo, 61, P_Cn, 63, P_Lo, 86, P_Cn, 87, P_Po, 88, P_No, 96, P_Lo, 119, P_So, 121, P_No, 128, P_Lo, 159, P_Cn, 167, P_No, 176, P_Cn, 224, P_Lo, 243, P_Cn, 244, P_Lo, 246, P_Cn, 251, P_No,
@@ -103,14 +103,15 @@ const unsigned char UnicodeProperty::pro
0, P_Cn, 96, P_No, 127, P_Cn,
0, P_Mc, 1, P_Mn, 2, P_Mc, 3, P_Lo, 56, P_Mn, 71, P_Po, 78, P_Cn, 82, P_No, 102, P_Nd, 112, P_Cn, 127, P_Mn, 130, P_Mc, 131, P_Lo, 176, P_Mc, 179, P_Mn, 183, P_Mc, 185, P_Mn, 187, P_Po, 189, P_Cf, 190, P_Po, 194, P_Cn, 208, P_Lo, 233, P_Cn, 240, P_Nd, 250, P_Cn,
0, P_Mn, 3, P_Lo, 39, P_Mn, 44, P_Mc, 45, P_Mn, 53, P_Cn, 54, P_Nd, 64, P_Po, 68, P_Cn, 80, P_Lo, 115, P_Mn, 116, P_Po, 118, P_Lo, 119, P_Cn, 128, P_Mn, 130, P_Mc, 131, P_Lo, 179, P_Mc, 182, P_Mn, 191, P_Mc, 193, P_Lo, 197, P_Po, 202, P_Mn, 205, P_Po, 206, P_Cn, 208, P_Nd, 218, P_Lo, 219, P_Po, 220, P_Lo, 221, P_Po, 224, P_Cn, 225, P_No, 245, P_Cn,
- 0, P_Lo, 18, P_Cn, 19, P_Lo, 44, P_Mc, 47, P_Mn, 50, P_Mc, 52, P_Mn, 53, P_Mc, 54, P_Mn, 56, P_Po, 62, P_Cn, 128, P_Lo, 135, P_Cn, 136, P_Lo, 137, P_Cn, 138, P_Lo, 142, P_Cn, 143, P_Lo, 158, P_Cn, 159, P_Lo, 169, P_Po, 170, P_Cn, 176, P_Lo, 223, P_Mn, 224, P_Mc, 227, P_Mn, 235, P_Cn, 240, P_Nd, 250, P_Cn,
+ 0, P_Lo, 18, P_Cn, 19, P_Lo, 44, P_Mc, 47, P_Mn, 50, P_Mc, 52, P_Mn, 53, P_Mc, 54, P_Mn, 56, P_Po, 62, P_Mn, 63, P_Cn, 128, P_Lo, 135, P_Cn, 136, P_Lo, 137, P_Cn, 138, P_Lo, 142, P_Cn, 143, P_Lo, 158, P_Cn, 159, P_Lo, 169, P_Po, 170, P_Cn, 176, P_Lo, 223, P_Mn, 224, P_Mc, 227, P_Mn, 235, P_Cn, 240, P_Nd, 250, P_Cn,
0, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 64, P_Mn, 65, P_Mc, 69, P_Cn, 71, P_Mc, 73, P_Cn, 75, P_Mc, 78, P_Cn, 80, P_Lo, 81, P_Cn, 87, P_Mc, 88, P_Cn, 93, P_Lo, 98, P_Mc, 100, P_Cn, 102, P_Mn, 109, P_Cn, 112, P_Mn, 117, P_Cn,
- 0, P_Cn, 128, P_Lo, 176, P_Mc, 179, P_Mn, 185, P_Mc, 186, P_Mn, 187, P_Mc, 191, P_Mn, 193, P_Mc, 194, P_Mn, 196, P_Lo, 198, P_Po, 199, P_Lo, 200, P_Cn, 208, P_Nd, 218, P_Cn,
+ 0, P_Lo, 53, P_Mc, 56, P_Mn, 64, P_Mc, 66, P_Mn, 69, P_Mc, 70, P_Mn, 71, P_Lo, 75, P_Po, 80, P_Nd, 90, P_Cn, 91, P_Po, 92, P_Cn, 93, P_Po, 94, P_Cn, 128, P_Lo, 176, P_Mc, 179, P_Mn, 185, P_Mc, 186, P_Mn, 187, P_Mc, 191, P_Mn, 193, P_Mc, 194, P_Mn, 196, P_Lo, 198, P_Po, 199, P_Lo, 200, P_Cn, 208, P_Nd, 218, P_Cn,
0, P_Cn, 128, P_Lo, 175, P_Mc, 178, P_Mn, 182, P_Cn, 184, P_Mc, 188, P_Mn, 190, P_Mc, 191, P_Mn, 193, P_Po, 216, P_Lo, 220, P_Mn, 222, P_Cn,
- 0, P_Lo, 48, P_Mc, 51, P_Mn, 59, P_Mc, 61, P_Mn, 62, P_Mc, 63, P_Mn, 65, P_Po, 68, P_Lo, 69, P_Cn, 80, P_Nd, 90, P_Cn, 128, P_Lo, 171, P_Mn, 172, P_Mc, 173, P_Mn, 174, P_Mc, 176, P_Mn, 182, P_Mc, 183, P_Mn, 184, P_Cn, 192, P_Nd, 202, P_Cn,
+ 0, P_Lo, 48, P_Mc, 51, P_Mn, 59, P_Mc, 61, P_Mn, 62, P_Mc, 63, P_Mn, 65, P_Po, 68, P_Lo, 69, P_Cn, 80, P_Nd, 90, P_Cn, 96, P_Po, 109, P_Cn, 128, P_Lo, 171, P_Mn, 172, P_Mc, 173, P_Mn, 174, P_Mc, 176, P_Mn, 182, P_Mc, 183, P_Mn, 184, P_Cn, 192, P_Nd, 202, P_Cn,
0, P_Lo, 26, P_Cn, 29, P_Mn, 32, P_Mc, 34, P_Mn, 38, P_Mc, 39, P_Mn, 44, P_Cn, 48, P_Nd, 58, P_No, 60, P_Po, 63, P_So, 64, P_Cn,
0, P_Cn, 160, P_Lu, 192, P_Ll, 224, P_Nd, 234, P_No, 243, P_Cn, 255, P_Lo,
0, P_Cn, 192, P_Lo, 249, P_Cn,
+ 0, P_Lo, 9, P_Cn, 10, P_Lo, 47, P_Mc, 48, P_Mn, 55, P_Cn, 56, P_Mn, 62, P_Mc, 63, P_Mn, 64, P_Lo, 65, P_Po, 70, P_Cn, 80, P_Nd, 90, P_No, 109, P_Cn, 112, P_Po, 114, P_Lo, 144, P_Cn, 146, P_Mn, 168, P_Cn, 169, P_Mc, 170, P_Mn, 177, P_Mc, 178, P_Mn, 180, P_Mc, 181, P_Mn, 183, P_Cn,
0, P_Lo, 154, P_Cn,
0, P_Nl, 111, P_Cn, 112, P_Po, 117, P_Cn, 128, P_Lo,
0, P_Lo, 68, P_Cn,
@@ -118,7 +119,9 @@ const unsigned char UnicodeProperty::pro
0, P_Lo, 71, P_Cn,
0, P_Lo, 57, P_Cn, 64, P_Lo, 95, P_Cn, 96, P_Nd, 106, P_Cn, 110, P_Po, 112, P_Cn, 208, P_Lo, 238, P_Cn, 240, P_Mn, 245, P_Po, 246, P_Cn,
0, P_Lo, 48, P_Mn, 55, P_Po, 60, P_So, 64, P_Lm, 68, P_Po, 69, P_So, 70, P_Cn, 80, P_Nd, 90, P_Cn, 91, P_No, 98, P_Cn, 99, P_Lo, 120, P_Cn, 125, P_Lo, 144, P_Cn,
- 0, P_Lo, 69, P_Cn, 80, P_Lo, 81, P_Mc, 127, P_Cn, 143, P_Mn, 147, P_Lm, 160, P_Cn,
+ 0, P_Lo, 69, P_Cn, 80, P_Lo, 81, P_Mc, 127, P_Cn, 143, P_Mn, 147, P_Lm, 160, P_Cn, 224, P_Lm, 225, P_Cn,
+ 0, P_Cn, 236, P_Lo, 237, P_Cn,
+ 0, P_Lo, 243, P_Cn,
0, P_Lo, 2, P_Cn,
0, P_Lo, 107, P_Cn, 112, P_Lo, 125, P_Cn, 128, P_Lo, 137, P_Cn, 144, P_Lo, 154, P_Cn, 156, P_So, 157, P_Mn, 159, P_Po, 160, P_Cf, 164, P_Cn,
0, P_So, 246, P_Cn,
@@ -130,17 +133,18 @@ const unsigned char UnicodeProperty::pro
0, P_Ll, 8, P_Lu, 34, P_Ll, 60, P_Lu, 86, P_Ll, 112, P_Lu, 138, P_Ll, 166, P_Cn, 168, P_Lu, 193, P_Sm, 194, P_Ll, 219, P_Sm, 220, P_Ll, 226, P_Lu, 251, P_Sm, 252, P_Ll,
0, P_Ll, 21, P_Sm, 22, P_Ll, 28, P_Lu, 53, P_Sm, 54, P_Ll, 79, P_Sm, 80, P_Ll, 86, P_Lu, 111, P_Sm, 112, P_Ll, 137, P_Sm, 138, P_Ll, 144, P_Lu, 169, P_Sm, 170, P_Ll, 195, P_Sm, 196, P_Ll, 202, P_Lul, 204, P_Cn, 206, P_Nd,
0, P_Mn, 55, P_So, 59, P_Mn, 109, P_So, 117, P_Mn, 118, P_So, 132, P_Mn, 133, P_So, 135, P_Po, 140, P_Cn, 155, P_Mn, 160, P_Cn, 161, P_Mn, 176, P_Cn,
+ 0, P_Mn, 7, P_Cn, 8, P_Mn, 25, P_Cn, 27, P_Mn, 34, P_Cn, 35, P_Mn, 37, P_Cn, 38, P_Mn, 43, P_Cn,
0, P_Lo, 197, P_Cn, 199, P_No, 208, P_Mn, 215, P_Cn,
+ 0, P_Lu, 34, P_Ll, 68, P_Mn, 75, P_Cn, 80, P_Nd, 90, P_Cn, 94, P_Po, 96, P_Cn,
0, P_Lo, 4, P_Cn, 5, P_Lo, 32, P_Cn, 33, P_Lo, 35, P_Cn, 36, P_Lo, 37, P_Cn, 39, P_Lo, 40, P_Cn, 41, P_Lo, 51, P_Cn, 52, P_Lo, 56, P_Cn, 57, P_Lo, 58, P_Cn, 59, P_Lo, 60, P_Cn, 66, P_Lo, 67, P_Cn, 71, P_Lo, 72, P_Cn, 73, P_Lo, 74, P_Cn, 75, P_Lo, 76, P_Cn, 77, P_Lo, 80, P_Cn, 81, P_Lo, 83, P_Cn, 84, P_Lo, 85, P_Cn, 87, P_Lo, 88, P_Cn, 89, P_Lo, 90, P_Cn, 91, P_Lo, 92, P_Cn, 93, P_Lo, 94, P_Cn, 95, P_Lo, 96, P_Cn, 97, P_Lo, 99, P_Cn, 100, P_Lo, 101, P_Cn, 103, P_Lo, 107, P_Cn, 108, P_Lo, 115, P_Cn, 116, P_Lo, 120, P_Cn, 121, P_Lo, 125, P_Cn, 126, P_Lo, 127, P_Cn, 128, P_Lo, 138, P_Cn, 139, P_Lo, 156, P_Cn, 161, P_Lo, 164, P_Cn, 165, P_Lo, 170, P_Cn, 171, P_Lo, 188, P_Cn, 240, P_Sm, 242, P_Cn,
0, P_So, 44, P_Cn, 48, P_So, 148, P_Cn, 160, P_So, 175, P_Cn, 177, P_So, 192, P_Cn, 193, P_So, 208, P_Cn, 209, P_So, 246, P_Cn,
- 0, P_No, 13, P_Cn, 16, P_So, 47, P_Cn, 48, P_So, 108, P_Cn, 112, P_So, 155, P_Cn, 230, P_So,
- 0, P_So, 3, P_Cn, 16, P_So, 59, P_Cn, 64, P_So, 73, P_Cn, 80, P_So, 82, P_Cn,
+ 0, P_No, 13, P_Cn, 16, P_So, 47, P_Cn, 48, P_So, 108, P_Cn, 112, P_So, 173, P_Cn, 230, P_So,
+ 0, P_So, 3, P_Cn, 16, P_So, 60, P_Cn, 64, P_So, 73, P_Cn, 80, P_So, 82, P_Cn,
0, P_So, 251, P_Sk,
- 0, P_So, 122, P_Cn, 123, P_So, 164, P_Cn, 165, P_So,
- 0, P_So, 209, P_Cn, 224, P_So, 237, P_Cn, 240, P_So, 244, P_Cn,
+ 0, P_So, 211, P_Cn, 224, P_So, 237, P_Cn, 240, P_So, 247, P_Cn,
0, P_So, 116, P_Cn, 128, P_So, 213, P_Cn,
0, P_So, 12, P_Cn, 16, P_So, 72, P_Cn, 80, P_So, 90, P_Cn, 96, P_So, 136, P_Cn, 144, P_So, 174, P_Cn,
- 0, P_Cn, 16, P_So, 25, P_Cn, 128, P_So, 133, P_Cn, 192, P_So, 193, P_Cn,
+ 0, P_Cn, 16, P_So, 31, P_Cn, 32, P_So, 40, P_Cn, 48, P_So, 49, P_Cn, 51, P_So, 63, P_Cn, 64, P_So, 76, P_Cn, 80, P_So, 95, P_Cn, 128, P_So, 146, P_Cn, 192, P_So, 193, P_Cn,
0, P_Cn, 214, P_Lo, 215, P_Cn,
0, P_Cn, 52, P_Lo, 53, P_Cn, 64, P_Lo, 65, P_Cn,
0, P_Cn, 29, P_Lo, 30, P_Cn, 32, P_Lo, 33, P_Cn,
@@ -159,182 +163,191 @@ const unsigned int UnicodeProperty::prop
0x500, 390, 450,
0x600, 450, 520,
0x700, 520, 560,
- 0x800, 560, 598,
- 0x900, 598, 720,
- 0xA00, 720, 870,
- 0xB00, 870, 1032,
- 0xC00, 1032, 1166,
- 0xD00, 1166, 1280,
- 0xE00, 1280, 1388,
- 0xF00, 1388, 1476,
- 0x1000, 1476, 1566,
- 0x1100, 1566, 1568,
- 0x1200, 1568, 1622,
- 0x1300, 1622, 1656,
- 0x1400, 1656, 1660,
- 0x1500, 1566, 1568,
- 0x1600, 1660, 1686,
- 0x1700, 1686, 1760,
- 0x1800, 1760, 1796,
- 0x1900, 1796, 1852,
- 0x1A00, 1852, 1916,
- 0x1B00, 1916, 1998,
- 0x1C00, 1998, 2060,
- 0x1D00, 2060, 2078,
- 0x1E00, 2078, 2084,
- 0x1F00, 2084, 2212,
- 0x2000, 2212, 2326,
- 0x2100, 2326, 2458,
- 0x2200, 2458, 2460,
- 0x2300, 2460, 2496,
- 0x2400, 2496, 2510,
- 0x2500, 2510, 2522,
- 0x2600, 2522, 2528,
- 0x2700, 2528, 2592,
- 0x2800, 2592, 2594,
- 0x2900, 2594, 2658,
- 0x2A00, 2458, 2460,
- 0x2B00, 2658, 2690,
- 0x2C00, 2690, 2744,
- 0x2D00, 2744, 2806,
- 0x2E00, 2806, 2890,
- 0x2F00, 2890, 2898,
- 0x3000, 2898, 3002,
- 0x3100, 3002, 3028,
- 0x3200, 3028, 3054,
- 0x3300, 2592, 2594,
- 0x3400, 3054, 3058,
+ 0x800, 560, 606,
+ 0x900, 606, 728,
+ 0xA00, 728, 878,
+ 0xB00, 878, 1040,
+ 0xC00, 1040, 1174,
+ 0xD00, 1174, 1290,
+ 0xE00, 1290, 1398,
+ 0xF00, 1398, 1486,
+ 0x1000, 1486, 1576,
+ 0x1100, 1576, 1578,
+ 0x1200, 1578, 1632,
+ 0x1300, 1632, 1666,
+ 0x1400, 1666, 1670,
+ 0x1500, 1576, 1578,
+ 0x1600, 1670, 1696,
+ 0x1700, 1696, 1770,
+ 0x1800, 1770, 1810,
+ 0x1900, 1810, 1866,
+ 0x1A00, 1866, 1930,
+ 0x1B00, 1930, 2012,
+ 0x1C00, 2012, 2076,
+ 0x1D00, 2076, 2094,
+ 0x1E00, 2094, 2100,
+ 0x1F00, 2100, 2228,
+ 0x2000, 2228, 2342,
+ 0x2100, 2342, 2474,
+ 0x2200, 2474, 2476,
+ 0x2300, 2476, 2512,
+ 0x2400, 2512, 2526,
+ 0x2500, 2526, 2538,
+ 0x2600, 2538, 2544,
+ 0x2700, 2544, 2608,
+ 0x2800, 2608, 2610,
+ 0x2900, 2610, 2674,
+ 0x2A00, 2474, 2476,
+ 0x2B00, 2674, 2706,
+ 0x2C00, 2706, 2760,
+ 0x2D00, 2760, 2822,
+ 0x2E00, 2822, 2908,
+ 0x2F00, 2908, 2916,
+ 0x3000, 2916, 3020,
+ 0x3100, 3020, 3046,
+ 0x3200, 3046, 3072,
+ 0x3300, 2608, 2610,
+ 0x3400, 3072, 3076,
0x3500, 0, 2,
- 0x4D00, 3058, 3066,
- 0x4E00, 3054, 3058,
+ 0x4D00, 3076, 3084,
+ 0x4E00, 3072, 3076,
0x4F00, 0, 2,
- 0x9F00, 3066, 3072,
- 0xA000, 3072, 3078,
- 0xA100, 1566, 1568,
- 0xA400, 3078, 3092,
- 0xA500, 1566, 1568,
- 0xA600, 3092, 3138,
- 0xA700, 3138, 3196,
- 0xA800, 3196, 3266,
- 0xA900, 3266, 3332,
- 0xAA00, 3332, 3430,
- 0xAB00, 3430, 3488,
- 0xAC00, 3054, 3058,
+ 0x9F00, 3084, 3090,
+ 0xA000, 3090, 3096,
+ 0xA100, 1576, 1578,
+ 0xA400, 3096, 3110,
+ 0xA500, 1576, 1578,
+ 0xA600, 3110, 3156,
+ 0xA700, 3156, 3214,
+ 0xA800, 3214, 3284,
+ 0xA900, 3284, 3350,
+ 0xAA00, 3350, 3448,
+ 0xAB00, 3448, 3506,
+ 0xAC00, 3072, 3076,
0xAD00, 0, 2,
- 0xD700, 3488, 3502,
- 0xD800, 3502, 3506,
+ 0xD700, 3506, 3520,
+ 0xD800, 3520, 3524,
0xD900, 0, 2,
- 0xDB00, 3506, 3514,
- 0xDC00, 3502, 3506,
+ 0xDB00, 3524, 3532,
+ 0xDC00, 3520, 3524,
0xDD00, 0, 2,
- 0xDF00, 3514, 3518,
- 0xE000, 3518, 3522,
+ 0xDF00, 3532, 3536,
+ 0xE000, 3536, 3540,
0xE100, 0, 2,
- 0xF800, 3522, 3526,
- 0xF900, 1566, 1568,
- 0xFA00, 3526, 3534,
- 0xFB00, 3534, 3578,
- 0xFC00, 1566, 1568,
- 0xFD00, 3578, 3602,
- 0xFE00, 3602, 3712,
- 0xFF00, 3712, 3832,
- 0x10000, 3832, 3860,
- 0x10100, 3860, 3896,
- 0x10200, 3896, 3912,
- 0x10300, 3912, 3952,
- 0x10400, 3952, 3964,
- 0x10500, 3964, 3976,
- 0x10600, 1566, 1568,
- 0x10700, 3976, 3988,
- 0x10800, 3988, 4040,
- 0x10900, 4040, 4070,
- 0x10A00, 4070, 4136,
- 0x10B00, 4136, 4166,
- 0x10C00, 4166, 4180,
+ 0xF800, 3540, 3544,
+ 0xF900, 1576, 1578,
+ 0xFA00, 3544, 3552,
+ 0xFB00, 3552, 3596,
+ 0xFC00, 1576, 1578,
+ 0xFD00, 3596, 3620,
+ 0xFE00, 3620, 3730,
+ 0xFF00, 3730, 3850,
+ 0x10000, 3850, 3878,
+ 0x10100, 3878, 3914,
+ 0x10200, 3914, 3930,
+ 0x10300, 3930, 3970,
+ 0x10400, 3970, 3990,
+ 0x10500, 3990, 4002,
+ 0x10600, 1576, 1578,
+ 0x10700, 4002, 4014,
+ 0x10800, 4014, 4066,
+ 0x10900, 4066, 4096,
+ 0x10A00, 4096, 4162,
+ 0x10B00, 4162, 4192,
+ 0x10C00, 4192, 4206,
0x10D00, 0, 2,
- 0x10E00, 4180, 4186,
+ 0x10E00, 4206, 4212,
0x10F00, 0, 2,
- 0x11000, 4186, 4236,
- 0x11100, 4236, 4302,
- 0x11200, 4302, 4360,
- 0x11300, 4360, 4432,
- 0x11400, 4432, 4464,
- 0x11500, 4464, 4490,
- 0x11600, 4490, 4536,
- 0x11700, 4536, 4562,
- 0x11800, 4562, 4576,
+ 0x11000, 4212, 4262,
+ 0x11100, 4262, 4328,
+ 0x11200, 4328, 4388,
+ 0x11300, 4388, 4460,
+ 0x11400, 4460, 4520,
+ 0x11500, 4520, 4546,
+ 0x11600, 4546, 4596,
+ 0x11700, 4596, 4622,
+ 0x11800, 4622, 4636,
0x11900, 0, 2,
- 0x11A00, 4576, 4582,
+ 0x11A00, 4636, 4642,
0x11B00, 0, 2,
- 0x12000, 1566, 1568,
- 0x12300, 4582, 4586,
- 0x12400, 4586, 4596,
- 0x12500, 4596, 4600,
+ 0x11C00, 4642, 4696,
+ 0x11D00, 0, 2,
+ 0x12000, 1576, 1578,
+ 0x12300, 4696, 4700,
+ 0x12400, 4700, 4710,
+ 0x12500, 4710, 4714,
0x12600, 0, 2,
- 0x13000, 1566, 1568,
- 0x13400, 4600, 4604,
+ 0x13000, 1576, 1578,
+ 0x13400, 4714, 4718,
0x13500, 0, 2,
- 0x14400, 1566, 1568,
- 0x14600, 4604, 4608,
+ 0x14400, 1576, 1578,
+ 0x14600, 4718, 4722,
0x14700, 0, 2,
- 0x16800, 1566, 1568,
- 0x16A00, 4608, 4634,
- 0x16B00, 4634, 4666,
+ 0x16800, 1576, 1578,
+ 0x16A00, 4722, 4748,
+ 0x16B00, 4748, 4780,
0x16C00, 0, 2,
- 0x16F00, 4666, 4682,
- 0x17000, 0, 2,
- 0x1B000, 4682, 4686,
+ 0x16F00, 4780, 4800,
+ 0x17000, 3072, 3076,
+ 0x17100, 0, 2,
+ 0x18700, 4800, 4806,
+ 0x18800, 1576, 1578,
+ 0x18A00, 4806, 4810,
+ 0x18B00, 0, 2,
+ 0x1B000, 4810, 4814,
0x1B100, 0, 2,
- 0x1BC00, 4686, 4712,
+ 0x1BC00, 4814, 4840,
0x1BD00, 0, 2,
- 0x1D000, 4712, 4716,
- 0x1D100, 4716, 4746,
- 0x1D200, 4746, 4754,
- 0x1D300, 4754, 4762,
- 0x1D400, 4762, 4818,
- 0x1D500, 4818, 4872,
- 0x1D600, 4872, 4904,
- 0x1D700, 4904, 4946,
- 0x1D800, 2592, 2594,
- 0x1DA00, 4946, 4974,
+ 0x1D000, 4840, 4844,
+ 0x1D100, 4844, 4874,
+ 0x1D200, 4874, 4882,
+ 0x1D300, 4882, 4890,
+ 0x1D400, 4890, 4946,
+ 0x1D500, 4946, 5000,
+ 0x1D600, 5000, 5032,
+ 0x1D700, 5032, 5074,
+ 0x1D800, 2608, 2610,
+ 0x1DA00, 5074, 5102,
0x1DB00, 0, 2,
- 0x1E800, 4974, 4984,
- 0x1E900, 0, 2,
- 0x1EE00, 4984, 5120,
+ 0x1E000, 5102, 5122,
+ 0x1E100, 0, 2,
+ 0x1E800, 5122, 5132,
+ 0x1E900, 5132, 5148,
+ 0x1EA00, 0, 2,
+ 0x1EE00, 5148, 5284,
0x1EF00, 0, 2,
- 0x1F000, 5120, 5144,
- 0x1F100, 5144, 5162,
- 0x1F200, 5162, 5178,
- 0x1F300, 5178, 5182,
- 0x1F400, 2592, 2594,
- 0x1F500, 5182, 5192,
- 0x1F600, 5192, 5204,
- 0x1F700, 5204, 5212,
- 0x1F800, 5212, 5232,
- 0x1F900, 5232, 5246,
+ 0x1F000, 5284, 5308,
+ 0x1F100, 5308, 5326,
+ 0x1F200, 5326, 5342,
+ 0x1F300, 5342, 5346,
+ 0x1F400, 2608, 2610,
+ 0x1F600, 5346, 5358,
+ 0x1F700, 5358, 5366,
+ 0x1F800, 5366, 5386,
+ 0x1F900, 5386, 5420,
0x1FA00, 0, 2,
- 0x20000, 3054, 3058,
+ 0x20000, 3072, 3076,
0x20100, 0, 2,
- 0x2A600, 5246, 5252,
- 0x2A700, 3054, 3058,
+ 0x2A600, 5420, 5426,
+ 0x2A700, 3072, 3076,
0x2A800, 0, 2,
- 0x2B700, 5252, 5262,
- 0x2B800, 5262, 5272,
+ 0x2B700, 5426, 5436,
+ 0x2B800, 5436, 5446,
0x2B900, 0, 2,
- 0x2CE00, 5272, 5278,
+ 0x2CE00, 5446, 5452,
0x2CF00, 0, 2,
- 0x2F800, 1566, 1568,
- 0x2FA00, 5278, 5282,
+ 0x2F800, 1576, 1578,
+ 0x2FA00, 5452, 5456,
0x2FB00, 0, 2,
- 0xE0000, 5282, 5292,
- 0xE0100, 5292, 5296,
+ 0xE0000, 5456, 5466,
+ 0xE0100, 5466, 5470,
0xE0200, 0, 2,
- 0xF0000, 3518, 3522,
+ 0xF0000, 3536, 3540,
0xF0100, 0, 2,
- 0xFFF00, 5296, 5302,
- 0x100000, 3518, 3522,
+ 0xFFF00, 5470, 5476,
+ 0x100000, 3536, 3540,
0x100100, 0, 2,
- 0x10FF00, 5296, 5302,
+ 0x10FF00, 5470, 5476,
0x110000, 0, 2,
};
const int UnicodeProperty::nproperty_offsets = (sizeof(UnicodeProperty::property_offsets) / (3*sizeof(unsigned int)));
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh 2018-02-23 12:47:54.095971653 -0500
@@ -5,15 +5,15 @@
class UnicodeProperty { public:
enum {
- P_C = 000, P_Cn = 000, P_Co = 001, P_Cs = 002, P_Cf = 003, P_Cc = 004,
- P_Z = 010, P_Zs = 010, P_Zl = 011, P_Zp = 012,
- P_M = 020, P_Mn = 020, P_Mc = 021, P_Me = 022,
- P_L = 030, P_Lo = 030, P_Lu = 031, P_Ll = 032, P_Lt = 033, P_Lm = 034,
- P_N = 040, P_No = 040, P_Nd = 041, P_Nl = 042,
- P_P = 050, P_Po = 050, P_Pc = 051, P_Pd = 052, P_Ps = 053, P_Pe = 054, P_Pi = 055, P_Pf = 056,
- P_S = 060, P_So = 060, P_Sm = 061, P_Sc = 062, P_Sk = 063,
- P_TMASK = 0370,
- P_MAX = 0377
+ P_C = 000, P_Cn = 000, P_Co = 001, P_Cs = 002, P_Cf = 003, P_Cc = 004,
+ P_Z = 010, P_Zs = 010, P_Zl = 011, P_Zp = 012,
+ P_M = 020, P_Mn = 020, P_Mc = 021, P_Me = 022,
+ P_L = 030, P_Lo = 030, P_Lu = 031, P_Ll = 032, P_Lt = 033, P_Lm = 034,
+ P_N = 040, P_No = 040, P_Nd = 041, P_Nl = 042,
+ P_P = 050, P_Po = 050, P_Pc = 051, P_Pd = 052, P_Ps = 053, P_Pe = 054, P_Pi = 055, P_Pf = 056,
+ P_S = 060, P_So = 060, P_Sm = 061, P_Sc = 062, P_Sk = 063,
+ P_TMASK = 0370,
+ P_MAX = 0377
};
static int property(uint32_t uni);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc 2018-02-23 12:47:54.095971653 -0500
@@ -1,6 +1,6 @@
/* util.{cc,hh} -- various bits
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -37,30 +37,30 @@ read_file(String filename, ErrorHandler
{
FILE *f;
if (!filename || filename == "-") {
- filename = "<stdin>";
- f = stdin;
+ filename = "<stdin>";
+ f = stdin;
#if defined(_MSDOS) || defined(_WIN32)
- // Set the file mode to binary
- _setmode(_fileno(f), _O_BINARY);
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
#endif
} else if (!(f = fopen(filename.c_str(), "rb"))) {
- errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
- return String();
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ return String();
}
StringAccum sa;
int amt;
do {
- if (char *x = sa.reserve(8192)) {
- amt = fread(x, 1, 8192, f);
- sa.adjust_length(amt);
- } else
- amt = 0;
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
} while (amt != 0);
if (!feof(f) || ferror(f))
- errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
if (f != stdin)
- fclose(f);
+ fclose(f);
return sa.take_string();
}
@@ -68,9 +68,9 @@ String
printable_filename(const String &s)
{
if (!s || s == "-")
- return String::make_stable("<stdin>");
+ return String::make_stable("<stdin>");
else
- return s;
+ return s;
}
String
@@ -78,19 +78,19 @@ pathname_filename(const String &path)
{
int slash = path.find_right('/');
if (slash >= 0 && slash != path.length() - 1)
- return path.substring(slash + 1);
+ return path.substring(slash + 1);
else
- return path;
+ return path;
}
static String
simplify_filename(String x)
{
while (x.substring(0, 2) == "./")
- x = x.substring(2);
+ x = x.substring(2);
int pos;
while ((pos = x.find_left("/./")) >= 0)
- x = x.substring(0, pos) + x.substring(pos + 2);
+ x = x.substring(0, pos) + x.substring(pos + 2);
return x;
}
@@ -104,7 +104,7 @@ String
shell_quote(const String &str)
{
if (!str)
- return String::make_stable("\"\"");
+ return String::make_stable("\"\"");
const char *begin = str.begin();
const char *end = str.end();
@@ -114,35 +114,35 @@ shell_quote(const String &str)
sa.append('\"');
for (const char *s = begin; s < end; ++s)
- if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '\\' || *s == ':' || *s == '.')
- /* do nothing */;
- else if (*s == '\"') {
- sa.append(begin, s);
- sa.append("\"\"\"", 3);
- begin = s + 1;
- } else {
- sa.append(begin, s + 1);
- begin = s + 1;
- }
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '\\' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else if (*s == '\"') {
+ sa.append(begin, s);
+ sa.append("\"\"\"", 3);
+ begin = s + 1;
+ } else {
+ sa.append(begin, s + 1);
+ begin = s + 1;
+ }
if (sa.length() > 1) {
- sa.append(begin, end);
- sa.append('\"');
- return sa.take_string();
+ sa.append(begin, end);
+ sa.append('\"');
+ return sa.take_string();
}
#else
for (const char *s = begin; s < end; s++)
- if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '/' || *s == ':' || *s == '.')
- /* do nothing */;
- else {
- sa.append(begin, s);
- sa.append('\\');
- begin = s;
- }
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '/' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else {
+ sa.append(begin, s);
+ sa.append('\\');
+ begin = s;
+ }
if (sa.length()) {
- sa.append(begin, end);
- return sa.take_string();
+ sa.append(begin, end);
+ return sa.take_string();
}
#endif
@@ -153,12 +153,25 @@ int
mysystem(const char *command, ErrorHandler *errh)
{
if (no_create) {
- errh->message("would run %s", command);
- return 0;
+ errh->message("would run %s", command);
+ return 0;
} else {
- if (verbose)
- errh->message("running %s", command);
- return system(command);
+ if (verbose)
+ errh->message("running %s", command);
+ return system(command);
+ }
+}
+
+FILE*
+mypopen(const char* command, const char* type, ErrorHandler* errh)
+{
+ if (no_create) {
+ errh->message("would run %s", command);
+ return popen("true", type);
+ } else {
+ if (verbose)
+ errh->message("running %s", command);
+ return popen(command, type);
}
}
@@ -179,34 +192,34 @@ int
temporary_file(String &filename, ErrorHandler *errh)
{
if (no_create)
- return 0; // random number suffices
+ return 0; // random number suffices
#if HAVE_MKSTEMP
const char *tmpdir = getenv("TMPDIR");
if (tmpdir)
- filename = String(tmpdir) + "/otftotfm.XXXXXX";
+ filename = String(tmpdir) + "/otftotfm.XXXXXX";
else {
# ifdef P_tmpdir
- filename = P_tmpdir "/otftotfm.XXXXXX";
+ filename = P_tmpdir "/otftotfm.XXXXXX";
# else
- filename = "/tmp/otftotfm.XXXXXX";
+ filename = "/tmp/otftotfm.XXXXXX";
# endif
}
int fd = mkstemp(filename.mutable_c_str());
if (fd < 0)
- errh->error("temporary file %<%s%>: %s", filename.c_str(), strerror(errno));
+ errh->error("temporary file %<%s%>: %s", filename.c_str(), strerror(errno));
return fd;
#else // !HAVE_MKSTEMP
for (int tries = 0; tries < 5; tries++) {
- if (!(filename = my_tmpnam()))
- return errh->error("cannot create temporary file");
+ if (!(filename = my_tmpnam()))
+ return errh->error("cannot create temporary file");
# ifdef O_EXCL
- int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL | O_TRUNC, 0600);
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL | O_TRUNC, 0600);
# else
- int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600);
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600);
# endif
- if (fd >= 0)
- return fd;
+ if (fd >= 0)
+ return fd;
}
return errh->error("temporary file %<%s%>: %s", filename.c_str(), strerror(errno));
#endif
@@ -217,34 +230,34 @@ parse_unicode_number(const char* begin,
{
bool allow_lower = (require_prefix == 1);
if (require_prefix < 0)
- /* do not look for prefix */;
+ /* do not look for prefix */;
else if (begin + 7 == end && begin[0] == 'u' && begin[1] == 'n' && begin[2] == 'i')
- begin += 3;
+ begin += 3;
else if (begin + 5 <= end && begin + 7 >= end && begin[0] == 'u')
- begin++;
+ begin++;
else if (begin + 3 <= end && begin + 8 >= end && begin[0] == 'U' && begin[1] == '+')
- begin += 2, allow_lower = true;
+ begin += 2, allow_lower = true;
else if (require_prefix > 1)
- /* some prefix was required */
- return false;
+ /* some prefix was required */
+ return false;
uint32_t value;
for (value = 0; begin < end; begin++)
- if (*begin >= '0' && *begin <= '9')
- value = (value << 4) | (*begin - '0');
- else if (*begin >= 'A' && *begin <= 'F')
- value = (value << 4) | (*begin - 'A' + 10);
- else if (allow_lower && *begin >= 'a' && *begin <= 'f')
- value = (value << 4) | (*begin - 'a' + 10);
- else
- return false;
+ if (*begin >= '0' && *begin <= '9')
+ value = (value << 4) | (*begin - '0');
+ else if (*begin >= 'A' && *begin <= 'F')
+ value = (value << 4) | (*begin - 'A' + 10);
+ else if (allow_lower && *begin >= 'a' && *begin <= 'f')
+ value = (value << 4) | (*begin - 'a' + 10);
+ else
+ return false;
if (value > 0
- && (value <= 0xD7FF || (value >= 0xE000 && value <= 0x10FFFF))) {
- result = value;
- return true;
+ && (value <= 0xD7FF || (value >= 0xE000 && value <= 0x10FFFF))) {
+ result = value;
+ return true;
} else
- return false;
+ return false;
}
#if 0
@@ -253,7 +266,7 @@ shell_command_output(String cmdline, con
{
FILE *f = tmpfile();
if (!f)
- errh->fatal("cannot create temporary file: %s", strerror(errno));
+ errh->fatal("cannot create temporary file: %s", strerror(errno));
ignore_result(fwrite(input.data(), 1, input.length(), f));
fflush(f);
rewind(f);
@@ -261,26 +274,26 @@ shell_command_output(String cmdline, con
String new_cmdline = cmdline + " 0<&" + String(fileno(f));
FILE *p = popen(new_cmdline.c_str(), "r");
if (!p)
- errh->fatal("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+ errh->fatal("%<%s%>: %s", cmdline.c_str(), strerror(errno));
StringAccum sa;
int amt;
do {
- if (char *x = sa.reserve(2048)) {
- amt = fread(x, 1, 2048, p);
- sa.adjust_length(amt);
- } else
- amt = 0;
+ if (char *x = sa.reserve(2048)) {
+ amt = fread(x, 1, 2048, p);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
} while (amt != 0 && sa.length() < 200000);
if (amt != 0)
- errh->warning("%<%s%> output too long, truncated", cmdline.c_str());
+ errh->warning("%<%s%> output too long, truncated", cmdline.c_str());
else if (!feof(p) || ferror(p))
- errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+ errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
fclose(f);
pclose(p);
while (strip_newlines && sa && (sa.back() == '\n' || sa.back() == '\r'))
- sa.pop_back();
+ sa.pop_back();
return sa.take_string();
}
#endif
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh 2018-02-23 12:47:54.095971653 -0500
@@ -2,6 +2,7 @@
#define OTFTOTFM_UTIL_HH
#include <lcdf/string.hh>
#include <lcdf/globmatch.hh>
+#include <stdio.h>
class ErrorHandler;
extern bool no_create;
@@ -12,7 +13,7 @@ enum { G_ENCODING = 1, G_METRICS = 2, G_
G_PSFONTSMAP = 16, G_BINARY = 32, G_ASCII = 64, G_DOTLESSJ = 128,
G_UPDMAP = 256, G_TRUETYPE = 512, G_TYPE42 = 1024 };
-extern int output_flags;
+extern unsigned output_flags;
String read_file(String filename, ErrorHandler *, bool warn = false);
String printable_filename(const String &);
@@ -21,6 +22,7 @@ bool same_filename(const String &a, cons
String shell_quote(const String &);
int temporary_file(String &, ErrorHandler *);
int mysystem(const char *command, ErrorHandler *);
+FILE* mypopen(const char* command, const char* type, ErrorHandler* errh);
bool parse_unicode_number(const char*, const char*, int require_prefix, uint32_t& result);
#ifdef WIN32
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/README.md.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/README.md
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/README.md.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/README.md 2018-02-23 12:47:54.095971653 -0500
@@ -99,7 +99,7 @@ named `FONTNAME.afm` -- `MyriadMM-LightC
Copyright and license
---------------------
-All source code is Copyright (c) 1997-2016 Eddie Kohler.
+All source code is Copyright (c) 1997-2018 Eddie Kohler.
This code is distributed under the GNU General Public License, Version 2
(and only Version 2). The GNU General Public License is available via the
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1 2018-02-23 12:47:54.096971628 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc 2018-02-23 12:47:54.096971628 -0500
@@ -1,6 +1,6 @@
/* t1dotlessj.cc -- driver for creating dotlessj characters from Type 1 fonts
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -317,7 +317,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("t1dotlessj (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2003-2016 Eddie Kohler\n\
+ printf("Copyright (C) 2003-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
@@ -410,10 +410,10 @@ particular purpose.\n");
// write it to output
if (!outputf)
outputf = stdout;
+ if (binary) {
#if defined(_MSDOS) || defined(_WIN32)
- _setmode(_fileno(outputf), _O_BINARY);
+ _setmode(_fileno(outputf), _O_BINARY);
#endif
- if (binary) {
Type1PFBWriter w(outputf);
dotless_font->write(w);
} else {
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc 2018-02-23 12:47:54.096971628 -0500
@@ -1,6 +1,6 @@
/* cscheck.{cc,hh} -- checking Type 1 charstrings for validity
*
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1 2018-02-23 12:47:54.096971628 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc 2018-02-23 12:47:54.096971628 -0500
@@ -1,6 +1,6 @@
/* t1lint.cc -- driver for checking Type 1 fonts for validity
*
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -412,7 +412,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("t1lint (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 1999-2016 Eddie Kohler\n\
+ printf("Copyright (C) 1999-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1 2018-02-23 12:47:54.096971628 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc 2018-02-23 12:47:54.096971628 -0500
@@ -1,6 +1,6 @@
/* t1rawafm.cc -- driver for generating a raw AFM file from a font
*
- * Copyright (c) 2008-2016 Eddie Kohler
+ * Copyright (c) 2008-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -315,7 +315,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("t1rawafm (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2008-2016 Eddie Kohler\n\
+ printf("Copyright (C) 2008-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
@@ -359,9 +359,6 @@ particular purpose.\n");
if (!outf)
errh->fatal("%s: %s", output_file, strerror(errno));
}
-#if defined(_MSDOS) || defined(_WIN32)
- _setmode(_fileno(outf), _O_BINARY);
-#endif
write_afm(outf, font);
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1 2018-02-23 12:47:54.097971603 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc 2018-02-23 12:47:54.097971603 -0500
@@ -1,6 +1,6 @@
/* t1reencode.cc -- driver for reencoding Type 1 fonts
*
- * Copyright (c) 2005-2016 Eddie Kohler
+ * Copyright (c) 2005-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -978,7 +978,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("t1reencode (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 1999-2016 Eddie Kohler\n\
+ printf("Copyright (C) 1999-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
@@ -1094,10 +1094,10 @@ particular purpose.\n");
if (!outf)
errh->fatal("%s: %s", output_file, strerror(errno));
}
+ if (binary) {
#if defined(_MSDOS) || defined(_WIN32)
- _setmode(_fileno(outf), _O_BINARY);
+ _setmode(_fileno(outf), _O_BINARY);
#endif
- if (binary) {
Type1PFBWriter w(outf);
font->write(w);
} else {
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc 2018-02-23 12:47:54.097971603 -0500
@@ -1,6 +1,6 @@
/* util.{cc,hh} -- various bits
*
- * Copyright (c) 2003-2016 Eddie Kohler
+ * Copyright (c) 2003-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1 2018-02-23 12:47:54.097971603 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc 2018-02-23 12:47:54.097971603 -0500
@@ -1,6 +1,6 @@
/* t1testpage.cc -- driver for generating Type 1 fonts' test pages
*
- * Copyright (c) 1999-2016 Eddie Kohler
+ * Copyright (c) 1999-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -624,7 +624,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("t1testpage (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 1999-2016 Eddie Kohler\n\
+ printf("Copyright (C) 1999-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
@@ -665,9 +665,6 @@ particular purpose.\n");
if (!outf)
errh->fatal("%s: %s", output_file, strerror(errno));
}
-#if defined(_MSDOS) || defined(_WIN32)
- _setmode(_fileno(outf), _O_BINARY);
-#endif
//font->undo_synthetic();
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1 2018-02-23 12:47:54.097971603 -0500
@@ -1,4 +1,4 @@
-.ds V 2.106
+.ds V 2.107
.de M
.BR "\\$1" "(\\$2)\\$3"
..
diff -up texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc.git4166ff9 texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc
--- texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc.git4166ff9 2016-11-25 13:08:53.000000000 -0500
+++ texlive-base-20170520/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc 2018-02-23 12:47:54.098971578 -0500
@@ -1,6 +1,6 @@
/* ttftotype42.cc -- driver for translating TrueType fonts to Type 42 fonts
*
- * Copyright (c) 2006-2016 Eddie Kohler
+ * Copyright (c) 2006-2018 Eddie Kohler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -355,7 +355,7 @@ main(int argc, char *argv[])
case VERSION_OPT:
printf("ttftotype42 (LCDF typetools) %s\n", VERSION);
- printf("Copyright (C) 2006-2016 Eddie Kohler\n\
+ printf("Copyright (C) 2006-2018 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");