summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc')
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc328
1 files changed, 0 insertions, 328 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
deleted file mode 100644
index 6c682b2f8e6..00000000000
--- a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
+++ /dev/null
@@ -1,328 +0,0 @@
-// -*- related-file-name: "../include/efont/otfgpos.hh" -*-
-
-/* otfgpos.{cc,hh} -- OpenType GPOS table
- *
- * Copyright (c) 2003-2019 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/otfgpos.hh>
-#include <lcdf/error.hh>
-#include <lcdf/straccum.hh>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <algorithm>
-
-namespace Efont { namespace OpenType {
-
-
-/**************************
- * Gpos *
- * *
- **************************/
-
-Gpos::Gpos(const Data &d, ErrorHandler *errh)
-{
- // Fixed Version
- // Offset ScriptList
- // Offset FeatureList
- // Offset LookupList
- if (d.length() == 0)
- throw BlankTable("GPOS");
- if (d.u16(0) != 1)
- throw Format("GPOS");
- if (_script_list.assign(d.offset_subtable(4), errh) < 0)
- throw Format("GPOS script list");
- if (_feature_list.assign(d.offset_subtable(6), errh) < 0)
- throw Format("GPOS feature list");
- _lookup_list = d.offset_subtable(8);
-}
-
-int
-Gpos::nlookups() const
-{
- return _lookup_list.u16(0);
-}
-
-GposLookup
-Gpos::lookup(unsigned i) const
-{
- if (i >= _lookup_list.u16(0))
- throw Error("GPOS lookup out of range");
- else
- return GposLookup(_lookup_list.offset_subtable(2 + i*2));
-}
-
-
-/**************************
- * GposValue *
- * *
- **************************/
-
-const int GposValue::nibble_bitcount_x2[] = { 0, 2, 2, 4, 2, 4, 4, 6,
- 2, 4, 4, 6, 4, 6, 6, 8 };
-
-
-/**************************
- * GposLookup *
- * *
- **************************/
-
-GposLookup::GposLookup(const Data &d)
- : _d(d)
-{
- if (_d.length() < 6)
- throw Format("GPOS Lookup table");
- _type = _d.u16(0);
- if (_type == L_EXTENSION && _d.u16(4) != 0) {
- Data first_subtable = _d.offset_subtable(HEADERSIZE);
- if (first_subtable.length() < 8 || first_subtable.u16(0) != 1)
- throw Format("GPOS Extension Lookup table");
- _type = first_subtable.u16(2);
- }
-}
-
-Data
-GposLookup::subtable(int i) const
-{
- Data subd = _d.offset_subtable(HEADERSIZE + i*RECSIZE);
- if (_d.u16(0) != L_EXTENSION)
- return subd;
- else if (subd.length() >= 8 && subd.u16(0) == 1 && subd.u16(2) == _type)
- return subd.subtable(subd.u32(4));
- else
- return Data();
-}
-
-bool
-GposLookup::unparse_automatics(Vector<Positioning> &v, ErrorHandler *errh) const
-{
- int nlookup = _d.u16(4), success = 0;
- switch (_type) {
- case L_SINGLE:
- for (int i = 0; i < nlookup; i++)
- try {
- GposSingle s(subtable(i));
- s.unparse(v);
- success++;
- } catch (Error e) {
- if (errh)
- errh->warning("%s, continuing", e.description.c_str());
- }
- return success > 0;
- case L_PAIR:
- for (int i = 0; i < nlookup; i++)
- try {
- GposPair p(subtable(i));
- p.unparse(v);
- success++;
- } catch (Error e) {
- if (errh)
- errh->warning("%s, continuing", e.description.c_str());
- }
- return success > 0;
- default:
- return false;
- }
-}
-
-
-/**************************
- * GposSingle *
- * *
- **************************/
-
-GposSingle::GposSingle(const Data &d)
- : _d(d)
-{
- if (_d[0] != 0
- || (_d[1] != 1 && _d[1] != 2))
- throw Format("GPOS Single Positioning");
- Coverage coverage(_d.offset_subtable(2));
- if (!coverage.ok()
- || (_d[1] == 2 && coverage.size() > _d.u16(6)))
- throw Format("GPOS Single Positioning coverage");
-}
-
-Coverage
-GposSingle::coverage() const noexcept
-{
- return Coverage(_d.offset_subtable(2), 0, false);
-}
-
-void
-GposSingle::unparse(Vector<Positioning> &v) const
-{
- if (_d[1] == 1) {
- int format = _d.u16(4);
- Data value = _d.subtable(6);
- for (Coverage::iterator i = coverage().begin(); i; i++)
- v.push_back(Positioning(Position(*i, format, value)));
- } else {
- int format = _d.u16(4);
- int size = GposValue::size(format);
- for (Coverage::iterator i = coverage().begin(); i; i++)
- v.push_back(Positioning(Position(*i, format, _d.subtable(F2_HEADERSIZE + size*i.coverage_index()))));
- }
-}
-
-
-/**************************
- * GposPair *
- * *
- **************************/
-
-GposPair::GposPair(const Data &d)
- : _d(d)
-{
- if (_d[0] != 0
- || (_d[1] != 1 && _d[1] != 2))
- throw Format("GPOS Pair Positioning");
- Coverage coverage(_d.offset_subtable(2));
- if (!coverage.ok()
- || (_d[1] == 1 && coverage.size() > _d.u16(8)))
- throw Format("GPOS Pair Positioning coverage");
-}
-
-Coverage
-GposPair::coverage() const noexcept
-{
- return Coverage(_d.offset_subtable(2), 0, false);
-}
-
-void
-GposPair::unparse(Vector<Positioning> &v) const
-{
- if (_d[1] == 1) {
- int format1 = _d.u16(4);
- int format2 = _d.u16(6);
- int f2_pos = PAIRVALUE_HEADERSIZE + GposValue::size(format1);
- int pairvalue_size = f2_pos + GposValue::size(format2);
- for (Coverage::iterator i = coverage().begin(); i; i++) {
- Data pairset = _d.offset_subtable(F1_HEADERSIZE + i.coverage_index()*F1_RECSIZE);
- int npair = pairset.u16(0);
- for (int j = 0; j < npair; j++) {
- Data pair = pairset.subtable(PAIRSET_HEADERSIZE + j*pairvalue_size);
- v.push_back(Positioning(Position(*i, format1, pair.subtable(PAIRVALUE_HEADERSIZE)),
- Position(pair.u16(0), format2, pair.subtable(f2_pos))));
- }
- }
- } else { // _d[1] == 2
- int format1 = _d.u16(4);
- int format2 = _d.u16(6);
- int f2_pos = GposValue::size(format1);
- int recsize = f2_pos + GposValue::size(format2);
- ClassDef class1(_d.offset_subtable(8));
- ClassDef class2(_d.offset_subtable(10));
- Coverage coverage = this->coverage();
- int nclass1 = _d.u16(12);
- int nclass2 = _d.u16(14);
- int offset = F2_HEADERSIZE;
- for (int c1 = 0; c1 < nclass1; c1++)
- for (int c2 = 0; c2 < nclass2; c2++, offset += recsize) {
- Position p1(format1, _d.subtable(offset));
- Position p2(format2, _d.subtable(offset + f2_pos));
- if (p1 || p2) {
- for (ClassDef::class_iterator c1i = class1.begin(c1, coverage); c1i; c1i++)
- for (ClassDef::class_iterator c2i = class2.begin(c2); c2i; c2i++)
- v.push_back(Positioning(Position(*c1i, p1), Position(*c2i, p2)));
- }
- }
- }
-}
-
-
-/**************************
- * Positioning *
- * *
- **************************/
-
-static void
-unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns)
-{
- if (!gns)
- gns = &debug_glyph_names;
- if (gid && gns && gns->size() > gid && (*gns)[gid])
- sa << (*gns)[gid];
- else
- sa << "g" << gid;
-}
-
-void
-Position::unparse(StringAccum &sa, const Vector<PermString> *gns) const
-{
- unparse_glyphid(sa, g, gns);
- if (placed())
- sa << '@' << pdx << ',' << pdy;
- sa << '+' << adx;
- if (ady)
- sa << '/' << ady;
-}
-
-String
-Position::unparse(const Vector<PermString> *gns) const
-{
- StringAccum sa;
- unparse(sa, gns);
- return sa.take_string();
-}
-
-bool
-Positioning::context_in(const Coverage &c) const
-{
- return (c.covers(_left.g) || !_left.g) && (!_right.g || c.covers(_right.g));
-}
-
-bool
-Positioning::context_in(const GlyphSet &gs) const
-{
- return (gs.covers(_left.g) || !_left.g) && (!_right.g || gs.covers(_right.g));
-}
-
-void
-Positioning::unparse(StringAccum &sa, const Vector<PermString> *gns) const
-{
- if (!*this)
- sa << "NULL[]";
- else if (is_single()) {
- sa << "SINGLE[";
- _left.unparse(sa, gns);
- sa << ']';
- } else if (is_pairkern()) {
- sa << "KERN[";
- unparse_glyphid(sa, _left.g, gns);
- sa << ' ';
- unparse_glyphid(sa, _right.g, gns);
- sa << "+" << _left.adx << ']';
- } else if (is_pair()) {
- sa << "PAIR[";
- _left.unparse(sa, gns);
- sa << ' ';
- _right.unparse(sa, gns);
- sa << ']';
- } else
- sa << "UNKNOWN[]";
-}
-
-String
-Positioning::unparse(const Vector<PermString> *gns) const
-{
- StringAccum sa;
- unparse(sa, gns);
- return sa.take_string();
-}
-
-}}
-
-#include <lcdf/vector.cc>