summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc')
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc
new file mode 100644
index 00000000000..5b64be1ac41
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-2.104/libefont/pairop.cc
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../include/efont/pairop.hh" -*-
+
+/* pairop.{cc,hh} -- ligature/kern font metrics
+ *
+ * Copyright (c) 1998-2012 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
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/pairop.hh>
+#include <stdio.h>
+namespace Efont {
+
+PairProgram::PairProgram(const PairProgram &o)
+ : _reversed(o._reversed),
+ _left_map(o._left_map),
+ _op(o._op)
+{
+}
+
+
+void
+PairProgram::reserve_glyphs(int e)
+{
+ if (e <= _left_map.size()) return;
+ _left_map.resize(e, -1);
+}
+
+
+PairOpIndex
+PairProgram::find(GlyphIndex leftgi, GlyphIndex rightgi) const
+{
+ PairOpIndex opi = find_left(leftgi);
+ while (opi >= 0) {
+ if (op(opi).right() == rightgi)
+ return opi;
+ opi = op(opi).next_left();
+ }
+ return -1;
+}
+
+
+bool
+PairProgram::add_kern(GlyphIndex left, GlyphIndex right, int ki)
+{
+ PairOp newop(left, right, ki, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+bool
+PairProgram::add_lig(GlyphIndex left, GlyphIndex right, GlyphIndex result,
+ int kind)
+{
+ PairOp newop(left, right, result, kind, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+void
+PairProgram::unreverse()
+{
+ if (!_reversed) return;
+
+ _left_map.assign(_left_map.size(), -1);
+
+ for (PairOpIndex opi = _op.size() - 1; opi >= 0; opi--) {
+ PairOp &o = _op[opi];
+ PairOpIndex l = o.left();
+ o.set_next(_left_map[l]);
+ _left_map[l] = opi;
+ }
+
+ _reversed = false;
+}
+
+
+void
+PairProgram::optimize()
+{
+ /* PairOpIndex opi;
+
+ // Get rid of 0-valued kerns.
+ for (opi = 0; opi < opcount(); opi++) {
+ PairOp &o = op(opi);
+ if (o.is_kern() && o.value() == 0)
+ o.noopify();
+ }*/
+}
+
+
+inline const char *
+PairProgram::print_name(GlyphIndex) const
+{
+#if 0
+ if (gi == opAnychar) return "*";
+ else return glyph(gi).name();
+#endif
+ return 0;
+}
+
+
+void
+PairProgram::print() const
+{
+#if 0
+ for (GlyphIndex gi = 0; gi < glyphblock.size(); gi++)
+ if (glyphblock[gi] != -1)
+ printf("%s->B%d ", glyph(gi).name().c_str(), glyphblock[gi]);
+ printf("\n");
+
+ for (int i = 0; i < blocks.size(); i++) {
+ printf("B%-2d: ", i);
+ PairOpBlock &opb = *blocks[i];
+ for (int j = 0; j < opb.size(); j++)
+ if (opb[j].is_lig())
+ printf("%s->%s ", printname(opb[j].right()),
+ printname(opb[j].result()));
+ else if (opb[j].is_kern())
+ printf("%s[%g] ", printname(opb[j].right()), kern(opb[j].value()));
+ else if (opb[j].is_noop())
+ printf(". ");
+ if (blocks[i]->nextblock != -1)
+ printf(" :B%d", blocks[i]->nextblock);
+ printf("\n");
+ }
+#endif
+}
+
+}