summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh')
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh110
1 files changed, 110 insertions, 0 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh
new file mode 100644
index 00000000000..753e5714d5c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.100/otftotfm/glyphfilter.hh
@@ -0,0 +1,110 @@
+#ifndef OTFTOTFM_GLYPHFILTER_HH
+#define OTFTOTFM_GLYPHFILTER_HH
+#include <efont/otf.hh>
+#include <lcdf/vector.hh>
+class Metrics;
+
+class GlyphFilter { public:
+
+ GlyphFilter() : _sorted(true) { }
+
+ 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;
+
+ void add_substitution_filter(const String&, bool is_exclude, ErrorHandler*);
+ 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
+
+ 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&);
+ };
+
+ private:
+
+ enum { T_EXCLUDE = 1, T_NEGATE = 2, T_TYPEMASK = 3,
+ T_SRC = 0, T_DST = 4 };
+ enum { D_NAME, D_UNIPROP, D_UNIRANGE };
+
+ Vector<Pattern> _patterns;
+ bool _sorted;
+
+ bool allow(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode, int ptype) const;
+ void add_pattern(const String&, int ptype, ErrorHandler*);
+ void sort();
+
+};
+
+inline bool
+GlyphFilter::allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_SRC));
+}
+
+inline bool
+GlyphFilter::allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_DST));
+}
+
+inline bool operator==(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return a.type == b.type && a.data == b.data && a.u.unirange.low == b.u.unirange.low && a.u.unirange.high == b.u.unirange.high && a.pattern == b.pattern;
+}
+
+inline bool operator<(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return GlyphFilter::Pattern::compare(a, b) < 0;
+}
+
+inline bool operator!=(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return !(a == b);
+}
+
+bool operator==(const GlyphFilter&, const GlyphFilter&);
+
+inline bool operator!=(const GlyphFilter& a, const GlyphFilter& b)
+{
+ return !(a == b);
+}
+
+inline bool
+GlyphFilter::check_eq(GlyphFilter& o)
+{
+ sort();
+ o.sort();
+ return *this == o;
+}
+
+GlyphFilter operator+(const GlyphFilter&, const GlyphFilter&);
+
+inline StringAccum&
+operator<<(StringAccum& sa, const GlyphFilter& gf)
+{
+ gf.unparse(sa);
+ return sa;
+}
+
+#endif