diff options
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.cc | 153 |
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 +} + +} |