[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri Aug 30 16:33:32 PDT 2013


 configure.ac                           |   23 
 src/Makefile.am                        |   28 
 src/hb-icu-le.cc                       |  265 -
 src/hb-icu-le/COPYING                  |    2 
 src/hb-icu-le/FontTableCache.cpp       |   91 
 src/hb-icu-le/FontTableCache.h         |   48 
 src/hb-icu-le/Makefile.am              |   25 
 src/hb-icu-le/PortableFontInstance.cpp |  275 -
 src/hb-icu-le/PortableFontInstance.h   |  119 
 src/hb-icu-le/README                   |    3 
 src/hb-icu-le/cmaps.cpp                |  200 -
 src/hb-icu-le/cmaps.h                  |   87 
 src/hb-icu-le/letest.h                 |   63 
 src/hb-icu-le/license.html             |   51 
 src/hb-icu-le/sfnt.h                   |  453 --
 src/hb-old.cc                          |  410 --
 src/hb-old/COPYING                     |   24 
 src/hb-old/Makefile.am                 |   56 
 src/hb-old/README                      |    7 
 src/hb-old/harfbuzz-arabic.c           | 1150 ------
 src/hb-old/harfbuzz-buffer-private.h   |  107 
 src/hb-old/harfbuzz-buffer.c           |  383 --
 src/hb-old/harfbuzz-buffer.h           |  102 
 src/hb-old/harfbuzz-external.h         |  106 
 src/hb-old/harfbuzz-gdef-private.h     |  135 
 src/hb-old/harfbuzz-gdef.c             | 1163 ------
 src/hb-old/harfbuzz-gdef.h             |  140 
 src/hb-old/harfbuzz-global.h           |  125 
 src/hb-old/harfbuzz-gpos-private.h     |  729 ---
 src/hb-old/harfbuzz-gpos.c             | 6094 ---------------------------------
 src/hb-old/harfbuzz-gpos.h             |  155 
 src/hb-old/harfbuzz-greek.c            |  447 --
 src/hb-old/harfbuzz-gsub-private.h     |  483 --
 src/hb-old/harfbuzz-gsub.c             | 4329 -----------------------
 src/hb-old/harfbuzz-gsub.h             |  148 
 src/hb-old/harfbuzz-hangul.c           |  268 -
 src/hb-old/harfbuzz-hebrew.c           |  187 -
 src/hb-old/harfbuzz-impl.c             |   84 
 src/hb-old/harfbuzz-impl.h             |  135 
 src/hb-old/harfbuzz-indic.cpp          | 1868 ----------
 src/hb-old/harfbuzz-khmer.c            |  642 ---
 src/hb-old/harfbuzz-myanmar.c          |  511 --
 src/hb-old/harfbuzz-open-private.h     |  102 
 src/hb-old/harfbuzz-open.c             | 1433 -------
 src/hb-old/harfbuzz-open.h             |  288 -
 src/hb-old/harfbuzz-shaper-all.cpp     |   37 
 src/hb-old/harfbuzz-shaper-private.h   |  159 
 src/hb-old/harfbuzz-shaper.cpp         |  996 -----
 src/hb-old/harfbuzz-shaper.h           |  265 -
 src/hb-old/harfbuzz-stream-private.h   |   81 
 src/hb-old/harfbuzz-stream.c           |  114 
 src/hb-old/harfbuzz-stream.h           |   51 
 src/hb-old/harfbuzz-tibetan.c          |  249 -
 src/hb-old/harfbuzz.h                  |   38 
 54 files changed, 2 insertions(+), 25532 deletions(-)

New commits:
commit ac1b723917d9b8f247a350f8d3e1bc5d1e472073
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Aug 30 19:32:10 2013 -0400

    Remove hb-old and hb-icu-le test shapers
    
    They've been disabled for a while and no one cared.  We're past
    the point to need them for testing, and if we ever need to
    resurrect them again, well, they're in git graveyard somewhere.

diff --git a/configure.ac b/configure.ac
index 29df3d1..47834c1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -128,14 +128,6 @@ AM_CONDITIONAL(HAVE_OT, $have_ot)
 
 dnl ===========================================================================
 
-have_hb_old=false
-if $have_hb_old; then
-	AC_DEFINE(HAVE_HB_OLD, 1, [Have Old HarfBuzz backend])
-fi
-AM_CONDITIONAL(HAVE_HB_OLD, $have_hb_old)
-
-dnl ===========================================================================
-
 AC_ARG_WITH(glib,
 	[AS_HELP_STRING([--with-glib=@<:@yes/no/auto@:>@],
 			[Use glib @<:@default=auto@:>@])],,
@@ -269,15 +261,6 @@ AM_CONDITIONAL(HAVE_ICU, $have_icu)
 
 dnl ==========================================================================
 
-have_icu_le=false
-dnl PKG_CHECK_MODULES(ICU_LE, icu-le icu-uc, have_icu_le=true, :)
-if $have_icu_le; then
-	AC_DEFINE(HAVE_ICU_LE, 1, [Have ICU Layout Engine library])
-fi
-AM_CONDITIONAL(HAVE_ICU_LE, $have_icu_le)
-
-dnl ==========================================================================
-
 AC_ARG_WITH(graphite2,
 	[AS_HELP_STRING([--with-graphite2=@<:@yes/no/auto@:>@],
 			[Use the graphite2 library @<:@default=no@:>@])],,
@@ -408,8 +391,6 @@ AC_CONFIG_FILES([
 Makefile
 src/Makefile
 src/hb-version.h
-src/hb-icu-le/Makefile
-src/hb-old/Makefile
 src/hb-ucdn/Makefile
 util/Makefile
 test/Makefile
@@ -439,10 +420,8 @@ Tools used for command-line utilities:
 Additional shapers (the more the better):
 	Graphite2:		${have_graphite2}
 
-Test / platform shapers (not normally needed):
+Platform shapers (not normally needed):
 	CoreText:		${have_coretext}
-	ICU Layout Engine:	${have_icu_le}
-	Old HarfBuzz:		${have_hb_old}
 	Uniscribe:		${have_uniscribe}
 
 Other features:
diff --git a/src/Makefile.am b/src/Makefile.am
index 563d5a3..ca3718b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -154,22 +154,6 @@ HBSOURCES += hb-coretext.cc
 HBHEADERS += hb-coretext.h
 endif
 
-if HAVE_HB_OLD
-SUBDIRS += hb-old
-HBCFLAGS += -I$(srcdir)/hb-old
-HBLIBS   += hb-old/libhb-old.la
-HBSOURCES += hb-old.cc
-endif
-DIST_SUBDIRS += hb-old
-
-if HAVE_ICU_LE
-SUBDIRS += hb-icu-le
-HBCFLAGS += -I$(srcdir)/hb-icu-le
-HBLIBS   += hb-icu-le/libhb-icu-le.la
-HBSOURCES += hb-icu-le.cc
-endif
-DIST_SUBDIRS += hb-icu-le
-
 if HAVE_UCDN
 SUBDIRS += hb-ucdn
 HBCFLAGS += -I$(srcdir)/hb-ucdn
@@ -186,9 +170,6 @@ export_symbols = -export-symbols harfbuzz.def
 harfbuzz_def_dependency = harfbuzz.def
 libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
 else
-if HAVE_ICU_LE
-libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
-else
 # Use a C linker for GCC, not C++; Don't link to libstdc++
 if HAVE_GCC
 libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS)
@@ -196,7 +177,6 @@ else
 libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
 endif
 endif
-endif
 
 libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS)
 nodist_libharfbuzz_la_SOURCES = $(nodist_HBSOURCES)
@@ -352,16 +332,10 @@ dist_check_SCRIPTS = \
 	check-c-linkage-decls.sh \
 	check-header-guards.sh \
 	check-includes.sh \
-	check-symbols.sh \
-	$(NULL)
-
-if HAVE_ICU_LE
-else
-dist_check_SCRIPTS += \
 	check-libstdc++.sh \
 	check-static-inits.sh \
+	check-symbols.sh \
 	$(NULL)
-endif
 
 TESTS = $(dist_check_SCRIPTS)
 TESTS_ENVIRONMENT = \
diff --git a/src/hb-icu-le.cc b/src/hb-icu-le.cc
deleted file mode 100644
index 634354e..0000000
--- a/src/hb-icu-le.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright © 2012  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#define HB_SHAPER icu_le
-#define hb_icu_le_shaper_font_data_t PortableFontInstance
-#include "hb-shaper-impl-private.hh"
-
-#include "hb-icu-le/PortableFontInstance.h"
-
-#include <layout/LEScripts.h>
-#include <layout/loengine.h>
-#include <unicode/uscript.h>
-#include <unicode/unistr.h>
-
-
-/* Duplicated here so we don't depend on hb-icu. */
-
-static hb_script_t
-_hb_icu_script_to_script (UScriptCode script)
-{
-  if (unlikely (script == USCRIPT_INVALID_CODE))
-    return HB_SCRIPT_INVALID;
-
-  return hb_script_from_string (uscript_getShortName (script), -1);
-}
-
-static UScriptCode
-_hb_icu_script_from_script (hb_script_t script)
-{
-  if (unlikely (script == HB_SCRIPT_INVALID))
-    return USCRIPT_INVALID_CODE;
-
-  for (unsigned int i = 0; i < USCRIPT_CODE_LIMIT; i++)
-    if (unlikely (_hb_icu_script_to_script ((UScriptCode) i) == script))
-      return (UScriptCode) i;
-
-  return USCRIPT_UNKNOWN;
-}
-
-
-/*
- * shaper face data
- */
-
-struct hb_icu_le_shaper_face_data_t {};
-
-hb_icu_le_shaper_face_data_t *
-_hb_icu_le_shaper_face_data_create (hb_face_t *face HB_UNUSED)
-{
-  return (hb_icu_le_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_icu_le_shaper_face_data_destroy (hb_icu_le_shaper_face_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper font data
- */
-
-hb_icu_le_shaper_font_data_t *
-_hb_icu_le_shaper_font_data_create (hb_font_t *font)
-{
-  LEErrorCode status = LE_NO_ERROR;
-  unsigned int x_ppem = font->x_ppem ? font->x_ppem : 72;
-  unsigned int y_ppem = font->y_ppem ? font->y_ppem : 72;
-  hb_icu_le_shaper_font_data_t *data = new PortableFontInstance (font->face,
-								 font->x_scale / x_ppem,
-								 font->y_scale / y_ppem,
-								 x_ppem,
-								 y_ppem,
-								 status);
-  if (status != LE_NO_ERROR) {
-    delete (data);
-    return NULL;
-  }
-
-  return data;
-}
-
-void
-_hb_icu_le_shaper_font_data_destroy (hb_icu_le_shaper_font_data_t *data)
-{
-  delete (data);
-}
-
-
-/*
- * shaper shape_plan data
- */
-
-struct hb_icu_le_shaper_shape_plan_data_t {};
-
-hb_icu_le_shaper_shape_plan_data_t *
-_hb_icu_le_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
-					  const hb_feature_t *user_features,
-					  unsigned int        num_user_features)
-{
-  return (hb_icu_le_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_icu_le_shaper_shape_plan_data_destroy (hb_icu_le_shaper_shape_plan_data_t *data)
-{
-}
-
-
-/*
- * shaper
- */
-
-hb_bool_t
-_hb_icu_le_shape (hb_shape_plan_t    *shape_plan,
-		  hb_font_t          *font,
-		  hb_buffer_t        *buffer,
-		  const hb_feature_t *features,
-		  unsigned int        num_features)
-{
-  LEFontInstance *font_instance = HB_SHAPER_DATA_GET (font);
-  le_int32 script_code = _hb_icu_script_from_script (shape_plan->props.script);
-  le_int32 language_code = -1 /* TODO */;
-  le_int32 typography_flags = 3; /* Needed for ligatures and kerning */
-  LEErrorCode status = LE_NO_ERROR;
-  le_engine *le = le_create ((const le_font *) font_instance,
-			     script_code,
-			     language_code,
-			     typography_flags,
-			     &status);
-  if (status != LE_NO_ERROR)
-  { le_close (le); return false; }
-
-retry:
-
-  unsigned int scratch_size;
-  char *scratch = (char *) buffer->get_scratch_buffer (&scratch_size);
-
-  LEUnicode *pchars = (LEUnicode *) scratch;
-  unsigned int chars_len = 0;
-  for (unsigned int i = 0; i < buffer->len; i++) {
-    hb_codepoint_t c = buffer->info[i].codepoint;
-    if (likely (c < 0x10000))
-      pchars[chars_len++] = c;
-    else if (unlikely (c >= 0x110000))
-      pchars[chars_len++] = 0xFFFD;
-    else {
-      pchars[chars_len++] = 0xD800 + ((c - 0x10000) >> 10);
-      pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1));
-    }
-  }
-
-#define ALLOCATE_ARRAY(Type, name, len) \
-  Type *name = (Type *) scratch; \
-  scratch += (len) * sizeof ((name)[0]); \
-  scratch_size -= (len) * sizeof ((name)[0]);
-
-  ALLOCATE_ARRAY (LEUnicode, chars, chars_len);
-  ALLOCATE_ARRAY (unsigned int, clusters, chars_len);
-
-  chars_len = 0;
-  for (unsigned int i = 0; i < buffer->len; i++) {
-    hb_codepoint_t c = buffer->info[i].codepoint;
-    if (likely (c < 0x10000))
-      clusters[chars_len++] = buffer->info[i].cluster;
-    else if (unlikely (c >= 0x110000))
-      clusters[chars_len++] = buffer->info[i].cluster;
-    else {
-      clusters[chars_len++] = buffer->info[i].cluster;
-      clusters[chars_len++] = buffer->info[i].cluster;
-    }
-  }
-
-  unsigned int glyph_count = le_layoutChars (le,
-					     chars,
-					     0,
-					     chars_len,
-					     chars_len,
-					     HB_DIRECTION_IS_BACKWARD (buffer->props.direction),
-					     0., 0.,
-					     &status);
-  if (status != LE_NO_ERROR)
-  { le_close (le); return false; }
-
-  unsigned int num_glyphs = scratch_size / (sizeof (LEGlyphID) +
-					    sizeof (le_int32) +
-					    sizeof (float) * 2);
-
-  if (unlikely (glyph_count >= num_glyphs || glyph_count > buffer->allocated)) {
-    buffer->ensure (buffer->allocated * 2);
-    if (buffer->in_error)
-    { le_close (le); return false; }
-    goto retry;
-  }
-
-  ALLOCATE_ARRAY (LEGlyphID, glyphs, glyph_count);
-  ALLOCATE_ARRAY (le_int32, indices, glyph_count);
-  ALLOCATE_ARRAY (float, positions, glyph_count * 2 + 2);
-
-  le_getGlyphs (le, glyphs, &status);
-  le_getCharIndices (le, indices, &status);
-  le_getGlyphPositions (le, positions, &status);
-
-#undef ALLOCATE_ARRAY
-
-  /* Ok, we've got everything we need, now compose output buffer,
-   * very, *very*, carefully! */
-
-  unsigned int j = 0;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < glyph_count; i++)
-  {
-    if (glyphs[i] >= 0xFFFE)
-	continue;
-
-    info[j].codepoint = glyphs[i];
-    info[j].cluster = clusters[indices[i]];
-
-    /* icu-le doesn't seem to have separate advance values. */
-    info[j].mask = positions[2 * i + 2] - positions[2 * i];
-    info[j].var1.u32 = 0;
-    info[j].var2.u32 = -positions[2 * i + 1];
-
-    j++;
-  }
-  buffer->len = j;
-
-  buffer->clear_positions ();
-
-  for (unsigned int i = 0; i < buffer->len; i++) {
-    hb_glyph_info_t *info = &buffer->info[i];
-    hb_glyph_position_t *pos = &buffer->pos[i];
-
-    /* TODO vertical */
-    pos->x_advance = info->mask;
-    pos->x_offset = info->var1.u32;
-    pos->y_offset = info->var2.u32;
-  }
-
-  le_close (le);
-  return true;
-}
diff --git a/src/hb-icu-le/COPYING b/src/hb-icu-le/COPYING
deleted file mode 100644
index 8080968..0000000
--- a/src/hb-icu-le/COPYING
+++ /dev/null
@@ -1,2 +0,0 @@
-The contents of this directory are licensed under the ICU license.
-See file license.html.
diff --git a/src/hb-icu-le/FontTableCache.cpp b/src/hb-icu-le/FontTableCache.cpp
deleted file mode 100644
index 93db6cc..0000000
--- a/src/hb-icu-le/FontTableCache.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- **********************************************************************
- *   Copyright (C) 2003-2008, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- **********************************************************************
- */
-
-#include "layout/LETypes.h"
-
-#include "letest.h"
-#include "FontTableCache.h"
-
-#define TABLE_CACHE_INIT 5
-#define TABLE_CACHE_GROW 5
-
-struct FontTableCacheEntry
-{
-    LETag tag;
-    hb_blob_t *blob;
-};
-
-FontTableCache::FontTableCache()
-    : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT)
-{
-    fTableCache = NEW_ARRAY(FontTableCacheEntry, fTableCacheSize);
-
-    if (fTableCache == NULL) {
-        fTableCacheSize = 0;
-        return;
-    }
-
-    for (int i = 0; i < fTableCacheSize; i += 1) {
-        fTableCache[i].tag  = 0;
-        fTableCache[i].blob = NULL;
-    }
-}
-
-FontTableCache::~FontTableCache()
-{
-    for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
-        hb_blob_destroy(fTableCache[i].blob);
-
-        fTableCache[i].tag  = 0;
-        fTableCache[i].blob = NULL;
-    }
-
-    fTableCacheCurr = 0;
-
-    DELETE_ARRAY(fTableCache);
-}
-
-void FontTableCache::freeFontTable(hb_blob_t *blob) const
-{
-    hb_blob_destroy(blob);
-}
-
-const void *FontTableCache::find(LETag tableTag) const
-{
-    for (int i = 0; i < fTableCacheCurr; i += 1) {
-        if (fTableCache[i].tag == tableTag) {
-            return hb_blob_get_data(fTableCache[i].blob, NULL);
-        }
-    }
-
-    hb_blob_t *blob = readFontTable(tableTag);
-
-    ((FontTableCache *) this)->add(tableTag, blob);
-
-    return hb_blob_get_data (blob, NULL);
-}
-
-void FontTableCache::add(LETag tableTag, hb_blob_t *blob)
-{
-    if (fTableCacheCurr >= fTableCacheSize) {
-        le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
-
-        fTableCache = (FontTableCacheEntry *) GROW_ARRAY(fTableCache, newSize);
-
-        for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
-            fTableCache[i].tag  = 0;
-            fTableCache[i].blob = NULL;
-        }
-
-        fTableCacheSize = newSize;
-    }
-
-    fTableCache[fTableCacheCurr].tag  = tableTag;
-    fTableCache[fTableCacheCurr].blob = blob;
-
-    fTableCacheCurr += 1;
-}
diff --git a/src/hb-icu-le/FontTableCache.h b/src/hb-icu-le/FontTableCache.h
deleted file mode 100644
index f956f88..0000000
--- a/src/hb-icu-le/FontTableCache.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- **********************************************************************
- *   Copyright (C) 2003-2008, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- **********************************************************************
- */
-
-#ifndef __FONTTABLECACHE_H
-
-#define __FONTTABLECACHE_H
-
-#define HB_H_IN
-#include <hb-blob.h>
-
-#include "layout/LETypes.h"
-#include "letest.h"
-
-HB_BEGIN_VISIBILITY
-
-U_NAMESPACE_USE
-
-struct FontTableCacheEntry;
-
-class FontTableCache
-{
-public:
-    FontTableCache();
-
-    virtual ~FontTableCache();
-
-    const void *find(LETag tableTag) const;
-
-protected:
-    virtual hb_blob_t *readFontTable(LETag tableTag) const = 0;
-    virtual void freeFontTable(hb_blob_t *blob) const;
-
-private:
-
-    void add(LETag tableTag, hb_blob_t *blob);
-
-    FontTableCacheEntry *fTableCache;
-    le_int32 fTableCacheCurr;
-    le_int32 fTableCacheSize;
-};
-
-HB_END_VISIBILITY
-
-#endif
diff --git a/src/hb-icu-le/Makefile.am b/src/hb-icu-le/Makefile.am
deleted file mode 100644
index e3b103c..0000000
--- a/src/hb-icu-le/Makefile.am
+++ /dev/null
@@ -1,25 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-noinst_LTLIBRARIES = libhb-icu-le.la
-
-
-libhb_icu_le_la_SOURCES = \
-	FontTableCache.cpp \
-	FontTableCache.h \
-	PortableFontInstance.cpp \
-	PortableFontInstance.h \
-	cmaps.cpp \
-	cmaps.h \
-	letest.h \
-	sfnt.h
-libhb_icu_le_la_CPPFLAGS = \
-	-I$(top_srcdir) \
-	-I$(top_srcdir)/src \
-	-I$(top_builddir)/src \
-	$(ICU_LE_CFLAGS)
-libhb_icu_le_la_LIBADD = \
-	$(ICU_LE_LIBS)
-
-EXTRA_DIST = README license.html COPYING
-
--include $(top_srcdir)/git.mk
diff --git a/src/hb-icu-le/PortableFontInstance.cpp b/src/hb-icu-le/PortableFontInstance.cpp
deleted file mode 100644
index 9d423c4..0000000
--- a/src/hb-icu-le/PortableFontInstance.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- *******************************************************************************
- *
- *   Copyright (C) 1999-2008, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- *
- *******************************************************************************
- *   file name:  PortableFontInstance.cpp
- *
- *   created on: 11/22/1999
- *   created by: Eric R. Mader
- */
-
-#include <stdio.h>
-
-#include "layout/LETypes.h"
-#include "layout/LEFontInstance.h"
-#include "layout/LESwaps.h"
-
-#include "PortableFontInstance.h"
-
-#include "letest.h"
-#include "sfnt.h"
-
-#include <string.h>
-
-
-PortableFontInstance::PortableFontInstance(hb_face_t *face,
-					   float xScale,
-					   float yScale,
-					   unsigned int xPixelsPerEM,
-					   unsigned int yPixelsPerEM,
-					   LEErrorCode &status)
-    : fFace(face),
-      fXScale(xScale), fYScale(yScale),
-      fXPixelsPerEM(xPixelsPerEM), fYPixelsPerEM(yPixelsPerEM),
-      fUnitsPerEM(0), fAscent(0), fDescent(0), fLeading(0),
-      fNAMETable(NULL), fNameCount(0), fNameStringOffset(0), fCMAPMapper(NULL), fHMTXTable(NULL), fNumGlyphs(0), fNumLongHorMetrics(0)
-{
-    if (LE_FAILURE(status)) {
-        return;
-    }
-
-    const LETag hheaTag = LE_HHEA_TABLE_TAG;
-    const HHEATable *hheaTable = NULL;
-
-    fUnitsPerEM = hb_face_get_upem (face);
-
-    hheaTable = (HHEATable *) getFontTable(hheaTag);
-
-    if (hheaTable == NULL) {
-        status = LE_MISSING_FONT_TABLE_ERROR;
-	return;
-    }
-
-    fAscent  = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->ascent));
-    fDescent = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->descent));
-    fLeading = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->lineGap));
-
-    fNumLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics);
-
-    fCMAPMapper = findUnicodeMapper();
-
-    if (fCMAPMapper == NULL) {
-        status = LE_MISSING_FONT_TABLE_ERROR;
-	return;
-    }
-}
-
-PortableFontInstance::~PortableFontInstance()
-{
-    if (fCMAPMapper)
-        delete fCMAPMapper;
-}
-
-const void *PortableFontInstance::getFontTable(LETag tableTag) const
-{
-    return FontTableCache::find(tableTag);
-}
-
-hb_blob_t *PortableFontInstance::readFontTable(LETag tableTag) const
-{
-  return hb_face_reference_table(fFace, tableTag);
-}
-
-CMAPMapper *PortableFontInstance::findUnicodeMapper()
-{
-    LETag cmapTag = LE_CMAP_TABLE_TAG;
-    const CMAPTable *cmap = (CMAPTable *) getFontTable(cmapTag);
-
-    if (cmap == NULL) {
-        return NULL;
-    }
-
-    return CMAPMapper::createUnicodeMapper(cmap);
-}
-
-const char *PortableFontInstance::getNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const
-{
-    if (fNAMETable == NULL) {
-        LETag nameTag = LE_NAME_TABLE_TAG;
-        PortableFontInstance *realThis = (PortableFontInstance *) this;
-
-        realThis->fNAMETable = (const NAMETable *) getFontTable(nameTag);
-
-        if (realThis->fNAMETable != NULL) {
-            realThis->fNameCount        = SWAPW(realThis->fNAMETable->count);
-            realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset);
-        }
-    }
-
-    for(le_int32 i = 0; i < fNameCount; i += 1) {
-        const NameRecord *nameRecord = &fNAMETable->nameRecords[i];
-        
-        if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID &&
-            SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
-            char *name = ((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset);
-            le_uint16 length = SWAPW(nameRecord->length);
-            char *result = NEW_ARRAY(char, length + 2);
-
-            ARRAY_COPY(result, name, length);
-            result[length] = result[length + 1] = 0;
-
-            return result;
-        }
-    }
-
-    return NULL;
-}
-
-const LEUnicode16 *PortableFontInstance::getUnicodeNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const
-{
-    if (fNAMETable == NULL) {
-        LETag nameTag = LE_NAME_TABLE_TAG;
-        PortableFontInstance *realThis = (PortableFontInstance *) this;
-
-        realThis->fNAMETable = (const NAMETable *) getFontTable(nameTag);
-
-        if (realThis->fNAMETable != NULL) {
-            realThis->fNameCount        = SWAPW(realThis->fNAMETable->count);
-            realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset);
-        }
-    }
-
-    for(le_int32 i = 0; i < fNameCount; i += 1) {
-        const NameRecord *nameRecord = &fNAMETable->nameRecords[i];
-        
-        if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID &&
-            SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
-            LEUnicode16 *name = (LEUnicode16 *) (((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset));
-            le_uint16 length = SWAPW(nameRecord->length) / 2;
-            LEUnicode16 *result = NEW_ARRAY(LEUnicode16, length + 2);
-
-            for (le_int32 c = 0; c < length; c += 1) {
-                result[c] = SWAPW(name[c]);
-            }
-
-            result[length] = 0;
-
-            return result;
-        }
-    }
-
-    return NULL;
-}
-
-void PortableFontInstance::deleteNameString(const char *name) const
-{
-    DELETE_ARRAY(name);
-}
-
-void PortableFontInstance::deleteNameString(const LEUnicode16 *name) const
-{
-    DELETE_ARRAY(name);
-}
-
-void PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const
-{
-    TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
-
-    if (fHMTXTable == NULL) {
-        LETag maxpTag = LE_MAXP_TABLE_TAG;
-        LETag hmtxTag = LE_HMTX_TABLE_TAG;
-        const MAXPTable *maxpTable = (MAXPTable *) getFontTable(maxpTag);
-        PortableFontInstance *realThis = (PortableFontInstance *) this;
-
-        if (maxpTable != NULL) {
-            realThis->fNumGlyphs = SWAPW(maxpTable->numGlyphs);
-        }
-
-        realThis->fHMTXTable = (const HMTXTable *) getFontTable(hmtxTag);
-    }
-
-    le_uint16 index = ttGlyph;
-
-    if (ttGlyph >= fNumGlyphs || fHMTXTable == NULL) {
-        advance.fX = advance.fY = 0;
-        return;
-    }
-
-    if (ttGlyph >= fNumLongHorMetrics) {
-        index = fNumLongHorMetrics - 1;
-    }
-
-    transformFunits (SWAPW(fHMTXTable->hMetrics[index].advanceWidth), 0, advance);
-}
-
-le_bool PortableFontInstance::getGlyphPoint(LEGlyphID /*glyph*/, le_int32 /*pointNumber*/, LEPoint &/*point*/) const
-{
-    return FALSE;
-}
-
-le_int32 PortableFontInstance::getUnitsPerEM() const
-{
-    return fUnitsPerEM;
-}
-
-le_uint32 PortableFontInstance::getFontChecksum() const
-{
-    return 0;
-}
-
-le_int32 PortableFontInstance::getAscent() const
-{
-    return fAscent;
-}
-
-le_int32 PortableFontInstance::getDescent() const
-{
-    return fDescent;
-}
-
-le_int32 PortableFontInstance::getLeading() const
-{
-    return fLeading;
-}
-
-// We really want to inherit this method from the superclass, but some compilers
-// issue a warning if we don't implement it...
-LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const
-{
-    return LEFontInstance::mapCharToGlyph(ch, mapper, filterZeroWidth);
-}
-
-// We really want to inherit this method from the superclass, but some compilers
-// issue a warning if we don't implement it...
-LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const
-{
-    return LEFontInstance::mapCharToGlyph(ch, mapper);
-}
-
-LEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch) const
-{
-    return fCMAPMapper->unicodeToGlyph(ch);
-}
-
-float PortableFontInstance::getXPixelsPerEm() const
-{
-    return fXPixelsPerEM;
-}
-
-float PortableFontInstance::getYPixelsPerEm() const
-{
-    return fYPixelsPerEM;
-}
-
-float PortableFontInstance::getScaleFactorX() const
-{
-    return fXScale;
-}
-
-float PortableFontInstance::getScaleFactorY() const
-{
-    return fYScale;
-}
diff --git a/src/hb-icu-le/PortableFontInstance.h b/src/hb-icu-le/PortableFontInstance.h
deleted file mode 100644
index 5b92d83..0000000
--- a/src/hb-icu-le/PortableFontInstance.h
+++ /dev/null
@@ -1,119 +0,0 @@
-
-/*
- *******************************************************************************
- *
- *   Copyright (C) 1999-2008, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- *
- *******************************************************************************
- *   file name:  PortableFontInstance.h
- *
- *   created on: 11/12/1999
- *   created by: Eric R. Mader
- */
-
-#ifndef __PORTABLEFONTINSTANCE_H
-#define __PORTABLEFONTINSTANCE_H
-
-#define HB_H_IN
-#include <hb-font.h>
-#include <hb-blob.h>
-
-#include "layout/LETypes.h"
-#include "layout/LEFontInstance.h"
-#include "letest.h"
-
-#include "FontTableCache.h"
-
-#include "cmaps.h"
-
-HB_BEGIN_VISIBILITY
-
-class PortableFontInstance : public LEFontInstance, protected FontTableCache
-{
-private:
-    hb_face_t *fFace;
-
-    float     fXScale;
-    float     fYScale;
-    unsigned int fXPixelsPerEM;
-    unsigned int fYPixelsPerEM;
-    le_int32  fUnitsPerEM;
-    le_int32  fAscent;
-    le_int32  fDescent;
-    le_int32  fLeading;
-
-    const NAMETable *fNAMETable;
-    le_uint16 fNameCount;
-    le_uint16 fNameStringOffset;
-
-    CMAPMapper *fCMAPMapper;
-
-    const HMTXTable *fHMTXTable;
-    le_uint16 fNumGlyphs;
-    le_uint16 fNumLongHorMetrics;
-
-    void getMetrics();
-
-    CMAPMapper *findUnicodeMapper();
-
-protected:
-    hb_blob_t *readFontTable(LETag tableTag) const;
-
-public:
-    PortableFontInstance(hb_face_t *face,
-			 float xScale,
-			 float yScale,
-			 unsigned int xPixelsPerEM,
-			 unsigned int yPixelsPerEM,
-			 LEErrorCode &status);
-
-    virtual ~PortableFontInstance();
-
-    virtual const void *getFontTable(LETag tableTag) const;
-
-    virtual const char *getNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const;
-
-    virtual const LEUnicode16 *getUnicodeNameString(le_uint16 nameID, le_uint16 platform, le_uint16 encoding, le_uint16 language) const;
-
-    virtual void deleteNameString(const char *name) const;
-
-    virtual void deleteNameString(const LEUnicode16 *name) const;
-
-    virtual le_int32 getUnitsPerEM() const;
-
-    virtual le_uint32 getFontChecksum() const;
-
-    virtual le_int32 getAscent() const;
-
-    virtual le_int32 getDescent() const;
-
-    virtual le_int32 getLeading() const;
-
-    // We really want to inherit this method from the superclass, but some compilers
-    // issue a warning if we don't implement it...
-    virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const;
-    
-    // We really want to inherit this method from the superclass, but some compilers
-    // issue a warning if we don't implement it...
-    virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const;
-
-    virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch) const;
-
-    virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const;
-
-    virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const;
-
-    virtual float getXPixelsPerEm() const;
-
-    virtual float getYPixelsPerEm() const;
-
-    virtual float getScaleFactorX() const;
-
-    virtual float getScaleFactorY() const;
-
-};
-
-HB_END_VISIBILITY
-
-#endif
diff --git a/src/hb-icu-le/README b/src/hb-icu-le/README
deleted file mode 100644
index 329a218..0000000
--- a/src/hb-icu-le/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This is PortableFontInstance from icu/test/testle of ICU50.
-Modified to use a hb_face_t.
-For license information, see the file license.html.
diff --git a/src/hb-icu-le/cmaps.cpp b/src/hb-icu-le/cmaps.cpp
deleted file mode 100644
index d03ee71..0000000
--- a/src/hb-icu-le/cmaps.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-/***************************************************************************
-*
-*   Copyright (C) 1998-2003, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-************************************************************************/
-
-#include "layout/LETypes.h"
-#include "layout/LESwaps.h"
-
-#include "sfnt.h"
-#include "cmaps.h"
-
-#define SWAPU16(code) ((LEUnicode16) SWAPW(code))
-#define SWAPU32(code) ((LEUnicode32) SWAPL(code))
-
-//
-// Finds the high bit by binary searching
-// through the bits in value.
-//
-static inline le_int8 highBit(le_uint32 value)
-{
-    le_uint8 bit = 0;
-
-    if (value >= 1 << 16) {
-        value >>= 16;
-        bit += 16;
-    }
-
-    if (value >= 1 << 8) {
-        value >>= 8;
-        bit += 8;
-    }
-
-    if (value >= 1 << 4) {
-        value >>= 4;
-        bit += 4;
-    }
-
-    if (value >= 1 << 2) {
-        value >>= 2;
-        bit += 2;
-    }
-
-    if (value >= 1 << 1) {
-        value >>= 1;
-        bit += 1;
-    }
-
-    return bit;
-}
-
-CMAPMapper *CMAPMapper::createUnicodeMapper(const CMAPTable *cmap)
-{
-    le_uint16 i;
-    le_uint16 nSubtables = SWAPW(cmap->numberSubtables);
-    const CMAPEncodingSubtable *subtable = NULL;
-    le_uint32 offset1 = 0, offset10 = 0;
-
-    for (i = 0; i < nSubtables; i += 1) {
-        const CMAPEncodingSubtableHeader *esh = &cmap->encodingSubtableHeaders[i];
-
-        if (SWAPW(esh->platformID) == 3) {
-            switch (SWAPW(esh->platformSpecificID)) {
-            case 1:
-                offset1 = SWAPL(esh->encodingOffset);
-                break;
-
-            case 10:
-                offset10 = SWAPL(esh->encodingOffset);
-                break;
-            }
-        }
-    }
-
-
-    if (offset10 != 0)
-    {
-        subtable = (const CMAPEncodingSubtable *) ((const char *) cmap + offset10);
-    } else if (offset1 != 0) {
-        subtable = (const CMAPEncodingSubtable *) ((const char *) cmap + offset1);
-    } else {
-        return NULL;
-    }
-
-    switch (SWAPW(subtable->format)) {
-    case 4:
-        return new CMAPFormat4Mapper(cmap, (const CMAPFormat4Encoding *) subtable);
-
-    case 12:
-    {
-        const CMAPFormat12Encoding *encoding = (const CMAPFormat12Encoding *) subtable;
-
-        return new CMAPGroupMapper(cmap, encoding->groups, SWAPL(encoding->nGroups));
-    }
-
-    default:
-        break;
-    }
-
-    return NULL;
-}
-
-CMAPFormat4Mapper::CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header)
-    : CMAPMapper(cmap)
-{
-    le_uint16 segCount = SWAPW(header->segCountX2) / 2;
-
-    fEntrySelector = SWAPW(header->entrySelector);
-    fRangeShift = SWAPW(header->rangeShift) / 2;
-    fEndCodes = &header->endCodes[0];
-    fStartCodes = &header->endCodes[segCount + 1]; // + 1 for reservedPad...
-    fIdDelta = &fStartCodes[segCount];
-    fIdRangeOffset = &fIdDelta[segCount];
-}
-
-LEGlyphID CMAPFormat4Mapper::unicodeToGlyph(LEUnicode32 unicode32) const
-{
-    if (unicode32 >= 0x10000) {
-        return 0;
-    }
-
-    LEUnicode16 unicode = (LEUnicode16) unicode32;
-    le_uint16 index = 0;
-    le_uint16 probe = 1 << fEntrySelector;
-    TTGlyphID result = 0;
-
-    if (SWAPU16(fStartCodes[fRangeShift]) <= unicode) {
-        index = fRangeShift;
-    }
-
-    while (probe > (1 << 0)) {
-        probe >>= 1;
-
-        if (SWAPU16(fStartCodes[index + probe]) <= unicode) {
-            index += probe;
-        }
-    }
-
-    if (unicode >= SWAPU16(fStartCodes[index]) && unicode <= SWAPU16(fEndCodes[index])) {
-        if (fIdRangeOffset[index] == 0) {
-            result = (TTGlyphID) unicode;
-        } else {
-            le_uint16 offset = unicode - SWAPU16(fStartCodes[index]);
-            le_uint16 rangeOffset = SWAPW(fIdRangeOffset[index]);
-            le_uint16 *glyphIndexTable = (le_uint16 *) ((char *) &fIdRangeOffset[index] + rangeOffset);
-
-            result = SWAPW(glyphIndexTable[offset]);
-        }
-
-        result += SWAPW(fIdDelta[index]);
-    } else {
-        result = 0;
-    }
-
-    return LE_SET_GLYPH(0, result);
-}
-
-CMAPFormat4Mapper::~CMAPFormat4Mapper()
-{
-    // parent destructor does it all
-}
-
-CMAPGroupMapper::CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups)
-    : CMAPMapper(cmap), fGroups(groups)
-{
-    le_uint8 bit = highBit(nGroups);
-    fPower = 1 << bit;
-    fRangeOffset = nGroups - fPower;
-}
-
-LEGlyphID CMAPGroupMapper::unicodeToGlyph(LEUnicode32 unicode32) const
-{
-    le_int32 probe = fPower;
-    le_int32 range = 0;
-
-    if (SWAPU32(fGroups[fRangeOffset].startCharCode) <= unicode32) {
-        range = fRangeOffset;
-    }
-
-    while (probe > (1 << 0)) {
-        probe >>= 1;
-
-        if (SWAPU32(fGroups[range + probe].startCharCode) <= unicode32) {
-            range += probe;
-        }
-    }
-
-    if (SWAPU32(fGroups[range].startCharCode) <= unicode32 && SWAPU32(fGroups[range].endCharCode) >= unicode32) {
-        return (LEGlyphID) (SWAPU32(fGroups[range].startGlyphCode) + unicode32 - SWAPU32(fGroups[range].startCharCode));
-    }
-
-    return 0;
-}
-
-CMAPGroupMapper::~CMAPGroupMapper()
-{
-    // parent destructor does it all
-}
-
diff --git a/src/hb-icu-le/cmaps.h b/src/hb-icu-le/cmaps.h
deleted file mode 100644
index cf73f3a..0000000
--- a/src/hb-icu-le/cmaps.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/***************************************************************************
-*
-*   Copyright (C) 1998-2006, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-************************************************************************/
-
-
-#ifndef __CMAPS_H
-#define __CMAPS_H
-
-#include "layout/LETypes.h"
-#include "letest.h"
-#include "sfnt.h"
-
-HB_BEGIN_VISIBILITY
-
-class CMAPMapper
-{
-public:
-    virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const = 0;
-
-    virtual ~CMAPMapper();
-
-    static CMAPMapper *createUnicodeMapper(const CMAPTable *cmap);
-
-protected:
-    CMAPMapper(const CMAPTable *cmap);
-
-    CMAPMapper() {};
-
-private:
-    const CMAPTable *fcmap;
-};
-
-class CMAPFormat4Mapper : public CMAPMapper
-{
-public:
-    CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header);
-
-    virtual ~CMAPFormat4Mapper();
-
-    virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const;
-
-protected:
-    CMAPFormat4Mapper() {};
-
-private:
-    le_uint16       fEntrySelector;
-    le_uint16       fRangeShift;
-    const le_uint16 *fEndCodes;
-    const le_uint16 *fStartCodes;
-    const le_uint16 *fIdDelta;
-    const le_uint16 *fIdRangeOffset;
-};
-
-class CMAPGroupMapper : public CMAPMapper
-{
-public:
-    CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups);
-
-    virtual ~CMAPGroupMapper();
-
-    virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const;
-
-protected:
-    CMAPGroupMapper() {};
-
-private:
-    le_int32 fPower;
-    le_int32 fRangeOffset;
-    const CMAPGroup *fGroups;
-};
-
-inline CMAPMapper::CMAPMapper(const CMAPTable *cmap)
-    : fcmap(cmap)
-{
-    // nothing else to do
-}
-
-inline CMAPMapper::~CMAPMapper()
-{
-}
-
-HB_END_VISIBILITY
-
-#endif
diff --git a/src/hb-icu-le/letest.h b/src/hb-icu-le/letest.h
deleted file mode 100644
index ff564ba..0000000
--- a/src/hb-icu-le/letest.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *******************************************************************************
- *
- *   Copyright (C) 1999-2011, International Business Machines
- *   Corporation and others.  All Rights Reserved.
- *
- *******************************************************************************
- *   file name:  letest.h
- *
- *   created on: 11/06/2000
- *   created by: Eric R. Mader
- */
-
-#ifndef __LETEST_H
-#define __LETEST_H
-
-
-#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
-# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
-# define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
-#else
-# define HB_BEGIN_VISIBILITY
-# define HB_END_VISIBILITY
-#endif
-
-
-#include "layout/LETypes.h"
-/*#include "unicode/ctest.h"*/
-
-#include <stdlib.h>
-#include <string.h>
-
-HB_BEGIN_VISIBILITY
-
-U_NAMESPACE_USE
-
-#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
-
-#define ARRAY_COPY(dst, src, count) memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0])
-
-#define NEW_ARRAY(type,count) (type *) malloc((count) * sizeof(type))
-
-#define DELETE_ARRAY(array) free((void *) (array))
-
-#define GROW_ARRAY(array,newSize) realloc((void *) (array), (newSize) * sizeof (array)[0])
-
-struct TestResult
-{
-    le_int32   glyphCount;
-    LEGlyphID *glyphs;
-    le_int32  *indices;
-    float     *positions;
-};
-
-#ifndef __cplusplus
-typedef struct TestResult TestResult;
-#endif
-
-//U_CFUNC void addCTests(TestNode **root);
-
-HB_END_VISIBILITY
-
-#endif
diff --git a/src/hb-icu-le/license.html b/src/hb-icu-le/license.html
deleted file mode 100644
index d078d05..0000000
--- a/src/hb-icu-le/license.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></meta>
-<title>ICU License - ICU 1.8.1 and later</title>
-</head>
-
-<body BGCOLOR="#ffffff">
-<h2>ICU License - ICU 1.8.1 and later</h2>
-
-<p>COPYRIGHT AND PERMISSION NOTICE</p>
-
-<p>
-Copyright (c) 1995-2012 International Business Machines Corporation and others
-</p>
-<p>
-All rights reserved.
-</p>
-<p>
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, and/or sell
-copies of the Software, and to permit persons
-to whom the Software is furnished to do so, provided that the above
-copyright notice(s) and this permission notice appear in all copies
-of the Software and that both the above copyright notice(s) and this
-permission notice appear in supporting documentation.
-</p>
-<p>
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL
-THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM,
-OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
-RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
-USE OR PERFORMANCE OF THIS SOFTWARE.
-</p>
-<p>
-Except as contained in this notice, the name of a copyright holder shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-this Software without prior written authorization of the copyright holder.
-</p>
-
-<hr>
-<p><small>
-All trademarks and registered trademarks mentioned herein are the property of their respective owners.
-</small></p>
-</body>
-</html>
diff --git a/src/hb-icu-le/sfnt.h b/src/hb-icu-le/sfnt.h
deleted file mode 100644
index feec0ad..0000000
--- a/src/hb-icu-le/sfnt.h
+++ /dev/null
@@ -1,453 +0,0 @@
-/***************************************************************************
-*
-*   Copyright (C) 1998-2011, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-************************************************************************/
-
-#ifndef __SFNT_H
-#define __SFNT_H
-
-#include "layout/LETypes.h"
-#include "letest.h"
-
-HB_BEGIN_VISIBILITY
-
-U_NAMESPACE_USE
-
-#ifndef ANY_NUMBER
-#define ANY_NUMBER 1
-#endif
-
-struct DirectoryEntry
-{
-    le_uint32   tag;
-    le_uint32   checksum;
-    le_uint32   offset;
-    le_uint32   length;
-};
-
-#ifndef __cplusplus
-typedef struct DirectoryEntry DirectoryEntry;
-#endif
-
-struct SFNTDirectory
-{
-    le_uint32       scalerType;
-    le_uint16       numTables;
-    le_uint16       searchRange;
-    le_uint16       entrySelector;
-    le_uint16       rangeShift;
-    DirectoryEntry  tableDirectory[ANY_NUMBER];
-};
-
-#ifndef __cplusplus
-typedef struct SFNTDirectory SFNTDirectory;
-#endif
-
-
-struct CMAPEncodingSubtableHeader
-{
-    le_uint16   platformID;
-    le_uint16   platformSpecificID;
-    le_uint32   encodingOffset;
-};
-
-#ifndef __cplusplus
-typedef struct CMAPEncodingSubtableHeader CMAPEncodingSubtableHeader;
-#endif
-
-struct CMAPTable
-{
-    le_uint16   version;
-    le_uint16   numberSubtables;
-    CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER];
-};
-
-#ifndef __cplusplus
-typedef struct CMAPTable CMAPTable;
-#endif
-
-struct CMAPEncodingSubtable
-{
-    le_uint16   format;
-    le_uint16   length;
-    le_uint16   language;
-};
-
-#ifndef __cplusplus
-typedef struct CMAPEncodingSubtable CMAPEncodingSubtable;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat0Encoding : CMAPEncodingSubtable
-{
-    le_uint8    glyphIndexArray[256];
-};
-#else
-struct CMAPFormat0Encoding
-{
-	CMAPEncodingSubtable base;
-
-	le_uint8 glyphIndexArray[256];
-};
-
-typedef struct CMAPFormat0Encoding CMAPFormat0Encoding;
-#endif
-
-struct CMAPFormat2Subheader
-{
-    le_uint16   firstCode;
-    le_uint16   entryCount;
-    le_int16    idDelta;
-    le_uint16   idRangeOffset;
-};
-
-#ifndef __cplusplus
-typedef struct CMAPFormat2Subheader CMAPFormat2Subheader;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat2Encoding : CMAPEncodingSubtable
-{
-    le_uint16  subHeadKeys[256];
-    CMAPFormat2Subheader subheaders[ANY_NUMBER];
-};
-#else
-struct CMAPFormat2Encoding
-{
-	CMAPEncodingSubtable base;
-
-    le_uint16  subHeadKeys[256];
-    CMAPFormat2Subheader subheaders[ANY_NUMBER];
-};
-
-typedef struct CMAPFormat2Encoding CMAPFormat2Encoding;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat4Encoding : CMAPEncodingSubtable
-{
-    le_uint16   segCountX2;
-    le_uint16   searchRange;
-    le_uint16   entrySelector;
-    le_uint16   rangeShift;
-    le_uint16   endCodes[ANY_NUMBER];
-/*
-    le_uint16   reservedPad;
-    le_uint16   startCodes[ANY_NUMBER];
-    le_uint16   idDelta[ANY_NUMBER];
-    le_uint16   idRangeOffset[ANY_NUMBER];
-    le_uint16   glyphIndexArray[ANY_NUMBER];
-*/
-};
-#else
-struct CMAPFormat4Encoding
-{
-	CMAPEncodingSubtable base;
-
-    le_uint16   segCountX2;
-    le_uint16   searchRange;
-    le_uint16   entrySelector;
-    le_uint16   rangeShift;
-    le_uint16   endCodes[ANY_NUMBER];
-/*
-//  le_uint16   reservedPad;
-//  le_uint16   startCodes[ANY_NUMBER];
-//  le_uint16   idDelta[ANY_NUMBER];
-//  le_uint16   idRangeOffset[ANY_NUMBER];
-//  le_uint16   glyphIndexArray[ANY_NUMBER];
-*/
-};
-
-typedef struct CMAPFormat4Encoding CMAPFormat4Encoding;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat6Encoding : CMAPEncodingSubtable
-{
-    le_uint16   firstCode;
-    le_uint16   entryCount;
-    le_uint16   glyphIndexArray[ANY_NUMBER];
-};
-#else
-struct CMAPFormat6Encoding
-{
-	CMAPEncodingSubtable base;
-
-    le_uint16   firstCode;
-    le_uint16   entryCount;
-    le_uint16   glyphIndexArray[ANY_NUMBER];
-};
-
-typedef struct CMAPFormat6Encoding CMAPFormat6Encoding;
-#endif
-
-struct CMAPEncodingSubtable32
-{
-    le_uint32   format;
-    le_uint32   length;
-    le_uint32   language;
-};
-
-#ifndef __cplusplus
-typedef struct CMAPEncodingSubtable32 CMAPEncodingSubtable32;
-#endif
-
-struct CMAPGroup
-{
-    le_uint32   startCharCode;
-    le_uint32   endCharCode;
-    le_uint32   startGlyphCode;
-};
-
-#ifndef __cplusplus
-typedef struct CMAPGroup CMAPGroup;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat8Encoding : CMAPEncodingSubtable32
-{
-    le_uint32   is32[65536/32];
-    le_uint32   nGroups;
-    CMAPGroup   groups[ANY_NUMBER];
-};
-#else
-struct CMAPFormat8Encoding
-{
-	CMAPEncodingSubtable32 base;
-
-    le_uint32   is32[65536/32];
-    le_uint32   nGroups;
-    CMAPGroup   groups[ANY_NUMBER];
-};
-
-typedef struct CMAPFormat8Encoding CMAPFormat8Encoding;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat10Encoding : CMAPEncodingSubtable32
-{
-    le_uint32   startCharCode;
-    le_uint32   numCharCodes;
-    le_uint16   glyphs[ANY_NUMBER];
-};
-#else
-struct CMAPFormat10Encoding
-{
-	CMAPEncodingSubtable32 base;
-
-    le_uint32   startCharCode;
-    le_uint32   numCharCodes;
-    le_uint16   glyphs[ANY_NUMBER];
-};
-
-typedef struct CMAPFormat10Encoding CMAPFormat10Encoding;
-#endif
-
-#ifdef __cplusplus
-struct CMAPFormat12Encoding : CMAPEncodingSubtable32
-{
-    le_uint32   nGroups;
-    CMAPGroup   groups[ANY_NUMBER];
-};
-#else
-struct CMAPFormat12Encoding
-{
-	CMAPEncodingSubtable32 base;
-
-    le_uint32   nGroups;
-    CMAPGroup   groups[ANY_NUMBER];
-};
-
-typedef struct CMAPFormat12Encoding CMAPFormat12Encoding;
-#endif
-
-typedef le_int32 fixed;
-
-struct BigDate
-{
-    le_uint32   bc;
-    le_uint32   ad;
-};
-
-#ifndef __cplusplus
-typedef struct BigDate BigDate;
-#endif
-
-struct HEADTable
-{
-    fixed       version;
-    fixed       fontRevision;
-    le_uint32   checksumAdjustment;
-    le_uint32   magicNumber;
-    le_uint16   flags;
-    le_uint16   unitsPerEm;
-    BigDate     created;
-    BigDate     modified;
-    le_int16    xMin;
-    le_int16    yMin;
-    le_int16    xMax;
-    le_int16    yMax;
-    le_int16    lowestRecPPEM;
-    le_int16    fontDirectionHint;
-    le_int16    indexToLocFormat;
-    le_int16    glyphDataFormat;
-};
-
-#ifndef __cplusplus
-typedef struct HEADTable HEADTable;
-#endif
-
-struct MAXPTable
-{
-    fixed       version;
-    le_uint16   numGlyphs;
-    le_uint16   maxPoints;
-    le_uint16   maxContours;
-    le_uint16   maxComponentPoints;
-    le_uint16   maxComponentContours;
-    le_uint16   maxZones;
-    le_uint16   maxTwilightPoints;
-    le_uint16   maxStorage;
-    le_uint16   maxFunctionDefs;
-    le_uint16   maxInstructionDefs;
-    le_uint16   maxStackElements;
-    le_uint16   maxSizeOfInstructions;
-    le_uint16   maxComponentElements;
-    le_uint16   maxComponentDepth;
-};
-
-#ifndef __cplusplus
-typedef struct MAXPTable MAXPTable;
-#endif
-
-struct HHEATable
-{
-    fixed       version;
-    le_int16    ascent;
-    le_int16    descent;
-    le_int16    lineGap;
-    le_uint16   advanceWidthMax;
-    le_int16    minLeftSideBearing;
-    le_int16    minRightSideBearing;
-    le_int16    xMaxExtent;
-    le_int16    caretSlopeRise;
-    le_int16    caretSlopeRun;
-    le_int16    caretOffset;
-    le_int16    reserved1;
-    le_int16    reserved2;
-    le_int16    reserved3;
-    le_int16    reserved4;
-    le_int16    metricDataFormat;
-    le_uint16   numOfLongHorMetrics;
-};
-
-#ifndef __cplusplus
-typedef struct HHEATable HHEATable;
-#endif
-
-struct LongHorMetric
-{
-    le_uint16   advanceWidth;
-    le_int16    leftSideBearing;
-};
-
-#ifndef __cplusplus
-typedef struct LongHorMetric LongHorMetric;
-#endif
-
-struct HMTXTable
-{
-    LongHorMetric hMetrics[ANY_NUMBER];       /* ANY_NUMBER = numOfLongHorMetrics from hhea table */
-/* le_int16        leftSideBearing[ANY_NUMBER];  ANY_NUMBER = numGlyphs - numOfLongHorMetrics     */
-};
-
-#ifndef __cplusplus
-typedef struct HMTXTable HMTXTable;
-#endif
-
-enum PlatformID
-{
-    PLATFORM_UNICODE = 0,
-    PLATFORM_MACINTOSH = 1,
-    PLATFORM_ISO       = 2,
-    PLATFORM_MICROSOFT = 3,
-    PLATFORM_CUSTOM    = 4
-};
-
-enum MacintoshEncodingID
-{
-    MACINTOSH_ROMAN = 0
-};
-
-enum MacintoshLanguageID
-{
-    MACINTOSH_ENGLISH = 0
-};
-
-enum MicrosoftEncodingID
-{
-    MICROSOFT_UNICODE_BMP  =  1,
-    MICROSOFT_UNICODE_FULL = 10
-};
-
-enum MicrosoftLanguageID
-{
-    MICROSOFT_ENGLISH = 0x409
-};
-
-enum NameID
-{
-    NAME_COPYRIGHT_NOTICE     = 0,
-    NAME_FONT_FAMILY          = 1,
-    NAME_FONT_SUB_FAMILY      = 2,
-    NAME_UNIQUE_FONT_ID       = 3,
-    NAME_FULL_FONT_NAME       = 4,
-    NAME_VERSION_STRING       = 5,
-    NAME_POSTSCRIPT_NAME      = 6,
-    NAME_TRADEMARK            = 7,
-    NAME_MANUFACTURER         = 8,
-    NAME_DESIGNER             = 9,
-    NAME_DESCRIPTION          = 10,
-    NAME_VENDOR_URL           = 11,
-    NAME_DESIGNER_URL         = 12,
-    NAME_LICENSE_DESCRIPTION  = 13,
-    NAME_LICENSE_URL          = 14,
-    NAME_RESERVED             = 15,
-    NAME_PREFERRED_FAMILY     = 16,
-    NAME_PREFERRED_SUB_FAMILY = 17,
-    NAME_COMPATIBLE_FULL      = 18,
-    NAME_SAMPLE_TEXT          = 19,
-    NAME_POSTSCRIPT_CID       = 20
-};
-
-struct NameRecord
-{
-    le_uint16 platformID;
-    le_uint16 encodingID;
-    le_uint16 languageID;
-    le_uint16 nameID;
-    le_uint16 length;
-    le_uint16 offset;
-};
-
-#ifndef __cplusplus
-typedef struct NameRecord NameRecord;
-#endif
-
-struct NAMETable
-{
-    le_uint16 version;
-    le_uint16 count;
-    le_uint16 stringOffset;
-    NameRecord nameRecords[ANY_NUMBER];
-};
-
-#ifndef __cplusplus
-typedef struct NAMETable NAMETable;
-#endif
-
-HB_END_VISIBILITY
-
-#endif
diff --git a/src/hb-old.cc b/src/hb-old.cc
deleted file mode 100644
index a7ea8ed..0000000
--- a/src/hb-old.cc
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright © 2012  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#define HB_SHAPER old
-#define hb_old_shaper_face_data_t HB_FaceRec_
-#define hb_old_shaper_font_data_t HB_Font_
-#include "hb-shaper-impl-private.hh"
-
-#include <harfbuzz.h>
-
-
-#ifndef HB_DEBUG_OLD
-#define HB_DEBUG_OLD (HB_DEBUG+0)
-#endif
-
-
-static HB_Script
-hb_old_script_from_script (hb_script_t script)
-{
-  switch ((hb_tag_t) script)
-  {
-    default:
-    case HB_SCRIPT_COMMON:		return HB_Script_Common;
-    case HB_SCRIPT_GREEK:		return HB_Script_Greek;
-    case HB_SCRIPT_CYRILLIC:		return HB_Script_Cyrillic;
-    case HB_SCRIPT_ARMENIAN:		return HB_Script_Armenian;
-    case HB_SCRIPT_HEBREW:		return HB_Script_Hebrew;
-    case HB_SCRIPT_ARABIC:		return HB_Script_Arabic;
-    case HB_SCRIPT_SYRIAC:		return HB_Script_Syriac;
-    case HB_SCRIPT_THAANA:		return HB_Script_Thaana;
-    case HB_SCRIPT_DEVANAGARI:		return HB_Script_Devanagari;
-    case HB_SCRIPT_BENGALI:		return HB_Script_Bengali;
-    case HB_SCRIPT_GURMUKHI:		return HB_Script_Gurmukhi;
-    case HB_SCRIPT_GUJARATI:		return HB_Script_Gujarati;
-    case HB_SCRIPT_ORIYA:		return HB_Script_Oriya;
-    case HB_SCRIPT_TAMIL:		return HB_Script_Tamil;
-    case HB_SCRIPT_TELUGU:		return HB_Script_Telugu;
-    case HB_SCRIPT_KANNADA:		return HB_Script_Kannada;
-    case HB_SCRIPT_MALAYALAM:		return HB_Script_Malayalam;
-    case HB_SCRIPT_SINHALA:		return HB_Script_Sinhala;
-    case HB_SCRIPT_THAI:		return HB_Script_Thai;
-    case HB_SCRIPT_LAO:			return HB_Script_Lao;
-    case HB_SCRIPT_TIBETAN:		return HB_Script_Tibetan;
-    case HB_SCRIPT_MYANMAR:		return HB_Script_Myanmar;
-    case HB_SCRIPT_GEORGIAN:		return HB_Script_Georgian;
-    case HB_SCRIPT_HANGUL:		return HB_Script_Hangul;
-    case HB_SCRIPT_OGHAM:		return HB_Script_Ogham;
-    case HB_SCRIPT_RUNIC:		return HB_Script_Runic;
-    case HB_SCRIPT_KHMER:		return HB_Script_Khmer;
-    case HB_SCRIPT_NKO:			return HB_Script_Nko;
-    case HB_SCRIPT_INHERITED:		return HB_Script_Inherited;
-  }
-}
-
-
-static HB_Bool
-hb_old_convertStringToGlyphIndices (HB_Font old_font,
-				    const HB_UChar16 *string,
-				    hb_uint32 length,
-				    HB_Glyph *glyphs,
-				    hb_uint32 *numGlyphs,
-				    HB_Bool rightToLeft)
-{
-  hb_font_t *font = (hb_font_t *) old_font->userData;
-
-  for (unsigned int i = 0; i < length; i++)
-  {
-    hb_codepoint_t u;
-
-    /* XXX Handle UTF-16.  Ugh */
-    u = string[i];
-
-    if (rightToLeft)
-      u = hb_unicode_funcs_get_default ()->mirroring (u);
-
-    font->get_glyph (u, 0, &u); /* TODO Variation selectors */
-
-    glyphs[i] = u;
-  }
-  *numGlyphs = length; /* XXX */
-
-  return true;
-}
-
-static void
-hb_old_getGlyphAdvances (HB_Font old_font,
-			 const HB_Glyph *glyphs,
-			 hb_uint32 numGlyphs,
-			 HB_Fixed *advances,
-			 int flags /*HB_ShaperFlag*/ HB_UNUSED)
-{
-  hb_font_t *font = (hb_font_t *) old_font->userData;
-
-  for (unsigned int i = 0; i < numGlyphs; i++)
-    advances[i] = font->get_glyph_h_advance (glyphs[i]);
-}
-
-static HB_Bool
-hb_old_canRender (HB_Font old_font,
-		  const HB_UChar16 *string,
-		  hb_uint32 length)
-{
-  return true; /* TODO */
-}
-
-static HB_Error
-hb_old_getPointInOutline (HB_Font old_font,
-			  HB_Glyph glyph,
-			  int flags /*HB_ShaperFlag*/,
-			  hb_uint32 point,
-			  HB_Fixed *xpos,
-			  HB_Fixed *ypos,
-			  hb_uint32 *nPoints)
-{
-  return HB_Err_Ok; /* TODO */
-}
-
-static void
-hb_old_getGlyphMetrics (HB_Font old_font,
-			HB_Glyph glyph,
-			HB_GlyphMetrics *metrics)
-{
-  hb_font_t *font = (hb_font_t *) old_font->userData;
-
-  hb_glyph_extents_t extents;
-
-  font->get_glyph_extents (glyph, &extents);
-
-  metrics->x       = extents.x_bearing;
-  metrics->y       = extents.y_bearing;
-  metrics->width   = extents.width;
-  metrics->height  = extents.height;
-  metrics->xOffset = font->get_glyph_h_advance (glyph);
-  metrics->yOffset = 0;
-}
-
-static HB_Fixed
-hb_old_getFontMetric (HB_Font old_font,
-		      HB_FontMetric metric)
-{
-  hb_font_t *font = (hb_font_t *) old_font->userData;
-
-  switch (metric)
-  {
-    case HB_FontAscent:
-       return font->y_scale; /* XXX We don't have ascent data yet. */
-
-    default:
-      return 0;
-  }
-}
-
-static const HB_FontClass hb_old_font_class = {
-  hb_old_convertStringToGlyphIndices,
-  hb_old_getGlyphAdvances,
-  hb_old_canRender,
-  hb_old_getPointInOutline,
-  hb_old_getGlyphMetrics,
-  hb_old_getFontMetric
-};
-
-
-
-static HB_Error
-table_func (void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length)
-{
-  hb_face_t *face = (hb_face_t *) font;
-  hb_blob_t *blob = face->reference_table ((hb_tag_t) tag);
-  unsigned int capacity = *length;
-  *length = hb_blob_get_length (blob);
-  memcpy (buffer, hb_blob_get_data (blob, NULL), MIN (capacity, *length));
-  hb_blob_destroy (blob);
- return HB_Err_Ok;
-}
-
-
-/*
- * shaper face data
- */
-
-hb_old_shaper_face_data_t *
-_hb_old_shaper_face_data_create (hb_face_t *face)
-{
-  return HB_NewFace (face, table_func);
-}
-
-void
-_hb_old_shaper_face_data_destroy (hb_old_shaper_face_data_t *data)
-{
-  HB_FreeFace (data);
-}
-
-
-/*
- * shaper font data
- */
-
-hb_old_shaper_font_data_t *
-_hb_old_shaper_font_data_create (hb_font_t *font)
-{
-  HB_FontRec *data = (HB_FontRec *) calloc (1, sizeof (HB_FontRec));
-  if (unlikely (!data)) {
-    DEBUG_MSG (OLD, font, "malloc()ing HB_Font failed");
-    return NULL;
-  }
-
-  data->klass = &hb_old_font_class;
-  data->x_ppem = font->x_ppem;
-  data->y_ppem = font->y_ppem;
-  data->x_scale = font->x_scale; /* XXX */
-  data->y_scale = font->y_scale; /* XXX */
-  data->userData = font;
-
-  return data;
-}
-
-void
-_hb_old_shaper_font_data_destroy (hb_old_shaper_font_data_t *data)
-{
-  free (data);
-}
-
-
-/*
- * shaper shape_plan data
- */
-
-struct hb_old_shaper_shape_plan_data_t {};
-
-hb_old_shaper_shape_plan_data_t *
-_hb_old_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
-				       const hb_feature_t *user_features HB_UNUSED,
-				       unsigned int        num_user_features HB_UNUSED)
-{
-  return (hb_old_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
-}
-
-void
-_hb_old_shaper_shape_plan_data_destroy (hb_old_shaper_shape_plan_data_t *data HB_UNUSED)
-{
-}
-
-
-/*
- * shaper
- */
-
-hb_bool_t
-_hb_old_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
-	       hb_font_t          *font,
-	       hb_buffer_t        *buffer,
-	       const hb_feature_t *features,
-	       unsigned int        num_features)
-{
-  hb_face_t *face = font->face;
-  HB_Face old_face = HB_SHAPER_DATA_GET (face);
-  HB_Font old_font = HB_SHAPER_DATA_GET (font);
-
-  bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
-
-retry:
-
-  unsigned int scratch_size;
-  char *scratch = (char *) buffer->get_scratch_buffer (&scratch_size);
-
-#define utf16_index() var1.u32
-  HB_UChar16 *pchars = (HB_UChar16 *) scratch;
-  unsigned int chars_len = 0;
-  for (unsigned int i = 0; i < buffer->len; i++) {
-    hb_codepoint_t c = buffer->info[i].codepoint;
-    buffer->info[i].utf16_index() = chars_len;
-    if (likely (c < 0x10000))
-      pchars[chars_len++] = c;
-    else if (unlikely (c >= 0x110000))
-      pchars[chars_len++] = 0xFFFD;
-    else {
-      pchars[chars_len++] = 0xD800 + ((c - 0x10000) >> 10);
-      pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1));
-    }
-  }
-
-
-#define ALLOCATE_ARRAY(Type, name, len) \
-  name = (Type *) scratch; \
-  scratch += (len) * sizeof ((name)[0]); \
-  scratch_size -= (len) * sizeof ((name)[0]);
-
-
-  HB_ShaperItem item = {0};
-
-  ALLOCATE_ARRAY (const HB_UChar16, item.string, chars_len);
-  ALLOCATE_ARRAY (unsigned short, item.log_clusters, chars_len + 2);
-  item.stringLength = chars_len;
-  item.item.pos = 0;
-  item.item.length = item.stringLength;
-  item.item.script = hb_old_script_from_script (buffer->props.script);
-  item.item.bidiLevel = backward ? 1 : 0;
-
-  item.font = old_font;
-  item.face = old_face;
-  item.shaperFlags = 0;
-
-  item.glyphIndicesPresent = false;
-
-  /* TODO Alignment. */
-  unsigned int num_glyphs = scratch_size / (sizeof (HB_Glyph) +
-					    sizeof (HB_GlyphAttributes) +
-					    sizeof (HB_Fixed) +
-					    sizeof (HB_FixedPoint) +
-					    sizeof (uint32_t));
-
-  item.num_glyphs = num_glyphs;
-  ALLOCATE_ARRAY (HB_Glyph, item.glyphs, num_glyphs);
-  ALLOCATE_ARRAY (HB_GlyphAttributes, item.attributes, num_glyphs);
-  ALLOCATE_ARRAY (HB_Fixed, item.advances, num_glyphs);
-  ALLOCATE_ARRAY (HB_FixedPoint, item.offsets, num_glyphs);
-  /* Apparently in some cases the offsets array will not be fully assigned to.
-   * Clear it. */
-  memset (item.offsets, 0, num_glyphs * sizeof (item.offsets[0]));
-  uint32_t *vis_clusters;
-  ALLOCATE_ARRAY (uint32_t, vis_clusters, num_glyphs);
-
-#undef ALLOCATE_ARRAY
-
-  if (!HB_ShapeItem (&item))
-  {
-    if (unlikely (item.num_glyphs > num_glyphs))
-    {
-      buffer->ensure (buffer->allocated * 2);
-      if (buffer->in_error)
-        return false;
-      goto retry;
-    }
-    return false;
-  }
-  num_glyphs = item.num_glyphs;
-
-  /* Ok, we've got everything we need, now compose output buffer,
-   * very, *very*, carefully! */
-
-  /* Calculate visual-clusters.  That's what we ship. */
-  for (unsigned int i = 0; i < num_glyphs; i++)
-    vis_clusters[i] = -1;
-  for (unsigned int i = 0; i < buffer->len; i++) {
-    uint32_t *p = &vis_clusters[item.log_clusters[buffer->info[i].utf16_index()]];
-    *p = MIN (*p, buffer->info[i].cluster);
-  }
-  for (unsigned int i = 1; i < num_glyphs; i++)
-    if (vis_clusters[i] == (uint32_t) -1)
-      vis_clusters[i] = vis_clusters[i - 1];
-
-#undef utf16_index
-
-  buffer->ensure (num_glyphs);
-  if (buffer->in_error)
-    return false;
-
-
-  buffer->len = num_glyphs;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < num_glyphs; i++)
-  {
-    info[i].codepoint = item.glyphs[i];
-    info[i].cluster = vis_clusters[i];
-
-    info[i].mask = item.advances[i];
-    info[i].var1.u32 = item.offsets[i].x;
-    info[i].var2.u32 = item.offsets[i].y;
-  }
-
-  buffer->clear_positions ();
-
-  for (unsigned int i = 0; i < num_glyphs; ++i) {
-    hb_glyph_info_t *info = &buffer->info[i];
-    hb_glyph_position_t *pos = &buffer->pos[i];
-
-    /* TODO vertical */
-    pos->x_advance = info->mask;
-    pos->x_offset = info->var1.u32;
-    pos->y_offset = info->var2.u32;
-  }
-
-  if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
-    buffer->reverse ();
-
-  return true;
-}
diff --git a/src/hb-old/COPYING b/src/hb-old/COPYING
deleted file mode 100644
index f7c0e97..0000000
--- a/src/hb-old/COPYING
+++ /dev/null
@@ -1,24 +0,0 @@
-HarfBuzz-old was previously licensed under different licenses.  This was
-changed in January 2008.  If you need to relicense your old copies,
-consult the announcement of the license change on the internet.
-Other than that, each copy of HarfBuzz-old is licensed under the COPYING
-file included with it.  The actual license follows:
-
-
-Permission is hereby granted, without written agreement and without
-license or royalty fees, to use, copy, modify, and distribute this
-software and its documentation for any purpose, provided that the
-above copyright notice and the following two paragraphs appear in
-all copies of this software.
-
-IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
-DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
-ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
-IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
-BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
-ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
-PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
diff --git a/src/hb-old/Makefile.am b/src/hb-old/Makefile.am
deleted file mode 100644
index 39830a6..0000000
--- a/src/hb-old/Makefile.am
+++ /dev/null
@@ -1,56 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-noinst_LTLIBRARIES = libhb-old.la
-
-MAINSOURCES =  \
-	harfbuzz-buffer.c \
-	harfbuzz-stream.c \
-	harfbuzz-gdef.c \
-	harfbuzz-gpos.c \
-	harfbuzz-gsub.c \
-	harfbuzz-impl.c \
-	harfbuzz-open.c \
-	harfbuzz-shaper.cpp \
-	harfbuzz-greek.c \
-	harfbuzz-tibetan.c \
-	harfbuzz-khmer.c \
-	harfbuzz-indic.cpp \
-	harfbuzz-hebrew.c \
-	harfbuzz-arabic.c \
-	harfbuzz-hangul.c \
-	harfbuzz-myanmar.c
-
-PUBLICHEADERS = \
-	harfbuzz.h \
-	harfbuzz-buffer.h \
-	harfbuzz-gdef.h \
-	harfbuzz-gpos.h \
-	harfbuzz-gsub.h \
-	harfbuzz-open.h \
-	harfbuzz-global.h \
-	harfbuzz-external.h \
-	harfbuzz-shaper.h \
-	harfbuzz-stream.h
-
-PRIVATEHEADERS = \
-	harfbuzz-impl.h \
-	harfbuzz-buffer-private.h \
-	harfbuzz-stream-private.h \
-	harfbuzz-gdef-private.h \
-	harfbuzz-gpos-private.h \
-	harfbuzz-gsub-private.h \
-	harfbuzz-open-private.h \
-	harfbuzz-shaper-private.h
-
-libhb_old_la_SOURCES = \
-	$(MAINSOURCES) \
-	$(PUBLICHEADERS) \
-	$(PRIVATEHEADERS)
-libhb_old_la_CPPFLAGS = \
-	-I$(top_srcdir) \
-	-I$(top_srcdir)/src \
-	-I$(top_builddir)/src
-
-EXTRA_DIST = README COPYING
-
--include $(top_srcdir)/git.mk
diff --git a/src/hb-old/README b/src/hb-old/README
deleted file mode 100644
index a29344a..0000000
--- a/src/hb-old/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This is HarfBuzz-old, an OpenType Layout engine library.
-
-To report bugs or post to discussion mailing list, see:
-
-	http://freedesktop.org/wiki/Software/HarfBuzz
-
-For license information, see the file COPYING.
diff --git a/src/hb-old/harfbuzz-arabic.c b/src/hb-old/harfbuzz-arabic.c
deleted file mode 100644
index 206411f..0000000
--- a/src/hb-old/harfbuzz-arabic.c
+++ /dev/null
@@ -1,1150 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-static const HB_UChar16 ReplacementCharacter = 0xfffd;
-
-typedef struct {
-    unsigned char shape;
-    unsigned char justification;
-} HB_ArabicProperties;
-
-typedef enum {
-    XIsolated,
-    XFinal,
-    XInitial,
-    XMedial,
-    /* intermediate state */
-    XCausing
-} ArabicShape;
-
-/*
-// these groups correspond to the groups defined in the Unicode standard.
-// Some of these groups are equal with regards to both joining and line breaking behaviour,
-// and thus have the same enum value
-//
-// I'm not sure the mapping of syriac to arabic enums is correct with regards to justification, but as
-// I couldn't find any better document I'll hope for the best.
-*/
-typedef enum {
-    /* NonJoining */
-    ArabicNone,
-    ArabicSpace,
-    /* Transparent */
-    Transparent,
-    /* Causing */
-    Center,
-    Kashida,
-
-    /* Arabic */
-    /* Dual */
-    Beh,
-    Noon,
-    Meem = Noon,
-    Heh = Noon,
-    KnottedHeh = Noon,
-    HehGoal = Noon,
-    SwashKaf = Noon,
-    Yeh,
-    Hah,
-    Seen,
-    Sad = Seen,
-    Tah,
-    Kaf = Tah,
-    Gaf = Tah,
-    Lam = Tah,
-    Ain,
-    Feh = Ain,
-    Qaf = Ain,
-    /* Right */
-    Alef,
-    Waw,
-    Dal,
-    TehMarbuta = Dal,
-    Reh,
-    HamzaOnHehGoal,
-    YehWithTail = HamzaOnHehGoal,
-    YehBarre = HamzaOnHehGoal,
-
-    /* Syriac */
-    /* Dual */
-    Beth = Beh,
-    Gamal = Ain,
-    Heth = Noon,
-    Teth = Hah,
-    Yudh = Noon,
-    Kaph = Noon,
-    Lamadh = Lam,
-    Mim = Noon,
-    Nun = Noon,
-    Semakh = Noon,
-    FinalSemakh = Noon,
-    SyriacE = Ain,
-    Pe = Ain,
-    ReversedPe = Hah,
-    Qaph = Noon,
-    Shin = Noon,
-    Fe = Ain,
-
-    /* Right */
-    Alaph = Alef,
-    Dalath = Dal,
-    He = Dal,
-    SyriacWaw = Waw,
-    Zain = Alef,
-    YudhHe = Waw,
-    Sadhe = HamzaOnHehGoal,
-    Taw = Dal,
-
-    /* Compiler bug? Otherwise ArabicGroupsEnd would be equal to Dal + 1. */
-    Dummy = HamzaOnHehGoal,
-    ArabicGroupsEnd
-} ArabicGroup;
-
-static const unsigned char arabic_group[0x150] = {
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
-    ArabicNone, ArabicNone, Alef, Alef,
-    Waw, Alef, Yeh, Alef,
-    Beh, TehMarbuta, Beh, Beh,
-    Hah, Hah, Hah, Dal,
-
-    Dal, Reh, Reh, Seen,
-    Seen, Sad, Sad, Tah,
-    Tah, Ain, Ain, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
-    /* 0x640 */
-    Kashida, Feh, Qaf, Kaf,
-    Lam, Meem, Noon, Heh,
-    Waw, Yeh, Yeh, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, Beh, Qaf,
-
-    Transparent, Alef, Alef, Alef,
-    ArabicNone, Alef, Waw, Waw,
-    Yeh, Beh, Beh, Beh,
-    Beh, Beh, Beh, Beh,
-
-    /* 0x680 */
-    Beh, Hah, Hah, Hah,
-    Hah, Hah, Hah, Hah,
-    Dal, Dal, Dal, Dal,
-    Dal, Dal, Dal, Dal,
-
-    Dal, Reh, Reh, Reh,
-    Reh, Reh, Reh, Reh,
-    Reh, Reh, Seen, Seen,
-    Seen, Sad, Sad, Tah,
-
-    Ain, Feh, Feh, Feh,
-    Feh, Feh, Feh, Qaf,
-    Qaf, Gaf, SwashKaf, Gaf,
-    Kaf, Kaf, Kaf, Gaf,
-
-    Gaf, Gaf, Gaf, Gaf,
-    Gaf, Lam, Lam, Lam,
-    Lam, Noon, Noon, Noon,
-    Noon, Noon, KnottedHeh, Hah,
-
-    /* 0x6c0 */
-    TehMarbuta, HehGoal, HamzaOnHehGoal, HamzaOnHehGoal,
-    Waw, Waw, Waw, Waw,
-    Waw, Waw, Waw, Waw,
-    Yeh, YehWithTail, Yeh, Waw,
-
-    Yeh, Yeh, YehBarre, YehBarre,
-    ArabicNone, TehMarbuta, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, ArabicNone, ArabicNone, Transparent,
-
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, ArabicNone, ArabicNone, Transparent,
-    Transparent, ArabicNone, Transparent, Transparent,
-    Transparent, Transparent, Dal, Reh,
-
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, Seen, Sad,
-    Ain, ArabicNone, ArabicNone, KnottedHeh,
-
-    /* 0x700 */
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-    ArabicNone, ArabicNone, ArabicNone, ArabicNone,
-
-    Alaph, Transparent, Beth, Gamal,
-    Gamal, Dalath, Dalath, He,
-    SyriacWaw, Zain, Heth, Teth,
-    Teth, Yudh, YudhHe, Kaph,
-
-    Lamadh, Mim, Nun, Semakh,
-    FinalSemakh, SyriacE, Pe, ReversedPe,
-    Sadhe, Qaph, Dalath, Shin,
-    Taw, Beth, Gamal, Dalath,
-
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, Transparent,
-    Transparent, Transparent, Transparent, ArabicNone,
-    ArabicNone, Zain, Kaph, Fe,
-};
-
-static ArabicGroup arabicGroup(hb_unicode_funcs_t *ufuncs, unsigned short uc)
-{
-    if (uc >= 0x0600 && uc < 0x750)
-        return (ArabicGroup) arabic_group[uc-0x600];
-    else if (uc == 0x200d)
-        return Center;
-    else if (HB_GetUnicodeCharCategory(ufuncs, uc) == HB_Separator_Space)
-        return ArabicSpace;
-    else
-        return ArabicNone;
-}
-
-
-/*
-   Arabic shaping obeys a number of rules according to the joining classes (see Unicode book, section on
-   arabic).
-
-   Each unicode char has a joining class (right, dual (left&right), center (joincausing) or transparent).
-   transparent joining is not encoded in HB_UChar16::joining(), but applies to all combining marks and format marks.
-
-   Right join-causing: dual + center
-   Left join-causing: dual + right + center
-
-   Rules are as follows (for a string already in visual order, as we have it here):
-
-   R1 Transparent characters do not affect joining behaviour.
-   R2 A right joining character, that has a right join-causing char on the right will get form XRight
-   (R3 A left joining character, that has a left join-causing char on the left will get form XLeft)
-   Note: the above rule is meaningless, as there are no pure left joining characters defined in Unicode
-   R4 A dual joining character, that has a left join-causing char on the left and a right join-causing char on
-             the right will get form XMedial
-   R5  A dual joining character, that has a right join causing char on the right, and no left join causing char on the left
-         will get form XRight
-   R6 A dual joining character, that has a  left join causing char on the left, and no right join causing char on the right
-         will get form XLeft
-   R7 Otherwise the character will get form XIsolated
-
-   Additionally we have to do the minimal ligature support for lam-alef ligatures:
-
-   L1 Transparent characters do not affect ligature behaviour.
-   L2 Any sequence of Alef(XRight) + Lam(XMedial) will form the ligature Alef.Lam(XLeft)
-   L3 Any sequence of Alef(XRight) + Lam(XLeft) will form the ligature Alef.Lam(XIsolated)
-
-   The state table below handles rules R1-R7.
-*/
-
-typedef enum {
-    JNone,
-    JCausing,
-    JDual,
-    JRight,
-    JTransparent
-} Joining;
-
-static const Joining joining_for_group[ArabicGroupsEnd] = {
-    /* NonJoining */
-    JNone, /* ArabicNone */
-    JNone, /* ArabicSpace */
-    /* Transparent */
-    JTransparent, /* Transparent */
-    /* Causing */
-    JCausing, /* Center */
-    JCausing, /* Kashida */
-    /* Dual */
-    JDual, /* Beh */
-    JDual, /* Noon */
-    JDual, /* Yeh */
-    JDual, /* Hah */
-    JDual, /* Seen */
-    JDual, /* Tah */
-    JDual, /* Ain */
-    /* Right */
-    JRight, /* Alef */
-    JRight, /* Waw */
-    JRight, /* Dal */
-    JRight, /* Reh */
-    JRight  /* HamzaOnHehGoal */
-};
-
-
-typedef struct {
-    ArabicShape form1;
-    ArabicShape form2;
-} JoiningPair;
-
-static const JoiningPair joining_table[5][4] =
-/* None, Causing, Dual, Right */
-{
-    { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XInitial }, { XIsolated, XIsolated } }, /* XIsolated */
-    { { XFinal, XIsolated }, { XFinal, XCausing }, { XFinal, XInitial }, { XFinal, XIsolated } }, /* XFinal */
-    { { XIsolated, XIsolated }, { XInitial, XCausing }, { XInitial, XMedial }, { XInitial, XFinal } }, /* XInitial */
-    { { XFinal, XIsolated }, { XMedial, XCausing }, { XMedial, XMedial }, { XMedial, XFinal } }, /* XMedial */
-    { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XMedial }, { XIsolated, XFinal } }, /* XCausing */
-};
-
-
-/*
-According to http://www.microsoft.com/middleeast/Arabicdev/IE6/KBase.asp
-
-1. Find the priority of the connecting opportunities in each word
-2. Add expansion at the highest priority connection opportunity
-3. If more than one connection opportunity have the same highest value,
-   use the opportunity closest to the end of the word.
-
-Following is a chart that provides the priority for connection
-opportunities and where expansion occurs. The character group names
-are those in table 6.6 of the UNICODE 2.0 book.
-
-
-PrioritY        Glyph                   Condition                                       Kashida Location
-
-Arabic_Kashida        User inserted Kashida   The user entered a Kashida in a position.       After the user
-                (Shift+j or Shift+[E with hat])    Thus, it is the highest priority to insert an   inserted kashida
-                                        automatic kashida.
-
-Arabic_Seen        Seen, Sad               Connecting to the next character.               After the character.
-                                        (Initial or medial form).
-
-Arabic_HaaDal        Teh Marbutah, Haa, Dal  Connecting to previous character.               Before the final form
-                                                                                        of these characters.
-
-Arabic_Alef     Alef, Tah, Lam,         Connecting to previous character.               Before the final form
-                Kaf and Gaf                                                             of these characters.
-
-Arabic_BaRa     Reh, Yeh                Connected to medial Beh                         Before preceding medial Baa
-
-Arabic_Waw        Waw, Ain, Qaf, Feh      Connecting to previous character.               Before the final form of
-                                                                                        these characters.
-
-Arabic_Normal   Other connecting        Connecting to previous character.               Before the final form
-                characters                                                              of these characters.
-
-
-
-This seems to imply that we have at most one kashida point per arabic word.
-
-*/
-
-static void getArabicProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties)
-{
-/*     qDebug("arabicSyriacOpenTypeShape: properties:"); */
-    int lastPos = 0;
-    int lastGroup = ArabicNone;
-    int i = 0;
-
-    ArabicGroup group = arabicGroup(ufuncs, chars[0]);
-    Joining j = joining_for_group[group];
-    ArabicShape shape = joining_table[XIsolated][j].form2;
-    properties[0].justification = HB_NoJustification;
-
-    for (i = 1; i < len; ++i) {
-        /* #### fix handling for spaces and punktuation */
-        properties[i].justification = HB_NoJustification;
-
-        group = arabicGroup(ufuncs, chars[i]);
-        j = joining_for_group[group];
-
-        if (j == JTransparent) {
-            properties[i].shape = XIsolated;
-            continue;
-        }
-
-        properties[lastPos].shape = joining_table[shape][j].form1;
-        shape = joining_table[shape][j].form2;
-
-        switch(lastGroup) {
-        case Seen:
-            if (properties[lastPos].shape == XInitial || properties[lastPos].shape == XMedial)
-                properties[i-1].justification = HB_Arabic_Seen;
-            break;
-        case Hah:
-            if (properties[lastPos].shape == XFinal)
-                properties[lastPos-1].justification = HB_Arabic_HaaDal;
-            break;
-        case Alef:
-            if (properties[lastPos].shape == XFinal)
-                properties[lastPos-1].justification = HB_Arabic_Alef;
-            break;
-        case Ain:
-            if (properties[lastPos].shape == XFinal)
-                properties[lastPos-1].justification = HB_Arabic_Waw;
-            break;
-        case Noon:
-            if (properties[lastPos].shape == XFinal)
-                properties[lastPos-1].justification = HB_Arabic_Normal;
-            break;
-        case ArabicNone:
-            break;
-
-        default:
-            assert(FALSE);
-        }
-
-        lastGroup = ArabicNone;
-
-        switch(group) {
-        case ArabicNone:
-        case Transparent:
-        /* ### Center should probably be treated as transparent when it comes to justification. */
-        case Center:
-            break;
-        case ArabicSpace:
-            properties[i].justification = HB_Arabic_Space;
-            break;
-        case Kashida:
-            properties[i].justification = HB_Arabic_Kashida;
-            break;
-        case Seen:
-            lastGroup = Seen;
-            break;
-
-        case Hah:
-        case Dal:
-            lastGroup = Hah;
-            break;
-
-        case Alef:
-        case Tah:
-            lastGroup = Alef;
-            break;
-
-        case Yeh:
-        case Reh:
-            if (properties[lastPos].shape == XMedial && arabicGroup(ufuncs, chars[lastPos]) == Beh)
-                properties[lastPos-1].justification = HB_Arabic_BaRa;
-            break;
-
-        case Ain:
-        case Waw:
-            lastGroup = Ain;
-            break;
-
-        case Noon:
-        case Beh:
-        case HamzaOnHehGoal:
-            lastGroup = Noon;
-            break;
-        case ArabicGroupsEnd:
-            assert(FALSE);
-        }
-
-        lastPos = i;
-    }
-    properties[lastPos].shape = joining_table[shape][JNone].form1;
-
-
-    /*
-     for (int i = 0; i < len; ++i)
-         qDebug("arabic properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification);
-    */
-}
-
-static Joining getNkoJoining(unsigned short uc)
-{
-    if (uc < 0x7ca)
-        return JNone;
-    if (uc <= 0x7ea)
-        return JDual;
-    if (uc <= 0x7f3)
-        return JTransparent;
-    if (uc <= 0x7f9)
-        return JNone;
-    if (uc == 0x7fa)
-        return JCausing;
-    return JNone;
-}
-
-static void getNkoProperties(hb_unicode_funcs_t *ufuncs, const unsigned short *chars, int len, HB_ArabicProperties *properties)
-{
-    int lastPos = 0;
-    int i = 0;
-
-    Joining j = getNkoJoining(chars[0]);
-    ArabicShape shape = joining_table[XIsolated][j].form2;
-    properties[0].justification = HB_NoJustification;
-
-    for (i = 1; i < len; ++i) {
-        properties[i].justification = (HB_GetUnicodeCharCategory(ufuncs, chars[i]) == HB_Separator_Space) ?
-                                      ArabicSpace : ArabicNone;
-
-        j = getNkoJoining(chars[i]);
-
-        if (j == JTransparent) {
-            properties[i].shape = XIsolated;
-            continue;
-        }
-
-        properties[lastPos].shape = joining_table[shape][j].form1;
-        shape = joining_table[shape][j].form2;
-
-
-        lastPos = i;
-    }
-    properties[lastPos].shape = joining_table[shape][JNone].form1;
-
-
-    /*
-     for (int i = 0; i < len; ++i)
-         qDebug("nko properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification);
-    */
-}
-
-/*
-// The unicode to unicode shaping codec.
-// does only presentation forms B at the moment, but that should be enough for
-// simple display
-*/
-static const hb_uint16 arabicUnicodeMapping[256][2] = {
-    /* base of shaped forms, and number-1 of them (0 for non shaping,
-       1 for right binding and 3 for dual binding */
-
-    /* These are just the glyphs available in Unicode,
-       some characters are in R class, but have no glyphs in Unicode. */
-
-    { 0x0600, 0 }, /* 0x0600 */
-    { 0x0601, 0 }, /* 0x0601 */
-    { 0x0602, 0 }, /* 0x0602 */
-    { 0x0603, 0 }, /* 0x0603 */
-    { 0x0604, 0 }, /* 0x0604 */
-    { 0x0605, 0 }, /* 0x0605 */
-    { 0x0606, 0 }, /* 0x0606 */
-    { 0x0607, 0 }, /* 0x0607 */
-    { 0x0608, 0 }, /* 0x0608 */
-    { 0x0609, 0 }, /* 0x0609 */
-    { 0x060A, 0 }, /* 0x060A */
-    { 0x060B, 0 }, /* 0x060B */
-    { 0x060C, 0 }, /* 0x060C */
-    { 0x060D, 0 }, /* 0x060D */
-    { 0x060E, 0 }, /* 0x060E */
-    { 0x060F, 0 }, /* 0x060F */
-
-    { 0x0610, 0 }, /* 0x0610 */
-    { 0x0611, 0 }, /* 0x0611 */
-    { 0x0612, 0 }, /* 0x0612 */
-    { 0x0613, 0 }, /* 0x0613 */
-    { 0x0614, 0 }, /* 0x0614 */
-    { 0x0615, 0 }, /* 0x0615 */
-    { 0x0616, 0 }, /* 0x0616 */
-    { 0x0617, 0 }, /* 0x0617 */
-    { 0x0618, 0 }, /* 0x0618 */
-    { 0x0619, 0 }, /* 0x0619 */
-    { 0x061A, 0 }, /* 0x061A */
-    { 0x061B, 0 }, /* 0x061B */
-    { 0x061C, 0 }, /* 0x061C */
-    { 0x061D, 0 }, /* 0x061D */
-    { 0x061E, 0 }, /* 0x061E */
-    { 0x061F, 0 }, /* 0x061F */
-
-    { 0x0620, 0 }, /* 0x0620 */
-    { 0xFE80, 0 }, /* 0x0621            HAMZA */
-    { 0xFE81, 1 }, /* 0x0622    R       ALEF WITH MADDA ABOVE */
-    { 0xFE83, 1 }, /* 0x0623    R       ALEF WITH HAMZA ABOVE */
-    { 0xFE85, 1 }, /* 0x0624    R       WAW WITH HAMZA ABOVE */
-    { 0xFE87, 1 }, /* 0x0625    R       ALEF WITH HAMZA BELOW */
-    { 0xFE89, 3 }, /* 0x0626    D       YEH WITH HAMZA ABOVE */
-    { 0xFE8D, 1 }, /* 0x0627    R       ALEF */
-    { 0xFE8F, 3 }, /* 0x0628    D       BEH */
-    { 0xFE93, 1 }, /* 0x0629    R       TEH MARBUTA */
-    { 0xFE95, 3 }, /* 0x062A    D       TEH */
-    { 0xFE99, 3 }, /* 0x062B    D       THEH */
-    { 0xFE9D, 3 }, /* 0x062C    D       JEEM */
-    { 0xFEA1, 3 }, /* 0x062D    D       HAH */
-    { 0xFEA5, 3 }, /* 0x062E    D       KHAH */
-    { 0xFEA9, 1 }, /* 0x062F    R       DAL */
-
-    { 0xFEAB, 1 }, /* 0x0630    R       THAL */
-    { 0xFEAD, 1 }, /* 0x0631    R       REH */
-    { 0xFEAF, 1 }, /* 0x0632    R       ZAIN */
-    { 0xFEB1, 3 }, /* 0x0633    D       SEEN */
-    { 0xFEB5, 3 }, /* 0x0634    D       SHEEN */
-    { 0xFEB9, 3 }, /* 0x0635    D       SAD */
-    { 0xFEBD, 3 }, /* 0x0636    D       DAD */
-    { 0xFEC1, 3 }, /* 0x0637    D       TAH */
-    { 0xFEC5, 3 }, /* 0x0638    D       ZAH */
-    { 0xFEC9, 3 }, /* 0x0639    D       AIN */
-    { 0xFECD, 3 }, /* 0x063A    D       GHAIN */
-    { 0x063B, 0 }, /* 0x063B */
-    { 0x063C, 0 }, /* 0x063C */
-    { 0x063D, 0 }, /* 0x063D */
-    { 0x063E, 0 }, /* 0x063E */
-    { 0x063F, 0 }, /* 0x063F */
-
-    { 0x0640, 0 }, /* 0x0640    C       TATWEEL // ### Join Causing, only one glyph */
-    { 0xFED1, 3 }, /* 0x0641    D       FEH */
-    { 0xFED5, 3 }, /* 0x0642    D       QAF */
-    { 0xFED9, 3 }, /* 0x0643    D       KAF */
-    { 0xFEDD, 3 }, /* 0x0644    D       LAM */
-    { 0xFEE1, 3 }, /* 0x0645    D       MEEM */
-    { 0xFEE5, 3 }, /* 0x0646    D       NOON */
-    { 0xFEE9, 3 }, /* 0x0647    D       HEH */
-    { 0xFEED, 1 }, /* 0x0648    R       WAW */
-    { 0x0649, 3 }, /* 0x0649            ALEF MAKSURA // ### Dual, glyphs not consecutive, handle in code. */
-    { 0xFEF1, 3 }, /* 0x064A    D       YEH */
-    { 0x064B, 0 }, /* 0x064B */
-    { 0x064C, 0 }, /* 0x064C */
-    { 0x064D, 0 }, /* 0x064D */
-    { 0x064E, 0 }, /* 0x064E */
-    { 0x064F, 0 }, /* 0x064F */
-
-    { 0x0650, 0 }, /* 0x0650 */
-    { 0x0651, 0 }, /* 0x0651 */
-    { 0x0652, 0 }, /* 0x0652 */
-    { 0x0653, 0 }, /* 0x0653 */
-    { 0x0654, 0 }, /* 0x0654 */
-    { 0x0655, 0 }, /* 0x0655 */
-    { 0x0656, 0 }, /* 0x0656 */
-    { 0x0657, 0 }, /* 0x0657 */
-    { 0x0658, 0 }, /* 0x0658 */
-    { 0x0659, 0 }, /* 0x0659 */
-    { 0x065A, 0 }, /* 0x065A */
-    { 0x065B, 0 }, /* 0x065B */
-    { 0x065C, 0 }, /* 0x065C */
-    { 0x065D, 0 }, /* 0x065D */
-    { 0x065E, 0 }, /* 0x065E */
-    { 0x065F, 0 }, /* 0x065F */
-
-    { 0x0660, 0 }, /* 0x0660 */
-    { 0x0661, 0 }, /* 0x0661 */
-    { 0x0662, 0 }, /* 0x0662 */
-    { 0x0663, 0 }, /* 0x0663 */
-    { 0x0664, 0 }, /* 0x0664 */
-    { 0x0665, 0 }, /* 0x0665 */
-    { 0x0666, 0 }, /* 0x0666 */
-    { 0x0667, 0 }, /* 0x0667 */
-    { 0x0668, 0 }, /* 0x0668 */
-    { 0x0669, 0 }, /* 0x0669 */
-    { 0x066A, 0 }, /* 0x066A */
-    { 0x066B, 0 }, /* 0x066B */
-    { 0x066C, 0 }, /* 0x066C */
-    { 0x066D, 0 }, /* 0x066D */
-    { 0x066E, 0 }, /* 0x066E */
-    { 0x066F, 0 }, /* 0x066F */
-
-    { 0x0670, 0 }, /* 0x0670 */
-    { 0xFB50, 1 }, /* 0x0671    R       ALEF WASLA */
-    { 0x0672, 0 }, /* 0x0672 */
-    { 0x0673, 0 }, /* 0x0673 */
-    { 0x0674, 0 }, /* 0x0674 */
-    { 0x0675, 0 }, /* 0x0675 */
-    { 0x0676, 0 }, /* 0x0676 */
-    { 0x0677, 0 }, /* 0x0677 */
-    { 0x0678, 0 }, /* 0x0678 */
-    { 0xFB66, 3 }, /* 0x0679    D       TTEH */
-    { 0xFB5E, 3 }, /* 0x067A    D       TTEHEH */
-    { 0xFB52, 3 }, /* 0x067B    D       BEEH */
-    { 0x067C, 0 }, /* 0x067C */
-    { 0x067D, 0 }, /* 0x067D */
-    { 0xFB56, 3 }, /* 0x067E    D       PEH */
-    { 0xFB62, 3 }, /* 0x067F    D       TEHEH */
-
-    { 0xFB5A, 3 }, /* 0x0680    D       BEHEH */
-    { 0x0681, 0 }, /* 0x0681 */
-    { 0x0682, 0 }, /* 0x0682 */
-    { 0xFB76, 3 }, /* 0x0683    D       NYEH */
-    { 0xFB72, 3 }, /* 0x0684    D       DYEH */
-    { 0x0685, 0 }, /* 0x0685 */
-    { 0xFB7A, 3 }, /* 0x0686    D       TCHEH */
-    { 0xFB7E, 3 }, /* 0x0687    D       TCHEHEH */
-    { 0xFB88, 1 }, /* 0x0688    R       DDAL */
-    { 0x0689, 0 }, /* 0x0689 */
-    { 0x068A, 0 }, /* 0x068A */
-    { 0x068B, 0 }, /* 0x068B */
-    { 0xFB84, 1 }, /* 0x068C    R       DAHAL */
-    { 0xFB82, 1 }, /* 0x068D    R       DDAHAL */
-    { 0xFB86, 1 }, /* 0x068E    R       DUL */
-    { 0x068F, 0 }, /* 0x068F */
-
-    { 0x0690, 0 }, /* 0x0690 */
-    { 0xFB8C, 1 }, /* 0x0691    R       RREH */
-    { 0x0692, 0 }, /* 0x0692 */
-    { 0x0693, 0 }, /* 0x0693 */
-    { 0x0694, 0 }, /* 0x0694 */
-    { 0x0695, 0 }, /* 0x0695 */
-    { 0x0696, 0 }, /* 0x0696 */
-    { 0x0697, 0 }, /* 0x0697 */
-    { 0xFB8A, 1 }, /* 0x0698    R       JEH */
-    { 0x0699, 0 }, /* 0x0699 */
-    { 0x069A, 0 }, /* 0x069A */
-    { 0x069B, 0 }, /* 0x069B */
-    { 0x069C, 0 }, /* 0x069C */
-    { 0x069D, 0 }, /* 0x069D */
-    { 0x069E, 0 }, /* 0x069E */
-    { 0x069F, 0 }, /* 0x069F */
-
-    { 0x06A0, 0 }, /* 0x06A0 */
-    { 0x06A1, 0 }, /* 0x06A1 */
-    { 0x06A2, 0 }, /* 0x06A2 */
-    { 0x06A3, 0 }, /* 0x06A3 */
-    { 0xFB6A, 3 }, /* 0x06A4    D       VEH */
-    { 0x06A5, 0 }, /* 0x06A5 */
-    { 0xFB6E, 3 }, /* 0x06A6    D       PEHEH */
-    { 0x06A7, 0 }, /* 0x06A7 */
-    { 0x06A8, 0 }, /* 0x06A8 */
-    { 0xFB8E, 3 }, /* 0x06A9    D       KEHEH */
-    { 0x06AA, 0 }, /* 0x06AA */
-    { 0x06AB, 0 }, /* 0x06AB */
-    { 0x06AC, 0 }, /* 0x06AC */
-    { 0xFBD3, 3 }, /* 0x06AD    D       NG */
-    { 0x06AE, 0 }, /* 0x06AE */
-    { 0xFB92, 3 }, /* 0x06AF    D       GAF */
-
-    { 0x06B0, 0 }, /* 0x06B0 */
-    { 0xFB9A, 3 }, /* 0x06B1    D       NGOEH */
-    { 0x06B2, 0 }, /* 0x06B2 */
-    { 0xFB96, 3 }, /* 0x06B3    D       GUEH */
-    { 0x06B4, 0 }, /* 0x06B4 */
-    { 0x06B5, 0 }, /* 0x06B5 */
-    { 0x06B6, 0 }, /* 0x06B6 */
-    { 0x06B7, 0 }, /* 0x06B7 */
-    { 0x06B8, 0 }, /* 0x06B8 */
-    { 0x06B9, 0 }, /* 0x06B9 */
-    { 0xFB9E, 1 }, /* 0x06BA    R       NOON GHUNNA */
-    { 0xFBA0, 3 }, /* 0x06BB    D       RNOON */
-    { 0x06BC, 0 }, /* 0x06BC */
-    { 0x06BD, 0 }, /* 0x06BD */
-    { 0xFBAA, 3 }, /* 0x06BE    D       HEH DOACHASHMEE */
-    { 0x06BF, 0 }, /* 0x06BF */
-
-    { 0xFBA4, 1 }, /* 0x06C0    R       HEH WITH YEH ABOVE */
-    { 0xFBA6, 3 }, /* 0x06C1    D       HEH GOAL */
-    { 0x06C2, 0 }, /* 0x06C2 */
-    { 0x06C3, 0 }, /* 0x06C3 */
-    { 0x06C4, 0 }, /* 0x06C4 */
-    { 0xFBE0, 1 }, /* 0x06C5    R       KIRGHIZ OE */
-    { 0xFBD9, 1 }, /* 0x06C6    R       OE */
-    { 0xFBD7, 1 }, /* 0x06C7    R       U */
-    { 0xFBDB, 1 }, /* 0x06C8    R       YU */
-    { 0xFBE2, 1 }, /* 0x06C9    R       KIRGHIZ YU */
-    { 0x06CA, 0 }, /* 0x06CA */
-    { 0xFBDE, 1 }, /* 0x06CB    R       VE */
-    { 0xFBFC, 3 }, /* 0x06CC    D       FARSI YEH */
-    { 0x06CD, 0 }, /* 0x06CD */
-    { 0x06CE, 0 }, /* 0x06CE */
-    { 0x06CF, 0 }, /* 0x06CF */
-
-    { 0xFBE4, 3 }, /* 0x06D0    D       E */
-    { 0x06D1, 0 }, /* 0x06D1 */
-    { 0xFBAE, 1 }, /* 0x06D2    R       YEH BARREE */
-    { 0xFBB0, 1 }, /* 0x06D3    R       YEH BARREE WITH HAMZA ABOVE */
-    { 0x06D4, 0 }, /* 0x06D4 */
-    { 0x06D5, 0 }, /* 0x06D5 */
-    { 0x06D6, 0 }, /* 0x06D6 */
-    { 0x06D7, 0 }, /* 0x06D7 */
-    { 0x06D8, 0 }, /* 0x06D8 */
-    { 0x06D9, 0 }, /* 0x06D9 */
-    { 0x06DA, 0 }, /* 0x06DA */
-    { 0x06DB, 0 }, /* 0x06DB */
-    { 0x06DC, 0 }, /* 0x06DC */
-    { 0x06DD, 0 }, /* 0x06DD */
-    { 0x06DE, 0 }, /* 0x06DE */
-    { 0x06DF, 0 }, /* 0x06DF */
-
-    { 0x06E0, 0 }, /* 0x06E0 */
-    { 0x06E1, 0 }, /* 0x06E1 */
-    { 0x06E2, 0 }, /* 0x06E2 */
-    { 0x06E3, 0 }, /* 0x06E3 */
-    { 0x06E4, 0 }, /* 0x06E4 */
-    { 0x06E5, 0 }, /* 0x06E5 */
-    { 0x06E6, 0 }, /* 0x06E6 */
-    { 0x06E7, 0 }, /* 0x06E7 */
-    { 0x06E8, 0 }, /* 0x06E8 */
-    { 0x06E9, 0 }, /* 0x06E9 */
-    { 0x06EA, 0 }, /* 0x06EA */
-    { 0x06EB, 0 }, /* 0x06EB */
-    { 0x06EC, 0 }, /* 0x06EC */
-    { 0x06ED, 0 }, /* 0x06ED */
-    { 0x06EE, 0 }, /* 0x06EE */
-    { 0x06EF, 0 }, /* 0x06EF */
-
-    { 0x06F0, 0 }, /* 0x06F0 */
-    { 0x06F1, 0 }, /* 0x06F1 */
-    { 0x06F2, 0 }, /* 0x06F2 */
-    { 0x06F3, 0 }, /* 0x06F3 */
-    { 0x06F4, 0 }, /* 0x06F4 */
-    { 0x06F5, 0 }, /* 0x06F5 */
-    { 0x06F6, 0 }, /* 0x06F6 */
-    { 0x06F7, 0 }, /* 0x06F7 */
-    { 0x06F8, 0 }, /* 0x06F8 */
-    { 0x06F9, 0 }, /* 0x06F9 */
-    { 0x06FA, 0 }, /* 0x06FA */
-    { 0x06FB, 0 }, /* 0x06FB */
-    { 0x06FC, 0 }, /* 0x06FC */
-    { 0x06FD, 0 }, /* 0x06FD */
-    { 0x06FE, 0 }, /* 0x06FE */
-    { 0x06FF, 0 }  /* 0x06FF */
-};
-
-/* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, this table does */
-static const hb_uint16 alefMaksura[4] = {0xFEEF, 0xFEF0, 0xFBE8, 0xFBE9};
-
-/*
-// this is a bit tricky. Alef always binds to the right, so the second parameter descibing the shape
-// of the lam can be either initial of medial. So initial maps to the isolated form of the ligature,
-// medial to the final form
-*/
-static const hb_uint16 arabicUnicodeLamAlefMapping[6][4] = {
-    { 0xfffd, 0xfffd, 0xfef5, 0xfef6 }, /* 0x622        R       Alef with Madda above */
-    { 0xfffd, 0xfffd, 0xfef7, 0xfef8 }, /* 0x623        R       Alef with Hamza above */
-    { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x624        // Just to fill the table ;-) */
-    { 0xfffd, 0xfffd, 0xfef9, 0xfefa }, /* 0x625        R       Alef with Hamza below */
-    { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x626        // Just to fill the table ;-) */
-    { 0xfffd, 0xfffd, 0xfefb, 0xfefc }  /* 0x627        R       Alef */
-};
-
-static int getShape(hb_uint8 cell, int shape)
-{
-    /* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, handle this here */
-    int ch = (cell != 0x49)
-              ? (shape ? arabicUnicodeMapping[cell][0] + shape : 0x600+cell)
-              : alefMaksura[shape] ;
-    return ch;
-}
-
-
-/*
-  Two small helper functions for arabic shaping.
-*/
-static HB_UChar16 prevChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, int pos)
-{
-    /*qDebug("leftChar: pos=%d", pos); */
-    const HB_UChar16 *ch = str + pos - 1;
-    pos--;
-    while(pos > -1) {
-        if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing)
-            return *ch;
-        pos--;
-        ch--;
-    }
-    return ReplacementCharacter;
-}
-
-static HB_UChar16 nextChar(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos)
-{
-    const HB_UChar16 *ch = str + pos + 1;
-    pos++;
-    while(pos < len) {
-        /*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */
-        if(HB_GetUnicodeCharCategory(ufuncs, *ch) != HB_Mark_NonSpacing)
-            return *ch;
-        /* assume it's a transparent char, this might not be 100% correct */
-        pos++;
-        ch++;
-    }
-    return ReplacementCharacter;
-}
-
-static void shapedString(hb_unicode_funcs_t *ufuncs, const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength,
-                         HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters)
-{
-    HB_ArabicProperties *properties;
-    hb_int32 f = from;
-    hb_uint32 l = len;
-    const HB_UChar16 *ch;
-    HB_UChar16 *data;
-    int clusterStart;
-    hb_uint32 i;
-    HB_STACKARRAY(HB_ArabicProperties, props, len + 2);
-    properties = props;
-
-    assert(stringLength >= from + len);
-
-    if(len == 0) {
-        *shapedLength = 0;
-        return;
-    }
-
-    if (from > 0) {
-        --f;
-        ++l;
-        ++properties;
-    }
-    if (f + l < stringLength)
-        ++l;
-    getArabicProperties(ufuncs, uc+f, l, props);
-
-    ch = uc + from;
-    data = shapeBuffer;
-    clusterStart = 0;
-
-    for (i = 0; i < len; i++) {
-        hb_uint8 r = *ch >> 8;
-        int gpos = data - shapeBuffer;
-
-        if (r != 0x06) {
-            if (r == 0x20) {
-                if (*ch == 0x200c || *ch == 0x200d)
-                    /* remove ZWJ and ZWNJ */
-                    goto skip;
-            }
-            if (reverse)
-                *data = HB_GetMirroredChar(ufuncs, *ch);
-            else
-                *data = *ch;
-        } else {
-            hb_uint8 c = *ch & 0xff;
-            int pos = i + from;
-            int shape = properties[i].shape;
-/*            qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, getShape(c, shape)); */
-            /* take care of lam-alef ligatures (lam right of alef) */
-            hb_uint16 map;
-            switch (c) {
-                case 0x44: { /* lam */
-                    const HB_UChar16 pch = nextChar(ufuncs, uc, stringLength, pos);
-                    if ((pch >> 8) == 0x06) {
-                        switch (pch & 0xff) {
-                            case 0x22:
-                            case 0x23:
-                            case 0x25:
-                            case 0x27:
-/*                                 qDebug(" lam of lam-alef ligature"); */
-                                map = arabicUnicodeLamAlefMapping[(pch & 0xff) - 0x22][shape];
-                                goto next;
-                            default:
-                                break;
-                        }
-                    }
-                    break;
-                }
-                case 0x22: /* alef with madda */
-                case 0x23: /* alef with hamza above */
-                case 0x25: /* alef with hamza below */
-                case 0x27: /* alef */
-                    if (prevChar(ufuncs, uc, pos) == 0x0644) {
-                        /* have a lam alef ligature */
-                        /*qDebug(" alef of lam-alef ligature"); */
-                        goto skip;
-                    }
-                default:
-                    break;
-            }
-            map = getShape(c, shape);
-        next:
-            *data = map;
-        }
-        /* ##### Fixme */
-        /*glyphs[gpos].attributes.zeroWidth = zeroWidth; */
-        if (HB_GetUnicodeCharCategory(ufuncs, *ch) == HB_Mark_NonSpacing) {
-            attributes[gpos].mark = TRUE;
-/*             qDebug("glyph %d (char %d) is mark!", gpos, i); */
-        } else {
-            attributes[gpos].mark = FALSE;
-            clusterStart = data - shapeBuffer;
-        }
-        attributes[gpos].clusterStart = !attributes[gpos].mark;
-        attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(ufuncs, *ch);
-        attributes[gpos].justification = properties[i].justification;
-/*         qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/
-        data++;
-    skip:
-        ch++;
-        logClusters[i] = clusterStart;
-    }
-    *shapedLength = data - shapeBuffer;
-
-    HB_FREE_STACKARRAY(props);
-}
-
-#ifndef NO_OPENTYPE
-
-static const HB_OpenTypeFeature arabic_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty },
-    { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty },
-    { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty },
-    { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
-    { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty },
-    { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
-    { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
-    { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty },
-    { HB_MAKE_TAG('c', 's', 'w', 'h'), CswhProperty },
-    /* mset is used in old Win95 fonts that don't have a 'mark' positioning table. */
-    { HB_MAKE_TAG('m', 's', 'e', 't'), MsetProperty },
-    {0, 0}
-};
-
-static const HB_OpenTypeFeature syriac_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty },
-    { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty },
-    { HB_MAKE_TAG('f', 'i', 'n', '2'), FinaProperty },
-    { HB_MAKE_TAG('f', 'i', 'n', '3'), FinaProperty },
-    { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty },
-    { HB_MAKE_TAG('m', 'e', 'd', '2'), MediProperty },
-    { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
-    { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty },
-    { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
-    { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty },
-    { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty },
-    {0, 0}
-};
-
-static HB_Bool arabicSyriacOpenTypeShape(HB_ShaperItem *item, HB_Bool *ot_ok)
-{
-    const HB_UChar16 *uc;
-    const int nglyphs = item->num_glyphs;
-    hb_int32 f;
-    hb_uint32 l;
-    HB_ArabicProperties *properties;
-    HB_DECLARE_STACKARRAY(HB_ArabicProperties, props)
-    HB_DECLARE_STACKARRAY(hb_uint32, apply)
-    HB_Bool shaped;
-    int i = 0;
-
-    *ot_ok = TRUE;
-
-    if (!HB_ConvertStringToGlyphIndices(item))
-        return FALSE;
-    HB_HeuristicSetGlyphAttributes(item);
-
-    HB_INIT_STACKARRAY(HB_ArabicProperties, props, item->item.length + 2);
-    HB_INIT_STACKARRAY(hb_uint32, apply, item->num_glyphs);
-
-    uc = item->string + item->item.pos;
-
-    properties = props;
-    f = 0;
-    l = item->item.length;
-    if (item->item.pos > 0) {
-        --f;
-        ++l;
-        ++properties;
-    }
-    if (f + l + item->item.pos < item->stringLength) {
-        ++l;
-    }
-    if (item->item.script == HB_Script_Nko)
-        getNkoProperties(item->ufuncs, uc+f, l, props);
-    else
-        getArabicProperties(item->ufuncs, uc+f, l, props);
-
-    for (i = 0; i < (int)item->num_glyphs; i++) {
-        apply[i] = 0;
-
-        if (properties[i].shape == XIsolated)
-            apply[i] |= MediProperty|FinaProperty|InitProperty;
-        else if (properties[i].shape == XMedial)
-            apply[i] |= IsolProperty|FinaProperty|InitProperty;
-        else if (properties[i].shape == XFinal)
-            apply[i] |= IsolProperty|MediProperty|InitProperty;
-        else if (properties[i].shape == XInitial)
-            apply[i] |= IsolProperty|MediProperty|FinaProperty;
-
-        item->attributes[i].justification = properties[i].justification;
-    }
-
-    HB_FREE_STACKARRAY(props);
-
-    shaped = HB_OpenTypeShape(item, apply);
-
-    HB_FREE_STACKARRAY(apply);
-
-    if (!shaped) {
-        *ot_ok = FALSE;
-        return FALSE;
-    }
-    return HB_OpenTypePosition(item, nglyphs, /*doLogClusters*/TRUE);
-}
-
-#endif
-
-/* #### stil missing: identify invalid character combinations */
-HB_Bool HB_ArabicShape(HB_ShaperItem *item)
-{
-    int slen;
-    HB_Bool haveGlyphs;
-    HB_STACKARRAY(HB_UChar16, shapedChars, item->item.length);
-
-    assert(item->item.script == HB_Script_Arabic || item->item.script == HB_Script_Syriac
-           || item->item.script == HB_Script_Nko);
-
-#ifndef NO_OPENTYPE
-
-    if (HB_SelectScript(item, item->item.script == HB_Script_Arabic ? arabic_features : syriac_features)) {
-        HB_Bool ot_ok;
-        if (arabicSyriacOpenTypeShape(item, &ot_ok)) {
-            HB_FREE_STACKARRAY(shapedChars);
-            return TRUE;
-        }
-        if (ot_ok) {
-            HB_FREE_STACKARRAY(shapedChars);
-            return FALSE;
-            /* fall through to the non OT code*/
-        }
-    }
-#endif
-
-    if (item->item.script != HB_Script_Arabic) {
-        HB_FREE_STACKARRAY(shapedChars);
-        return HB_BasicShape(item);
-    }
-
-    shapedString(item->ufuncs, item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen,
-                  item->item.bidiLevel % 2,
-                  item->attributes, item->log_clusters);
-
-    haveGlyphs = item->font->klass
-        ->convertStringToGlyphIndices(item->font,
-                                      shapedChars, slen,
-                                      item->glyphs, &item->num_glyphs,
-                                      item->item.bidiLevel % 2);
-
-    HB_FREE_STACKARRAY(shapedChars);
-
-    if (!haveGlyphs)
-        return FALSE;
-
-    HB_HeuristicPosition(item);
-    return TRUE;
-}
-
-
diff --git a/src/hb-old/harfbuzz-buffer-private.h b/src/hb-old/harfbuzz-buffer-private.h
deleted file mode 100644
index 5065f2e..0000000
--- a/src/hb-old/harfbuzz-buffer-private.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_PRIVATE_H
-#define HARFBUZZ_BUFFER_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-#define HB_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
-
-HB_INTERNAL void
-_hb_buffer_swap( HB_Buffer buffer );
-
-HB_INTERNAL void
-_hb_buffer_clear_output( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs( HB_Buffer  buffer,
-			      HB_UShort  num_in,
-			      HB_UShort  num_out,
-			      HB_UShort *glyph_data,
-			      HB_UShort  component,
-			      HB_UShort  ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph ( HB_Buffer buffer,
-			      HB_UInt   glyph_index,
-			      HB_UShort component,
-			      HB_UShort ligID );
-
-HB_INTERNAL HB_Error
-_hb_buffer_copy_output_glyph ( HB_Buffer buffer );
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_output_glyph ( HB_Buffer buffer,
-				  HB_UInt   glyph_index,
-				  HB_Bool   inplace );
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid( HB_Buffer buffer );
-
-
-/* convenience macros */
-
-#define IN_GLYPH( pos )        (buffer->in_string[(pos)].gindex)
-#define IN_ITEM( pos )         (&buffer->in_string[(pos)])
-#define IN_CURGLYPH()          (buffer->in_string[buffer->in_pos].gindex)
-#define IN_CURITEM()           (&buffer->in_string[buffer->in_pos])
-#define IN_PROPERTIES( pos )   (buffer->in_string[(pos)].properties)
-#define IN_LIGID( pos )        (buffer->in_string[(pos)].ligID)
-#define IN_COMPONENT( pos )    (buffer->in_string[(pos)].component)
-#define POSITION( pos )        (&buffer->positions[(pos)])
-#define OUT_GLYPH( pos )       (buffer->out_string[(pos)].gindex)
-#define OUT_ITEM( pos )        (&buffer->out_string[(pos)])
-
-#define CHECK_Property( gdef, index, flags, property )					\
-          ( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags),		\
-                                      (property) ) ) != HB_Err_Ok )
-
-#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID )             \
-          ( ( error = _hb_buffer_add_output_glyphs( (buffer),                            \
-						    (num_in), (num_out),                \
-                                                    (glyph_data), (component), (ligID)  \
-                                                  ) ) != HB_Err_Ok )
-#define ADD_Glyph( buffer, glyph_index, component, ligID )				\
-          ( ( error = _hb_buffer_add_output_glyph( (buffer),                             \
-                                                    (glyph_index), (component), (ligID) \
-                                                  ) ) != HB_Err_Ok )
-#define REPLACE_Glyph( buffer, glyph_index, nesting_level )				\
-          ( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index),		\
-						      (nesting_level) == 1 ) ) != HB_Err_Ok )
-#define COPY_Glyph( buffer )								\
-	  ( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok )
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_BUFFER_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-buffer.c b/src/hb-old/harfbuzz-buffer.c
deleted file mode 100644
index a85ee8d..0000000
--- a/src/hb-old/harfbuzz-buffer.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-buffer-private.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-
-/* Here is how the buffer works internally:
- *
- * There are two string pointers: in_string and out_string.  They
- * always have same allocated size, but different length and positions.
- *
- * As an optimization, both in_string and out_string may point to the
- * same piece of memory, which is owned by in_string.  This remains the
- * case as long as:
- *
- *   - copy_glyph() is called
- *   - replace_glyph() is called with inplace=TRUE
- *   - add_output_glyph() and add_output_glyphs() are not called
- *
- * In that case swap(), and copy_glyph(), and replace_glyph() are all
- * mostly no-op.
- *
- * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is
- * called, out_string is moved over to an alternate buffer (alt_string), and
- * its current contents (out_length entries) are copied to the alt buffer.
- * This should all remain transparent to the user.  swap() then switches
- * in_string and alt_string.  alt_string is not allocated until its needed,
- * but after that it's grown with in_string unconditionally.
- *
- * The buffer->separate_out boolean keeps status of whether out_string points
- * to in_string (FALSE) or alt_string (TRUE).
- */
-
-/* Internal API */
-
-static HB_Error
-HB_Buffer_ensure( HB_Buffer buffer,
-		   HB_UInt   size )
-{
-  HB_UInt new_allocated = buffer->allocated;
-
-  if (size > new_allocated)
-    {
-      HB_Error error;
-
-      while (size > new_allocated)
-	new_allocated += (new_allocated >> 1) + 8;
-      
-      if ( buffer->positions )
-        {
-	  if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
-	    return error;
-	}
-
-      if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) )
-	return error;
-
-      if ( buffer->separate_out )
-        {
-	  if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) )
-	    return error;
-
-	  buffer->out_string = buffer->alt_string;
-	}
-      else
-        {
-	  buffer->out_string = buffer->in_string;
-
-	  if ( buffer->alt_string )
-	    {
-	      if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) )
-		return error;
-	    }
-	}
-
-      buffer->allocated = new_allocated;
-    }
-
-  return HB_Err_Ok;
-}
-
-static HB_Error
-HB_Buffer_duplicate_out_buffer( HB_Buffer buffer )
-{
-  if ( !buffer->alt_string )
-    {
-      HB_Error error;
-
-      if ( ALLOC_ARRAY( buffer->alt_string, buffer->allocated, HB_GlyphItemRec ) )
-	return error;
-    }
-
-  buffer->out_string = buffer->alt_string;
-  memcpy( buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]) );
-  buffer->separate_out = TRUE;
-
-  return HB_Err_Ok;
-}
-
-/* Public API */
-
-HB_Error
-HB_Buffer_new( HB_Buffer *pbuffer )
-{
-  HB_Buffer buffer;
-  HB_Error error;
-
-  if ( ALLOC( buffer, sizeof( HB_BufferRec ) ) )
-    return error;
-
-  buffer->allocated = 0;
-  buffer->in_string = NULL;
-  buffer->alt_string = NULL;
-  buffer->positions = NULL;
-
-  HB_Buffer_clear( buffer );
-
-  *pbuffer = buffer;
-
-  return HB_Err_Ok;
-}
-
-void
-HB_Buffer_free( HB_Buffer buffer )
-{
-  FREE( buffer->in_string );
-  FREE( buffer->alt_string );
-  buffer->out_string = NULL;
-  FREE( buffer->positions );
-  FREE( buffer );
-}
-
-void
-HB_Buffer_clear( HB_Buffer buffer )
-{
-  buffer->in_length = 0;
-  buffer->out_length = 0;
-  buffer->in_pos = 0;
-  buffer->out_pos = 0;
-  buffer->out_string = buffer->in_string;
-  buffer->separate_out = FALSE;
-  buffer->max_ligID = 0;
-}
-
-HB_Error
-HB_Buffer_add_glyph( HB_Buffer buffer,
-		      HB_UInt   glyph_index,
-		      HB_UInt   properties,
-		      HB_UInt   cluster )
-{
-  HB_Error error;
-  HB_GlyphItem glyph;
-  
-  error = HB_Buffer_ensure( buffer, buffer->in_length + 1 );
-  if ( error )
-    return error;
-
-  glyph = &buffer->in_string[buffer->in_length];
-  glyph->gindex = glyph_index;
-  glyph->properties = properties;
-  glyph->cluster = cluster;
-  glyph->component = 0;
-  glyph->ligID = 0;
-  glyph->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
-  
-  buffer->in_length++;
-
-  return HB_Err_Ok;
-}
-
-/* HarfBuzz-Internal API */
-
-HB_INTERNAL void
-_hb_buffer_clear_output( HB_Buffer buffer )
-{
-  buffer->out_length = 0;
-  buffer->out_pos = 0;
-  buffer->out_string = buffer->in_string;
-  buffer->separate_out = FALSE;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_clear_positions( HB_Buffer buffer )
-{
-  if ( !buffer->positions )
-    {
-      HB_Error error;
-
-      if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) )
-	return error;
-    }
-
-  memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL void
-_hb_buffer_swap( HB_Buffer buffer )
-{
-  HB_GlyphItem tmp_string;
-  int tmp_length;
-  int tmp_pos;
-
-  if ( buffer->separate_out )
-    {
-      tmp_string = buffer->in_string;
-      buffer->in_string = buffer->out_string;
-      buffer->out_string = tmp_string;
-      buffer->alt_string = buffer->out_string;
-    }
-
-  tmp_length = buffer->in_length;
-  buffer->in_length = buffer->out_length;
-  buffer->out_length = tmp_length;
-
-  tmp_pos = buffer->in_pos;
-  buffer->in_pos = buffer->out_pos;
-  buffer->out_pos = tmp_pos;
-}
-
-/* The following function copies `num_out' elements from `glyph_data'
-   to `buffer->out_string', advancing the in array pointer in the structure
-   by `num_in' elements, and the out array pointer by `num_out' elements.
-   Finally, it sets the `length' field of `out' equal to
-   `pos' of the `out' structure.
-
-   If `component' is 0xFFFF, the component value from buffer->in_pos
-   will copied `num_out' times, otherwise `component' itself will
-   be used to fill the `component' fields.
-
-   If `ligID' is 0xFFFF, the ligID value from buffer->in_pos
-   will copied `num_out' times, otherwise `ligID' itself will
-   be used to fill the `ligID' fields.
-
-   The properties for all replacement glyphs are taken
-   from the glyph at position `buffer->in_pos'.
-
-   The cluster value for the glyph at position buffer->in_pos is used
-   for all replacement glyphs */
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyphs( HB_Buffer  buffer,
-			      HB_UShort  num_in,
-			      HB_UShort  num_out,
-			      HB_UShort *glyph_data,
-			      HB_UShort  component,
-			      HB_UShort  ligID )
-{
-  HB_Error  error;
-  HB_UShort i;
-  HB_UInt properties;
-  HB_UInt cluster;
-
-  error = HB_Buffer_ensure( buffer, buffer->out_pos + num_out );
-  if ( error )
-    return error;
-
-  if ( !buffer->separate_out )
-    {
-      error = HB_Buffer_duplicate_out_buffer( buffer );
-      if ( error )
-	return error;
-    }
-
-  properties = buffer->in_string[buffer->in_pos].properties;
-  cluster = buffer->in_string[buffer->in_pos].cluster;
-  if ( component == 0xFFFF )
-    component = buffer->in_string[buffer->in_pos].component;
-  if ( ligID == 0xFFFF )
-    ligID = buffer->in_string[buffer->in_pos].ligID;
-
-  for ( i = 0; i < num_out; i++ )
-  {
-    HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i];
-
-    item->gindex = glyph_data[i];
-    item->properties = properties;
-    item->cluster = cluster;
-    item->component = component;
-    item->ligID = ligID;
-    item->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
-  }
-
-  buffer->in_pos  += num_in;
-  buffer->out_pos += num_out;
-
-  buffer->out_length = buffer->out_pos;
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_add_output_glyph( HB_Buffer buffer,
-			     HB_UInt   glyph_index,
-			     HB_UShort component,
-			     HB_UShort ligID )
-{
-  HB_UShort glyph_data =  glyph_index;
-
-  return _hb_buffer_add_output_glyphs ( buffer, 1, 1,
-					&glyph_data, component, ligID );
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_copy_output_glyph ( HB_Buffer buffer )
-{  
-  HB_Error  error;
-
-  error = HB_Buffer_ensure( buffer, buffer->out_pos + 1 );
-  if ( error )
-    return error;
-  
-  if ( buffer->separate_out )
-    {
-      buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos];
-    }
-
-  buffer->in_pos++;
-  buffer->out_pos++;
-  buffer->out_length = buffer->out_pos;
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_hb_buffer_replace_output_glyph( HB_Buffer buffer,
-				 HB_UInt   glyph_index,
-				 HB_Bool   inplace )
-{
-
-  HB_Error error;
-
-  if ( inplace )
-    {
-      error = _hb_buffer_copy_output_glyph ( buffer );
-      if ( error )
-	return error;
-
-      buffer->out_string[buffer->out_pos-1].gindex = glyph_index;
-    }
-  else
-    {
-      return _hb_buffer_add_output_glyph( buffer, glyph_index, 0xFFFF, 0xFFFF );
-    }
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_UShort
-_hb_buffer_allocate_ligid( HB_Buffer buffer )
-{
-  buffer->max_ligID++;
-  if (HB_UNLIKELY (buffer->max_ligID == 0))
-    buffer->max_ligID++;
-
-  return buffer->max_ligID;
-}
diff --git a/src/hb-old/harfbuzz-buffer.h b/src/hb-old/harfbuzz-buffer.h
deleted file mode 100644
index ea5d404..0000000
--- a/src/hb-old/harfbuzz-buffer.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2004,2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_BUFFER_H
-#define HARFBUZZ_BUFFER_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-typedef struct HB_GlyphItemRec_ {
-  HB_UInt     gindex;
-  HB_UInt     properties;
-  HB_UInt     cluster;
-  HB_UShort   component;
-  HB_UShort   ligID;
-  HB_UShort   gproperties;
-} HB_GlyphItemRec, *HB_GlyphItem;
-
-typedef struct HB_PositionRec_ {
-  HB_Fixed   x_pos;
-  HB_Fixed   y_pos;
-  HB_Fixed   x_advance;
-  HB_Fixed   y_advance;
-  HB_UShort  back;            /* number of glyphs to go back
-				 for drawing current glyph   */
-  HB_Short  cursive_chain;   /* character to which this connects,
-				 may be positive or negative; used
-				 only internally                     */
-  HB_Bool    new_advance;     /* if set, the advance width values are
-				 absolute, i.e., they won't be
-				 added to the original glyph's value
-				 but rather replace them.            */
-} HB_PositionRec, *HB_Position;
-
-
-typedef struct HB_BufferRec_{ 
-  HB_UInt    allocated;
-
-  HB_UInt    in_length;
-  HB_UInt    out_length;
-  HB_UInt    in_pos;
-  HB_UInt    out_pos;
-  
-  HB_GlyphItem  in_string;
-  HB_GlyphItem  out_string;
-  HB_GlyphItem  alt_string;
-  HB_Position   positions;
-  HB_UShort      max_ligID;
-  HB_Bool       separate_out;
-} HB_BufferRec, *HB_Buffer;
-
-HB_Error
-HB_Buffer_new( HB_Buffer *buffer );
-
-void
-HB_Buffer_free( HB_Buffer buffer );
-
-void
-HB_Buffer_clear( HB_Buffer buffer );
-
-HB_Error
-HB_Buffer_add_glyph( HB_Buffer buffer,
-		      HB_UInt    glyph_index,
-		      HB_UInt    properties,
-		      HB_UInt    cluster );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_BUFFER_H */
diff --git a/src/hb-old/harfbuzz-external.h b/src/hb-old/harfbuzz-external.h
deleted file mode 100644
index 7a9e363..0000000
--- a/src/hb-old/harfbuzz-external.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_EXTERNAL_H
-#define HARFBUZZ_EXTERNAL_H
-
-#define HB_H_IN
-#include <hb-unicode.h>
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-/* This header contains some methods that are not part of
-   Harfbuzz itself, but referenced by it.
-   They need to be provided by the application/library
-*/
-
-
-typedef enum 
-{
-    HB_Mark_NonSpacing		= HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK,		/* Mn */
-    HB_Mark_SpacingCombining	= HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK,		/* Mc */
-    HB_Mark_Enclosing		= HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK,		/* Me */
-
-    HB_Number_DecimalDigit	= HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER,		/* Nd */
-    HB_Number_Letter		= HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER,		/* Nl */
-    HB_Number_Other		= HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER,		/* No */
-
-    HB_Separator_Space		= HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR,		/* Zs */
-    HB_Separator_Line		= HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR,		/* Zl */
-    HB_Separator_Paragraph	= HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR,	/* Zp */
-
-    HB_Other_Control		= HB_UNICODE_GENERAL_CATEGORY_CONTROL,			/* Cc */
-    HB_Other_Format		= HB_UNICODE_GENERAL_CATEGORY_FORMAT,			/* Cf */
-    HB_Other_Surrogate		= HB_UNICODE_GENERAL_CATEGORY_SURROGATE,		/* Cs */
-    HB_Other_PrivateUse		= HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE,		/* Co */
-    HB_Other_NotAssigned	= HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED,		/* Cn */
-
-    HB_Letter_Uppercase		= HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER,		/* Lu */
-    HB_Letter_Lowercase		= HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER,		/* Ll */
-    HB_Letter_Titlecase		= HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER,		/* Lt */
-    HB_Letter_Modifier		= HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER,		/* Lm */
-    HB_Letter_Other		= HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER,		/* Lo */
-
-    HB_Punctuation_Connector	= HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION,	/* Pc */
-    HB_Punctuation_Dash		= HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION,		/* Pd */
-    HB_Punctuation_Open		= HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION,		/* Ps */
-    HB_Punctuation_Close	= HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION,	/* Pe */
-    HB_Punctuation_InitialQuote	= HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION,	/* Pi */
-    HB_Punctuation_FinalQuote	= HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION,	/* Pf */
-    HB_Punctuation_Other	= HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION,	/* Po */
-
-    HB_Symbol_Math		= HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL,		/* Sm */
-    HB_Symbol_Currency		= HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL,		/* Sc */
-    HB_Symbol_Modifier		= HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL,		/* Sk */
-    HB_Symbol_Other		= HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL		/* So */
-} HB_CharCategory;
-
-
-static inline HB_CharCategory HB_GetUnicodeCharCategory(hb_unicode_funcs_t *funcs, HB_UChar32 ch)
-{
-  return (HB_CharCategory) hb_unicode_general_category (funcs, ch);
-}
-
-static inline int HB_GetUnicodeCharCombiningClass(hb_unicode_funcs_t *funcs, HB_UChar32 ch)
-{
-  return hb_unicode_combining_class (funcs, ch);
-}
-
-static inline HB_UChar16 HB_GetMirroredChar(hb_unicode_funcs_t *funcs, HB_UChar16 ch)
-{
-  return hb_unicode_mirroring (funcs, ch);
-}
-
-static inline void HB_GetUnicodeCharProperties(hb_unicode_funcs_t *funcs, HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
-{
-  if (category)
-    *category = HB_GetUnicodeCharCategory (funcs, ch);
-  if (combiningClass)
-    *combiningClass = HB_GetUnicodeCharCombiningClass (funcs, ch);
-}
-
-HB_END_HEADER
-
-#endif
diff --git a/src/hb-old/harfbuzz-gdef-private.h b/src/hb-old/harfbuzz-gdef-private.h
deleted file mode 100644
index 2a6d958..0000000
--- a/src/hb-old/harfbuzz-gdef-private.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GDEF_PRIVATE_H
-#define HARFBUZZ_GDEF_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-buffer-private.h"
-#include "harfbuzz-gdef.h"
-
-HB_BEGIN_HEADER
-
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/* Attachment related structures */
-
-struct  HB_AttachPoint_
-{
-  HB_UShort*  PointIndex;             /* array of contour points      */
-  HB_UShort   PointCount;             /* size of the PointIndex array */
-};
-
-/* Ligature Caret related structures */
-
-struct  HB_CaretValueFormat1_
-{
-  HB_Short  Coordinate;               /* x or y value (in design units) */
-};
-
-typedef struct HB_CaretValueFormat1_  HB_CaretValueFormat1;
-
-
-struct  HB_CaretValueFormat2_
-{
-  HB_UShort  CaretValuePoint;         /* contour point index on glyph */
-};
-
-typedef struct HB_CaretValueFormat2_  HB_CaretValueFormat2;
-
-
-struct  HB_CaretValueFormat3_
-{
-  HB_Device*  Device;                 /* Device table for x or y value  */
-  HB_Short    Coordinate;             /* x or y value (in design units) */
-};
-
-typedef struct HB_CaretValueFormat3_  HB_CaretValueFormat3;
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-struct  HB_CaretValueFormat4_
-{
-  HB_UShort  IdCaretValue;            /* metric ID */
-};
-
-typedef struct HB_CaretValueFormat4_  HB_CaretValueFormat4;
-#endif
-
-
-struct  HB_CaretValue_
-{
-  union
-  {
-    HB_CaretValueFormat1  cvf1;
-    HB_CaretValueFormat2  cvf2;
-    HB_CaretValueFormat3  cvf3;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    HB_CaretValueFormat4  cvf4;
-#endif
-  } cvf;
-
-  HB_Byte  CaretValueFormat;          /* 1, 2, 3, or 4 */
-};
-
-typedef struct HB_CaretValue_  HB_CaretValue;
-
-
-struct  HB_LigGlyph_
-{
-  HB_CaretValue*  CaretValue;        /* array of caret values  */
-  HB_UShort        CaretCount;        /* number of caret values */
-  HB_Bool          loaded;
-};
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
-				       HB_UShort        glyphID,
-				       HB_UShort        property );
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
-				   HB_GlyphItem    item,
-				   HB_UShort        flags,
-				   HB_UShort*       property );
-
-HB_INTERNAL HB_Error
-_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
-						  HB_Stream      input,
-						  HB_Lookup*     lo,
-						  HB_UShort      num_lookups );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GDEF_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-gdef.c b/src/hb-old/harfbuzz-gdef.c
deleted file mode 100644
index 966b167..0000000
--- a/src/hb-old/harfbuzz-gdef.c
+++ /dev/null
@@ -1,1163 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gdef-private.h"
-#include "harfbuzz-open-private.h"
-
-static HB_Error  Load_AttachList( HB_AttachList*  al,
-				  HB_Stream        stream );
-static HB_Error  Load_LigCaretList( HB_LigCaretList*  lcl,
-				    HB_Stream          stream );
-
-static void  Free_AttachList( HB_AttachList*  al);
-static void  Free_LigCaretList( HB_LigCaretList*  lcl);
-
-static void  Free_NewGlyphClasses( HB_GDEFHeader*  gdef);
-
-
-
-/* GDEF glyph classes */
-
-#define UNCLASSIFIED_GLYPH  0
-#define SIMPLE_GLYPH        1
-#define LIGATURE_GLYPH      2
-#define MARK_GLYPH          3
-#define COMPONENT_GLYPH     4
-
-
-
-
-
-
-HB_Error  HB_New_GDEF_Table( HB_GDEFHeader** retptr )
-{
-  HB_Error         error;
-
-  HB_GDEFHeader*  gdef;
-
-  if ( !retptr )
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( ALLOC( gdef, sizeof( *gdef ) ) )
-    return error;
-
-  gdef->GlyphClassDef.loaded = FALSE;
-  gdef->AttachList.loaded = FALSE;
-  gdef->LigCaretList.loaded = FALSE;
-  gdef->MarkAttachClassDef_offset = 0;
-  gdef->MarkAttachClassDef.loaded = FALSE;
-
-  gdef->LastGlyph = 0;
-  gdef->NewGlyphClasses = NULL;
-
-  *retptr = gdef;
-
-  return HB_Err_Ok;
-}
-
-
-HB_Error  HB_Load_GDEF_Table( HB_Stream stream, 
-			      HB_GDEFHeader** retptr )
-{
-  HB_Error         error;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_GDEFHeader*  gdef;
-
-
-  if ( !retptr )
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( GOTO_Table( TTAG_GDEF ) )
-    return error;
-
-  if (( error = HB_New_GDEF_Table ( &gdef ) ))
-    return error;
-
-  base_offset = FILE_Pos();
-
-  /* skip version */
-
-  if ( FILE_Seek( base_offset + 4L ) ||
-       ACCESS_Frame( 2L ) )
-    goto Fail0;
-
-  new_offset = GET_UShort();
-
-  FORGET_Frame();
-
-  /* all GDEF subtables are optional */
-
-  if ( new_offset )
-  {
-    new_offset += base_offset;
-
-    /* only classes 1-4 are allowed here */
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_ClassDefinition( &gdef->GlyphClassDef, 5,
-					 stream ) ) != HB_Err_Ok )
-      goto Fail0;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail1;
-
-  new_offset = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( new_offset )
-  {
-    new_offset += base_offset;
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_AttachList( &gdef->AttachList,
-				    stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  new_offset = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( new_offset )
-  {
-    new_offset += base_offset;
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LigCaretList( &gdef->LigCaretList,
-				      stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  /* OpenType 1.2 has introduced the `MarkAttachClassDef' field.  We
-     first have to scan the LookupFlag values to find out whether we
-     must load it or not.  Here we only store the offset of the table. */
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( new_offset )
-    gdef->MarkAttachClassDef_offset = new_offset + base_offset;
-  else
-    gdef->MarkAttachClassDef_offset = 0;
-
-  *retptr = gdef;
-
-  return HB_Err_Ok;
-
-Fail3:
-  Free_LigCaretList( &gdef->LigCaretList );
-  
-Fail2:
-  Free_AttachList( &gdef->AttachList );
-
-Fail1:
-  _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef );
-
-Fail0:
-  FREE( gdef );
-
-  return error;
-}
-
-
-HB_Error  HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ) 
-{  
-  Free_LigCaretList( &gdef->LigCaretList );
-  Free_AttachList( &gdef->AttachList );
-  _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef );
-  _HB_OPEN_Free_ClassDefinition( &gdef->MarkAttachClassDef );
-  
-  Free_NewGlyphClasses( gdef );
-
-  FREE( gdef );
-
-  return HB_Err_Ok;
-}
-
-
-
-
-/*******************************
- * AttachList related functions
- *******************************/
-
-
-/* AttachPoint */
-
-static HB_Error  Load_AttachPoint( HB_AttachPoint*  ap,
-				   HB_Stream         stream )
-{
-  HB_Error  error;
-
-  HB_UShort   n, count;
-  HB_UShort*  pi;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ap->PointCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ap->PointIndex = NULL;
-
-  if ( count )
-  {
-    if ( ALLOC_ARRAY( ap->PointIndex, count, HB_UShort ) )
-      return error;
-
-    pi = ap->PointIndex;
-
-    if ( ACCESS_Frame( count * 2L ) )
-    {
-      FREE( pi );
-      return error;
-    }
-
-    for ( n = 0; n < count; n++ )
-      pi[n] = GET_UShort();
-
-    FORGET_Frame();
-  }
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_AttachPoint( HB_AttachPoint*  ap )
-{
-  FREE( ap->PointIndex );
-}
-
-
-/* AttachList */
-
-static HB_Error  Load_AttachList( HB_AttachList*  al,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-
-  HB_UShort         n, m, count;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_AttachPoint*  ap;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &al->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = al->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  al->AttachPoint = NULL;
-
-  if ( ALLOC_ARRAY( al->AttachPoint, count, HB_AttachPoint ) )
-    goto Fail2;
-
-  ap = al->AttachPoint;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_AttachPoint( &ap[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  al->loaded = TRUE;
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_AttachPoint( &ap[m] );
-
-  FREE( ap );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &al->Coverage );
-  return error;
-}
-
-
-static void  Free_AttachList( HB_AttachList*  al)
-{
-  HB_UShort         n, count;
-
-  HB_AttachPoint*  ap;
-
-
-  if ( !al->loaded )
-    return;
-
-  if ( al->AttachPoint )
-  {
-    count = al->GlyphCount;
-    ap    = al->AttachPoint;
-
-    for ( n = 0; n < count; n++ )
-      Free_AttachPoint( &ap[n] );
-
-    FREE( ap );
-  }
-
-  _HB_OPEN_Free_Coverage( &al->Coverage );
-}
-
-
-
-/*********************************
- * LigCaretList related functions
- *********************************/
-
-
-/* CaretValueFormat1 */
-/* CaretValueFormat2 */
-/* CaretValueFormat3 */
-/* CaretValueFormat4 */
-
-static HB_Error  Load_CaretValue( HB_CaretValue*  cv,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-
-  HB_UInt cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cv->CaretValueFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( cv->CaretValueFormat )
-  {
-  case 1:
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    cv->cvf.cvf1.Coordinate = GET_Short();
-
-    FORGET_Frame();
-
-    break;
-
-  case 2:
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    cv->cvf.cvf2.CaretValuePoint = GET_UShort();
-
-    FORGET_Frame();
-
-    break;
-
-  case 3:
-    if ( ACCESS_Frame( 4L ) )
-      return error;
-
-    cv->cvf.cvf3.Coordinate = GET_Short();
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Device( &cv->cvf.cvf3.Device,
-				stream ) ) != HB_Err_Ok )
-      return error;
-    (void)FILE_Seek( cur_offset );
-
-    break;
-
-  case 4:
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    cv->cvf.cvf4.IdCaretValue = GET_UShort();
-#else
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_CaretValue( HB_CaretValue*  cv)
-{
-  if ( cv->CaretValueFormat == 3 )
-    _HB_OPEN_Free_Device( cv->cvf.cvf3.Device );
-}
-
-
-/* LigGlyph */
-
-static HB_Error  Load_LigGlyph( HB_LigGlyph*  lg,
-				HB_Stream      stream )
-{
-  HB_Error  error;
-
-  HB_UShort        n, m, count;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_CaretValue*  cv;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = lg->CaretCount = GET_UShort();
-
-  FORGET_Frame();
-
-  lg->CaretValue = NULL;
-
-  if ( ALLOC_ARRAY( lg->CaretValue, count, HB_CaretValue ) )
-    return error;
-
-  cv = lg->CaretValue;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_CaretValue( &cv[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_CaretValue( &cv[m] );
-
-  FREE( cv );
-  return error;
-}
-
-
-static void  Free_LigGlyph( HB_LigGlyph*  lg)
-{
-  HB_UShort        n, count;
-
-  HB_CaretValue*  cv;
-
-
-  if ( lg->CaretValue )
-  {
-    count = lg->CaretCount;
-    cv    = lg->CaretValue;
-
-    for ( n = 0; n < count; n++ )
-      Free_CaretValue( &cv[n] );
-
-    FREE( cv );
-  }
-}
-
-
-/* LigCaretList */
-
-static HB_Error  Load_LigCaretList( HB_LigCaretList*  lcl,
-				    HB_Stream          stream )
-{
-  HB_Error  error;
-
-  HB_UShort      m, n, count;
-  HB_UInt       cur_offset, new_offset, base_offset;
-
-  HB_LigGlyph*  lg;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &lcl->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = lcl->LigGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  lcl->LigGlyph = NULL;
-
-  if ( ALLOC_ARRAY( lcl->LigGlyph, count, HB_LigGlyph ) )
-    goto Fail2;
-
-  lg = lcl->LigGlyph;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LigGlyph( &lg[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  lcl->loaded = TRUE;
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_LigGlyph( &lg[m] );
-
-  FREE( lg );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &lcl->Coverage );
-  return error;
-}
-
-
-static void  Free_LigCaretList( HB_LigCaretList*  lcl )
-{
-  HB_UShort      n, count;
-
-  HB_LigGlyph*  lg;
-
-
-  if ( !lcl->loaded )
-    return;
-
-  if ( lcl->LigGlyph )
-  {
-    count = lcl->LigGlyphCount;
-    lg    = lcl->LigGlyph;
-
-    for ( n = 0; n < count; n++ )
-      Free_LigGlyph( &lg[n] );
-
-    FREE( lg );
-  }
-
-  _HB_OPEN_Free_Coverage( &lcl->Coverage );
-}
-
-
-
-/***********
- * GDEF API
- ***********/
-
-
-static HB_UShort  Get_New_Class( HB_GDEFHeader*  gdef,
-				 HB_UShort        glyphID,
-				 HB_UShort        index )
-{
-  HB_UShort              glyph_index, array_index, count;
-  HB_UShort              byte, bits;
-  
-  HB_ClassRangeRecord*  gcrr;
-  HB_UShort**            ngc;
-
-
-  if ( glyphID >= gdef->LastGlyph )
-    return 0;
-
-  count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount;
-  gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord;
-  ngc  = gdef->NewGlyphClasses;
-
-  if ( index < count && glyphID < gcrr[index].Start )
-  {
-    array_index = index;
-    if ( index == 0 )
-      glyph_index = glyphID;
-    else
-      glyph_index = glyphID - gcrr[index - 1].End - 1;
-  }
-  else
-  {
-    array_index = index + 1;
-    glyph_index = glyphID - gcrr[index].End - 1;
-  }
-
-  byte = ngc[array_index][glyph_index / 4];
-  bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 );
-
-  return bits & 0x000F;
-}
-
-
-
-HB_Error  HB_GDEF_Get_Glyph_Property( HB_GDEFHeader*  gdef,
-				      HB_UShort        glyphID,
-				      HB_UShort*       property )
-{
-  HB_UShort class = 0, index = 0; /* shut compiler up */
-
-  HB_Error  error;
-
-
-  if ( !gdef || !property )
-    return ERR(HB_Err_Invalid_Argument);
-
-  /* first, we check for mark attach classes */
-
-  if ( gdef->MarkAttachClassDef.loaded )
-  {
-    error = _HB_OPEN_Get_Class( &gdef->MarkAttachClassDef, glyphID, &class, &index );
-    if ( error && error != HB_Err_Not_Covered )
-      return error;
-    if ( !error )
-    {
-      *property = class << 8;
-      return HB_Err_Ok;
-    }
-  }
-
-  error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index );
-  if ( error && error != HB_Err_Not_Covered )
-    return error;
-
-  /* if we have a constructed class table, check whether additional
-     values have been assigned                                      */
-
-  if ( error == HB_Err_Not_Covered && gdef->NewGlyphClasses )
-    class = Get_New_Class( gdef, glyphID, index );
-
-  switch ( class )
-  {
-  default:
-  case UNCLASSIFIED_GLYPH:
-    *property = 0;
-    break;
-
-  case SIMPLE_GLYPH:
-    *property = HB_GDEF_BASE_GLYPH;
-    break;
-
-  case LIGATURE_GLYPH:
-    *property = HB_GDEF_LIGATURE;
-    break;
-
-  case MARK_GLYPH:
-    *property = HB_GDEF_MARK;
-    break;
-
-  case COMPONENT_GLYPH:
-    *property = HB_GDEF_COMPONENT;
-    break;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-static HB_Error  Make_ClassRange( HB_ClassDefinition*  cd,
-				  HB_UShort             start,
-				  HB_UShort             end,
-				  HB_UShort             class )
-{
-  HB_Error               error;
-  HB_UShort              index;
-
-  HB_ClassDefFormat2*   cdf2;
-  HB_ClassRangeRecord*  crr;
-
-
-  cdf2 = &cd->cd.cd2;
-
-  if ( REALLOC_ARRAY( cdf2->ClassRangeRecord,
-		      cdf2->ClassRangeCount + 1 ,
-		      HB_ClassRangeRecord ) )
-    return error;
-
-  cdf2->ClassRangeCount++;
-
-  crr   = cdf2->ClassRangeRecord;
-  index = cdf2->ClassRangeCount - 1;
-
-  crr[index].Start = start;
-  crr[index].End   = end;
-  crr[index].Class = class;
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GDEF_Build_ClassDefinition( HB_GDEFHeader*  gdef,
-					 HB_UShort        num_glyphs,
-					 HB_UShort        glyph_count,
-					 HB_UShort*       glyph_array,
-					 HB_UShort*       class_array )
-{
-  HB_UShort              start, curr_glyph, curr_class;
-  HB_UShort              n, m, count;
-  HB_Error               error;
-
-  HB_ClassDefinition*   gcd;
-  HB_ClassRangeRecord*  gcrr;
-  HB_UShort**            ngc;
-
-
-  if ( !gdef || !glyph_array || !class_array )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gcd = &gdef->GlyphClassDef;
-
-  /* We build a format 2 table */
-
-  gcd->ClassFormat = 2;
-
-  gcd->cd.cd2.ClassRangeCount  = 0;
-  gcd->cd.cd2.ClassRangeRecord = NULL;
-
-  start      = glyph_array[0];
-  curr_class = class_array[0];
-  curr_glyph = start;
-
-  if ( curr_class >= 5 )
-  {
-    error = ERR(HB_Err_Invalid_Argument);
-    goto Fail4;
-  }
-
-  glyph_count--;
-
-  for ( n = 0; n < glyph_count + 1; n++ )
-  {
-    if ( curr_glyph == glyph_array[n] && curr_class == class_array[n] )
-    {
-      if ( n == glyph_count )
-      {
-	if ( ( error = Make_ClassRange( gcd, start,
-					curr_glyph,
-					curr_class) ) != HB_Err_Ok )
-	  goto Fail3;
-      }
-      else
-      {
-	if ( curr_glyph == 0xFFFF )
-	{
-	  error = ERR(HB_Err_Invalid_Argument);
-	  goto Fail3;
-	}
-	else
-	  curr_glyph++;
-      }
-    }
-    else
-    {
-      if ( ( error = Make_ClassRange( gcd, start,
-				      curr_glyph - 1,
-				      curr_class) ) != HB_Err_Ok )
-	goto Fail3;
-
-      if ( curr_glyph > glyph_array[n] )
-      {
-	error = ERR(HB_Err_Invalid_Argument);
-	goto Fail3;
-      }
-
-      start      = glyph_array[n];
-      curr_class = class_array[n];
-      curr_glyph = start;
-
-      if ( curr_class >= 5 )
-      {
-	error = ERR(HB_Err_Invalid_Argument);
-	goto Fail3;
-      }
-
-      if ( n == glyph_count )
-      {
-	if ( ( error = Make_ClassRange( gcd, start,
-					curr_glyph,
-					curr_class) ) != HB_Err_Ok )
-	  goto Fail3;
-      }
-      else
-      {
-	if ( curr_glyph == 0xFFFF )
-	{
-	  error = ERR(HB_Err_Invalid_Argument);
-	  goto Fail3;
-	}
-	else
-	  curr_glyph++;
-      }
-    }
-  }
-
-  /* now prepare the arrays for class values assigned during the lookup
-     process                                                            */
-
-  if ( ALLOC_ARRAY( gdef->NewGlyphClasses,
-		    gcd->cd.cd2.ClassRangeCount + 1, HB_UShort* ) )
-    goto Fail3;
-
-  count = gcd->cd.cd2.ClassRangeCount;
-  gcrr  = gcd->cd.cd2.ClassRangeRecord;
-  ngc   = gdef->NewGlyphClasses;
-
-  /* We allocate arrays for all glyphs not covered by the class range
-     records.  Each element holds four class values.                  */
-
-  if ( count > 0 )
-  {
-      if ( gcrr[0].Start )
-      {
-	if ( ALLOC_ARRAY( ngc[0], ( gcrr[0].Start + 3 ) / 4, HB_UShort ) )
-	  goto Fail2;
-      }
-
-      for ( n = 1; n < count; n++ )
-      {
-	if ( gcrr[n].Start - gcrr[n - 1].End > 1 )
-	  if ( ALLOC_ARRAY( ngc[n],
-			    ( gcrr[n].Start - gcrr[n - 1].End + 2 ) / 4,
-			    HB_UShort ) )
-	    goto Fail1;
-      }
-
-      if ( gcrr[count - 1].End != num_glyphs - 1 )
-      {
-	if ( ALLOC_ARRAY( ngc[count],
-			  ( num_glyphs - gcrr[count - 1].End + 2 ) / 4,
-			  HB_UShort ) )
-	    goto Fail1;
-      }
-  }
-  else if ( num_glyphs > 0 )
-  {
-      if ( ALLOC_ARRAY( ngc[count],
-			( num_glyphs + 3 ) / 4,
-			HB_UShort ) )
-	  goto Fail2;
-  }
-      
-  gdef->LastGlyph = num_glyphs - 1;
-
-  gdef->MarkAttachClassDef_offset = 0L;
-  gdef->MarkAttachClassDef.loaded = FALSE;
-
-  gcd->loaded = TRUE;
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    FREE( ngc[m] );
-
-Fail2:
-  FREE( gdef->NewGlyphClasses );
-
-Fail3:
-  FREE( gcd->cd.cd2.ClassRangeRecord );
-
-Fail4:
-  return error;
-}
-
-
-static void  Free_NewGlyphClasses( HB_GDEFHeader*  gdef )
-{
-  HB_UShort**  ngc;
-  HB_UShort    n, count;
-
-
-  if ( gdef->NewGlyphClasses )
-  {
-    count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount + 1;
-    ngc   = gdef->NewGlyphClasses;
-
-    for ( n = 0; n < count; n++ )
-      FREE( ngc[n] );
-
-    FREE( ngc );
-  }
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
-			      HB_UShort        glyphID,
-			      HB_UShort        property )
-{
-  HB_Error               error;
-  HB_UShort              class, new_class, index = 0; /* shut compiler up */
-  HB_UShort              byte, bits, mask;
-  HB_UShort              array_index, glyph_index, count;
-
-  HB_ClassRangeRecord*  gcrr;
-  HB_UShort**            ngc;
-
-
-  error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index );
-  if ( error && error != HB_Err_Not_Covered )
-    return error;
-
-  /* we don't accept glyphs covered in `GlyphClassDef' */
-
-  if ( !error )
-    return HB_Err_Not_Covered;
-
-  switch ( property )
-  {
-  case 0:
-    new_class = UNCLASSIFIED_GLYPH;
-    break;
-
-  case HB_GDEF_BASE_GLYPH:
-    new_class = SIMPLE_GLYPH;
-    break;
-
-  case HB_GDEF_LIGATURE:
-    new_class = LIGATURE_GLYPH;
-    break;
-
-  case HB_GDEF_MARK:
-    new_class = MARK_GLYPH;
-    break;
-
-  case HB_GDEF_COMPONENT:
-    new_class = COMPONENT_GLYPH;
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_Argument);
-  }
-
-  count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount;
-  gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord;
-  ngc  = gdef->NewGlyphClasses;
-
-  if ( index < count && glyphID < gcrr[index].Start )
-  {
-    array_index = index;
-    if ( index == 0 )
-      glyph_index = glyphID;
-    else
-      glyph_index = glyphID - gcrr[index - 1].End - 1;
-  }
-  else
-  {
-    array_index = index + 1;
-    glyph_index = glyphID - gcrr[index].End - 1;
-  }
-
-  byte  = ngc[array_index][glyph_index / 4];
-  bits  = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 );
-  class = bits & 0x000F;
-
-  /* we don't overwrite existing entries */
-
-  if ( !class )
-  {
-    bits = new_class << ( 16 - ( glyph_index % 4 + 1 ) * 4 );
-    mask = ~( 0x000F << ( 16 - ( glyph_index % 4 + 1 ) * 4 ) );
-
-    ngc[array_index][glyph_index / 4] &= mask;
-    ngc[array_index][glyph_index / 4] |= bits;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
-			  HB_GlyphItem    gitem,
-			  HB_UShort        flags,
-			  HB_UShort*       property )
-{
-  HB_Error  error;
-
-  if ( gdef )
-  {
-    HB_UShort basic_glyph_class;
-    HB_UShort desired_attachment_class;
-
-    if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN )
-    {
-      error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties );
-      if ( error )
-	return error;
-    }
-
-    *property = gitem->gproperties;
-
-    /* If the glyph was found in the MarkAttachmentClass table,
-     * then that class value is the high byte of the result,
-     * otherwise the low byte contains the basic type of the glyph
-     * as defined by the GlyphClassDef table.
-     */
-    if ( *property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS  )
-      basic_glyph_class = HB_GDEF_MARK;
-    else
-      basic_glyph_class = *property;
-
-    /* Return Not_Covered, if, for example, basic_glyph_class
-     * is HB_GDEF_LIGATURE and LookFlags includes HB_LOOKUP_FLAG_IGNORE_LIGATURES
-     */
-    if ( flags & basic_glyph_class )
-      return HB_Err_Not_Covered;
-    
-    /* The high byte of LookupFlags has the meaning
-     * "ignore marks of attachment type different than
-     * the attachment type specified."
-     */
-    desired_attachment_class = flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS;
-    if ( desired_attachment_class )
-    {
-      if ( basic_glyph_class == HB_GDEF_MARK &&
-	   *property != desired_attachment_class )
-	return HB_Err_Not_Covered;
-    }
-  } else {
-      *property = 0;
-  }
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
-						  HB_Stream      stream,
-						  HB_Lookup*     lo,
-						  HB_UShort      num_lookups)
-{
-  HB_Error   error = HB_Err_Ok;
-  HB_UShort  i;
-
-  /* We now check the LookupFlags for values larger than 0xFF to find
-     out whether we need to load the `MarkAttachClassDef' field of the
-     GDEF table -- this hack is necessary for OpenType 1.2 tables since
-     the version field of the GDEF table hasn't been incremented.
-
-     For constructed GDEF tables, we only load it if
-     `MarkAttachClassDef_offset' is not zero (nevertheless, a build of
-     a constructed mark attach table is not supported currently).       */
-
-  if ( gdef &&
-       gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded )
-  {
-    for ( i = 0; i < num_lookups; i++ )
-    {
-
-      if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
-      {
-	if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) ||
-	     ( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef,
-					     256, stream ) ) != HB_Err_Ok )
-	  goto Done;
-
-	break;
-      }
-    }
-  }
-
-Done:
-  return error;
-}
-
-/* END */
diff --git a/src/hb-old/harfbuzz-gdef.h b/src/hb-old/harfbuzz-gdef.h
deleted file mode 100644
index f9a03dd..0000000
--- a/src/hb-old/harfbuzz-gdef.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GDEF_H
-#define HARFBUZZ_GDEF_H
-
-#include "harfbuzz-open.h"
-#include "harfbuzz-stream.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/* GDEF glyph properties.  Note that HB_GDEF_COMPONENT has no corresponding
- * flag in the LookupFlag field.     */
-#define HB_GDEF_BASE_GLYPH  0x0002
-#define HB_GDEF_LIGATURE    0x0004
-#define HB_GDEF_MARK        0x0008
-#define HB_GDEF_COMPONENT   0x0010
-
-
-typedef struct HB_AttachPoint_  HB_AttachPoint;
-
-
-struct  HB_AttachList_
-{
-  HB_AttachPoint*   AttachPoint;      /* array of AttachPoint tables */
-  HB_Coverage       Coverage;         /* Coverage table              */
-  HB_UShort         GlyphCount;       /* number of glyphs with
-					 attachments                 */
-  HB_Bool           loaded;
-};
-
-typedef struct HB_AttachList_  HB_AttachList;
-
-typedef struct HB_LigGlyph_  HB_LigGlyph;
-
-struct  HB_LigCaretList_
-{
-  HB_LigGlyph*   LigGlyph;            /* array of LigGlyph tables  */
-  HB_Coverage    Coverage;            /* Coverage table            */
-  HB_UShort      LigGlyphCount;       /* number of ligature glyphs */
-  HB_Bool        loaded;
-};
-
-typedef struct HB_LigCaretList_  HB_LigCaretList;
-
-
-
-/* The `NewGlyphClasses' field is not defined in the TTO specification.
-   We use it for fonts with a constructed `GlyphClassDef' structure
-   (i.e., which don't have a GDEF table) to collect glyph classes
-   assigned during the lookup process.  The number of arrays in this
-   pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth
-   array then contains the glyph class values of the glyphs not covered
-   by the ClassRangeRecords structures with index n-1 and n.  We store
-   glyph class values for four glyphs in a single array element.
-
-   `LastGlyph' is identical to the number of glyphs minus one in the
-   font; we need it only if `NewGlyphClasses' is not NULL (to have an
-   upper bound for the last array).
-
-   Note that we first store the file offset to the `MarkAttachClassDef'
-   field (which has been introduced in OpenType 1.2) -- since the
-   `Version' field value hasn't been increased to indicate that we have
-   one more field for some obscure reason, we must parse the GSUB table
-   to find out whether class values refer to this table.  Only then we
-   can finally load the MarkAttachClassDef structure if necessary.      */
-
-struct  HB_GDEFHeader_
-{
-  HB_UShort**          NewGlyphClasses;
-  HB_UInt             offset;
-  HB_UInt             MarkAttachClassDef_offset;
-
-  HB_16Dot16             Version;
-
-  HB_ClassDefinition   GlyphClassDef;
-  HB_AttachList        AttachList;
-  HB_LigCaretList      LigCaretList;
-  HB_ClassDefinition   MarkAttachClassDef;        /* new in OT 1.2 */
-
-  HB_UShort            LastGlyph;
-};
-
-typedef struct HB_GDEFHeader_   HB_GDEFHeader;
-typedef struct HB_GDEFHeader_*  HB_GDEF;
-
-
-HB_Error  HB_New_GDEF_Table( HB_GDEFHeader** retptr );
-      
-
-HB_Error  HB_Load_GDEF_Table( HB_Stream       stream,
-			      HB_GDEFHeader** gdef );
-
-
-HB_Error  HB_Done_GDEF_Table ( HB_GDEFHeader* gdef );
-
-
-HB_Error  HB_GDEF_Get_Glyph_Property( HB_GDEFHeader*  gdef,
-				      HB_UShort        glyphID,
-				      HB_UShort*       property );
-
-HB_Error  HB_GDEF_Build_ClassDefinition( HB_GDEFHeader*  gdef,
-					 HB_UShort        num_glyphs,
-					 HB_UShort        glyph_count,
-					 HB_UShort*       glyph_array,
-					 HB_UShort*       class_array );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GDEF_H */
diff --git a/src/hb-old/harfbuzz-global.h b/src/hb-old/harfbuzz-global.h
deleted file mode 100644
index 9ba5841..0000000
--- a/src/hb-old/harfbuzz-global.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#ifndef HARFBUZZ_GLOBAL_H
-#define HARFBUZZ_GLOBAL_H
-
-#include <stdlib.h>
-#include <string.h>
-
-#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
-# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
-# define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
-#else
-# define HB_BEGIN_VISIBILITY
-# define HB_END_VISIBILITY
-#endif
-#ifdef __cplusplus
-# define HB_BEGIN_HEADER  extern "C" { HB_BEGIN_VISIBILITY
-# define HB_END_HEADER  HB_END_VISIBILITY }
-#else
-# define HB_BEGIN_HEADER  HB_BEGIN_VISIBILITY
-# define HB_END_HEADER  HB_END_VISIBILITY
-#endif
-
-HB_BEGIN_HEADER
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-#define HB_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
-          ( ( (HB_UInt)_x1 << 24 ) |     \
-            ( (HB_UInt)_x2 << 16 ) |     \
-            ( (HB_UInt)_x3 <<  8 ) |     \
-              (HB_UInt)_x4         )
-
-typedef char hb_int8;
-typedef unsigned char hb_uint8;
-typedef short hb_int16;
-typedef unsigned short hb_uint16;
-typedef int hb_int32;
-typedef unsigned int hb_uint32;
-
-typedef hb_uint8 HB_Bool;
-
-typedef hb_uint8 HB_Byte;
-typedef hb_uint16 HB_UShort;
-typedef hb_uint32 HB_UInt;
-typedef hb_int8 HB_Char;
-typedef hb_int16 HB_Short;
-typedef hb_int32 HB_Int;
-
-typedef hb_uint16 HB_UChar16;
-typedef hb_uint32 HB_UChar32;
-typedef hb_uint32 HB_Glyph;
-typedef hb_int32 HB_Fixed; /* 26.6 */
-
-#define HB_FIXED_CONSTANT(v) ((v) * 64)
-#define HB_FIXED_ROUND(v) (((v)+32) & -64)
-
-typedef hb_int32 HB_16Dot16; /* 16.16 */
-
-typedef void * HB_Pointer;
-typedef hb_uint32 HB_Tag;
-
-typedef enum {
-  /* no error */
-  HB_Err_Ok                           = 0x0000,
-  HB_Err_Not_Covered                  = 0xFFFF,
-
-  /* _hb_err() is called whenever returning the following errors,
-   * and in a couple places for HB_Err_Not_Covered too. */
-
-  /* programmer error */
-  HB_Err_Invalid_Argument             = 0x1A66,
-
-  /* font error */
-  HB_Err_Invalid_SubTable_Format      = 0x157F,
-  HB_Err_Invalid_SubTable             = 0x1570,
-  HB_Err_Read_Error                   = 0x6EAD,
-
-  /* system error */
-  HB_Err_Out_Of_Memory                = 0xDEAD
-} HB_Error;
-
-typedef struct {
-    HB_Fixed x;
-    HB_Fixed y;
-} HB_FixedPoint;
-
-typedef struct HB_Font_ *HB_Font;
-typedef struct HB_StreamRec_ *HB_Stream;
-typedef struct HB_FaceRec_ *HB_Face;
-
-HB_END_HEADER
-
-#endif
diff --git a/src/hb-old/harfbuzz-gpos-private.h b/src/hb-old/harfbuzz-gpos-private.h
deleted file mode 100644
index 39f3159..0000000
--- a/src/hb-old/harfbuzz-gpos-private.h
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GPOS_PRIVATE_H
-#define HARFBUZZ_GPOS_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-gpos.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/* shared tables */
-
-#define VR_X_PLACEMENT_DEVICE 0
-#define VR_Y_PLACEMENT_DEVICE 1
-#define VR_X_ADVANCE_DEVICE   2
-#define VR_Y_ADVANCE_DEVICE   3
-
-struct  HB_ValueRecord_
-{
-  HB_Short    XPlacement;             /* horizontal adjustment for
-					 placement                      */
-  HB_Short    YPlacement;             /* vertical adjustment for
-					 placement                      */
-  HB_Short    XAdvance;               /* horizontal adjustment for
-					 advance                        */
-  HB_Short    YAdvance;               /* vertical adjustment for
-					 advance                        */
-
-  HB_Device** DeviceTables;           /* device tables for placement
-					 and advance                    */
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  HB_UShort   XIdPlacement;           /* horizontal placement metric ID */
-  HB_UShort   YIdPlacement;           /* vertical placement metric ID   */
-  HB_UShort   XIdAdvance;             /* horizontal advance metric ID   */
-  HB_UShort   YIdAdvance;             /* vertical advance metric ID     */
-#endif
-};
-
-typedef struct HB_ValueRecord_  HB_ValueRecord;
-
-
-/* Mask values to scan the value format of the ValueRecord structure.
- We always expand compressed ValueRecords of the font.              */
-
-#define HB_GPOS_FORMAT_HAVE_DEVICE_TABLES       0x00F0
-
-#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT         0x0001
-#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT         0x0002
-#define HB_GPOS_FORMAT_HAVE_X_ADVANCE           0x0004
-#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE           0x0008
-#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE  0x0010
-#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE  0x0020
-#define HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE    0x0040
-#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE    0x0080
-#define HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT      0x0100
-#define HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT      0x0200
-#define HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE        0x0400
-#define HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE        0x0800
-
-
-struct  HB_AnchorFormat1_
-{
-  HB_Short   XCoordinate;             /* horizontal value */
-  HB_Short   YCoordinate;             /* vertical value   */
-};
-
-typedef struct HB_AnchorFormat1_  HB_AnchorFormat1;
-
-
-struct  HB_AnchorFormat2_
-{
-  HB_Short   XCoordinate;             /* horizontal value             */
-  HB_Short   YCoordinate;             /* vertical value               */
-  HB_UShort  AnchorPoint;             /* index to glyph contour point */
-};
-
-typedef struct HB_AnchorFormat2_  HB_AnchorFormat2;
-
-#define AF3_X_DEVICE_TABLE 0
-#define AF3_Y_DEVICE_TABLE 1
-
-struct  HB_AnchorFormat3_
-{
-  HB_Short    XCoordinate;            /* horizontal value              */
-  HB_Short    YCoordinate;            /* vertical value                */
-  HB_Device** DeviceTables;           /* device tables for coordinates */
-};
-
-typedef struct HB_AnchorFormat3_  HB_AnchorFormat3;
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-struct  HB_AnchorFormat4_
-{
-  HB_UShort  XIdAnchor;               /* horizontal metric ID */
-  HB_UShort  YIdAnchor;               /* vertical metric ID   */
-};
-
-typedef struct HB_AnchorFormat4_  HB_AnchorFormat4;
-#endif
-
-
-struct  HB_Anchor_
-{
-  HB_Byte  PosFormat;                 /* 1, 2, 3, or 4 -- 0 indicates
-					 that there is no Anchor table */
-
-  union
-  {
-    HB_AnchorFormat1  af1;
-    HB_AnchorFormat2  af2;
-    HB_AnchorFormat3  af3;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    HB_AnchorFormat4  af4;
-#endif
-  } af;
-};
-
-typedef struct HB_Anchor_  HB_Anchor;
-
-
-struct  HB_MarkRecord_
-{
-  HB_UShort   Class;                  /* mark class   */
-  HB_Anchor  MarkAnchor;             /* anchor table */
-};
-
-typedef struct HB_MarkRecord_  HB_MarkRecord;
-
-
-struct  HB_MarkArray_
-{
-  HB_UShort        MarkCount;         /* number of MarkRecord tables */
-  HB_MarkRecord*  MarkRecord;        /* array of MarkRecord tables  */
-};
-
-typedef struct HB_MarkArray_  HB_MarkArray;
-
-
-/* LookupType 1 */
-
-struct  HB_SinglePosFormat1_
-{
-  HB_ValueRecord  Value;             /* ValueRecord for all covered
-					 glyphs                      */
-};
-
-typedef struct HB_SinglePosFormat1_  HB_SinglePosFormat1;
-
-
-struct  HB_SinglePosFormat2_
-{
-  HB_UShort         ValueCount;       /* number of ValueRecord tables */
-  HB_ValueRecord*  Value;            /* array of ValueRecord tables  */
-};
-
-typedef struct HB_SinglePosFormat2_  HB_SinglePosFormat2;
-
-
-struct  HB_SinglePos_
-{
-  HB_Byte       PosFormat;            /* 1 or 2         */
-  HB_Coverage  Coverage;             /* Coverage table */
-
-  HB_UShort     ValueFormat;          /* format of ValueRecord table */
-
-  union
-  {
-    HB_SinglePosFormat1  spf1;
-    HB_SinglePosFormat2  spf2;
-  } spf;
-};
-
-typedef struct HB_SinglePos_  HB_SinglePos;
-
-
-/* LookupType 2 */
-
-struct  HB_PairValueRecord_
-{
-  HB_UShort        SecondGlyph;       /* glyph ID for second glyph  */
-  HB_ValueRecord  Value1;            /* pos. data for first glyph  */
-  HB_ValueRecord  Value2;            /* pos. data for second glyph */
-};
-
-typedef struct HB_PairValueRecord_  HB_PairValueRecord;
-
-
-struct  HB_PairSet_
-{
-  HB_UShort             PairValueCount;
-				      /* number of PairValueRecord tables */
-  HB_PairValueRecord*  PairValueRecord;
-				      /* array of PairValueRecord tables  */
-};
-
-typedef struct HB_PairSet_  HB_PairSet;
-
-
-struct  HB_PairPosFormat1_
-{
-  HB_UShort     PairSetCount;         /* number of PairSet tables    */
-  HB_PairSet*  PairSet;              /* array of PairSet tables     */
-};
-
-typedef struct HB_PairPosFormat1_  HB_PairPosFormat1;
-
-
-struct  HB_Class2Record_
-{
-  HB_ValueRecord  Value1;            /* pos. data for first glyph  */
-  HB_ValueRecord  Value2;            /* pos. data for second glyph */
-};
-
-typedef struct HB_Class2Record_  HB_Class2Record;
-
-
-struct  HB_Class1Record_
-{
-  HB_Class2Record*  Class2Record;    /* array of Class2Record tables */
-};
-
-typedef struct HB_Class1Record_  HB_Class1Record;
-
-
-struct  HB_PairPosFormat2_
-{
-  HB_ClassDefinition  ClassDef1;     /* class def. for first glyph     */
-  HB_ClassDefinition  ClassDef2;     /* class def. for second glyph    */
-  HB_UShort            Class1Count;   /* number of classes in ClassDef1
-					 table                          */
-  HB_UShort            Class2Count;   /* number of classes in ClassDef2
-					 table                          */
-  HB_Class1Record*    Class1Record;  /* array of Class1Record tables   */
-};
-
-typedef struct HB_PairPosFormat2_  HB_PairPosFormat2;
-
-
-struct  HB_PairPos_
-{
-  HB_Byte       PosFormat;            /* 1 or 2         */
-  HB_Coverage  Coverage;             /* Coverage table */
-  HB_UShort     ValueFormat1;         /* format of ValueRecord table
-					 for first glyph             */
-  HB_UShort     ValueFormat2;         /* format of ValueRecord table
-					 for second glyph            */
-
-  union
-  {
-    HB_PairPosFormat1  ppf1;
-    HB_PairPosFormat2  ppf2;
-  } ppf;
-};
-
-typedef struct HB_PairPos_  HB_PairPos;
-
-
-/* LookupType 3 */
-
-struct  HB_EntryExitRecord_
-{
-  HB_Anchor  EntryAnchor;            /* entry Anchor table */
-  HB_Anchor  ExitAnchor;             /* exit Anchor table  */
-};
-
-
-typedef struct HB_EntryExitRecord_  HB_EntryExitRecord;
-
-struct  HB_CursivePos_
-{
-  HB_UShort             PosFormat;    /* always 1                         */
-  HB_Coverage          Coverage;     /* Coverage table                   */
-  HB_UShort             EntryExitCount;
-				      /* number of EntryExitRecord tables */
-  HB_EntryExitRecord*  EntryExitRecord;
-				      /* array of EntryExitRecord tables  */
-};
-
-typedef struct HB_CursivePos_  HB_CursivePos;
-
-
-/* LookupType 4 */
-
-struct  HB_BaseRecord_
-{
-  HB_Anchor*  BaseAnchor;            /* array of base glyph anchor
-					 tables                     */
-};
-
-typedef struct HB_BaseRecord_  HB_BaseRecord;
-
-
-struct  HB_BaseArray_
-{
-  HB_UShort        BaseCount;         /* number of BaseRecord tables */
-  HB_BaseRecord*  BaseRecord;        /* array of BaseRecord tables  */
-};
-
-typedef struct HB_BaseArray_  HB_BaseArray;
-
-
-struct  HB_MarkBasePos_
-{
-  HB_UShort      PosFormat;           /* always 1                  */
-  HB_Coverage   MarkCoverage;        /* mark glyph coverage table */
-  HB_Coverage   BaseCoverage;        /* base glyph coverage table */
-  HB_UShort      ClassCount;          /* number of mark classes    */
-  HB_MarkArray  MarkArray;           /* mark array table          */
-  HB_BaseArray  BaseArray;           /* base array table          */
-};
-
-typedef struct HB_MarkBasePos_  HB_MarkBasePos;
-
-
-/* LookupType 5 */
-
-struct  HB_ComponentRecord_
-{
-  HB_Anchor*  LigatureAnchor;        /* array of ligature glyph anchor
-					 tables                         */
-};
-
-typedef struct HB_ComponentRecord_  HB_ComponentRecord;
-
-
-struct  HB_LigatureAttach_
-{
-  HB_UShort             ComponentCount;
-				      /* number of ComponentRecord tables */
-  HB_ComponentRecord*  ComponentRecord;
-				      /* array of ComponentRecord tables  */
-};
-
-typedef struct HB_LigatureAttach_  HB_LigatureAttach;
-
-
-struct  HB_LigatureArray_
-{
-  HB_UShort            LigatureCount; /* number of LigatureAttach tables */
-  HB_LigatureAttach*  LigatureAttach;
-				      /* array of LigatureAttach tables  */
-};
-
-typedef struct HB_LigatureArray_  HB_LigatureArray;
-
-
-struct  HB_MarkLigPos_
-{
-  HB_UShort          PosFormat;       /* always 1                      */
-  HB_Coverage       MarkCoverage;    /* mark glyph coverage table     */
-  HB_Coverage       LigatureCoverage;
-				      /* ligature glyph coverage table */
-  HB_UShort          ClassCount;      /* number of mark classes        */
-  HB_MarkArray      MarkArray;       /* mark array table              */
-  HB_LigatureArray  LigatureArray;   /* ligature array table          */
-};
-
-typedef struct HB_MarkLigPos_  HB_MarkLigPos;
-
-
-/* LookupType 6 */
-
-struct  HB_Mark2Record_
-{
-  HB_Anchor*  Mark2Anchor;           /* array of mark glyph anchor
-					 tables                     */
-};
-
-typedef struct HB_Mark2Record_  HB_Mark2Record;
-
-
-struct  HB_Mark2Array_
-{
-  HB_UShort         Mark2Count;       /* number of Mark2Record tables */
-  HB_Mark2Record*  Mark2Record;      /* array of Mark2Record tables  */
-};
-
-typedef struct HB_Mark2Array_  HB_Mark2Array;
-
-
-struct  HB_MarkMarkPos_
-{
-  HB_UShort       PosFormat;          /* always 1                         */
-  HB_Coverage    Mark1Coverage;      /* first mark glyph coverage table  */
-  HB_Coverage    Mark2Coverage;      /* second mark glyph coverave table */
-  HB_UShort       ClassCount;         /* number of combining mark classes */
-  HB_MarkArray   Mark1Array;         /* MarkArray table for first mark   */
-  HB_Mark2Array  Mark2Array;         /* MarkArray table for second mark  */
-};
-
-typedef struct HB_MarkMarkPos_  HB_MarkMarkPos;
-
-
-/* needed by both lookup type 7 and 8 */
-
-struct  HB_PosLookupRecord_
-{
-  HB_UShort  SequenceIndex;           /* index into current
-					 glyph sequence               */
-  HB_UShort  LookupListIndex;         /* Lookup to apply to that pos. */
-};
-
-typedef struct HB_PosLookupRecord_  HB_PosLookupRecord;
-
-
-/* LookupType 7 */
-
-struct  HB_PosRule_
-{
-  HB_UShort             GlyphCount;   /* total number of input glyphs     */
-  HB_UShort             PosCount;     /* number of PosLookupRecord tables */
-  HB_UShort*            Input;        /* array of input glyph IDs         */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of PosLookupRecord tables  */
-};
-
-typedef struct HB_PosRule_  HB_PosRule;
-
-
-struct  HB_PosRuleSet_
-{
-  HB_UShort     PosRuleCount;         /* number of PosRule tables */
-  HB_PosRule*  PosRule;              /* array of PosRule tables  */
-};
-
-typedef struct HB_PosRuleSet_  HB_PosRuleSet;
-
-
-struct  HB_ContextPosFormat1_
-{
-  HB_Coverage     Coverage;          /* Coverage table              */
-  HB_UShort        PosRuleSetCount;   /* number of PosRuleSet tables */
-  HB_PosRuleSet*  PosRuleSet;        /* array of PosRuleSet tables  */
-};
-
-typedef struct HB_ContextPosFormat1_  HB_ContextPosFormat1;
-
-
-struct  HB_PosClassRule_
-{
-  HB_UShort             GlyphCount;   /* total number of context classes  */
-  HB_UShort             PosCount;     /* number of PosLookupRecord tables */
-  HB_UShort*            Class;        /* array of classes                 */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of PosLookupRecord tables  */
-};
-
-typedef struct HB_PosClassRule_  HB_PosClassRule;
-
-
-struct  HB_PosClassSet_
-{
-  HB_UShort          PosClassRuleCount;
-				      /* number of PosClassRule tables */
-  HB_PosClassRule*  PosClassRule;    /* array of PosClassRule tables  */
-};
-
-typedef struct HB_PosClassSet_  HB_PosClassSet;
-
-
-/* The `MaxContextLength' field is not defined in the TTO specification
-   but simplifies the implementation of this format.  It holds the
-   maximal context length used in the context rules.                    */
-
-struct  HB_ContextPosFormat2_
-{
-  HB_UShort            MaxContextLength;
-				      /* maximal context length       */
-  HB_Coverage         Coverage;      /* Coverage table               */
-  HB_ClassDefinition  ClassDef;      /* ClassDef table               */
-  HB_UShort            PosClassSetCount;
-				      /* number of PosClassSet tables */
-  HB_PosClassSet*     PosClassSet;   /* array of PosClassSet tables  */
-};
-
-typedef struct HB_ContextPosFormat2_  HB_ContextPosFormat2;
-
-
-struct  HB_ContextPosFormat3_
-{
-  HB_UShort             GlyphCount;   /* number of input glyphs           */
-  HB_UShort             PosCount;     /* number of PosLookupRecord tables */
-  HB_Coverage*         Coverage;     /* array of Coverage tables         */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of PosLookupRecord tables  */
-};
-
-typedef struct HB_ContextPosFormat3_  HB_ContextPosFormat3;
-
-
-struct  HB_ContextPos_
-{
-  HB_Byte  PosFormat;                 /* 1, 2, or 3     */
-
-  union
-  {
-    HB_ContextPosFormat1  cpf1;
-    HB_ContextPosFormat2  cpf2;
-    HB_ContextPosFormat3  cpf3;
-  } cpf;
-};
-
-typedef struct HB_ContextPos_  HB_ContextPos;
-
-
-/* LookupType 8 */
-
-struct  HB_ChainPosRule_
-{
-  HB_UShort*            Backtrack;    /* array of backtrack glyph IDs     */
-  HB_UShort*            Input;        /* array of input glyph IDs         */
-  HB_UShort*            Lookahead;    /* array of lookahead glyph IDs     */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of PosLookupRecords       */
-  HB_UShort             BacktrackGlyphCount;
-				      /* total number of backtrack glyphs */
-  HB_UShort             InputGlyphCount;
-				      /* total number of input glyphs     */
-  HB_UShort             LookaheadGlyphCount;
-				      /* total number of lookahead glyphs */
-  HB_UShort             PosCount;     /* number of PosLookupRecords       */
-};
-
-typedef struct HB_ChainPosRule_  HB_ChainPosRule;
-
-
-struct  HB_ChainPosRuleSet_
-{
-  HB_UShort          ChainPosRuleCount;
-				      /* number of ChainPosRule tables */
-  HB_ChainPosRule*  ChainPosRule;    /* array of ChainPosRule tables  */
-};
-
-typedef struct HB_ChainPosRuleSet_  HB_ChainPosRuleSet;
-
-
-struct  HB_ChainContextPosFormat1_
-{
-  HB_Coverage          Coverage;     /* Coverage table                   */
-  HB_UShort             ChainPosRuleSetCount;
-				      /* number of ChainPosRuleSet tables */
-  HB_ChainPosRuleSet*  ChainPosRuleSet;
-				      /* array of ChainPosRuleSet tables  */
-};
-
-typedef struct HB_ChainContextPosFormat1_  HB_ChainContextPosFormat1;
-
-
-struct  HB_ChainPosClassRule_
-{
-  HB_UShort*            Backtrack;    /* array of backtrack classes      */
-  HB_UShort*            Input;        /* array of context classes        */
-  HB_UShort*            Lookahead;    /* array of lookahead classes      */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of substitution lookups   */
-  HB_UShort             BacktrackGlyphCount;
-				      /* total number of backtrack
-					 classes                         */
-  HB_UShort             InputGlyphCount;
-				      /* total number of context classes */
-  HB_UShort             LookaheadGlyphCount;
-				      /* total number of lookahead
-					 classes                         */
-  HB_UShort             PosCount;     /* number of PosLookupRecords      */
-};
-
-typedef struct HB_ChainPosClassRule_  HB_ChainPosClassRule;
-
-
-struct  HB_ChainPosClassSet_
-{
-  HB_UShort               ChainPosClassRuleCount;
-				      /* number of ChainPosClassRule
-					 tables                      */
-  HB_ChainPosClassRule*  ChainPosClassRule;
-				      /* array of ChainPosClassRule
-					 tables                      */
-};
-
-typedef struct HB_ChainPosClassSet_  HB_ChainPosClassSet;
-
-
-/* The `MaxXXXLength' fields are not defined in the TTO specification
-   but simplifies the implementation of this format.  It holds the
-   maximal context length used in the specific context rules.         */
-
-struct  HB_ChainContextPosFormat2_
-{
-  HB_Coverage           Coverage;    /* Coverage table             */
-
-  HB_UShort              MaxBacktrackLength;
-				      /* maximal backtrack length   */
-  HB_ClassDefinition    BacktrackClassDef;
-				      /* BacktrackClassDef table    */
-  HB_UShort              MaxInputLength;
-				      /* maximal input length       */
-  HB_ClassDefinition    InputClassDef;
-				      /* InputClassDef table        */
-  HB_UShort              MaxLookaheadLength;
-				      /* maximal lookahead length   */
-  HB_ClassDefinition    LookaheadClassDef;
-				      /* LookaheadClassDef table    */
-
-  HB_UShort              ChainPosClassSetCount;
-				      /* number of ChainPosClassSet
-					 tables                     */
-  HB_ChainPosClassSet*  ChainPosClassSet;
-				      /* array of ChainPosClassSet
-					 tables                     */
-};
-
-typedef struct HB_ChainContextPosFormat2_  HB_ChainContextPosFormat2;
-
-
-struct  HB_ChainContextPosFormat3_
-{
-  HB_UShort             BacktrackGlyphCount;
-				      /* number of backtrack glyphs    */
-  HB_Coverage*         BacktrackCoverage;
-				      /* array of backtrack Coverage
-					 tables                        */
-  HB_UShort             InputGlyphCount;
-				      /* number of input glyphs        */
-  HB_Coverage*         InputCoverage;
-				      /* array of input coverage
-					 tables                        */
-  HB_UShort             LookaheadGlyphCount;
-				      /* number of lookahead glyphs    */
-  HB_Coverage*         LookaheadCoverage;
-				      /* array of lookahead coverage
-					 tables                        */
-  HB_UShort             PosCount;     /* number of PosLookupRecords    */
-  HB_PosLookupRecord*  PosLookupRecord;
-				      /* array of substitution lookups */
-};
-
-typedef struct HB_ChainContextPosFormat3_  HB_ChainContextPosFormat3;
-
-
-struct  HB_ChainContextPos_
-{
-  HB_Byte  PosFormat;               /* 1, 2, or 3 */
-
-  union
-  {
-    HB_ChainContextPosFormat1  ccpf1;
-    HB_ChainContextPosFormat2  ccpf2;
-    HB_ChainContextPosFormat3  ccpf3;
-  } ccpf;
-};
-
-typedef struct HB_ChainContextPos_  HB_ChainContextPos;
-
-
-#if 0
-/* LookupType 10 */
-struct HB_ExtensionPos_
-{
-  HB_UShort      PosFormat;           /* always 1 */
-  HB_UShort      LookuptType;         /* lookup-type of referenced subtable */
-  HB_GPOS_SubTable *subtable;         /* referenced subtable */
-};
-
-typedef struct HB_ExtensionPos_  HB_ExtensionPos;
-#endif
-
-
-union  HB_GPOS_SubTable_
-{
-  HB_SinglePos        single;
-  HB_PairPos          pair;
-  HB_CursivePos       cursive;
-  HB_MarkBasePos      markbase;
-  HB_MarkLigPos       marklig;
-  HB_MarkMarkPos      markmark;
-  HB_ContextPos       context;
-  HB_ChainContextPos  chain;
-};
-
-typedef union HB_GPOS_SubTable_  HB_GPOS_SubTable;
-
-
-
-HB_INTERNAL HB_Error
-_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st,
-				  HB_Stream     stream,
-				  HB_UShort     lookup_type );
-
-HB_INTERNAL void
-_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st,
-			      HB_UShort     lookup_type );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GPOS_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-gpos.c b/src/hb-old/harfbuzz-gpos.c
deleted file mode 100644
index e969a01..0000000
--- a/src/hb-old/harfbuzz-gpos.c
+++ /dev/null
@@ -1,6094 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- * Copyright (C) 2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gpos-private.h"
-#include "harfbuzz-open-private.h"
-#include "harfbuzz-gdef-private.h"
-#include "harfbuzz-shaper.h"
-
-struct  GPOS_Instance_
-{
-  HB_GPOSHeader*  gpos;
-  HB_Font          font;
-  HB_Bool          dvi;
-  HB_UShort        load_flags;  /* how the glyph should be loaded */
-  HB_Bool          r2l;
-
-  HB_UShort        last;        /* the last valid glyph -- used
-				   with cursive positioning     */
-  HB_Fixed           anchor_x;    /* the coordinates of the anchor point */
-  HB_Fixed           anchor_y;    /* of the last valid glyph             */
-};
-
-typedef struct GPOS_Instance_  GPOS_Instance;
-
-
-static HB_Error  GPOS_Do_Glyph_Lookup( GPOS_Instance*    gpi,
-				       HB_UShort         lookup_index,
-				       HB_Buffer        buffer,
-				       HB_UShort         context_length,
-				       int               nesting_level );
-
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-/* the client application must replace this with something more
-   meaningful if multiple master fonts are to be supported.     */
-
-static HB_Error  default_mmfunc( HB_Font      font,
-				 HB_UShort    metric_id,
-				 HB_Fixed*      metric_value,
-				 void*        data )
-{
-  HB_UNUSED(font);
-  HB_UNUSED(metric_id);
-  HB_UNUSED(metric_value);
-  HB_UNUSED(data);
-  return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-}
-#endif
-
-
-
-HB_Error  HB_Load_GPOS_Table( HB_Stream stream, 
-			      HB_GPOSHeader** retptr,
-			      HB_GDEFHeader*  gdef,
-			      HB_Stream       gdefStream )
-{
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_GPOSHeader*  gpos;
-
-  HB_Error   error;
-
-
-  if ( !retptr )
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( GOTO_Table( TTAG_GPOS ) )
-    return error;
-
-  base_offset = FILE_Pos();
-
-  if ( ALLOC ( gpos, sizeof( *gpos ) ) )
-    return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  gpos->mmfunc = default_mmfunc;
-#endif
-
-  /* skip version */
-
-  if ( FILE_Seek( base_offset + 4L ) ||
-       ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_ScriptList( &gpos->ScriptList,
-				  stream ) ) != HB_Err_Ok )
-    goto Fail4;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_FeatureList( &gpos->FeatureList,
-				   stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_LookupList( &gpos->LookupList,
-				  stream, HB_Type_GPOS ) ) != HB_Err_Ok )
-    goto Fail2;
-
-  gpos->gdef = gdef;      /* can be NULL */
-
-  if ( ( error =  _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream,
-								     gpos->LookupList.Lookup,
-								     gpos->LookupList.LookupCount ) ) )
-    goto Fail1;
-
-  *retptr = gpos;
-
-  return HB_Err_Ok;
-
-Fail1:
-  _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS );
-
-Fail2:
-  _HB_OPEN_Free_FeatureList( &gpos->FeatureList );
-
-Fail3:
-  _HB_OPEN_Free_ScriptList( &gpos->ScriptList );
-
-Fail4:
-  FREE( gpos );
-
-  return error;
-}
-
-
-HB_Error  HB_Done_GPOS_Table( HB_GPOSHeader* gpos )
-{
-  _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS );
-  _HB_OPEN_Free_FeatureList( &gpos->FeatureList );
-  _HB_OPEN_Free_ScriptList( &gpos->ScriptList );
-
-  FREE( gpos );
-
-  return HB_Err_Ok;
-}
-
-
-/*****************************
- * SubTable related functions
- *****************************/
-
-/* shared tables */
-
-/* ValueRecord */
-
-/* There is a subtle difference in the specs between a `table' and a
-   `record' -- offsets for device tables in ValueRecords are taken from
-   the parent table and not the parent record.                          */
-
-static HB_Error  Load_ValueRecord( HB_ValueRecord*  vr,
-				   HB_UShort         format,
-				   HB_UInt          base_offset,
-				   HB_Stream         stream )
-{
-  HB_Error  error;
-
-  HB_UInt cur_offset, new_offset;
-
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    vr->XPlacement = GET_Short();
-
-    FORGET_Frame();
-  }
-  else
-    vr->XPlacement = 0;
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    vr->YPlacement = GET_Short();
-
-    FORGET_Frame();
-  }
-  else
-    vr->YPlacement = 0;
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    vr->XAdvance = GET_Short();
-
-    FORGET_Frame();
-  }
-  else
-    vr->XAdvance = 0;
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    vr->YAdvance = GET_Short();
-
-    FORGET_Frame();
-  }
-  else
-    vr->YAdvance = 0;
-
-  if ( format & HB_GPOS_FORMAT_HAVE_DEVICE_TABLES )
-  {
-    if ( ALLOC_ARRAY( vr->DeviceTables, 4, HB_Device ) )
-      return error;
-    vr->DeviceTables[VR_X_ADVANCE_DEVICE] = 0;
-    vr->DeviceTables[VR_Y_ADVANCE_DEVICE] = 0;
-    vr->DeviceTables[VR_X_PLACEMENT_DEVICE] = 0;
-    vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] = 0;
-  }
-  else
-  {
-    vr->DeviceTables = 0;
-  }
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail4;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_PLACEMENT_DEVICE],
-				  stream ) ) != HB_Err_Ok )
-       goto Fail4;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail3;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_PLACEMENT_DEVICE],
-				  stream ) ) != HB_Err_Ok )
-	goto Fail3;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_X_ADVANCE_DEVICE],
-				  stream ) ) != HB_Err_Ok )
-	goto Fail2;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &vr->DeviceTables[VR_Y_ADVANCE_DEVICE],
-				  stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    vr->XIdPlacement = GET_UShort();
-#else
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-  }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  else
-    vr->XIdPlacement = 0;
-#endif
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    vr->YIdPlacement = GET_UShort();
-#else
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-  }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  else
-    vr->YIdPlacement = 0;
-#endif
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    vr->XIdAdvance = GET_UShort();
-#else
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-  }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  else
-    vr->XIdAdvance = 0;
-#endif
-
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    vr->YIdAdvance = GET_UShort();
-#else
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-  }
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  else
-    vr->YIdAdvance = 0;
-#endif
-
-  return HB_Err_Ok;
-
-Fail1:
-  if ( vr->DeviceTables )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] );
-
-Fail2:
-  if ( vr->DeviceTables )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] );
-
-Fail3:
-  if ( vr->DeviceTables )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] );
-
-Fail4:
-  FREE( vr->DeviceTables );
-  return error;
-}
-
-
-static void  Free_ValueRecord( HB_ValueRecord*  vr,
-			       HB_UShort         format )
-{
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE] );
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE] );
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE] );
-  if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
-    _HB_OPEN_Free_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE] );
-  FREE( vr->DeviceTables );
-}
-
-
-static HB_Error  Get_ValueRecord( GPOS_Instance*    gpi,
-				  HB_ValueRecord*  vr,
-				  HB_UShort         format,
-				  HB_Position      gd )
-{
-  HB_Short         pixel_value;
-  HB_Error         error = HB_Err_Ok;
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_Fixed           value;
-#endif
-
-  HB_UShort  x_ppem, y_ppem;
-  HB_16Dot16   x_scale, y_scale;
-
-
-  if ( !format )
-    return HB_Err_Ok;
-
-  x_ppem  = gpi->font->x_ppem;
-  y_ppem  = gpi->font->y_ppem;
-  x_scale = gpi->font->x_scale;
-  y_scale = gpi->font->y_scale;
-
-  /* design units -> fractional pixel */
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT )
-    gd->x_pos += x_scale * vr->XPlacement / 0x10000;
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT )
-    gd->y_pos += y_scale * vr->YPlacement / 0x10000;
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE )
-    gd->x_advance += x_scale * vr->XAdvance / 0x10000;
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE )
-    gd->y_advance += y_scale * vr->YAdvance / 0x10000;
-
-  if ( !gpi->dvi )
-  {
-    /* pixel -> fractional pixel */
-
-    if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE )
-    {
-      _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_PLACEMENT_DEVICE], x_ppem, &pixel_value );
-      gd->x_pos += pixel_value << 6;
-    }
-    if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE )
-    {
-      _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_PLACEMENT_DEVICE], y_ppem, &pixel_value );
-      gd->y_pos += pixel_value << 6;
-    }
-    if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE )
-    {
-      _HB_OPEN_Get_Device( vr->DeviceTables[VR_X_ADVANCE_DEVICE], x_ppem, &pixel_value );
-      gd->x_advance += pixel_value << 6;
-    }
-    if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE )
-    {
-      _HB_OPEN_Get_Device( vr->DeviceTables[VR_Y_ADVANCE_DEVICE], y_ppem, &pixel_value );
-      gd->y_advance += pixel_value << 6;
-    }
-  }
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  /* values returned from mmfunc() are already in fractional pixels */
-
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT )
-  {
-    error = (gpos->mmfunc)( gpi->font, vr->XIdPlacement,
-			    &value, gpos->data );
-    if ( error )
-      return error;
-    gd->x_pos += value;
-  }
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT )
-  {
-    error = (gpos->mmfunc)( gpi->font, vr->YIdPlacement,
-			    &value, gpos->data );
-    if ( error )
-      return error;
-    gd->y_pos += value;
-  }
-  if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE )
-  {
-    error = (gpos->mmfunc)( gpi->font, vr->XIdAdvance,
-			    &value, gpos->data );
-    if ( error )
-      return error;
-    gd->x_advance += value;
-  }
-  if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE )
-  {
-    error = (gpos->mmfunc)( gpi->font, vr->YIdAdvance,
-			    &value, gpos->data );
-    if ( error )
-      return error;
-    gd->y_advance += value;
-  }
-#endif
-
-  return error;
-}
-
-
-/* AnchorFormat1 */
-/* AnchorFormat2 */
-/* AnchorFormat3 */
-/* AnchorFormat4 */
-
-static HB_Error  Load_Anchor( HB_Anchor*  an,
-			      HB_Stream    stream )
-{
-  HB_Error  error;
-
-  HB_UInt cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  an->PosFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( an->PosFormat )
-  {
-  case 1:
-    if ( ACCESS_Frame( 4L ) )
-      return error;
-
-    an->af.af1.XCoordinate = GET_Short();
-    an->af.af1.YCoordinate = GET_Short();
-
-    FORGET_Frame();
-    break;
-
-  case 2:
-    if ( ACCESS_Frame( 6L ) )
-      return error;
-
-    an->af.af2.XCoordinate = GET_Short();
-    an->af.af2.YCoordinate = GET_Short();
-    an->af.af2.AnchorPoint = GET_UShort();
-
-    FORGET_Frame();
-    break;
-
-  case 3:
-    if ( ACCESS_Frame( 6L ) )
-      return error;
-
-    an->af.af3.XCoordinate = GET_Short();
-    an->af.af3.YCoordinate = GET_Short();
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) )
-        return error;
-
-      an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0;
-      an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0;
-
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE],
-				  stream ) ) != HB_Err_Ok )
-	goto Fail2;
-      (void)FILE_Seek( cur_offset );
-    }
-
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      if ( !an->af.af3.DeviceTables )
-      {
-        if ( ALLOC_ARRAY( an->af.af3.DeviceTables, 2, HB_Device ) )
-          return error;
-
-        an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] = 0;
-        an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] = 0;
-      }
-
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = _HB_OPEN_Load_Device( &an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE],
-				  stream ) ) != HB_Err_Ok )
-	goto Fail;
-      (void)FILE_Seek( cur_offset );
-    }
-    break;
-
-  case 4:
-    if ( ACCESS_Frame( 4L ) )
-      return error;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    an->af.af4.XIdAnchor = GET_UShort();
-    an->af.af4.YIdAnchor = GET_UShort();
-#else
-    (void) GET_UShort();
-    (void) GET_UShort();
-#endif
-
-    FORGET_Frame();
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  if ( an->af.af3.DeviceTables )
-    _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] );
-
-Fail2:
-  FREE( an->af.af3.DeviceTables );
-  return error;
-}
-
-
-static void  Free_Anchor( HB_Anchor*  an)
-{
-  if ( an->PosFormat == 3 && an->af.af3.DeviceTables )
-  {
-    _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE] );
-    _HB_OPEN_Free_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE] );
-    FREE( an->af.af3.DeviceTables );
-  }
-}
-
-
-static HB_Error  Get_Anchor( GPOS_Instance*   gpi,
-			     HB_Anchor*      an,
-			     HB_UShort        glyph_index,
-			     HB_Fixed*          x_value,
-			     HB_Fixed*          y_value )
-{
-  HB_Error  error = HB_Err_Ok;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  HB_GPOSHeader*  gpos = gpi->gpos;
-#endif
-  HB_UShort        ap;
-
-  HB_Short         pixel_value;
-
-  HB_UShort        x_ppem, y_ppem;
-  HB_16Dot16         x_scale, y_scale;
-
-
-  x_ppem  = gpi->font->x_ppem;
-  y_ppem  = gpi->font->y_ppem;
-  x_scale = gpi->font->x_scale;
-  y_scale = gpi->font->y_scale;
-
-  switch ( an->PosFormat )
-  {
-  case 0:
-    /* The special case of an empty AnchorTable */
-  default:
-
-    return HB_Err_Not_Covered;
-
-  case 1:
-    *x_value = x_scale * an->af.af1.XCoordinate / 0x10000;
-    *y_value = y_scale * an->af.af1.YCoordinate / 0x10000;
-    break;
-
-  case 2:
-    if ( !gpi->dvi )
-    {
-      hb_uint32 n_points = 0;
-      ap = an->af.af2.AnchorPoint;
-      if (!gpi->font->klass->getPointInOutline)
-          goto no_contour_point;
-      error = gpi->font->klass->getPointInOutline(gpi->font, glyph_index, gpi->load_flags, ap, x_value, y_value, &n_points);
-      if (error)
-          return error;
-      /* if n_points is set to zero, we use the design coordinate value pair.
-       * This can happen e.g. for sbit glyphs. */
-      if (!n_points)
-          goto no_contour_point;
-    }
-    else
-    {
-    no_contour_point:
-      *x_value = x_scale * an->af.af3.XCoordinate / 0x10000;
-      *y_value = y_scale * an->af.af3.YCoordinate / 0x10000;
-    }
-    break;
-
-  case 3:
-    if ( !gpi->dvi )
-    {
-      _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_X_DEVICE_TABLE], x_ppem, &pixel_value );
-      *x_value = pixel_value << 6;
-      _HB_OPEN_Get_Device( an->af.af3.DeviceTables[AF3_Y_DEVICE_TABLE], y_ppem, &pixel_value );
-      *y_value = pixel_value << 6;
-    }
-    else
-      *x_value = *y_value = 0;
-
-    *x_value += x_scale * an->af.af3.XCoordinate / 0x10000;
-    *y_value += y_scale * an->af.af3.YCoordinate / 0x10000;
-    break;
-
-  case 4:
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-    error = (gpos->mmfunc)( gpi->font, an->af.af4.XIdAnchor,
-			    x_value, gpos->data );
-    if ( error )
-      return error;
-
-    error = (gpos->mmfunc)( gpi->font, an->af.af4.YIdAnchor,
-			    y_value, gpos->data );
-    if ( error )
-      return error;
-    break;
-#else
-    return ERR(HB_Err_Not_Covered);
-#endif
-  }
-
-  return error;
-}
-
-
-/* MarkArray */
-
-static HB_Error  Load_MarkArray ( HB_MarkArray*  ma,
-				  HB_Stream       stream )
-{
-  HB_Error  error;
-
-  HB_UShort        n, m, count;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_MarkRecord*  mr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ma->MarkCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ma->MarkRecord = NULL;
-
-  if ( ALLOC_ARRAY( ma->MarkRecord, count, HB_MarkRecord ) )
-    return error;
-
-  mr = ma->MarkRecord;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 4L ) )
-      goto Fail;
-
-    mr[n].Class = GET_UShort();
-    new_offset  = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_Anchor( &mr[n].MarkAnchor, stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_Anchor( &mr[m].MarkAnchor );
-
-  FREE( mr );
-  return error;
-}
-
-
-static void  Free_MarkArray( HB_MarkArray*  ma )
-{
-  HB_UShort        n, count;
-
-  HB_MarkRecord*  mr;
-
-
-  if ( ma->MarkRecord )
-  {
-    count = ma->MarkCount;
-    mr    = ma->MarkRecord;
-
-    for ( n = 0; n < count; n++ )
-      Free_Anchor( &mr[n].MarkAnchor );
-
-    FREE( mr );
-  }
-}
-
-
-/* LookupType 1 */
-
-/* SinglePosFormat1 */
-/* SinglePosFormat2 */
-
-static HB_Error  Load_SinglePos( HB_GPOS_SubTable* st,
-				 HB_Stream       stream )
-{
-  HB_Error  error;
-  HB_SinglePos*   sp = &st->single;
-
-  HB_UShort         n, m, count, format;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_ValueRecord*  vr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 6L ) )
-    return error;
-
-  sp->PosFormat = GET_UShort();
-  new_offset    = GET_UShort() + base_offset;
-
-  format = sp->ValueFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( !format )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &sp->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  switch ( sp->PosFormat )
-  {
-  case 1:
-    error = Load_ValueRecord( &sp->spf.spf1.Value, format,
-			      base_offset, stream );
-    if ( error )
-      goto Fail2;
-    break;
-
-  case 2:
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    count = sp->spf.spf2.ValueCount = GET_UShort();
-
-    FORGET_Frame();
-
-    sp->spf.spf2.Value = NULL;
-
-    if ( ALLOC_ARRAY( sp->spf.spf2.Value, count, HB_ValueRecord ) )
-      goto Fail2;
-
-    vr = sp->spf.spf2.Value;
-
-    for ( n = 0; n < count; n++ )
-    {
-      error = Load_ValueRecord( &vr[n], format, base_offset, stream );
-      if ( error )
-	goto Fail1;
-    }
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_ValueRecord( &vr[m], format );
-
-  FREE( vr );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &sp->Coverage );
-  return error;
-}
-
-
-static void  Free_SinglePos( HB_GPOS_SubTable* st )
-{
-  HB_UShort         n, count, format;
-  HB_SinglePos*   sp = &st->single;
-
-  HB_ValueRecord*  v;
-
-
-  format = sp->ValueFormat;
-
-  switch ( sp->PosFormat )
-  {
-  case 1:
-    Free_ValueRecord( &sp->spf.spf1.Value, format );
-    break;
-
-  case 2:
-    if ( sp->spf.spf2.Value )
-    {
-      count = sp->spf.spf2.ValueCount;
-      v     = sp->spf.spf2.Value;
-
-      for ( n = 0; n < count; n++ )
-	Free_ValueRecord( &v[n], format );
-
-      FREE( v );
-    }
-    break;
-  default:
-    break;
-  }
-
-  _HB_OPEN_Free_Coverage( &sp->Coverage );
-}
-
-static HB_Error  Lookup_SinglePos( GPOS_Instance*    gpi,
-				   HB_GPOS_SubTable* st,
-				   HB_Buffer        buffer,
-				   HB_UShort         flags,
-				   HB_UShort         context_length,
-				   int               nesting_level )
-{
-  HB_UShort        index, property;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_SinglePos*   sp = &st->single;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &sp->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  switch ( sp->PosFormat )
-  {
-  case 1:
-    error = Get_ValueRecord( gpi, &sp->spf.spf1.Value,
-			     sp->ValueFormat, POSITION( buffer->in_pos ) );
-    if ( error )
-      return error;
-    break;
-
-  case 2:
-    if ( index >= sp->spf.spf2.ValueCount )
-      return ERR(HB_Err_Invalid_SubTable);
-    error = Get_ValueRecord( gpi, &sp->spf.spf2.Value[index],
-			     sp->ValueFormat, POSITION( buffer->in_pos ) );
-    if ( error )
-      return error;
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable);
-  }
-
-  (buffer->in_pos)++;
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 2 */
-
-/* PairSet */
-
-static HB_Error  Load_PairSet ( HB_PairSet*  ps,
-				HB_UShort     format1,
-				HB_UShort     format2,
-				HB_Stream     stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, m, count;
-  HB_UInt              base_offset;
-
-  HB_PairValueRecord*  pvr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ps->PairValueCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ps->PairValueRecord = NULL;
-
-  if ( ALLOC_ARRAY( ps->PairValueRecord, count, HB_PairValueRecord ) )
-    return error;
-
-  pvr = ps->PairValueRecord;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    pvr[n].SecondGlyph = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( format1 )
-    {
-      error = Load_ValueRecord( &pvr[n].Value1, format1,
-				base_offset, stream );
-      if ( error )
-	goto Fail;
-    }
-    if ( format2 )
-    {
-      error = Load_ValueRecord( &pvr[n].Value2, format2,
-				base_offset, stream );
-      if ( error )
-      {
-	if ( format1 )
-	  Free_ValueRecord( &pvr[n].Value1, format1 );
-	goto Fail;
-      }
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-  {
-    if ( format1 )
-      Free_ValueRecord( &pvr[m].Value1, format1 );
-    if ( format2 )
-      Free_ValueRecord( &pvr[m].Value2, format2 );
-  }
-
-  FREE( pvr );
-  return error;
-}
-
-
-static void  Free_PairSet( HB_PairSet*  ps,
-			   HB_UShort     format1,
-			   HB_UShort     format2 )
-{
-  HB_UShort             n, count;
-
-  HB_PairValueRecord*  pvr;
-
-
-  if ( ps->PairValueRecord )
-  {
-    count = ps->PairValueCount;
-    pvr   = ps->PairValueRecord;
-
-    for ( n = 0; n < count; n++ )
-    {
-      if ( format1 )
-	Free_ValueRecord( &pvr[n].Value1, format1 );
-      if ( format2 )
-	Free_ValueRecord( &pvr[n].Value2, format2 );
-    }
-
-    FREE( pvr );
-  }
-}
-
-
-/* PairPosFormat1 */
-
-static HB_Error  Load_PairPos1( HB_PairPosFormat1*  ppf1,
-				HB_UShort            format1,
-				HB_UShort            format2,
-				HB_Stream            stream )
-{
-  HB_Error  error;
-
-  HB_UShort     n, m, count;
-  HB_UInt      cur_offset, new_offset, base_offset;
-
-  HB_PairSet*  ps;
-
-
-  base_offset = FILE_Pos() - 8L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ppf1->PairSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ppf1->PairSet = NULL;
-
-  if ( ALLOC_ARRAY( ppf1->PairSet, count, HB_PairSet ) )
-    return error;
-
-  ps = ppf1->PairSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_PairSet( &ps[n], format1,
-				 format2, stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_PairSet( &ps[m], format1, format2 );
-
-  FREE( ps );
-  return error;
-}
-
-
-static void  Free_PairPos1( HB_PairPosFormat1*  ppf1,
-			    HB_UShort            format1,
-			    HB_UShort            format2 )
-{
-  HB_UShort     n, count;
-
-  HB_PairSet*  ps;
-
-
-  if ( ppf1->PairSet )
-  {
-    count = ppf1->PairSetCount;
-    ps    = ppf1->PairSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_PairSet( &ps[n], format1, format2 );
-
-    FREE( ps );
-  }
-}
-
-
-/* PairPosFormat2 */
-
-static HB_Error  Load_PairPos2( HB_PairPosFormat2*  ppf2,
-				HB_UShort            format1,
-				HB_UShort            format2,
-				HB_Stream            stream )
-{
-  HB_Error  error;
-
-  HB_UShort          m, n, k, count1, count2;
-  HB_UInt           cur_offset, new_offset1, new_offset2, base_offset;
-
-  HB_Class1Record*  c1r;
-  HB_Class2Record*  c2r;
-
-
-  base_offset = FILE_Pos() - 8L;
-
-  if ( ACCESS_Frame( 8L ) )
-    return error;
-
-  new_offset1 = GET_UShort() + base_offset;
-  new_offset2 = GET_UShort() + base_offset;
-
-  /* `Class1Count' and `Class2Count' are the upper limits for class
-     values, thus we read it now to make additional safety checks.  */
-
-  count1 = ppf2->Class1Count = GET_UShort();
-  count2 = ppf2->Class2Count = GET_UShort();
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset1 ) ||
-       ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef1, count1,
-				       stream ) ) != HB_Err_Ok )
-    return error;
-  if ( FILE_Seek( new_offset2 ) ||
-       ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef2, count2,
-				       stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  ppf2->Class1Record = NULL;
-
-  if ( ALLOC_ARRAY( ppf2->Class1Record, count1, HB_Class1Record ) )
-    goto Fail2;
-
-  c1r = ppf2->Class1Record;
-
-  for ( m = 0; m < count1; m++ )
-  {
-    c1r[m].Class2Record = NULL;
-
-    if ( ALLOC_ARRAY( c1r[m].Class2Record, count2, HB_Class2Record ) )
-      goto Fail1;
-
-    c2r = c1r[m].Class2Record;
-
-    for ( n = 0; n < count2; n++ )
-    {
-      if ( format1 )
-      {
-	error = Load_ValueRecord( &c2r[n].Value1, format1,
-				  base_offset, stream );
-	if ( error )
-	  goto Fail0;
-      }
-      if ( format2 )
-      {
-	error = Load_ValueRecord( &c2r[n].Value2, format2,
-				  base_offset, stream );
-	if ( error )
-	{
-	  if ( format1 )
-	    Free_ValueRecord( &c2r[n].Value1, format1 );
-	  goto Fail0;
-	}
-      }
-    }
-
-    continue;
-
-  Fail0:
-    for ( k = 0; k < n; k++ )
-    {
-      if ( format1 )
-	Free_ValueRecord( &c2r[k].Value1, format1 );
-      if ( format2 )
-	Free_ValueRecord( &c2r[k].Value2, format2 );
-    }
-    goto Fail1;
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( k = 0; k < m; k++ )
-  {
-    c2r = c1r[k].Class2Record;
-
-    for ( n = 0; n < count2; n++ )
-    {
-      if ( format1 )
-	Free_ValueRecord( &c2r[n].Value1, format1 );
-      if ( format2 )
-	Free_ValueRecord( &c2r[n].Value2, format2 );
-    }
-
-    FREE( c2r );
-  }
-
-  FREE( c1r );
-Fail2:
-
-  _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 );
-
-Fail3:
-  _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 );
-  return error;
-}
-
-
-static void  Free_PairPos2( HB_PairPosFormat2*  ppf2,
-			    HB_UShort            format1,
-			    HB_UShort            format2)
-{
-  HB_UShort          m, n, count1, count2;
-
-  HB_Class1Record*  c1r;
-  HB_Class2Record*  c2r;
-
-
-  if ( ppf2->Class1Record )
-  {
-    c1r    = ppf2->Class1Record;
-    count1 = ppf2->Class1Count;
-    count2 = ppf2->Class2Count;
-
-    for ( m = 0; m < count1; m++ )
-    {
-      c2r = c1r[m].Class2Record;
-
-      for ( n = 0; n < count2; n++ )
-      {
-	if ( format1 )
-	  Free_ValueRecord( &c2r[n].Value1, format1 );
-	if ( format2 )
-	  Free_ValueRecord( &c2r[n].Value2, format2 );
-      }
-
-      FREE( c2r );
-    }
-
-    FREE( c1r );
-
-    _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 );
-    _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 );
-  }
-}
-
-
-static HB_Error  Load_PairPos( HB_GPOS_SubTable* st,
-			       HB_Stream     stream )
-{
-  HB_Error  error;
-  HB_PairPos*     pp = &st->pair;
-
-  HB_UShort         format1, format2;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 8L ) )
-    return error;
-
-  pp->PosFormat = GET_UShort();
-  new_offset    = GET_UShort() + base_offset;
-
-  format1 = pp->ValueFormat1 = GET_UShort();
-  format2 = pp->ValueFormat2 = GET_UShort();
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &pp->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  switch ( pp->PosFormat )
-  {
-  case 1:
-    error = Load_PairPos1( &pp->ppf.ppf1, format1, format2, stream );
-    if ( error )
-      goto Fail;
-    break;
-
-  case 2:
-    error = Load_PairPos2( &pp->ppf.ppf2, format1, format2, stream );
-    if ( error )
-      goto Fail;
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  _HB_OPEN_Free_Coverage( &pp->Coverage );
-  return error;
-}
-
-
-static void  Free_PairPos( HB_GPOS_SubTable* st )
-{
-  HB_UShort  format1, format2;
-  HB_PairPos*     pp = &st->pair;
-
-
-  format1 = pp->ValueFormat1;
-  format2 = pp->ValueFormat2;
-
-  switch ( pp->PosFormat )
-  {
-  case 1:
-    Free_PairPos1( &pp->ppf.ppf1, format1, format2 );
-    break;
-
-  case 2:
-    Free_PairPos2( &pp->ppf.ppf2, format1, format2 );
-    break;
-
-  default:
-    break;
-  }
-
-  _HB_OPEN_Free_Coverage( &pp->Coverage );
-}
-
-
-static HB_Error  Lookup_PairPos1( GPOS_Instance*       gpi,
-				  HB_PairPosFormat1*  ppf1,
-				  HB_Buffer           buffer,
-				  HB_UInt              first_pos,
-				  HB_UShort            index,
-				  HB_UShort            format1,
-				  HB_UShort            format2 )
-{
-  HB_Error              error;
-  HB_UShort             numpvr, glyph2;
-
-  HB_PairValueRecord*  pvr;
-
-
-  if ( index >= ppf1->PairSetCount )
-     return ERR(HB_Err_Invalid_SubTable);
-
-  pvr = ppf1->PairSet[index].PairValueRecord;
-  if ( !pvr )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  glyph2 = IN_CURGLYPH();
-
-  for ( numpvr = ppf1->PairSet[index].PairValueCount;
-	numpvr;
-	numpvr--, pvr++ )
-  {
-    if ( glyph2 == pvr->SecondGlyph )
-    {
-      error = Get_ValueRecord( gpi, &pvr->Value1, format1,
-			       POSITION( first_pos ) );
-      if ( error )
-	return error;
-      return Get_ValueRecord( gpi, &pvr->Value2, format2,
-			      POSITION( buffer->in_pos ) );
-    }
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Lookup_PairPos2( GPOS_Instance*       gpi,
-				  HB_PairPosFormat2*  ppf2,
-				  HB_Buffer           buffer,
-				  HB_UInt              first_pos,
-				  HB_UShort            format1,
-				  HB_UShort            format2 )
-{
-  HB_Error           error;
-  HB_UShort          cl1 = 0, cl2 = 0; /* shut compiler up */
-
-  HB_Class1Record*  c1r;
-  HB_Class2Record*  c2r;
-
-
-  error = _HB_OPEN_Get_Class( &ppf2->ClassDef1, IN_GLYPH( first_pos ),
-		     &cl1, NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    return error;
-  error = _HB_OPEN_Get_Class( &ppf2->ClassDef2, IN_CURGLYPH(),
-		     &cl2, NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    return error;
-
-  c1r = &ppf2->Class1Record[cl1];
-  if ( !c1r )
-    return ERR(HB_Err_Invalid_SubTable);
-  c2r = &c1r->Class2Record[cl2];
-
-  error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) );
-  if ( error )
-    return error;
-  return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) );
-}
-
-
-static HB_Error  Lookup_PairPos( GPOS_Instance*    gpi,
-				 HB_GPOS_SubTable* st,
-				 HB_Buffer        buffer,
-				 HB_UShort         flags,
-				 HB_UShort         context_length,
-				 int               nesting_level )
-{
-  HB_Error         error;
-  HB_UShort        index, property;
-  HB_UInt          first_pos;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_PairPos*     pp = &st->pair;
-
-  HB_UNUSED(nesting_level);
-
-  if ( buffer->in_pos >= buffer->in_length - 1 )
-    return HB_Err_Not_Covered;           /* Not enough glyphs in stream */
-
-  if ( context_length != 0xFFFF && context_length < 2 )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &pp->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  /* second glyph */
-
-  first_pos = buffer->in_pos;
-  (buffer->in_pos)++;
-
-  while ( CHECK_Property( gpos->gdef, IN_CURITEM(),
-			  flags, &property ) )
-  {
-    if ( error && error != HB_Err_Not_Covered )
-      return error;
-
-    if ( buffer->in_pos == buffer->in_length )
-      {
-	buffer->in_pos = first_pos;
-        return HB_Err_Not_Covered;
-      }
-    (buffer->in_pos)++;
-
-  }
-
-  switch ( pp->PosFormat )
-  {
-  case 1:
-    error = Lookup_PairPos1( gpi, &pp->ppf.ppf1, buffer,
-			     first_pos, index,
-			     pp->ValueFormat1, pp->ValueFormat2 );
-    break;
-
-  case 2:
-    error = Lookup_PairPos2( gpi, &pp->ppf.ppf2, buffer, first_pos,
-			     pp->ValueFormat1, pp->ValueFormat2 );
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  /* if we don't have coverage for the second glyph don't skip it for
-     further lookups but reset in_pos back to the first_glyph and let
-     the caller in Do_String_Lookup increment in_pos */
-  if ( error == HB_Err_Not_Covered )
-      buffer->in_pos = first_pos;
-
-  /* adjusting the `next' glyph */
-
-  if ( pp->ValueFormat2 )
-    (buffer->in_pos)++;
-
-  return error;
-}
-
-
-/* LookupType 3 */
-
-/* CursivePosFormat1 */
-
-static HB_Error  Load_CursivePos( HB_GPOS_SubTable* st,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-  HB_CursivePos*  cp = &st->cursive;
-
-  HB_UShort             n, m, count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_EntryExitRecord*  eer;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  cp->PosFormat = GET_UShort();
-  new_offset    = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &cp->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = cp->EntryExitCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cp->EntryExitRecord = NULL;
-
-  if ( ALLOC_ARRAY( cp->EntryExitRecord, count, HB_EntryExitRecord ) )
-    goto Fail2;
-
-  eer = cp->EntryExitRecord;
-
-  for ( n = 0; n < count; n++ )
-  {
-    HB_UInt entry_offset;
-
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    entry_offset = new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_Anchor( &eer[n].EntryAnchor,
-				  stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-      eer[n].EntryAnchor.PosFormat   = 0;
-
-    if ( ACCESS_Frame( 2L ) )
-      return error;
-
-    new_offset = GET_UShort();
-
-    FORGET_Frame();
-
-    if ( new_offset )
-    {
-      new_offset += base_offset;
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_Anchor( &eer[n].ExitAnchor,
-				  stream ) ) != HB_Err_Ok )
-      {
-	if ( entry_offset )
-	  Free_Anchor( &eer[n].EntryAnchor );
-	goto Fail1;
-      }
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-      eer[n].ExitAnchor.PosFormat   = 0;
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-  {
-    Free_Anchor( &eer[m].EntryAnchor );
-    Free_Anchor( &eer[m].ExitAnchor );
-  }
-
-  FREE( eer );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &cp->Coverage );
-  return error;
-}
-
-
-static void  Free_CursivePos( HB_GPOS_SubTable* st )
-{
-  HB_UShort             n, count;
-  HB_CursivePos*  cp = &st->cursive;
-
-  HB_EntryExitRecord*  eer;
-
-
-  if ( cp->EntryExitRecord )
-  {
-    count = cp->EntryExitCount;
-    eer   = cp->EntryExitRecord;
-
-    for ( n = 0; n < count; n++ )
-    {
-      Free_Anchor( &eer[n].EntryAnchor );
-      Free_Anchor( &eer[n].ExitAnchor );
-    }
-
-    FREE( eer );
-  }
-
-  _HB_OPEN_Free_Coverage( &cp->Coverage );
-}
-
-
-static HB_Error  Lookup_CursivePos( GPOS_Instance*    gpi,
-				    HB_GPOS_SubTable* st,
-				    HB_Buffer        buffer,
-				    HB_UShort         flags,
-				    HB_UShort         context_length,
-				    int               nesting_level )
-{
-  HB_UShort        index, property;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_CursivePos*  cp = &st->cursive;
-
-  HB_EntryExitRecord*  eer;
-  HB_Fixed                entry_x, entry_y;
-  HB_Fixed                exit_x, exit_y;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-  {
-    gpi->last = 0xFFFF;
-    return HB_Err_Not_Covered;
-  }
-
-  /* Glyphs not having the right GDEF properties will be ignored, i.e.,
-     gpi->last won't be reset (contrary to user defined properties). */
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  /* We don't handle mark glyphs here.  According to Andrei, this isn't
-     possible, but who knows...                                         */
-
-  if ( property == HB_GDEF_MARK )
-  {
-    gpi->last = 0xFFFF;
-    return HB_Err_Not_Covered;
-  }
-
-  error = _HB_OPEN_Coverage_Index( &cp->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-  {
-    gpi->last = 0xFFFF;
-    return error;
-  }
-
-  if ( index >= cp->EntryExitCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  eer = &cp->EntryExitRecord[index];
-
-  /* Now comes the messiest part of the whole OpenType
-     specification.  At first glance, cursive connections seem easy
-     to understand, but there are pitfalls!  The reason is that
-     the specs don't mention how to compute the advance values
-     resp. glyph offsets.  I was told it would be an omission, to
-     be fixed in the next OpenType version...  Again many thanks to
-     Andrei Burago <andreib at microsoft.com> for clarifications.
-
-     Consider the following example:
-
-		      |  xadv1    |
-		       +---------+
-		       |         |
-		 +-----+--+ 1    |
-		 |     | .|      |
-		 |    0+--+------+
-		 |   2    |
-		 |        |
-		0+--------+
-		|  xadv2   |
-
-       glyph1: advance width = 12
-	       anchor point = (3,1)
-
-       glyph2: advance width = 11
-	       anchor point = (9,4)
-
-       LSB is 1 for both glyphs (so the boxes drawn above are glyph
-       bboxes).  Writing direction is R2L; `0' denotes the glyph's
-       coordinate origin.
-
-     Now the surprising part: The advance width of the *left* glyph
-     (resp. of the *bottom* glyph) will be modified, no matter
-     whether the writing direction is L2R or R2L (resp. T2B or
-     B2T)!  This assymetry is caused by the fact that the glyph's
-     coordinate origin is always the lower left corner for all
-     writing directions.
-
-     Continuing the above example, we can compute the new
-     (horizontal) advance width of glyph2 as
-
-       9 - 3 = 6  ,
-
-     and the new vertical offset of glyph2 as
-
-       1 - 4 = -3  .
-
-
-     Vertical writing direction is far more complicated:
-
-     a) Assuming that we recompute the advance height of the lower glyph:
-
-				  --
-		       +---------+
-	      --       |         |
-		 +-----+--+ 1    | yadv1
-		 |     | .|      |
-	   yadv2 |    0+--+------+        -- BSB1  --
-		 |   2    |       --      --        y_offset
-		 |        |
-   BSB2 --      0+--------+                        --
-	--    --
-
-       glyph1: advance height = 6
-	       anchor point = (3,1)
-
-       glyph2: advance height = 7
-	       anchor point = (9,4)
-
-       TSB is 1 for both glyphs; writing direction is T2B.
-
-
-	 BSB1     = yadv1 - (TSB1 + ymax1)
-	 BSB2     = yadv2 - (TSB2 + ymax2)
-	 y_offset = y2 - y1
-
-       vertical advance width of glyph2
-	 = y_offset + BSB2 - BSB1
-	 = (y2 - y1) + (yadv2 - (TSB2 + ymax2)) - (yadv1 - (TSB1 + ymax1))
-	 = y2 - y1 + yadv2 - TSB2 - ymax2 - (yadv1 - TSB1 - ymax1)
-	 = y2 - y1 + yadv2 - TSB2 - ymax2 - yadv1 + TSB1 + ymax1
-
-
-     b) Assuming that we recompute the advance height of the upper glyph:
-
-				  --      --
-		       +---------+        -- TSB1
-	--    --       |         |
-   TSB2 --       +-----+--+ 1    | yadv1   ymax1
-		 |     | .|      |
-	   yadv2 |    0+--+------+        --       --
-    ymax2        |   2    |       --                y_offset
-		 |        |
-	--      0+--------+                        --
-	      --
-
-       glyph1: advance height = 6
-	       anchor point = (3,1)
-
-       glyph2: advance height = 7
-	       anchor point = (9,4)
-
-       TSB is 1 for both glyphs; writing direction is T2B.
-
-       y_offset = y2 - y1
-
-       vertical advance width of glyph2
-	 = TSB1 + ymax1 + y_offset - (TSB2 + ymax2)
-	 = TSB1 + ymax1 + y2 - y1 - TSB2 - ymax2
-
-
-     Comparing a) with b) shows that b) is easier to compute.  I'll wait
-     for a reply from Andrei to see what should really be implemented...
-
-     Since horizontal advance widths or vertical advance heights
-     can be used alone but not together, no ambiguity occurs.        */
-
-  if ( gpi->last == 0xFFFF )
-    goto end;
-
-  /* Get_Anchor() returns HB_Err_Not_Covered if there is no anchor
-     table.                                                         */
-
-  error = Get_Anchor( gpi, &eer->EntryAnchor, IN_CURGLYPH(),
-		      &entry_x, &entry_y );
-  if ( error == HB_Err_Not_Covered )
-    goto end;
-  if ( error )
-    return error;
-
-  if ( gpi->r2l )
-  {
-    POSITION( buffer->in_pos )->x_advance   = entry_x - gpi->anchor_x;
-    POSITION( buffer->in_pos )->new_advance = TRUE;
-  }
-  else
-  {
-    POSITION( gpi->last )->x_advance   = gpi->anchor_x - entry_x;
-    POSITION( gpi->last )->new_advance = TRUE;
-  }
-
-  if ( flags & HB_LOOKUP_FLAG_RIGHT_TO_LEFT )
-  {
-    POSITION( gpi->last )->cursive_chain = gpi->last - buffer->in_pos;
-    POSITION( gpi->last )->y_pos = entry_y - gpi->anchor_y;
-  }
-  else
-  {
-    POSITION( buffer->in_pos )->cursive_chain = buffer->in_pos - gpi->last;
-    POSITION( buffer->in_pos )->y_pos = gpi->anchor_y - entry_y;
-  }
-
-end:
-  error = Get_Anchor( gpi, &eer->ExitAnchor, IN_CURGLYPH(),
-		      &exit_x, &exit_y );
-  if ( error == HB_Err_Not_Covered )
-    gpi->last = 0xFFFF;
-  else
-  {
-    gpi->last     = buffer->in_pos;
-    gpi->anchor_x = exit_x;
-    gpi->anchor_y = exit_y;
-  }
-  if ( error )
-    return error;
-
-  (buffer->in_pos)++;
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 4 */
-
-/* BaseArray */
-
-static HB_Error  Load_BaseArray( HB_BaseArray*  ba,
-				 HB_UShort       num_classes,
-				 HB_Stream       stream )
-{
-  HB_Error  error;
-
-  HB_UShort       m, n, count;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_BaseRecord  *br;
-  HB_Anchor      *ban, *bans;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ba->BaseCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ba->BaseRecord = NULL;
-
-  if ( ALLOC_ARRAY( ba->BaseRecord, count, HB_BaseRecord ) )
-    return error;
-
-  br = ba->BaseRecord;
-
-  bans = NULL;
-
-  if ( ALLOC_ARRAY( bans, count * num_classes, HB_Anchor ) )
-    goto Fail;
-
-  for ( m = 0; m < count; m++ )
-  {
-    br[m].BaseAnchor = NULL;
-
-    ban = br[m].BaseAnchor = bans + m * num_classes;
-
-    for ( n = 0; n < num_classes; n++ )
-    {
-      if ( ACCESS_Frame( 2L ) )
-	goto Fail;
-
-      new_offset = GET_UShort() + base_offset;
-
-      FORGET_Frame();
-
-      if (new_offset == base_offset) {
-	/* XXX
-	 * Doulos SIL Regular is buggy and has zero offsets here.
-	 * Skip it
-	 */
-	ban[n].PosFormat = 0;
-	continue;
-      }
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_Anchor( &ban[n], stream ) ) != HB_Err_Ok )
-	goto Fail;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  FREE( bans );
-  FREE( br );
-  return error;
-}
-
-
-static void  Free_BaseArray( HB_BaseArray*  ba,
-			     HB_UShort       num_classes )
-{
-  HB_BaseRecord  *br;
-  HB_Anchor      *bans;
-
-  if ( ba->BaseRecord )
-  {
-    br    = ba->BaseRecord;
-
-    if ( ba->BaseCount )
-    {
-      HB_UShort i, count;
-      count = num_classes * ba->BaseCount;
-      bans = br[0].BaseAnchor;
-      for (i = 0; i < count; i++)
-        Free_Anchor (&bans[i]);
-      FREE( bans );
-    }
-
-    FREE( br );
-  }
-}
-
-
-/* MarkBasePosFormat1 */
-
-static HB_Error  Load_MarkBasePos( HB_GPOS_SubTable* st,
-				   HB_Stream         stream )
-{
-  HB_Error  error;
-  HB_MarkBasePos* mbp = &st->markbase;
-
-  HB_UInt  cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  mbp->PosFormat = GET_UShort();
-  new_offset     = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  if (mbp->PosFormat != 1)
-    return ERR(HB_Err_Invalid_SubTable_Format);
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mbp->MarkCoverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mbp->BaseCoverage, stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 4L ) )
-    goto Fail2;
-
-  mbp->ClassCount = GET_UShort();
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_MarkArray( &mbp->MarkArray, stream ) ) != HB_Err_Ok )
-    goto Fail2;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail1;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_BaseArray( &mbp->BaseArray, mbp->ClassCount,
-				 stream ) ) != HB_Err_Ok )
-    goto Fail1;
-
-  return HB_Err_Ok;
-
-Fail1:
-  Free_MarkArray( &mbp->MarkArray );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &mbp->BaseCoverage );
-
-Fail3:
-  _HB_OPEN_Free_Coverage( &mbp->MarkCoverage );
-  return error;
-}
-
-
-static void  Free_MarkBasePos( HB_GPOS_SubTable* st )
-{
-  HB_MarkBasePos* mbp = &st->markbase;
-
-  Free_BaseArray( &mbp->BaseArray, mbp->ClassCount );
-  Free_MarkArray( &mbp->MarkArray );
-  _HB_OPEN_Free_Coverage( &mbp->BaseCoverage );
-  _HB_OPEN_Free_Coverage( &mbp->MarkCoverage );
-}
-
-
-static HB_Error  Lookup_MarkBasePos( GPOS_Instance*    gpi,
-				     HB_GPOS_SubTable* st,
-				     HB_Buffer        buffer,
-				     HB_UShort         flags,
-				     HB_UShort         context_length,
-				     int               nesting_level )
-{
-  HB_UShort        i, j, mark_index, base_index, property, class;
-  HB_Fixed           x_mark_value, y_mark_value, x_base_value, y_base_value;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_MarkBasePos* mbp = &st->markbase;
-
-  HB_MarkArray*   ma;
-  HB_BaseArray*   ba;
-  HB_BaseRecord*  br;
-  HB_Anchor*      mark_anchor;
-  HB_Anchor*      base_anchor;
-
-  HB_Position     o;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( flags & HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(),
-		       flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &mbp->MarkCoverage, IN_CURGLYPH(),
-			  &mark_index );
-  if ( error )
-    return error;
-
-  /* now we search backwards for a non-mark glyph */
-
-  i = 1;
-  j = buffer->in_pos - 1;
-
-  while ( i <= buffer->in_pos )
-  {
-    error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
-					&property );
-    if ( error )
-      return error;
-
-    if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
-      break;
-
-    i++;
-    j--;
-  }
-
-  /* The following assertion is too strong -- at least for mangal.ttf. */
-#if 0
-  if ( property != HB_GDEF_BASE_GLYPH )
-    return HB_Err_Not_Covered;
-#endif
-
-  if ( i > buffer->in_pos )
-    return HB_Err_Not_Covered;
-
-  error = _HB_OPEN_Coverage_Index( &mbp->BaseCoverage, IN_GLYPH( j ),
-			  &base_index );
-  if ( error )
-    return error;
-
-  ma = &mbp->MarkArray;
-
-  if ( mark_index >= ma->MarkCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  class       = ma->MarkRecord[mark_index].Class;
-  mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor;
-
-  if ( class >= mbp->ClassCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  ba = &mbp->BaseArray;
-
-  if ( base_index >= ba->BaseCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  br          = &ba->BaseRecord[base_index];
-  base_anchor = &br->BaseAnchor[class];
-
-  error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(),
-		      &x_mark_value, &y_mark_value );
-  if ( error )
-    return error;
-
-  error = Get_Anchor( gpi, base_anchor, IN_GLYPH( j ),
-		      &x_base_value, &y_base_value );
-  if ( error )
-    return error;
-
-  /* anchor points are not cumulative */
-
-  o = POSITION( buffer->in_pos );
-
-  o->x_pos     = x_base_value - x_mark_value;
-  o->y_pos     = y_base_value - y_mark_value;
-  o->x_advance = 0;
-  o->y_advance = 0;
-  o->back      = i;
-
-  (buffer->in_pos)++;
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 5 */
-
-/* LigatureAttach */
-
-static HB_Error  Load_LigatureAttach( HB_LigatureAttach*  lat,
-				      HB_UShort            num_classes,
-				      HB_Stream            stream )
-{
-  HB_Error  error;
-
-  HB_UShort             m, n, k, count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_ComponentRecord*  cr;
-  HB_Anchor*           lan;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = lat->ComponentCount = GET_UShort();
-
-  FORGET_Frame();
-
-  lat->ComponentRecord = NULL;
-
-  if ( ALLOC_ARRAY( lat->ComponentRecord, count, HB_ComponentRecord ) )
-    return error;
-
-  cr = lat->ComponentRecord;
-
-  for ( m = 0; m < count; m++ )
-  {
-    cr[m].LigatureAnchor = NULL;
-
-    if ( ALLOC_ARRAY( cr[m].LigatureAnchor, num_classes, HB_Anchor ) )
-      goto Fail;
-
-    lan = cr[m].LigatureAnchor;
-
-    for ( n = 0; n < num_classes; n++ )
-    {
-      if ( ACCESS_Frame( 2L ) )
-	goto Fail0;
-
-      new_offset = GET_UShort();
-
-      FORGET_Frame();
-
-      if ( new_offset )
-      {
-	new_offset += base_offset;
-
-	cur_offset = FILE_Pos();
-	if ( FILE_Seek( new_offset ) ||
-	     ( error = Load_Anchor( &lan[n], stream ) ) != HB_Err_Ok )
-	  goto Fail0;
-	(void)FILE_Seek( cur_offset );
-      }
-      else
-	lan[n].PosFormat = 0;
-    }
-
-    continue;
-  Fail0:
-    for ( k = 0; k < n; k++ )
-      Free_Anchor( &lan[k] );
-    goto Fail;
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( k = 0; k < m; k++ )
-  {
-    lan = cr[k].LigatureAnchor;
-
-    for ( n = 0; n < num_classes; n++ )
-      Free_Anchor( &lan[n] );
-
-    FREE( lan );
-  }
-
-  FREE( cr );
-  return error;
-}
-
-
-static void  Free_LigatureAttach( HB_LigatureAttach*  lat,
-				  HB_UShort            num_classes )
-{
-  HB_UShort        m, n, count;
-
-  HB_ComponentRecord*  cr;
-  HB_Anchor*           lan;
-
-
-  if ( lat->ComponentRecord )
-  {
-    count = lat->ComponentCount;
-    cr    = lat->ComponentRecord;
-
-    for ( m = 0; m < count; m++ )
-    {
-      lan = cr[m].LigatureAnchor;
-
-      for ( n = 0; n < num_classes; n++ )
-	Free_Anchor( &lan[n] );
-
-      FREE( lan );
-    }
-
-    FREE( cr );
-  }
-}
-
-
-/* LigatureArray */
-
-static HB_Error  Load_LigatureArray( HB_LigatureArray*  la,
-				     HB_UShort           num_classes,
-				     HB_Stream           stream )
-{
-  HB_Error  error;
-
-  HB_UShort            n, m, count;
-  HB_UInt             cur_offset, new_offset, base_offset;
-
-  HB_LigatureAttach*  lat;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = la->LigatureCount = GET_UShort();
-
-  FORGET_Frame();
-
-  la->LigatureAttach = NULL;
-
-  if ( ALLOC_ARRAY( la->LigatureAttach, count, HB_LigatureAttach ) )
-    return error;
-
-  lat = la->LigatureAttach;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LigatureAttach( &lat[n], num_classes,
-					stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_LigatureAttach( &lat[m], num_classes );
-
-  FREE( lat );
-  return error;
-}
-
-
-static void  Free_LigatureArray( HB_LigatureArray*  la,
-				 HB_UShort           num_classes )
-{
-  HB_UShort            n, count;
-
-  HB_LigatureAttach*  lat;
-
-
-  if ( la->LigatureAttach )
-  {
-    count = la->LigatureCount;
-    lat   = la->LigatureAttach;
-
-    for ( n = 0; n < count; n++ )
-      Free_LigatureAttach( &lat[n], num_classes );
-
-    FREE( lat );
-  }
-}
-
-
-/* MarkLigPosFormat1 */
-
-static HB_Error  Load_MarkLigPos( HB_GPOS_SubTable* st,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-  HB_MarkLigPos*  mlp = &st->marklig;
-
-  HB_UInt  cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  mlp->PosFormat = GET_UShort();
-  new_offset     = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mlp->MarkCoverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mlp->LigatureCoverage,
-				stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 4L ) )
-    goto Fail2;
-
-  mlp->ClassCount = GET_UShort();
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_MarkArray( &mlp->MarkArray, stream ) ) != HB_Err_Ok )
-    goto Fail2;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail1;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_LigatureArray( &mlp->LigatureArray, mlp->ClassCount,
-				     stream ) ) != HB_Err_Ok )
-    goto Fail1;
-
-  return HB_Err_Ok;
-
-Fail1:
-  Free_MarkArray( &mlp->MarkArray );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage );
-
-Fail3:
-  _HB_OPEN_Free_Coverage( &mlp->MarkCoverage );
-  return error;
-}
-
-
-static void  Free_MarkLigPos( HB_GPOS_SubTable* st)
-{
-  HB_MarkLigPos*  mlp = &st->marklig;
-
-  Free_LigatureArray( &mlp->LigatureArray, mlp->ClassCount );
-  Free_MarkArray( &mlp->MarkArray );
-  _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage );
-  _HB_OPEN_Free_Coverage( &mlp->MarkCoverage );
-}
-
-
-static HB_Error  Lookup_MarkLigPos( GPOS_Instance*    gpi,
-				    HB_GPOS_SubTable* st,
-				    HB_Buffer        buffer,
-				    HB_UShort         flags,
-				    HB_UShort         context_length,
-				    int               nesting_level )
-{
-  HB_UShort        i, j, mark_index, lig_index, property, class;
-  HB_UShort        mark_glyph;
-  HB_Fixed           x_mark_value, y_mark_value, x_lig_value, y_lig_value;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_MarkLigPos*  mlp = &st->marklig;
-
-  HB_MarkArray*        ma;
-  HB_LigatureArray*    la;
-  HB_LigatureAttach*   lat;
-  HB_ComponentRecord*  cr;
-  HB_UShort             comp_index;
-  HB_Anchor*           mark_anchor;
-  HB_Anchor*           lig_anchor;
-
-  HB_Position    o;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( flags & HB_LOOKUP_FLAG_IGNORE_LIGATURES )
-    return HB_Err_Not_Covered;
-
-  mark_glyph = IN_CURGLYPH();
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &mlp->MarkCoverage, mark_glyph, &mark_index );
-  if ( error )
-    return error;
-
-  /* now we search backwards for a non-mark glyph */
-
-  i = 1;
-  j = buffer->in_pos - 1;
-
-  while ( i <= buffer->in_pos )
-  {
-    error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
-					&property );
-    if ( error )
-      return error;
-
-    if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
-      break;
-
-    i++;
-    j--;
-  }
-
-  /* Similar to Lookup_MarkBasePos(), I suspect that this assertion is
-     too strong, thus it is commented out.                             */
-#if 0
-  if ( property != HB_GDEF_LIGATURE )
-    return HB_Err_Not_Covered;
-#endif
-
-  if ( i > buffer->in_pos )
-    return HB_Err_Not_Covered;
-
-  error = _HB_OPEN_Coverage_Index( &mlp->LigatureCoverage, IN_GLYPH( j ),
-			  &lig_index );
-  if ( error )
-    return error;
-
-  ma = &mlp->MarkArray;
-
-  if ( mark_index >= ma->MarkCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  class       = ma->MarkRecord[mark_index].Class;
-  mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor;
-
-  if ( class >= mlp->ClassCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  la = &mlp->LigatureArray;
-
-  if ( lig_index >= la->LigatureCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  lat = &la->LigatureAttach[lig_index];
-
-  /* We must now check whether the ligature ID of the current mark glyph
-     is identical to the ligature ID of the found ligature.  If yes, we
-     can directly use the component index.  If not, we attach the mark
-     glyph to the last component of the ligature.                        */
-
-  if ( IN_LIGID( j ) == IN_LIGID( buffer->in_pos) )
-  {
-    comp_index = IN_COMPONENT( buffer->in_pos );
-    if ( comp_index >= lat->ComponentCount )
-      return HB_Err_Not_Covered;
-  }
-  else
-    comp_index = lat->ComponentCount - 1;
-
-  cr         = &lat->ComponentRecord[comp_index];
-  lig_anchor = &cr->LigatureAnchor[class];
-
-  error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(),
-		      &x_mark_value, &y_mark_value );
-  if ( error )
-    return error;
-  error = Get_Anchor( gpi, lig_anchor, IN_GLYPH( j ),
-		      &x_lig_value, &y_lig_value );
-  if ( error )
-    return error;
-
-  /* anchor points are not cumulative */
-
-  o = POSITION( buffer->in_pos );
-
-  o->x_pos     = x_lig_value - x_mark_value;
-  o->y_pos     = y_lig_value - y_mark_value;
-  o->x_advance = 0;
-  o->y_advance = 0;
-  o->back      = i;
-
-  (buffer->in_pos)++;
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 6 */
-
-/* Mark2Array */
-
-static HB_Error  Load_Mark2Array( HB_Mark2Array*  m2a,
-				  HB_UShort        num_classes,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-
-  HB_UShort        m, n, count;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_Mark2Record  *m2r;
-  HB_Anchor       *m2an, *m2ans;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = m2a->Mark2Count = GET_UShort();
-
-  FORGET_Frame();
-
-  m2a->Mark2Record = NULL;
-
-  if ( ALLOC_ARRAY( m2a->Mark2Record, count, HB_Mark2Record ) )
-    return error;
-
-  m2r = m2a->Mark2Record;
-
-  m2ans = NULL;
-
-  if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) )
-    goto Fail;
-
-  for ( m = 0; m < count; m++ )
-  {
-    m2an = m2r[m].Mark2Anchor = m2ans + m * num_classes;
-
-    for ( n = 0; n < num_classes; n++ )
-    {
-      if ( ACCESS_Frame( 2L ) )
-	goto Fail;
-
-      new_offset = GET_UShort() + base_offset;
-
-      FORGET_Frame();
-
-      if (new_offset == base_offset) {
-        /* Anchor table not provided.  Skip loading.
-	 * Some versions of FreeSans hit this. */
-        m2an[n].PosFormat = 0;
-	continue;
-      }
-
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_Anchor( &m2an[n], stream ) ) != HB_Err_Ok )
-	goto Fail;
-      (void)FILE_Seek( cur_offset );
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  FREE( m2ans );
-  FREE( m2r );
-  return error;
-}
-
-
-static void  Free_Mark2Array( HB_Mark2Array*  m2a,
-			      HB_UShort        num_classes )
-{
-  HB_Mark2Record  *m2r;
-  HB_Anchor       *m2ans;
-
-  HB_UNUSED(num_classes);
-
-  if ( m2a->Mark2Record )
-  {
-    m2r   = m2a->Mark2Record;
-
-    if ( m2a->Mark2Count )
-    {
-      m2ans = m2r[0].Mark2Anchor;
-      FREE( m2ans );
-    }
-
-    FREE( m2r );
-  }
-}
-
-
-/* MarkMarkPosFormat1 */
-
-static HB_Error  Load_MarkMarkPos( HB_GPOS_SubTable* st,
-				   HB_Stream         stream )
-{
-  HB_Error  error;
-  HB_MarkMarkPos* mmp = &st->markmark;
-
-  HB_UInt  cur_offset, new_offset, base_offset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  mmp->PosFormat = GET_UShort();
-  new_offset     = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mmp->Mark1Coverage,
-				stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &mmp->Mark2Coverage,
-				stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 4L ) )
-    goto Fail2;
-
-  mmp->ClassCount = GET_UShort();
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_MarkArray( &mmp->Mark1Array, stream ) ) != HB_Err_Ok )
-    goto Fail2;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail1;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = Load_Mark2Array( &mmp->Mark2Array, mmp->ClassCount,
-				  stream ) ) != HB_Err_Ok )
-    goto Fail1;
-
-  return HB_Err_Ok;
-
-Fail1:
-  Free_MarkArray( &mmp->Mark1Array );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage );
-
-Fail3:
-  _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage );
-  return error;
-}
-
-
-static void  Free_MarkMarkPos( HB_GPOS_SubTable* st)
-{
-  HB_MarkMarkPos* mmp = &st->markmark;
-
-  Free_Mark2Array( &mmp->Mark2Array, mmp->ClassCount );
-  Free_MarkArray( &mmp->Mark1Array );
-  _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage );
-  _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage );
-}
-
-
-static HB_Error  Lookup_MarkMarkPos( GPOS_Instance*    gpi,
-				     HB_GPOS_SubTable* st,
-				     HB_Buffer        buffer,
-				     HB_UShort         flags,
-				     HB_UShort         context_length,
-				     int               nesting_level )
-{
-  HB_UShort        i, j, mark1_index, mark2_index, property, class;
-  HB_Fixed           x_mark1_value, y_mark1_value,
-		   x_mark2_value, y_mark2_value;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-  HB_MarkMarkPos* mmp = &st->markmark;
-
-  HB_MarkArray*    ma1;
-  HB_Mark2Array*   ma2;
-  HB_Mark2Record*  m2r;
-  HB_Anchor*       mark1_anchor;
-  HB_Anchor*       mark2_anchor;
-
-  HB_Position    o;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( flags & HB_LOOKUP_FLAG_IGNORE_MARKS )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gpos->gdef, IN_CURITEM(),
-		       flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &mmp->Mark1Coverage, IN_CURGLYPH(),
-			  &mark1_index );
-  if ( error )
-    return error;
-
-  /* now we search backwards for a suitable mark glyph until a non-mark
-     glyph                                                */
-
-  if ( buffer->in_pos == 0 )
-    return HB_Err_Not_Covered;
-
-  i = 1;
-  j = buffer->in_pos - 1;
-  while ( i <= buffer->in_pos )
-  {
-    error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
-					&property );
-    if ( error )
-      return error;
-
-    if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
-      return HB_Err_Not_Covered;
-
-    if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
-    {
-      if ( property == (flags & 0xFF00) )
-        break;
-    }
-    else
-      break;
-
-    i++;
-    j--;
-  }
-
-  if ( i > buffer->in_pos )
-    return HB_Err_Not_Covered;
-
-  error = _HB_OPEN_Coverage_Index( &mmp->Mark2Coverage, IN_GLYPH( j ),
-			  &mark2_index );
-  if ( error )
-    return error;
-
-  ma1 = &mmp->Mark1Array;
-
-  if ( mark1_index >= ma1->MarkCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  class        = ma1->MarkRecord[mark1_index].Class;
-  mark1_anchor = &ma1->MarkRecord[mark1_index].MarkAnchor;
-
-  if ( class >= mmp->ClassCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  ma2 = &mmp->Mark2Array;
-
-  if ( mark2_index >= ma2->Mark2Count )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  m2r          = &ma2->Mark2Record[mark2_index];
-  mark2_anchor = &m2r->Mark2Anchor[class];
-
-  error = Get_Anchor( gpi, mark1_anchor, IN_CURGLYPH(),
-		      &x_mark1_value, &y_mark1_value );
-  if ( error )
-    return error;
-  error = Get_Anchor( gpi, mark2_anchor, IN_GLYPH( j ),
-		      &x_mark2_value, &y_mark2_value );
-  if ( error )
-    return error;
-
-  /* anchor points are not cumulative */
-
-  o = POSITION( buffer->in_pos );
-
-  o->x_pos     = x_mark2_value - x_mark1_value;
-  o->y_pos     = y_mark2_value - y_mark1_value;
-  o->x_advance = 0;
-  o->y_advance = 0;
-  o->back      = 1;
-
-  (buffer->in_pos)++;
-
-  return HB_Err_Ok;
-}
-
-
-/* Do the actual positioning for a context positioning (either format
-   7 or 8).  This is only called after we've determined that the stream
-   matches the subrule.                                                 */
-
-static HB_Error  Do_ContextPos( GPOS_Instance*        gpi,
-				HB_UShort             GlyphCount,
-				HB_UShort             PosCount,
-				HB_PosLookupRecord*  pos,
-				HB_Buffer            buffer,
-				int                   nesting_level )
-{
-  HB_Error  error;
-  HB_UInt   i, old_pos;
-
-
-  i = 0;
-
-  while ( i < GlyphCount )
-  {
-    if ( PosCount && i == pos->SequenceIndex )
-    {
-      old_pos = buffer->in_pos;
-
-      /* Do a positioning */
-
-      error = GPOS_Do_Glyph_Lookup( gpi, pos->LookupListIndex, buffer,
-				    GlyphCount, nesting_level );
-
-      if ( error )
-	return error;
-
-      pos++;
-      PosCount--;
-      i += buffer->in_pos - old_pos;
-    }
-    else
-    {
-      i++;
-      (buffer->in_pos)++;
-    }
-  }
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 7 */
-
-/* PosRule */
-
-static HB_Error  Load_PosRule( HB_PosRule*  pr,
-			       HB_Stream     stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, count;
-  HB_UShort*            i;
-
-  HB_PosLookupRecord*  plr;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  pr->GlyphCount = GET_UShort();
-  pr->PosCount   = GET_UShort();
-
-  FORGET_Frame();
-
-  pr->Input = NULL;
-
-  count = pr->GlyphCount - 1;         /* only GlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( pr->Input, count, HB_UShort ) )
-    return error;
-
-  i = pr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  pr->PosLookupRecord = NULL;
-
-  count = pr->PosCount;
-
-  if ( ALLOC_ARRAY( pr->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = pr->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  FREE( i );
-  return error;
-}
-
-
-static void  Free_PosRule( HB_PosRule*  pr )
-{
-  FREE( pr->PosLookupRecord );
-  FREE( pr->Input );
-}
-
-
-/* PosRuleSet */
-
-static HB_Error  Load_PosRuleSet( HB_PosRuleSet*  prs,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-
-  HB_UShort     n, m, count;
-  HB_UInt      cur_offset, new_offset, base_offset;
-
-  HB_PosRule*  pr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = prs->PosRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  prs->PosRule = NULL;
-
-  if ( ALLOC_ARRAY( prs->PosRule, count, HB_PosRule ) )
-    return error;
-
-  pr = prs->PosRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_PosRule( &pr[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_PosRule( &pr[m] );
-
-  FREE( pr );
-  return error;
-}
-
-
-static void  Free_PosRuleSet( HB_PosRuleSet*  prs )
-{
-  HB_UShort     n, count;
-
-  HB_PosRule*  pr;
-
-
-  if ( prs->PosRule )
-  {
-    count = prs->PosRuleCount;
-    pr    = prs->PosRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_PosRule( &pr[n] );
-
-    FREE( pr );
-  }
-}
-
-
-/* ContextPosFormat1 */
-
-static HB_Error  Load_ContextPos1( HB_ContextPosFormat1*  cpf1,
-				   HB_Stream               stream )
-{
-  HB_Error  error;
-
-  HB_UShort        n, m, count;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_PosRuleSet*  prs;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &cpf1->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = cpf1->PosRuleSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpf1->PosRuleSet = NULL;
-
-  if ( ALLOC_ARRAY( cpf1->PosRuleSet, count, HB_PosRuleSet ) )
-    goto Fail2;
-
-  prs = cpf1->PosRuleSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_PosRuleSet( &prs[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_PosRuleSet( &prs[m] );
-
-  FREE( prs );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &cpf1->Coverage );
-  return error;
-}
-
-
-static void  Free_ContextPos1( HB_ContextPosFormat1*  cpf1 )
-{
-  HB_UShort        n, count;
-
-  HB_PosRuleSet*  prs;
-
-
-  if ( cpf1->PosRuleSet )
-  {
-    count = cpf1->PosRuleSetCount;
-    prs   = cpf1->PosRuleSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_PosRuleSet( &prs[n] );
-
-    FREE( prs );
-  }
-
-  _HB_OPEN_Free_Coverage( &cpf1->Coverage );
-}
-
-
-/* PosClassRule */
-
-static HB_Error  Load_PosClassRule( HB_ContextPosFormat2*  cpf2,
-				    HB_PosClassRule*       pcr,
-				    HB_Stream               stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, count;
-
-  HB_UShort*            c;
-  HB_PosLookupRecord*  plr;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  pcr->GlyphCount = GET_UShort();
-  pcr->PosCount   = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( pcr->GlyphCount > cpf2->MaxContextLength )
-    cpf2->MaxContextLength = pcr->GlyphCount;
-
-  pcr->Class = NULL;
-
-  count = pcr->GlyphCount - 1;        /* only GlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( pcr->Class, count, HB_UShort ) )
-    return error;
-
-  c = pcr->Class;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    c[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  pcr->PosLookupRecord = NULL;
-
-  count = pcr->PosCount;
-
-  if ( ALLOC_ARRAY( pcr->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = pcr->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  FREE( c );
-  return error;
-}
-
-
-static void  Free_PosClassRule( HB_PosClassRule*  pcr )
-{
-  FREE( pcr->PosLookupRecord );
-  FREE( pcr->Class );
-}
-
-
-/* PosClassSet */
-
-static HB_Error  Load_PosClassSet( HB_ContextPosFormat2*  cpf2,
-				   HB_PosClassSet*        pcs,
-				   HB_Stream               stream )
-{
-  HB_Error  error;
-
-  HB_UShort          n, m, count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_PosClassRule*  pcr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = pcs->PosClassRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  pcs->PosClassRule = NULL;
-
-  if ( ALLOC_ARRAY( pcs->PosClassRule, count, HB_PosClassRule ) )
-    return error;
-
-  pcr = pcs->PosClassRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_PosClassRule( cpf2, &pcr[n],
-				      stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_PosClassRule( &pcr[m] );
-
-  FREE( pcr );
-  return error;
-}
-
-
-static void  Free_PosClassSet( HB_PosClassSet*  pcs )
-{
-  HB_UShort          n, count;
-
-  HB_PosClassRule*  pcr;
-
-
-  if ( pcs->PosClassRule )
-  {
-    count = pcs->PosClassRuleCount;
-    pcr   = pcs->PosClassRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_PosClassRule( &pcr[n] );
-
-    FREE( pcr );
-  }
-}
-
-
-/* ContextPosFormat2 */
-
-static HB_Error  Load_ContextPos2( HB_ContextPosFormat2*  cpf2,
-				   HB_Stream               stream )
-{
-  HB_Error  error;
-
-  HB_UShort         n, m, count;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_PosClassSet*  pcs;
-
-
-  base_offset = FILE_Pos() - 2;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &cpf2->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 4L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  /* `PosClassSetCount' is the upper limit for class values, thus we
-     read it now to make an additional safety check.                 */
-
-  count = cpf2->PosClassSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_ClassDefinition( &cpf2->ClassDef, count,
-				       stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  cpf2->PosClassSet      = NULL;
-  cpf2->MaxContextLength = 0;
-
-  if ( ALLOC_ARRAY( cpf2->PosClassSet, count, HB_PosClassSet ) )
-    goto Fail2;
-
-  pcs = cpf2->PosClassSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    if ( new_offset != base_offset )      /* not a NULL offset */
-    {
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_PosClassSet( cpf2, &pcs[n],
-				       stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-    {
-      /* we create a PosClassSet table with no entries */
-
-      cpf2->PosClassSet[n].PosClassRuleCount = 0;
-      cpf2->PosClassSet[n].PosClassRule      = NULL;
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; n++ )
-    Free_PosClassSet( &pcs[m] );
-
-  FREE( pcs );
-
-Fail2:
-  _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef );
-
-Fail3:
-  _HB_OPEN_Free_Coverage( &cpf2->Coverage );
-  return error;
-}
-
-
-static void  Free_ContextPos2( HB_ContextPosFormat2*  cpf2 )
-{
-  HB_UShort         n, count;
-
-  HB_PosClassSet*  pcs;
-
-
-  if ( cpf2->PosClassSet )
-  {
-    count = cpf2->PosClassSetCount;
-    pcs   = cpf2->PosClassSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_PosClassSet( &pcs[n] );
-
-    FREE( pcs );
-  }
-
-  _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef );
-  _HB_OPEN_Free_Coverage( &cpf2->Coverage );
-}
-
-
-/* ContextPosFormat3 */
-
-static HB_Error  Load_ContextPos3( HB_ContextPosFormat3*  cpf3,
-				   HB_Stream               stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_Coverage*         c;
-  HB_PosLookupRecord*  plr;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  cpf3->GlyphCount = GET_UShort();
-  cpf3->PosCount   = GET_UShort();
-
-  FORGET_Frame();
-
-  cpf3->Coverage = NULL;
-
-  count = cpf3->GlyphCount;
-
-  if ( ALLOC_ARRAY( cpf3->Coverage, count, HB_Coverage ) )
-    return error;
-
-  c = cpf3->Coverage;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  cpf3->PosLookupRecord = NULL;
-
-  count = cpf3->PosCount;
-
-  if ( ALLOC_ARRAY( cpf3->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = cpf3->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  for ( n = 0; n < count; n++ )
-    _HB_OPEN_Free_Coverage( &c[n] );
-
-  FREE( c );
-  return error;
-}
-
-
-static void  Free_ContextPos3( HB_ContextPosFormat3*  cpf3 )
-{
-  HB_UShort      n, count;
-
-  HB_Coverage*  c;
-
-
-  FREE( cpf3->PosLookupRecord );
-
-  if ( cpf3->Coverage )
-  {
-    count = cpf3->GlyphCount;
-    c     = cpf3->Coverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-}
-
-
-/* ContextPos */
-
-static HB_Error  Load_ContextPos( HB_GPOS_SubTable* st,
-				  HB_Stream        stream )
-{
-  HB_Error  error;
-  HB_ContextPos*   cp = &st->context;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cp->PosFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( cp->PosFormat )
-  {
-  case 1:
-    return Load_ContextPos1( &cp->cpf.cpf1, stream );
-
-  case 2:
-    return Load_ContextPos2( &cp->cpf.cpf2, stream );
-
-  case 3:
-    return Load_ContextPos3( &cp->cpf.cpf3, stream );
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-static void  Free_ContextPos( HB_GPOS_SubTable* st )
-{
-  HB_ContextPos*   cp = &st->context;
-
-  switch ( cp->PosFormat )
-  {
-  case 1:  Free_ContextPos1( &cp->cpf.cpf1 ); break;
-  case 2:  Free_ContextPos2( &cp->cpf.cpf2 ); break;
-  case 3:  Free_ContextPos3( &cp->cpf.cpf3 ); break;
-  default:					      break;
-  }
-}
-
-
-static HB_Error  Lookup_ContextPos1( GPOS_Instance*          gpi,
-				     HB_ContextPosFormat1*  cpf1,
-				     HB_Buffer              buffer,
-				     HB_UShort               flags,
-				     HB_UShort               context_length,
-				     int                     nesting_level )
-{
-  HB_UShort        index, property;
-  HB_UShort        i, j, k, numpr;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-
-  HB_PosRule*     pr;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &cpf1->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  pr    = cpf1->PosRuleSet[index].PosRule;
-  numpr = cpf1->PosRuleSet[index].PosRuleCount;
-
-  for ( k = 0; k < numpr; k++ )
-  {
-    if ( context_length != 0xFFFF && context_length < pr[k].GlyphCount )
-      goto next_posrule;
-
-    if ( buffer->in_pos + pr[k].GlyphCount > buffer->in_length )
-      goto next_posrule;                       /* context is too long */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < pr[k].GlyphCount; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + pr[k].GlyphCount - i == (HB_Int)buffer->in_length )
-	  goto next_posrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != pr[k].Input[i - 1] )
-	goto next_posrule;
-    }
-
-    return Do_ContextPos( gpi, pr[k].GlyphCount,
-			  pr[k].PosCount, pr[k].PosLookupRecord,
-			  buffer,
-			  nesting_level );
-
-    next_posrule:
-      ;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Lookup_ContextPos2( GPOS_Instance*          gpi,
-				     HB_ContextPosFormat2*  cpf2,
-				     HB_Buffer              buffer,
-				     HB_UShort               flags,
-				     HB_UShort               context_length,
-				     int                     nesting_level )
-{
-  HB_UShort          index, property;
-  HB_Error           error;
-  HB_UShort          i, j, k, known_classes;
-
-  HB_UShort*         classes;
-  HB_UShort*         cl;
-  HB_GPOSHeader*    gpos = gpi->gpos;
-
-  HB_PosClassSet*   pcs;
-  HB_PosClassRule*  pr;
-  HB_GDEFHeader*    gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  /* Note: The coverage table in format 2 doesn't give an index into
-	   anything.  It just lets us know whether or not we need to
-	   do any lookup at all.                                     */
-
-  error = _HB_OPEN_Coverage_Index( &cpf2->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if (cpf2->MaxContextLength < 1)
-    return HB_Err_Not_Covered;
-
-  if ( ALLOC_ARRAY( classes, cpf2->MaxContextLength, HB_UShort ) )
-    return error;
-
-  error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_CURGLYPH(),
-		     &classes[0], NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    goto End;
-  known_classes = 0;
-
-  pcs = &cpf2->PosClassSet[classes[0]];
-  if ( !pcs )
-  {
-    error = ERR(HB_Err_Invalid_SubTable);
-    goto End;
-  }
-
-  for ( k = 0; k < pcs->PosClassRuleCount; k++ )
-  {
-    pr = &pcs->PosClassRule[k];
-
-    if ( context_length != 0xFFFF && context_length < pr->GlyphCount )
-      goto next_posclassrule;
-
-    if ( buffer->in_pos + pr->GlyphCount > buffer->in_length )
-      goto next_posclassrule;                /* context is too long */
-
-    cl   = pr->Class;
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < pr->GlyphCount; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End;
-
-	if ( j + pr->GlyphCount - i == (HB_Int)buffer->in_length )
-	  goto next_posclassrule;
-	j++;
-      }
-
-      if ( i > known_classes )
-      {
-	/* Keeps us from having to do this for each rule */
-
-	error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End;
-	known_classes = i;
-      }
-
-      if ( cl[i - 1] != classes[i] )
-	goto next_posclassrule;
-    }
-
-    error = Do_ContextPos( gpi, pr->GlyphCount,
-			   pr->PosCount, pr->PosLookupRecord,
-			   buffer,
-			   nesting_level );
-    goto End;
-
-  next_posclassrule:
-    ;
-  }
-
-  error = HB_Err_Not_Covered;
-
-End:
-  FREE( classes );
-  return error;
-}
-
-
-static HB_Error  Lookup_ContextPos3( GPOS_Instance*          gpi,
-				     HB_ContextPosFormat3*  cpf3,
-				     HB_Buffer              buffer,
-				     HB_UShort               flags,
-				     HB_UShort               context_length,
-				     int                     nesting_level )
-{
-  HB_Error         error;
-  HB_UShort        index, i, j, property;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-
-  HB_Coverage*    c;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  if ( context_length != 0xFFFF && context_length < cpf3->GlyphCount )
-    return HB_Err_Not_Covered;
-
-  if ( buffer->in_pos + cpf3->GlyphCount > buffer->in_length )
-    return HB_Err_Not_Covered;         /* context is too long */
-
-  c    = cpf3->Coverage;
-
-  for ( i = 1, j = 1; i < cpf3->GlyphCount; i++, j++ )
-  {
-    while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + cpf3->GlyphCount - i == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  return Do_ContextPos( gpi, cpf3->GlyphCount,
-			cpf3->PosCount, cpf3->PosLookupRecord,
-			buffer,
-			nesting_level );
-}
-
-
-static HB_Error  Lookup_ContextPos( GPOS_Instance*    gpi,
-				    HB_GPOS_SubTable* st,
-				    HB_Buffer        buffer,
-				    HB_UShort         flags,
-				    HB_UShort         context_length,
-				    int               nesting_level )
-{
-  HB_ContextPos*   cp = &st->context;
-
-  switch ( cp->PosFormat )
-  {
-  case 1:
-    return Lookup_ContextPos1( gpi, &cp->cpf.cpf1, buffer,
-			       flags, context_length, nesting_level );
-
-  case 2:
-    return Lookup_ContextPos2( gpi, &cp->cpf.cpf2, buffer,
-			       flags, context_length, nesting_level );
-
-  case 3:
-    return Lookup_ContextPos3( gpi, &cp->cpf.cpf3, buffer,
-			       flags, context_length, nesting_level );
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-/* LookupType 8 */
-
-/* ChainPosRule */
-
-static HB_Error  Load_ChainPosRule( HB_ChainPosRule*  cpr,
-				    HB_Stream          stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, count;
-  HB_UShort*            b;
-  HB_UShort*            i;
-  HB_UShort*            l;
-
-  HB_PosLookupRecord*  plr;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cpr->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpr->Backtrack = NULL;
-
-  count = cpr->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( cpr->Backtrack, count, HB_UShort ) )
-    return error;
-
-  b = cpr->Backtrack;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail4;
-
-  for ( n = 0; n < count; n++ )
-    b[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  cpr->InputGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpr->Input = NULL;
-
-  count = cpr->InputGlyphCount - 1;  /* only InputGlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( cpr->Input, count, HB_UShort ) )
-    goto Fail4;
-
-  i = cpr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail3;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  cpr->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpr->Lookahead = NULL;
-
-  count = cpr->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( cpr->Lookahead, count, HB_UShort ) )
-    goto Fail3;
-
-  l = cpr->Lookahead;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    l[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  cpr->PosCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpr->PosLookupRecord = NULL;
-
-  count = cpr->PosCount;
-
-  if ( ALLOC_ARRAY( cpr->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = cpr->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  FREE( l );
-
-Fail3:
-  FREE( i );
-
-Fail4:
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainPosRule( HB_ChainPosRule*  cpr )
-{
-  FREE( cpr->PosLookupRecord );
-  FREE( cpr->Lookahead );
-  FREE( cpr->Input );
-  FREE( cpr->Backtrack );
-}
-
-
-/* ChainPosRuleSet */
-
-static HB_Error  Load_ChainPosRuleSet( HB_ChainPosRuleSet*  cprs,
-				       HB_Stream             stream )
-{
-  HB_Error  error;
-
-  HB_UShort          n, m, count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_ChainPosRule*  cpr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = cprs->ChainPosRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cprs->ChainPosRule = NULL;
-
-  if ( ALLOC_ARRAY( cprs->ChainPosRule, count, HB_ChainPosRule ) )
-    return error;
-
-  cpr = cprs->ChainPosRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainPosRule( &cpr[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_ChainPosRule( &cpr[m] );
-
-  FREE( cpr );
-  return error;
-}
-
-
-static void  Free_ChainPosRuleSet( HB_ChainPosRuleSet*  cprs )
-{
-  HB_UShort          n, count;
-
-  HB_ChainPosRule*  cpr;
-
-
-  if ( cprs->ChainPosRule )
-  {
-    count = cprs->ChainPosRuleCount;
-    cpr   = cprs->ChainPosRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainPosRule( &cpr[n] );
-
-    FREE( cpr );
-  }
-}
-
-
-/* ChainContextPosFormat1 */
-
-static HB_Error  Load_ChainContextPos1( HB_ChainContextPosFormat1*  ccpf1,
-					HB_Stream                    stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, m, count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_ChainPosRuleSet*  cprs;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ccpf1->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = ccpf1->ChainPosRuleSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccpf1->ChainPosRuleSet = NULL;
-
-  if ( ALLOC_ARRAY( ccpf1->ChainPosRuleSet, count, HB_ChainPosRuleSet ) )
-    goto Fail2;
-
-  cprs = ccpf1->ChainPosRuleSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainPosRuleSet( &cprs[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_ChainPosRuleSet( &cprs[m] );
-
-  FREE( cprs );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &ccpf1->Coverage );
-  return error;
-}
-
-
-static void  Free_ChainContextPos1( HB_ChainContextPosFormat1*  ccpf1 )
-{
-  HB_UShort             n, count;
-
-  HB_ChainPosRuleSet*  cprs;
-
-
-  if ( ccpf1->ChainPosRuleSet )
-  {
-    count = ccpf1->ChainPosRuleSetCount;
-    cprs  = ccpf1->ChainPosRuleSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainPosRuleSet( &cprs[n] );
-
-    FREE( cprs );
-  }
-
-  _HB_OPEN_Free_Coverage( &ccpf1->Coverage );
-}
-
-
-/* ChainPosClassRule */
-
-static HB_Error  Load_ChainPosClassRule(
-		   HB_ChainContextPosFormat2*  ccpf2,
-		   HB_ChainPosClassRule*       cpcr,
-		   HB_Stream                    stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, count;
-
-  HB_UShort*            b;
-  HB_UShort*            i;
-  HB_UShort*            l;
-  HB_PosLookupRecord*  plr;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cpcr->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( cpcr->BacktrackGlyphCount > ccpf2->MaxBacktrackLength )
-    ccpf2->MaxBacktrackLength = cpcr->BacktrackGlyphCount;
-
-  cpcr->Backtrack = NULL;
-
-  count = cpcr->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( cpcr->Backtrack, count, HB_UShort ) )
-    return error;
-
-  b = cpcr->Backtrack;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail4;
-
-  for ( n = 0; n < count; n++ )
-    b[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  cpcr->InputGlyphCount = GET_UShort();
-
-  if ( cpcr->InputGlyphCount > ccpf2->MaxInputLength )
-    ccpf2->MaxInputLength = cpcr->InputGlyphCount;
-
-  FORGET_Frame();
-
-  cpcr->Input = NULL;
-
-  count = cpcr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( cpcr->Input, count, HB_UShort ) )
-    goto Fail4;
-
-  i = cpcr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail3;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  cpcr->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( cpcr->LookaheadGlyphCount > ccpf2->MaxLookaheadLength )
-    ccpf2->MaxLookaheadLength = cpcr->LookaheadGlyphCount;
-
-  cpcr->Lookahead = NULL;
-
-  count = cpcr->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( cpcr->Lookahead, count, HB_UShort ) )
-    goto Fail3;
-
-  l = cpcr->Lookahead;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    l[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  cpcr->PosCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpcr->PosLookupRecord = NULL;
-
-  count = cpcr->PosCount;
-
-  if ( ALLOC_ARRAY( cpcr->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = cpcr->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  FREE( l );
-
-Fail3:
-  FREE( i );
-
-Fail4:
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainPosClassRule( HB_ChainPosClassRule*  cpcr )
-{
-  FREE( cpcr->PosLookupRecord );
-  FREE( cpcr->Lookahead );
-  FREE( cpcr->Input );
-  FREE( cpcr->Backtrack );
-}
-
-
-/* PosClassSet */
-
-static HB_Error  Load_ChainPosClassSet(
-		   HB_ChainContextPosFormat2*  ccpf2,
-		   HB_ChainPosClassSet*        cpcs,
-		   HB_Stream                    stream )
-{
-  HB_Error  error;
-
-  HB_UShort               n, m, count;
-  HB_UInt                cur_offset, new_offset, base_offset;
-
-  HB_ChainPosClassRule*  cpcr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = cpcs->ChainPosClassRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cpcs->ChainPosClassRule = NULL;
-
-  if ( ALLOC_ARRAY( cpcs->ChainPosClassRule, count,
-		    HB_ChainPosClassRule ) )
-    return error;
-
-  cpcr = cpcs->ChainPosClassRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainPosClassRule( ccpf2, &cpcr[n],
-					   stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_ChainPosClassRule( &cpcr[m] );
-
-  FREE( cpcr );
-  return error;
-}
-
-
-static void  Free_ChainPosClassSet( HB_ChainPosClassSet*  cpcs )
-{
-  HB_UShort               n, count;
-
-  HB_ChainPosClassRule*  cpcr;
-
-
-  if ( cpcs->ChainPosClassRule )
-  {
-    count = cpcs->ChainPosClassRuleCount;
-    cpcr  = cpcs->ChainPosClassRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainPosClassRule( &cpcr[n] );
-
-    FREE( cpcr );
-  }
-}
-
-
-/* ChainContextPosFormat2 */
-
-static HB_Error  Load_ChainContextPos2( HB_ChainContextPosFormat2*  ccpf2,
-					HB_Stream                    stream )
-{
-  HB_Error  error;
-
-  HB_UShort              n, m, count;
-  HB_UInt               cur_offset, new_offset, base_offset;
-  HB_UInt               backtrack_offset, input_offset, lookahead_offset;
-
-  HB_ChainPosClassSet*  cpcs;
-
-
-  base_offset = FILE_Pos() - 2;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ccpf2->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 8L ) )
-    goto Fail5;
-
-  backtrack_offset = GET_UShort();
-  input_offset     = GET_UShort();
-  lookahead_offset = GET_UShort();
-
-  /* `ChainPosClassSetCount' is the upper limit for input class values,
-     thus we read it now to make an additional safety check. No limit
-     is known or needed for the other two class definitions          */
-
-  count = ccpf2->ChainPosClassSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->BacktrackClassDef, 65535,
-						       backtrack_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-    goto Fail5;
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->InputClassDef, count,
-						       input_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-    goto Fail4;
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->LookaheadClassDef, 65535,
-						       lookahead_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-    goto Fail3;
-
-  ccpf2->ChainPosClassSet   = NULL;
-  ccpf2->MaxBacktrackLength = 0;
-  ccpf2->MaxInputLength     = 0;
-  ccpf2->MaxLookaheadLength = 0;
-
-  if ( ALLOC_ARRAY( ccpf2->ChainPosClassSet, count, HB_ChainPosClassSet ) )
-    goto Fail2;
-
-  cpcs = ccpf2->ChainPosClassSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    if ( new_offset != base_offset )      /* not a NULL offset */
-    {
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_ChainPosClassSet( ccpf2, &cpcs[n],
-					    stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-    {
-      /* we create a ChainPosClassSet table with no entries */
-
-      ccpf2->ChainPosClassSet[n].ChainPosClassRuleCount = 0;
-      ccpf2->ChainPosClassSet[n].ChainPosClassRule      = NULL;
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_ChainPosClassSet( &cpcs[m] );
-
-  FREE( cpcs );
-
-Fail2:
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef );
-
-Fail3:
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef );
-
-Fail4:
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef );
-
-Fail5:
-  _HB_OPEN_Free_Coverage( &ccpf2->Coverage );
-  return error;
-}
-
-
-static void  Free_ChainContextPos2( HB_ChainContextPosFormat2*  ccpf2 )
-{
-  HB_UShort              n, count;
-
-  HB_ChainPosClassSet*  cpcs;
-
-
-  if ( ccpf2->ChainPosClassSet )
-  {
-    count = ccpf2->ChainPosClassSetCount;
-    cpcs  = ccpf2->ChainPosClassSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainPosClassSet( &cpcs[n] );
-
-    FREE( cpcs );
-  }
-
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef );
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef );
-  _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef );
-
-  _HB_OPEN_Free_Coverage( &ccpf2->Coverage );
-}
-
-
-/* ChainContextPosFormat3 */
-
-static HB_Error  Load_ChainContextPos3( HB_ChainContextPosFormat3*  ccpf3,
-					HB_Stream                    stream )
-{
-  HB_Error  error;
-
-  HB_UShort             n, nb, ni, nl, m, count;
-  HB_UShort             backtrack_count, input_count, lookahead_count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_Coverage*         b;
-  HB_Coverage*         i;
-  HB_Coverage*         l;
-  HB_PosLookupRecord*  plr;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  ccpf3->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccpf3->BacktrackCoverage = NULL;
-
-  backtrack_count = ccpf3->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( ccpf3->BacktrackCoverage, backtrack_count,
-		    HB_Coverage ) )
-    return error;
-
-  b = ccpf3->BacktrackCoverage;
-
-  for ( nb = 0; nb < backtrack_count; nb++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail4;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
-      goto Fail4;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  ccpf3->InputGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccpf3->InputCoverage = NULL;
-
-  input_count = ccpf3->InputGlyphCount;
-
-  if ( ALLOC_ARRAY( ccpf3->InputCoverage, input_count, HB_Coverage ) )
-    goto Fail4;
-
-  i = ccpf3->InputCoverage;
-
-  for ( ni = 0; ni < input_count; ni++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail3;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok )
-      goto Fail3;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  ccpf3->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccpf3->LookaheadCoverage = NULL;
-
-  lookahead_count = ccpf3->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( ccpf3->LookaheadCoverage, lookahead_count,
-		    HB_Coverage ) )
-    goto Fail3;
-
-  l = ccpf3->LookaheadCoverage;
-
-  for ( nl = 0; nl < lookahead_count; nl++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  ccpf3->PosCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccpf3->PosLookupRecord = NULL;
-
-  count = ccpf3->PosCount;
-
-  if ( ALLOC_ARRAY( ccpf3->PosLookupRecord, count, HB_PosLookupRecord ) )
-    goto Fail2;
-
-  plr = ccpf3->PosLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    plr[n].SequenceIndex   = GET_UShort();
-    plr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( plr );
-
-Fail2:
-  for ( m = 0; m < nl; m++ )
-    _HB_OPEN_Free_Coverage( &l[m] );
-
-  FREE( l );
-
-Fail3:
-  for ( m = 0; m < ni; m++ )
-    _HB_OPEN_Free_Coverage( &i[m] );
-
-  FREE( i );
-
-Fail4:
-  for ( m = 0; m < nb; m++ )
-    _HB_OPEN_Free_Coverage( &b[m] );
-
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainContextPos3( HB_ChainContextPosFormat3*  ccpf3 )
-{
-  HB_UShort      n, count;
-
-  HB_Coverage*  c;
-
-
-  FREE( ccpf3->PosLookupRecord );
-
-  if ( ccpf3->LookaheadCoverage )
-  {
-    count = ccpf3->LookaheadGlyphCount;
-    c     = ccpf3->LookaheadCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  if ( ccpf3->InputCoverage )
-  {
-    count = ccpf3->InputGlyphCount;
-    c     = ccpf3->InputCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  if ( ccpf3->BacktrackCoverage )
-  {
-    count = ccpf3->BacktrackGlyphCount;
-    c     = ccpf3->BacktrackCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-}
-
-
-/* ChainContextPos */
-
-static HB_Error  Load_ChainContextPos( HB_GPOS_SubTable* st,
-				       HB_Stream             stream )
-{
-  HB_Error  error;
-  HB_ChainContextPos*  ccp = &st->chain;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  ccp->PosFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( ccp->PosFormat )
-  {
-  case 1:
-    return Load_ChainContextPos1( &ccp->ccpf.ccpf1, stream );
-
-  case 2:
-    return Load_ChainContextPos2( &ccp->ccpf.ccpf2, stream );
-
-  case 3:
-    return Load_ChainContextPos3( &ccp->ccpf.ccpf3, stream );
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-static void  Free_ChainContextPos( HB_GPOS_SubTable* st )
-{
-  HB_ChainContextPos*  ccp = &st->chain;
-
-  switch ( ccp->PosFormat )
-  {
-  case 1:  Free_ChainContextPos1( &ccp->ccpf.ccpf1 ); break;
-  case 2:  Free_ChainContextPos2( &ccp->ccpf.ccpf2 ); break;
-  case 3:  Free_ChainContextPos3( &ccp->ccpf.ccpf3 ); break;
-  default:						      break;
-  }
-}
-
-
-static HB_Error  Lookup_ChainContextPos1(
-		   GPOS_Instance*               gpi,
-		   HB_ChainContextPosFormat1*  ccpf1,
-		   HB_Buffer                   buffer,
-		   HB_UShort                    flags,
-		   HB_UShort                    context_length,
-		   int                          nesting_level )
-{
-  HB_UShort          index, property;
-  HB_UShort          i, j, k, num_cpr;
-  HB_UShort          bgc, igc, lgc;
-  HB_Error           error;
-  HB_GPOSHeader*    gpos = gpi->gpos;
-
-  HB_ChainPosRule*  cpr;
-  HB_ChainPosRule   curr_cpr;
-  HB_GDEFHeader*    gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &ccpf1->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  cpr     = ccpf1->ChainPosRuleSet[index].ChainPosRule;
-  num_cpr = ccpf1->ChainPosRuleSet[index].ChainPosRuleCount;
-
-  for ( k = 0; k < num_cpr; k++ )
-  {
-    curr_cpr = cpr[k];
-    bgc      = curr_cpr.BacktrackGlyphCount;
-    igc      = curr_cpr.InputGlyphCount;
-    lgc      = curr_cpr.LookaheadGlyphCount;
-
-    if ( context_length != 0xFFFF && context_length < igc )
-      goto next_chainposrule;
-
-    /* check whether context is too long; it is a first guess only */
-
-    if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-      goto next_chainposrule;
-
-    if ( bgc )
-    {
-      /* Since we don't know in advance the number of glyphs to inspect,
-	 we search backwards for matches in the backtrack glyph array    */
-
-      for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
-      {
-	while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-	{
-	  if ( error && error != HB_Err_Not_Covered )
-	    return error;
-
-	  if ( j + 1 == bgc - i )
-	    goto next_chainposrule;
-	  j--;
-	}
-
-	/* In OpenType 1.3, it is undefined whether the offsets of
-	   backtrack glyphs is in logical order or not.  Version 1.4
-	   will clarify this:
-
-	     Logical order -      a  b  c  d  e  f  g  h  i  j
-					      i
-	     Input offsets -                  0  1
-	     Backtrack offsets -  3  2  1  0
-	     Lookahead offsets -                    0  1  2  3           */
-
-	if ( IN_GLYPH( j ) != curr_cpr.Backtrack[i] )
-	  goto next_chainposrule;
-      }
-    }
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	  goto next_chainposrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != curr_cpr.Input[i - 1] )
-	goto next_chainposrule;
-    }
-
-    /* we are starting to check for lookahead glyphs right after the
-       last context glyph                                            */
-
-    for ( i = 0; i < lgc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + lgc - i == (HB_Int)buffer->in_length )
-	  goto next_chainposrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != curr_cpr.Lookahead[i] )
-	goto next_chainposrule;
-    }
-
-    return Do_ContextPos( gpi, igc,
-			  curr_cpr.PosCount,
-			  curr_cpr.PosLookupRecord,
-			  buffer,
-			  nesting_level );
-
-  next_chainposrule:
-    ;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Lookup_ChainContextPos2(
-		   GPOS_Instance*               gpi,
-		   HB_ChainContextPosFormat2*  ccpf2,
-		   HB_Buffer                   buffer,
-		   HB_UShort                    flags,
-		   HB_UShort                    context_length,
-		   int                          nesting_level )
-{
-  HB_UShort              index, property;
-  HB_Error               error;
-  HB_UShort              i, j, k;
-  HB_UShort              bgc, igc, lgc;
-  HB_UShort              known_backtrack_classes,
-			 known_input_classes,
-			 known_lookahead_classes;
-
-  HB_UShort*             backtrack_classes;
-  HB_UShort*             input_classes;
-  HB_UShort*             lookahead_classes;
-
-  HB_UShort*             bc;
-  HB_UShort*             ic;
-  HB_UShort*             lc;
-  HB_GPOSHeader*        gpos = gpi->gpos;
-
-  HB_ChainPosClassSet*  cpcs;
-  HB_ChainPosClassRule  cpcr;
-  HB_GDEFHeader*        gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  /* Note: The coverage table in format 2 doesn't give an index into
-	   anything.  It just lets us know whether or not we need to
-	   do any lookup at all.                                     */
-
-  error = _HB_OPEN_Coverage_Index( &ccpf2->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if (ccpf2->MaxInputLength < 1)
-    return HB_Err_Not_Covered;
-
-  if ( ALLOC_ARRAY( backtrack_classes, ccpf2->MaxBacktrackLength, HB_UShort ) )
-    return error;
-  known_backtrack_classes = 0;
-
-  if ( ALLOC_ARRAY( input_classes, ccpf2->MaxInputLength, HB_UShort ) )
-    goto End3;
-  known_input_classes = 1;
-
-  if ( ALLOC_ARRAY( lookahead_classes, ccpf2->MaxLookaheadLength, HB_UShort ) )
-    goto End2;
-  known_lookahead_classes = 0;
-
-  error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_CURGLYPH(),
-		     &input_classes[0], NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    goto End1;
-
-  cpcs = &ccpf2->ChainPosClassSet[input_classes[0]];
-  if ( !cpcs )
-  {
-    error = ERR(HB_Err_Invalid_SubTable);
-    goto End1;
-  }
-
-  for ( k = 0; k < cpcs->ChainPosClassRuleCount; k++ )
-  {
-    cpcr = cpcs->ChainPosClassRule[k];
-    bgc  = cpcr.BacktrackGlyphCount;
-    igc  = cpcr.InputGlyphCount;
-    lgc  = cpcr.LookaheadGlyphCount;
-
-    if ( context_length != 0xFFFF && context_length < igc )
-      goto next_chainposclassrule;
-
-    /* check whether context is too long; it is a first guess only */
-
-    if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-      goto next_chainposclassrule;
-
-    if ( bgc )
-    {
-      /* Since we don't know in advance the number of glyphs to inspect,
-	 we search backwards for matches in the backtrack glyph array.
-	 Note that `known_backtrack_classes' starts at index 0.         */
-
-      bc       = cpcr.Backtrack;
-
-      for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
-      {
-	while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-	{
-	  if ( error && error != HB_Err_Not_Covered )
-	    goto End1;
-
-	  if ( j + 1 == bgc - i )
-	    goto next_chainposclassrule;
-	  j++;
-	}
-
-	if ( i >= known_backtrack_classes )
-	{
-	  /* Keeps us from having to do this for each rule */
-
-	  error = _HB_OPEN_Get_Class( &ccpf2->BacktrackClassDef, IN_GLYPH( j ),
-			     &backtrack_classes[i], NULL );
-	  if ( error && error != HB_Err_Not_Covered )
-	    goto End1;
-	  known_backtrack_classes = i;
-	}
-
-	if ( bc[i] != backtrack_classes[i] )
-	  goto next_chainposclassrule;
-      }
-    }
-
-    ic       = cpcr.Input;
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-
-	if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	  goto next_chainposclassrule;
-	j++;
-      }
-
-      if ( i >= known_input_classes )
-      {
-	error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_GLYPH( j ),
-			   &input_classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-	known_input_classes = i;
-      }
-
-      if ( ic[i - 1] != input_classes[i] )
-	goto next_chainposclassrule;
-    }
-
-    /* we are starting to check for lookahead glyphs right after the
-       last context glyph                                            */
-
-    lc       = cpcr.Lookahead;
-
-    for ( i = 0; i < lgc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-
-	if ( j + lgc - i == (HB_Int)buffer->in_length )
-	  goto next_chainposclassrule;
-	j++;
-      }
-
-      if ( i >= known_lookahead_classes )
-      {
-	error = _HB_OPEN_Get_Class( &ccpf2->LookaheadClassDef, IN_GLYPH( j ),
-			   &lookahead_classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-	known_lookahead_classes = i;
-      }
-
-      if ( lc[i] != lookahead_classes[i] )
-	goto next_chainposclassrule;
-    }
-
-    error = Do_ContextPos( gpi, igc,
-			   cpcr.PosCount,
-			   cpcr.PosLookupRecord,
-			   buffer,
-			   nesting_level );
-    goto End1;
-
-  next_chainposclassrule:
-    ;
-  }
-
-  error = HB_Err_Not_Covered;
-
-End1:
-  FREE( lookahead_classes );
-
-End2:
-  FREE( input_classes );
-
-End3:
-  FREE( backtrack_classes );
-  return error;
-}
-
-
-static HB_Error  Lookup_ChainContextPos3(
-		   GPOS_Instance*               gpi,
-		   HB_ChainContextPosFormat3*  ccpf3,
-		   HB_Buffer                   buffer,
-		   HB_UShort                    flags,
-		   HB_UShort                    context_length,
-		   int                          nesting_level )
-{
-  HB_UShort        index, i, j, property;
-  HB_UShort        bgc, igc, lgc;
-  HB_Error         error;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-
-  HB_Coverage*    bc;
-  HB_Coverage*    ic;
-  HB_Coverage*    lc;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gpos->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  bgc = ccpf3->BacktrackGlyphCount;
-  igc = ccpf3->InputGlyphCount;
-  lgc = ccpf3->LookaheadGlyphCount;
-
-  if ( context_length != 0xFFFF && context_length < igc )
-    return HB_Err_Not_Covered;
-
-  /* check whether context is too long; it is a first guess only */
-
-  if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-    return HB_Err_Not_Covered;
-
-  if ( bgc )
-  {
-    /* Since we don't know in advance the number of glyphs to inspect,
-       we search backwards for matches in the backtrack glyph array    */
-
-    bc       = ccpf3->BacktrackCoverage;
-
-    for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + 1 == bgc - i )
-	  return HB_Err_Not_Covered;
-	j--;
-      }
-
-      error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index );
-      if ( error )
-	return error;
-    }
-  }
-
-  ic       = ccpf3->InputCoverage;
-
-  for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ )
-  {
-    /* We already called CHECK_Property for IN_GLYPH ( buffer->in_pos ) */
-    while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  /* we are starting to check for lookahead glyphs right after the
-     last context glyph                                            */
-
-  lc       = ccpf3->LookaheadCoverage;
-
-  for ( i = 0; i < lgc; i++, j++ )
-  {
-    while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + lgc - i == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  return Do_ContextPos( gpi, igc,
-			ccpf3->PosCount,
-			ccpf3->PosLookupRecord,
-			buffer,
-			nesting_level );
-}
-
-
-static HB_Error  Lookup_ChainContextPos(
-		   GPOS_Instance*        gpi,
-		   HB_GPOS_SubTable* st,
-		   HB_Buffer            buffer,
-		   HB_UShort             flags,
-		   HB_UShort             context_length,
-		   int                   nesting_level )
-{
-  HB_ChainContextPos*  ccp = &st->chain;
-
-  switch ( ccp->PosFormat )
-  {
-  case 1:
-    return Lookup_ChainContextPos1( gpi, &ccp->ccpf.ccpf1, buffer,
-				    flags, context_length,
-				    nesting_level );
-
-  case 2:
-    return Lookup_ChainContextPos2( gpi, &ccp->ccpf.ccpf2, buffer,
-				    flags, context_length,
-				    nesting_level );
-
-  case 3:
-    return Lookup_ChainContextPos3( gpi, &ccp->ccpf.ccpf3, buffer,
-				    flags, context_length,
-				    nesting_level );
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-
-/***********
- * GPOS API
- ***********/
-
-
-
-HB_Error  HB_GPOS_Select_Script( HB_GPOSHeader*  gpos,
-				 HB_UInt         script_tag,
-				 HB_UShort*       script_index )
-{
-  HB_UShort          n;
-
-  HB_ScriptList*    sl;
-  HB_ScriptRecord*  sr;
-
-
-  if ( !gpos || !script_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  for ( n = 0; n < sl->ScriptCount; n++ )
-    if ( script_tag == sr[n].ScriptTag )
-    {
-      *script_index = n;
-
-      return HB_Err_Ok;
-    }
-
-  return HB_Err_Not_Covered;
-}
-
-
-
-HB_Error  HB_GPOS_Select_Language( HB_GPOSHeader*  gpos,
-				   HB_UInt         language_tag,
-				   HB_UShort        script_index,
-				   HB_UShort*       language_index,
-				   HB_UShort*       req_feature_index )
-{
-  HB_UShort           n;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*         s;
-  HB_LangSysRecord*  lsr;
-
-
-  if ( !gpos || !language_index || !req_feature_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  for ( n = 0; n < s->LangSysCount; n++ )
-    if ( language_tag == lsr[n].LangSysTag )
-    {
-      *language_index = n;
-      *req_feature_index = lsr[n].LangSys.ReqFeatureIndex;
-
-      return HB_Err_Ok;
-    }
-
-  return HB_Err_Not_Covered;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
-   default language (DefaultLangSys)                              */
-
-
-HB_Error  HB_GPOS_Select_Feature( HB_GPOSHeader*  gpos,
-				  HB_UInt         feature_tag,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UShort*       feature_index )
-{
-  HB_UShort           n;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*         s;
-  HB_LangSysRecord*  lsr;
-  HB_LangSys*        ls;
-  HB_UShort*          fi;
-
-  HB_FeatureList*    fl;
-  HB_FeatureRecord*  fr;
-
-
-  if ( !gpos || !feature_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  fl = &gpos->FeatureList;
-  fr = fl->FeatureRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( language_index == 0xFFFF )
-    ls = &s->DefaultLangSys;
-  else
-  {
-    if ( language_index >= s->LangSysCount )
-      return ERR(HB_Err_Invalid_Argument);
-
-    ls = &lsr[language_index].LangSys;
-  }
-
-  fi = ls->FeatureIndex;
-
-  for ( n = 0; n < ls->FeatureCount; n++ )
-  {
-    if ( fi[n] >= fl->FeatureCount )
-      return ERR(HB_Err_Invalid_SubTable_Format);
-
-    if ( feature_tag == fr[fi[n]].FeatureTag )
-    {
-      *feature_index = fi[n];
-
-      return HB_Err_Ok;
-    }
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-/* The next three functions return a null-terminated list */
-
-
-HB_Error  HB_GPOS_Query_Scripts( HB_GPOSHeader*  gpos,
-				 HB_UInt**       script_tag_list )
-{
-  HB_Error           error;
-  HB_UShort          n;
-  HB_UInt*          stl;
-
-  HB_ScriptList*    sl;
-  HB_ScriptRecord*  sr;
-
-
-  if ( !gpos || !script_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < sl->ScriptCount; n++ )
-    stl[n] = sr[n].ScriptTag;
-  stl[n] = 0;
-
-  *script_tag_list = stl;
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GPOS_Query_Languages( HB_GPOSHeader*  gpos,
-				   HB_UShort        script_index,
-				   HB_UInt**       language_tag_list )
-{
-  HB_Error            error;
-  HB_UShort           n;
-  HB_UInt*           ltl;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-
-
-  if ( !gpos || !language_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < s->LangSysCount; n++ )
-    ltl[n] = lsr[n].LangSysTag;
-  ltl[n] = 0;
-
-  *language_tag_list = ltl;
-
-  return HB_Err_Ok;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
-   default language (DefaultLangSys)                              */
-
-
-HB_Error  HB_GPOS_Query_Features( HB_GPOSHeader*  gpos,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UInt**       feature_tag_list )
-{
-  HB_UShort           n;
-  HB_Error            error;
-  HB_UInt*           ftl;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-  HB_LangSys*        ls;
-  HB_UShort*          fi;
-
-  HB_FeatureList*    fl;
-  HB_FeatureRecord*  fr;
-
-
-  if ( !gpos || !feature_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gpos->ScriptList;
-  sr = sl->ScriptRecord;
-
-  fl = &gpos->FeatureList;
-  fr = fl->FeatureRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( language_index == 0xFFFF )
-    ls = &s->DefaultLangSys;
-  else
-  {
-    if ( language_index >= s->LangSysCount )
-      return ERR(HB_Err_Invalid_Argument);
-
-    ls = &lsr[language_index].LangSys;
-  }
-
-  fi = ls->FeatureIndex;
-
-  if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < ls->FeatureCount; n++ )
-  {
-    if ( fi[n] >= fl->FeatureCount )
-    {
-      FREE( ftl );
-      return ERR(HB_Err_Invalid_SubTable_Format);
-    }
-    ftl[n] = fr[fi[n]].FeatureTag;
-  }
-  ftl[n] = 0;
-
-  *feature_tag_list = ftl;
-
-  return HB_Err_Ok;
-}
-
-
-/* Do an individual subtable lookup.  Returns HB_Err_Ok if positioning
-   has been done, or HB_Err_Not_Covered if not.                        */
-static HB_Error  GPOS_Do_Glyph_Lookup( GPOS_Instance*    gpi,
-				       HB_UShort         lookup_index,
-				       HB_Buffer        buffer,
-				       HB_UShort         context_length,
-				       int               nesting_level )
-{
-  HB_Error             error = HB_Err_Not_Covered;
-  HB_UShort            i, flags, lookup_count;
-  HB_GPOSHeader*       gpos = gpi->gpos;
-  HB_Lookup*           lo;
-  int		       lookup_type;
-
-
-  nesting_level++;
-
-  if ( nesting_level > HB_MAX_NESTING_LEVEL )
-    return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-
-  lookup_count = gpos->LookupList.LookupCount;
-  if (lookup_index >= lookup_count)
-    return error;
-
-  lo    = &gpos->LookupList.Lookup[lookup_index];
-  flags = lo->LookupFlag;
-  lookup_type = lo->LookupType;
-
-  for ( i = 0; i < lo->SubTableCount; i++ )
-  {
-    HB_GPOS_SubTable *st = &lo->SubTable[i].st.gpos;
-
-    switch (lookup_type) {
-      case HB_GPOS_LOOKUP_SINGLE:
-        error = Lookup_SinglePos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_PAIR:
-	error = Lookup_PairPos		( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_CURSIVE:
-	error = Lookup_CursivePos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_MARKBASE:
-	error = Lookup_MarkBasePos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_MARKLIG:
-	error = Lookup_MarkLigPos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_MARKMARK:
-	error = Lookup_MarkMarkPos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_CONTEXT:
-	error = Lookup_ContextPos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GPOS_LOOKUP_CHAIN:
-	error = Lookup_ChainContextPos	( gpi, st, buffer, flags, context_length, nesting_level ); break;
-    /*case HB_GPOS_LOOKUP_EXTENSION:
-	error = Lookup_ExtensionPos	( gpi, st, buffer, flags, context_length, nesting_level ); break;*/
-      default:
-	error = HB_Err_Not_Covered;
-    }
-
-    /* Check whether we have a successful positioning or an error other
-       than HB_Err_Not_Covered                                         */
-    if ( error != HB_Err_Not_Covered )
-      return error;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st,
-			HB_Stream         stream,
-			HB_UShort         lookup_type )
-{
-  switch ( lookup_type ) {
-    case HB_GPOS_LOOKUP_SINGLE:		return Load_SinglePos		( st, stream );
-    case HB_GPOS_LOOKUP_PAIR:		return Load_PairPos		( st, stream );
-    case HB_GPOS_LOOKUP_CURSIVE:	return Load_CursivePos		( st, stream );
-    case HB_GPOS_LOOKUP_MARKBASE:	return Load_MarkBasePos		( st, stream );
-    case HB_GPOS_LOOKUP_MARKLIG:	return Load_MarkLigPos		( st, stream );
-    case HB_GPOS_LOOKUP_MARKMARK:	return Load_MarkMarkPos		( st, stream );
-    case HB_GPOS_LOOKUP_CONTEXT:	return Load_ContextPos		( st, stream );
-    case HB_GPOS_LOOKUP_CHAIN:		return Load_ChainContextPos	( st, stream );
-  /*case HB_GPOS_LOOKUP_EXTENSION:	return Load_ExtensionPos	( st, stream );*/
-    default:				return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-}
-
-
-HB_INTERNAL void
-_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st,
-			HB_UShort         lookup_type )
-{
-  switch ( lookup_type ) {
-    case HB_GPOS_LOOKUP_SINGLE:		Free_SinglePos		( st ); return;
-    case HB_GPOS_LOOKUP_PAIR:		Free_PairPos		( st ); return;
-    case HB_GPOS_LOOKUP_CURSIVE:	Free_CursivePos		( st ); return;
-    case HB_GPOS_LOOKUP_MARKBASE:	Free_MarkBasePos	( st ); return;
-    case HB_GPOS_LOOKUP_MARKLIG:	Free_MarkLigPos		( st ); return;
-    case HB_GPOS_LOOKUP_MARKMARK:	Free_MarkMarkPos	( st ); return;
-    case HB_GPOS_LOOKUP_CONTEXT:	Free_ContextPos		( st ); return;
-    case HB_GPOS_LOOKUP_CHAIN:		Free_ChainContextPos	( st ); return;
-  /*case HB_GPOS_LOOKUP_EXTENSION:	Free_ExtensionPos	( st ); return;*/
-    default:									return;
-  }
-}
-
-
-/* apply one lookup to the input string object */
-
-static HB_Error  GPOS_Do_String_Lookup( GPOS_Instance*    gpi,
-				   HB_UShort         lookup_index,
-				   HB_Buffer        buffer )
-{
-  HB_Error         error, retError = HB_Err_Not_Covered;
-  HB_GPOSHeader*  gpos = gpi->gpos;
-
-  HB_UInt*  properties = gpos->LookupList.Properties;
-
-  const int       nesting_level = 0;
-  /* 0xFFFF indicates that we don't have a context length yet */
-  const HB_UShort context_length = 0xFFFF;
-
-
-  gpi->last  = 0xFFFF;     /* no last valid glyph for cursive pos. */
-
-  buffer->in_pos = 0;
-  while ( buffer->in_pos < buffer->in_length )
-  {
-    if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
-    {
-      /* Note that the connection between mark and base glyphs hold
-	 exactly one (string) lookup.  For example, it would be possible
-	 that in the first lookup, mark glyph X is attached to base
-	 glyph A, and in the next lookup it is attached to base glyph B.
-	 It is up to the font designer to provide meaningful lookups and
-	 lookup order.                                                   */
-
-      error = GPOS_Do_Glyph_Lookup( gpi, lookup_index, buffer, context_length, nesting_level );
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-    }
-    else
-    {
-      /* Contrary to properties defined in GDEF, user-defined properties
-	 will always stop a possible cursive positioning.                */
-      gpi->last = 0xFFFF;
-
-      error = HB_Err_Not_Covered;
-    }
-
-    if ( error == HB_Err_Not_Covered )
-      (buffer->in_pos)++;
-    else
-      retError = error;
-  }
-
-  return retError;
-}
-
-
-static HB_Error  Position_CursiveChain ( HB_Buffer     buffer )
-{
-  HB_UInt   i, j;
-  HB_Position positions = buffer->positions;
-
-  /* First handle all left-to-right connections */
-  for (j = 0; j < buffer->in_length; j++)
-  {
-    if (positions[j].cursive_chain > 0)
-      positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos;
-  }
-
-  /* Then handle all right-to-left connections */
-  for (i = buffer->in_length; i > 0; i--)
-  {
-    j = i - 1;
-
-    if (positions[j].cursive_chain < 0)
-      positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-HB_Error  HB_GPOS_Add_Feature( HB_GPOSHeader*  gpos,
-			       HB_UShort        feature_index,
-			       HB_UInt          property )
-{
-  HB_UShort    i;
-
-  HB_Feature  feature;
-  HB_UInt*     properties;
-  HB_UShort*   index;
-  HB_UShort    lookup_count;
-
-  /* Each feature can only be added once */
-
-  if ( !gpos ||
-       feature_index >= gpos->FeatureList.FeatureCount ||
-       gpos->FeatureList.ApplyCount == gpos->FeatureList.FeatureCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gpos->FeatureList.ApplyOrder[gpos->FeatureList.ApplyCount++] = feature_index;
-
-  properties = gpos->LookupList.Properties;
-
-  feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
-  index   = feature.LookupListIndex;
-  lookup_count = gpos->LookupList.LookupCount;
-
-  for ( i = 0; i < feature.LookupListCount; i++ )
-  {
-    HB_UShort lookup_index = index[i];
-    if (lookup_index < lookup_count)
-      properties[lookup_index] |= property;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GPOS_Clear_Features( HB_GPOSHeader*  gpos )
-{
-  HB_UShort i;
-
-  HB_UInt*  properties;
-
-
-  if ( !gpos )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gpos->FeatureList.ApplyCount = 0;
-
-  properties = gpos->LookupList.Properties;
-
-  for ( i = 0; i < gpos->LookupList.LookupCount; i++ )
-    properties[i] = 0;
-
-  return HB_Err_Ok;
-}
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-HB_Error  HB_GPOS_Register_MM_Function( HB_GPOSHeader*  gpos,
-					HB_MMFunction   mmfunc,
-					void*            data )
-{
-  if ( !gpos )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gpos->mmfunc = mmfunc;
-  gpos->data   = data;
-
-  return HB_Err_Ok;
-}
-#endif
-
-/* If `dvi' is TRUE, glyph contour points for anchor points and device
-   tables are ignored -- you will get device independent values.         */
-
-
-HB_Error  HB_GPOS_Apply_String( HB_Font            font,
-				HB_GPOSHeader*    gpos,
-				HB_UShort          load_flags,
-				HB_Buffer         buffer,
-				HB_Bool            dvi,
-				HB_Bool            r2l )
-{
-  HB_Error       error, retError = HB_Err_Not_Covered;
-  GPOS_Instance  gpi;
-  int            i, j, lookup_count, num_features;
-
-  if ( !font || !gpos || !buffer )
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( buffer->in_length == 0 )
-    return HB_Err_Not_Covered;
-
-  gpi.font       = font;
-  gpi.gpos       = gpos;
-  gpi.load_flags = load_flags;
-  gpi.r2l        = r2l;
-  gpi.dvi        = dvi;
-
-  lookup_count = gpos->LookupList.LookupCount;
-  num_features = gpos->FeatureList.ApplyCount;
-
-  if ( num_features )
-    {
-      error = _hb_buffer_clear_positions( buffer );
-      if ( error )
-	return error;
-    }
-
-  for ( i = 0; i < num_features; i++ )
-  {
-    HB_UShort  feature_index = gpos->FeatureList.ApplyOrder[i];
-    HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
-
-    for ( j = 0; j < feature.LookupListCount; j++ )
-    {
-      HB_UShort lookup_index = feature.LookupListIndex[j];
-
-      /* Skip nonexistant lookups */
-      if (lookup_index >= lookup_count)
-       continue;
-
-      error = GPOS_Do_String_Lookup( &gpi, lookup_index, buffer );
-      if ( error )
-      {
-	if ( error != HB_Err_Not_Covered )
-	  return error;
-      }
-      else
-	retError = error;
-    }
-  }
-
-  if ( num_features )
-    {
-  error = Position_CursiveChain ( buffer );
-  if ( error )
-    return error;
-    }
-
-  return retError;
-}
-
-/* END */
diff --git a/src/hb-old/harfbuzz-gpos.h b/src/hb-old/harfbuzz-gpos.h
deleted file mode 100644
index 92bff84..0000000
--- a/src/hb-old/harfbuzz-gpos.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GPOS_H
-#define HARFBUZZ_GPOS_H
-
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-
-/* Lookup types for glyph positioning */
-
-#define HB_GPOS_LOOKUP_SINGLE     1
-#define HB_GPOS_LOOKUP_PAIR       2
-#define HB_GPOS_LOOKUP_CURSIVE    3
-#define HB_GPOS_LOOKUP_MARKBASE   4
-#define HB_GPOS_LOOKUP_MARKLIG    5
-#define HB_GPOS_LOOKUP_MARKMARK   6
-#define HB_GPOS_LOOKUP_CONTEXT    7
-#define HB_GPOS_LOOKUP_CHAIN      8
-#define HB_GPOS_LOOKUP_EXTENSION  9
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-/* A pointer to a function which accesses the PostScript interpreter.
-   Multiple Master fonts need this interface to convert a metric ID
-   (as stored in an OpenType font version 1.2 or higher) `metric_id'
-   into a metric value (returned in `metric_value').
-
-   `data' points to the user-defined structure specified during a
-   call to HB_GPOS_Register_MM_Function().
-
-   `metric_value' must be returned as a scaled value (but shouldn't
-   be rounded).                                                       */
-
-typedef HB_Error  (*HB_MMFunction)(HB_Font       font,
-				    HB_UShort    metric_id,
-				    HB_Fixed*      metric_value,
-				    void*        data );
-#endif
-
-
-struct  HB_GPOSHeader_
-{
-  HB_16Dot16           Version;
-
-  HB_ScriptList     ScriptList;
-  HB_FeatureList    FeatureList;
-  HB_LookupList     LookupList;
-
-  HB_GDEFHeader*    gdef;
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-  /* this is OpenType 1.2 -- Multiple Master fonts need this
-     callback function to get various metric values from the
-     PostScript interpreter.                                 */
-
-  HB_MMFunction     mmfunc;
-  void*              data;
-#endif
-};
-
-typedef struct HB_GPOSHeader_  HB_GPOSHeader;
-typedef HB_GPOSHeader* HB_GPOS;
-
-
-HB_Error  HB_Load_GPOS_Table( HB_Stream stream, 
-                              HB_GPOSHeader** gpos,
-			      HB_GDEFHeader*  gdef,
-                              HB_Stream       gdefStream );
-
-
-HB_Error  HB_Done_GPOS_Table( HB_GPOSHeader* gpos );
-
-
-HB_Error  HB_GPOS_Select_Script( HB_GPOSHeader*  gpos,
-				 HB_UInt         script_tag,
-				 HB_UShort*       script_index );
-
-HB_Error  HB_GPOS_Select_Language( HB_GPOSHeader*  gpos,
-				   HB_UInt         language_tag,
-				   HB_UShort        script_index,
-				   HB_UShort*       language_index,
-				   HB_UShort*       req_feature_index );
-
-HB_Error  HB_GPOS_Select_Feature( HB_GPOSHeader*  gpos,
-				  HB_UInt         feature_tag,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UShort*       feature_index );
-
-
-HB_Error  HB_GPOS_Query_Scripts( HB_GPOSHeader*  gpos,
-				 HB_UInt**       script_tag_list );
-
-HB_Error  HB_GPOS_Query_Languages( HB_GPOSHeader*  gpos,
-				   HB_UShort        script_index,
-				   HB_UInt**       language_tag_list );
-
-HB_Error  HB_GPOS_Query_Features( HB_GPOSHeader*  gpos,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UInt**       feature_tag_list );
-
-
-HB_Error  HB_GPOS_Add_Feature( HB_GPOSHeader*  gpos,
-			       HB_UShort        feature_index,
-			       HB_UInt          property );
-
-HB_Error  HB_GPOS_Clear_Features( HB_GPOSHeader*  gpos );
-
-
-#ifdef HB_SUPPORT_MULTIPLE_MASTER
-HB_Error  HB_GPOS_Register_MM_Function( HB_GPOSHeader*  gpos,
-					HB_MMFunction   mmfunc,
-					void*            data );
-#endif
-
-/* If `dvi' is TRUE, glyph contour points for anchor points and device
-   tables are ignored -- you will get device independent values.         */
-
-
-HB_Error  HB_GPOS_Apply_String( HB_Font           font,
-				HB_GPOSHeader*   gpos,
-				HB_UShort         load_flags,
-				HB_Buffer        buffer,
-				HB_Bool           dvi,
-				HB_Bool           r2l );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GPOS_H */
diff --git a/src/hb-old/harfbuzz-greek.c b/src/hb-old/harfbuzz-greek.c
deleted file mode 100644
index 7d7996a..0000000
--- a/src/hb-old/harfbuzz-greek.c
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-#include <assert.h>
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature greek_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty },
-    { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty },
-    {0, 0}
-};
-#endif
-
-/*
-  Greek decompositions
-*/
-
-
-typedef struct _hb_greek_decomposition {
-    HB_UChar16 composed;
-    HB_UChar16 base;
-} hb_greek_decomposition;
-
-static const hb_greek_decomposition decompose_0x300[] = {
-    { 0x1FBA, 0x0391 },
-    { 0x1FC8, 0x0395 },
-    { 0x1FCA, 0x0397 },
-    { 0x1FDA, 0x0399 },
-    { 0x1FF8, 0x039F },
-    { 0x1FEA, 0x03A5 },
-    { 0x1FFA, 0x03A9 },
-    { 0x1F70, 0x03B1 },
-    { 0x1F72, 0x03B5 },
-    { 0x1F74, 0x03B7 },
-    { 0x1F76, 0x03B9 },
-    { 0x1F78, 0x03BF },
-    { 0x1F7A, 0x03C5 },
-    { 0x1F7C, 0x03C9 },
-    { 0x1FD2, 0x03CA },
-    { 0x1FE2, 0x03CB },
-    { 0x1F02, 0x1F00 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x300(HB_UChar16 base)
-{
-    if ((base ^ 0x1f00) < 0x100) {
-        if (base <= 0x1f69 && !(base & 0x6))
-            return base + 2;
-        if (base == 0x1fbf)
-            return 0x1fcd;
-        if (base == 0x1ffe)
-            return 0x1fdd;
-        return 0;
-    }
-    {
-        const hb_greek_decomposition *d = decompose_0x300;
-        while (d->base && d->base != base)
-            ++d;
-        return d->composed;
-    }
-}
-
-static const hb_greek_decomposition decompose_0x301[] = {
-    { 0x0386, 0x0391 },
-    { 0x0388, 0x0395 },
-    { 0x0389, 0x0397 },
-    { 0x038A, 0x0399 },
-    { 0x038C, 0x039F },
-    { 0x038E, 0x03A5 },
-    { 0x038F, 0x03A9 },
-    { 0x03AC, 0x03B1 },
-    { 0x03AD, 0x03B5 },
-    { 0x03AE, 0x03B7 },
-    { 0x03AF, 0x03B9 },
-    { 0x03CC, 0x03BF },
-    { 0x03CD, 0x03C5 },
-    { 0x03CE, 0x03C9 },
-    { 0x0390, 0x03CA },
-    { 0x03B0, 0x03CB },
-    { 0x03D3, 0x03D2 },
-    { 0, 0 }
-};
-
-
-static HB_UChar16 compose_0x301(HB_UChar16 base)
-{
-    if ((base ^ 0x1f00) < 0x100) {
-        if (base <= 0x1f69 && !(base & 0x6))
-            return base + 4;
-        if (base == 0x1fbf)
-            return 0x1fce;
-        if (base == 0x1ffe)
-            return 0x1fde;
-    }
-    {
-        const hb_greek_decomposition *d = decompose_0x301;
-        while (d->base && d->base != base)
-            ++d;
-        return d->composed;
-    }
-}
-
-static const hb_greek_decomposition decompose_0x304[] = {
-    { 0x1FB9, 0x0391 },
-    { 0x1FD9, 0x0399 },
-    { 0x1FE9, 0x03A5 },
-    { 0x1FB1, 0x03B1 },
-    { 0x1FD1, 0x03B9 },
-    { 0x1FE1, 0x03C5 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x304(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x304;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x306[] = {
-    { 0x1FB8, 0x0391 },
-    { 0x1FD8, 0x0399 },
-    { 0x1FE8, 0x03A5 },
-    { 0x1FB0, 0x03B1 },
-    { 0x1FD0, 0x03B9 },
-    { 0x1FE0, 0x03C5 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x306(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x306;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x308[] = {
-    { 0x03AA, 0x0399  },
-    { 0x03AB, 0x03A5  },
-    { 0x03CA, 0x03B9  },
-    { 0x03CB, 0x03C5  },
-    { 0x03D4, 0x03D2  },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x308(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x308;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-
-static const hb_greek_decomposition decompose_0x313[] = {
-    { 0x1F08, 0x0391 },
-    { 0x1F18, 0x0395 },
-    { 0x1F28, 0x0397 },
-    { 0x1F38, 0x0399 },
-    { 0x1F48, 0x039F },
-    { 0x1F68, 0x03A9 },
-    { 0x1F00, 0x03B1 },
-    { 0x1F10, 0x03B5 },
-    { 0x1F20, 0x03B7 },
-    { 0x1F30, 0x03B9 },
-    { 0x1F40, 0x03BF },
-    { 0x1FE4, 0x03C1 },
-    { 0x1F50, 0x03C5 },
-    { 0x1F60, 0x03C9 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x313(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x313;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x314[] = {
-    { 0x1F09, 0x0391 },
-    { 0x1F19, 0x0395 },
-    { 0x1F29, 0x0397 },
-    { 0x1F39, 0x0399 },
-    { 0x1F49, 0x039F },
-    { 0x1FEC, 0x03A1 },
-    { 0x1F59, 0x03A5 },
-    { 0x1F69, 0x03A9 },
-    { 0x1F01, 0x03B1 },
-    { 0x1F11, 0x03B5 },
-    { 0x1F21, 0x03B7 },
-    { 0x1F31, 0x03B9 },
-    { 0x1F41, 0x03BF },
-    { 0x1FE5, 0x03C1 },
-    { 0x1F51, 0x03C5 },
-    { 0x1F61, 0x03C9 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x314(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x314;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x342[] = {
-    { 0x1FB6, 0x03B1 },
-    { 0x1FC6, 0x03B7 },
-    { 0x1FD6, 0x03B9 },
-    { 0x1FE6, 0x03C5 },
-    { 0x1FF6, 0x03C9 },
-    { 0x1FD7, 0x03CA },
-    { 0x1FE7, 0x03CB },
-    { 0x1F06, 0x1F00 },
-    { 0x1F07, 0x1F01 },
-    { 0x1F0E, 0x1F08 },
-    { 0x1F0F, 0x1F09 },
-    { 0x1F26, 0x1F20 },
-    { 0x1F27, 0x1F21 },
-    { 0x1F2E, 0x1F28 },
-    { 0x1F2F, 0x1F29 },
-    { 0x1F36, 0x1F30 },
-    { 0x1F37, 0x1F31 },
-    { 0x1F3E, 0x1F38 },
-    { 0x1F3F, 0x1F39 },
-    { 0x1F56, 0x1F50 },
-    { 0x1F57, 0x1F51 },
-    { 0x1F5F, 0x1F59 },
-    { 0x1F66, 0x1F60 },
-    { 0x1F67, 0x1F61 },
-    { 0x1F6E, 0x1F68 },
-    { 0x1F6F, 0x1F69 },
-    { 0x1FCF, 0x1FBF },
-    { 0x1FDF, 0x1FFE },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x342(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x342;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-static const hb_greek_decomposition decompose_0x345[] = {
-    { 0x1FBC, 0x0391 },
-    { 0x1FCC, 0x0397 },
-    { 0x1FFC, 0x03A9 },
-    { 0x1FB4, 0x03AC },
-    { 0x1FC4, 0x03AE },
-    { 0x1FB3, 0x03B1 },
-    { 0x1FC3, 0x03B7 },
-    { 0x1FF3, 0x03C9 },
-    { 0x1FF4, 0x03CE },
-    { 0x1F80, 0x1F00 },
-    { 0x1F81, 0x1F01 },
-    { 0x1F82, 0x1F02 },
-    { 0x1F83, 0x1F03 },
-    { 0x1F84, 0x1F04 },
-    { 0x1F85, 0x1F05 },
-    { 0x1F86, 0x1F06 },
-    { 0x1F87, 0x1F07 },
-    { 0x1F88, 0x1F08 },
-    { 0x1F89, 0x1F09 },
-    { 0x1F8A, 0x1F0A },
-    { 0x1F8B, 0x1F0B },
-    { 0x1F8C, 0x1F0C },
-    { 0x1F8D, 0x1F0D },
-    { 0x1F8E, 0x1F0E },
-    { 0x1F8F, 0x1F0F },
-    { 0x1F90, 0x1F20 },
-    { 0x1F91, 0x1F21 },
-    { 0x1F92, 0x1F22 },
-    { 0x1F93, 0x1F23 },
-    { 0x1F94, 0x1F24 },
-    { 0x1F95, 0x1F25 },
-    { 0x1F96, 0x1F26 },
-    { 0x1F97, 0x1F27 },
-    { 0x1F98, 0x1F28 },
-    { 0x1F99, 0x1F29 },
-    { 0x1F9A, 0x1F2A },
-    { 0x1F9B, 0x1F2B },
-    { 0x1F9C, 0x1F2C },
-    { 0x1F9D, 0x1F2D },
-    { 0x1F9E, 0x1F2E },
-    { 0x1F9F, 0x1F2F },
-    { 0x1FA0, 0x1F60 },
-    { 0x1FA1, 0x1F61 },
-    { 0x1FA2, 0x1F62 },
-    { 0x1FA3, 0x1F63 },
-    { 0x1FA4, 0x1F64 },
-    { 0x1FA5, 0x1F65 },
-    { 0x1FA6, 0x1F66 },
-    { 0x1FA7, 0x1F67 },
-    { 0x1FA8, 0x1F68 },
-    { 0x1FA9, 0x1F69 },
-    { 0x1FAA, 0x1F6A },
-    { 0x1FAB, 0x1F6B },
-    { 0x1FAC, 0x1F6C },
-    { 0x1FAD, 0x1F6D },
-    { 0x1FAE, 0x1F6E },
-    { 0x1FAF, 0x1F6F },
-    { 0x1FB2, 0x1F70 },
-    { 0x1FC2, 0x1F74 },
-    { 0x1FF2, 0x1F7C },
-    { 0x1FB7, 0x1FB6 },
-    { 0x1FC7, 0x1FC6 },
-    { 0x1FF7, 0x1FF6 },
-    { 0, 0 }
-};
-
-static HB_UChar16 compose_0x345(HB_UChar16 base)
-{
-    const hb_greek_decomposition *d = decompose_0x345;
-    while (d->base && d->base != base)
-        ++d;
-    return d->composed;
-}
-
-/*
-  Greek shaping. Heuristic positioning can't render polytonic greek correctly. We're a lot
-  better off mapping greek chars with diacritics to the characters in the extended greek
-  region in Unicode if possible.
-*/
-HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item)
-{
-    const int availableGlyphs = shaper_item->num_glyphs;
-    const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos;
-    unsigned short *logClusters = shaper_item->log_clusters;
-    HB_GlyphAttributes *attributes = shaper_item->attributes;
-
-    HB_Bool haveGlyphs;
-    int slen = 1;
-    int cluster_start = 0;
-    hb_uint32 i;
-
-    HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length);
-
-    assert(shaper_item->item.script == HB_Script_Greek);
-
-    *shapedChars = *uc;
-    logClusters[0] = 0;
-
-    for (i = 1; i < shaper_item->item.length; ++i) {
-        hb_uint16 base = shapedChars[slen-1];
-        hb_uint16 shaped = 0;
-        if (uc[i] == 0x300)
-            shaped = compose_0x300(base);
-        else if (uc[i] == 0x301)
-            shaped = compose_0x301(base);
-        else if (uc[i] == 0x304)
-            shaped = compose_0x304(base);
-        else if (uc[i] == 0x306)
-            shaped = compose_0x306(base);
-        else if (uc[i] == 0x308)
-            shaped = compose_0x308(base);
-        else if (uc[i] == 0x313)
-            shaped = compose_0x313(base);
-        else if (uc[i] == 0x314)
-            shaped = compose_0x314(base);
-        else if (uc[i] == 0x342)
-            shaped = compose_0x342(base);
-        else if (uc[i] == 0x345)
-            shaped = compose_0x345(base);
-
-        if (shaped) {
-            if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) {
-                shapedChars[slen-1] = shaped;
-            } else {
-                shaped = 0;
-            }
-        }
-
-        if (!shaped) {
-            HB_CharCategory category;
-            int cmb;
-            shapedChars[slen] = uc[i];
-            HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb);
-            if (category != HB_Mark_NonSpacing) {
-                attributes[slen].clusterStart = TRUE;
-                attributes[slen].mark = FALSE;
-                attributes[slen].combiningClass = 0;
-                attributes[slen].dontPrint = HB_IsControlChar(uc[i]);
-                cluster_start = slen;
-            } else {
-                attributes[slen].clusterStart = FALSE;
-                attributes[slen].mark = TRUE;
-                attributes[slen].combiningClass = cmb;
-            }
-            ++slen;
-        }
-        logClusters[i] = cluster_start;
-    }
-
-    haveGlyphs = shaper_item->font->klass
-        ->convertStringToGlyphIndices(shaper_item->font,
-                                      shapedChars, slen,
-                                      shaper_item->glyphs, &shaper_item->num_glyphs,
-                                      shaper_item->item.bidiLevel % 2);
-
-    HB_FREE_STACKARRAY(shapedChars);
-
-    if (!haveGlyphs)
-        return FALSE;
-
-#ifndef NO_OPENTYPE
-    if (HB_SelectScript(shaper_item, greek_features)) {
-        HB_OpenTypeShape(shaper_item, /*properties*/0);
-        return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE);
-    }
-#endif
-    HB_HeuristicPosition(shaper_item);
-
-    return TRUE;
-}
-
diff --git a/src/hb-old/harfbuzz-gsub-private.h b/src/hb-old/harfbuzz-gsub-private.h
deleted file mode 100644
index 7eb329e..0000000
--- a/src/hb-old/harfbuzz-gsub-private.h
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GSUB_PRIVATE_H
-#define HARFBUZZ_GSUB_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include "harfbuzz-gsub.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-typedef union HB_GSUB_SubTable_  HB_GSUB_SubTable;
-
-/* LookupType 1 */
-
-struct  HB_SingleSubstFormat1_
-{
-  HB_Short  DeltaGlyphID;             /* constant added to get
-					 substitution glyph index */
-};
-
-typedef struct HB_SingleSubstFormat1_  HB_SingleSubstFormat1;
-
-
-struct  HB_SingleSubstFormat2_
-{
-  HB_UShort*  Substitute;             /* array of substitute glyph IDs */
-  HB_UShort   GlyphCount;             /* number of glyph IDs in
-					 Substitute array              */
-};
-
-typedef struct HB_SingleSubstFormat2_  HB_SingleSubstFormat2;
-
-
-struct  HB_SingleSubst_
-{
-  union
-  {
-    HB_SingleSubstFormat1  ssf1;
-    HB_SingleSubstFormat2  ssf2;
-  } ssf;
-
-  HB_Coverage  Coverage;             /* Coverage table */
-  HB_Byte     SubstFormat;            /* 1 or 2         */
-};
-
-typedef struct HB_SingleSubst_  HB_SingleSubst;
-
-
-/* LookupType 2 */
-
-struct  HB_Sequence_
-{
-  HB_UShort*  Substitute;             /* string of glyph IDs to
-					 substitute                 */
-  HB_UShort   GlyphCount;             /* number of glyph IDs in the
-					 Substitute array           */
-};
-
-typedef struct HB_Sequence_  HB_Sequence;
-
-
-struct  HB_MultipleSubst_
-{
-  HB_Sequence*  Sequence;            /* array of Sequence tables  */
-  HB_Coverage   Coverage;            /* Coverage table            */
-  HB_UShort      SubstFormat;         /* always 1                  */
-  HB_UShort      SequenceCount;       /* number of Sequence tables */
-};
-
-typedef struct HB_MultipleSubst_  HB_MultipleSubst;
-
-
-/* LookupType 3 */
-
-struct  HB_AlternateSet_
-{
-  HB_UShort*  Alternate;              /* array of alternate glyph IDs */
-  HB_UShort   GlyphCount;             /* number of glyph IDs in the
-					 Alternate array              */
-};
-
-typedef struct HB_AlternateSet_  HB_AlternateSet;
-
-
-struct  HB_AlternateSubst_
-{
-  HB_AlternateSet*  AlternateSet;    /* array of AlternateSet tables  */
-  HB_Coverage       Coverage;        /* Coverage table                */
-  HB_UShort          SubstFormat;     /* always 1                      */
-  HB_UShort          AlternateSetCount;
-				      /* number of AlternateSet tables */
-};
-
-typedef struct HB_AlternateSubst_  HB_AlternateSubst;
-
-
-/* LookupType 4 */
-
-struct  HB_Ligature_
-{
-  HB_UShort*  Component;              /* array of component glyph IDs     */
-  HB_UShort   LigGlyph;               /* glyphID of ligature
-					 to substitute                    */
-  HB_UShort   ComponentCount;         /* number of components in ligature */
-};
-
-typedef struct HB_Ligature_  HB_Ligature;
-
-
-struct  HB_LigatureSet_
-{
-  HB_Ligature*  Ligature;            /* array of Ligature tables  */
-  HB_UShort      LigatureCount;       /* number of Ligature tables */
-};
-
-typedef struct HB_LigatureSet_  HB_LigatureSet;
-
-
-struct  HB_LigatureSubst_
-{
-  HB_LigatureSet*  LigatureSet;      /* array of LigatureSet tables  */
-  HB_Coverage      Coverage;         /* Coverage table               */
-  HB_UShort         SubstFormat;      /* always 1                     */
-  HB_UShort         LigatureSetCount; /* number of LigatureSet tables */
-};
-
-typedef struct HB_LigatureSubst_  HB_LigatureSubst;
-
-
-/* needed by both lookup type 5 and 6 */
-
-struct  HB_SubstLookupRecord_
-{
-  HB_UShort  SequenceIndex;           /* index into current
-					 glyph sequence               */
-  HB_UShort  LookupListIndex;         /* Lookup to apply to that pos. */
-};
-
-typedef struct HB_SubstLookupRecord_  HB_SubstLookupRecord;
-
-
-/* LookupType 5 */
-
-struct  HB_SubRule_
-{
-  HB_UShort*              Input;      /* array of input glyph IDs     */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of SubstLookupRecord
-					 tables                       */
-  HB_UShort               GlyphCount; /* total number of input glyphs */
-  HB_UShort               SubstCount; /* number of SubstLookupRecord
-					 tables                       */
-};
-
-typedef struct HB_SubRule_  HB_SubRule;
-
-
-struct  HB_SubRuleSet_
-{
-  HB_SubRule*  SubRule;              /* array of SubRule tables  */
-  HB_UShort     SubRuleCount;         /* number of SubRule tables */
-};
-
-typedef struct HB_SubRuleSet_  HB_SubRuleSet;
-
-
-struct  HB_ContextSubstFormat1_
-{
-  HB_SubRuleSet*  SubRuleSet;        /* array of SubRuleSet tables  */
-  HB_Coverage     Coverage;          /* Coverage table              */
-  HB_UShort        SubRuleSetCount;   /* number of SubRuleSet tables */
-};
-
-typedef struct HB_ContextSubstFormat1_  HB_ContextSubstFormat1;
-
-
-struct  HB_SubClassRule_
-{
-  HB_UShort*              Class;      /* array of classes                */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of SubstLookupRecord
-					 tables                          */
-  HB_UShort               GlyphCount; /* total number of context classes */
-  HB_UShort               SubstCount; /* number of SubstLookupRecord
-					 tables                          */
-};
-
-typedef struct HB_SubClassRule_  HB_SubClassRule;
-
-
-struct  HB_SubClassSet_
-{
-  HB_SubClassRule*  SubClassRule;    /* array of SubClassRule tables  */
-  HB_UShort          SubClassRuleCount;
-				      /* number of SubClassRule tables */
-};
-
-typedef struct HB_SubClassSet_  HB_SubClassSet;
-
-
-/* The `MaxContextLength' field is not defined in the TTO specification
-   but simplifies the implementation of this format.  It holds the
-   maximal context length used in the context rules.                    */
-
-struct  HB_ContextSubstFormat2_
-{
-  HB_SubClassSet*     SubClassSet;   /* array of SubClassSet tables  */
-  HB_Coverage         Coverage;      /* Coverage table               */
-  HB_ClassDefinition  ClassDef;      /* ClassDef table               */
-  HB_UShort            SubClassSetCount;
-				      /* number of SubClassSet tables */
-  HB_UShort            MaxContextLength;
-				      /* maximal context length       */
-};
-
-typedef struct HB_ContextSubstFormat2_  HB_ContextSubstFormat2;
-
-
-struct  HB_ContextSubstFormat3_
-{
-  HB_Coverage*           Coverage;   /* array of Coverage tables      */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of substitution lookups */
-  HB_UShort               GlyphCount; /* number of input glyphs        */
-  HB_UShort               SubstCount; /* number of SubstLookupRecords  */
-};
-
-typedef struct HB_ContextSubstFormat3_  HB_ContextSubstFormat3;
-
-
-struct  HB_ContextSubst_
-{
-  union
-  {
-    HB_ContextSubstFormat1  csf1;
-    HB_ContextSubstFormat2  csf2;
-    HB_ContextSubstFormat3  csf3;
-  } csf;
-
-  HB_Byte  SubstFormat;               /* 1, 2, or 3 */
-};
-
-typedef struct HB_ContextSubst_  HB_ContextSubst;
-
-
-/* LookupType 6 */
-
-struct  HB_ChainSubRule_
-{
-  HB_UShort*              Backtrack;  /* array of backtrack glyph IDs     */
-  HB_UShort*              Input;      /* array of input glyph IDs         */
-  HB_UShort*              Lookahead;  /* array of lookahead glyph IDs     */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of SubstLookupRecords      */
-  HB_UShort               BacktrackGlyphCount;
-				      /* total number of backtrack glyphs */
-  HB_UShort               InputGlyphCount;
-				      /* total number of input glyphs     */
-  HB_UShort               LookaheadGlyphCount;
-				      /* total number of lookahead glyphs */
-  HB_UShort               SubstCount; /* number of SubstLookupRecords     */
-};
-
-typedef struct HB_ChainSubRule_  HB_ChainSubRule;
-
-
-struct  HB_ChainSubRuleSet_
-{
-  HB_ChainSubRule*  ChainSubRule;    /* array of ChainSubRule tables  */
-  HB_UShort          ChainSubRuleCount;
-				      /* number of ChainSubRule tables */
-};
-
-typedef struct HB_ChainSubRuleSet_  HB_ChainSubRuleSet;
-
-
-struct  HB_ChainContextSubstFormat1_
-{
-  HB_ChainSubRuleSet*  ChainSubRuleSet;
-				      /* array of ChainSubRuleSet tables  */
-  HB_Coverage          Coverage;     /* Coverage table                   */
-  HB_UShort             ChainSubRuleSetCount;
-				      /* number of ChainSubRuleSet tables */
-};
-
-typedef struct HB_ChainContextSubstFormat1_  HB_ChainContextSubstFormat1;
-
-
-struct  HB_ChainSubClassRule_
-{
-  HB_UShort*              Backtrack;  /* array of backtrack classes      */
-  HB_UShort*              Input;      /* array of context classes        */
-  HB_UShort*              Lookahead;  /* array of lookahead classes      */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of substitution lookups   */
-  HB_UShort               BacktrackGlyphCount;
-				      /* total number of backtrack
-					 classes                         */
-  HB_UShort               InputGlyphCount;
-				      /* total number of context classes */
-  HB_UShort               LookaheadGlyphCount;
-				      /* total number of lookahead
-					 classes                         */
-  HB_UShort               SubstCount; /* number of SubstLookupRecords    */
-};
-
-typedef struct HB_ChainSubClassRule_  HB_ChainSubClassRule;
-
-
-struct  HB_ChainSubClassSet_
-{
-  HB_ChainSubClassRule*  ChainSubClassRule;
-				      /* array of ChainSubClassRule
-					 tables                      */
-  HB_UShort               ChainSubClassRuleCount;
-				      /* number of ChainSubClassRule
-					 tables                      */
-};
-
-typedef struct HB_ChainSubClassSet_  HB_ChainSubClassSet;
-
-
-/* The `MaxXXXLength' fields are not defined in the TTO specification
-   but simplifies the implementation of this format.  It holds the
-   maximal context length used in the specific context rules.         */
-
-struct  HB_ChainContextSubstFormat2_
-{
-  HB_ChainSubClassSet*  ChainSubClassSet;
-				      /* array of ChainSubClassSet
-					 tables                     */
-  HB_Coverage           Coverage;    /* Coverage table             */
-
-  HB_ClassDefinition    BacktrackClassDef;
-				      /* BacktrackClassDef table    */
-  HB_ClassDefinition    InputClassDef;
-				      /* InputClassDef table        */
-  HB_ClassDefinition    LookaheadClassDef;
-				      /* LookaheadClassDef table    */
-
-  HB_UShort              ChainSubClassSetCount;
-				      /* number of ChainSubClassSet
-					 tables                     */
-  HB_UShort              MaxBacktrackLength;
-				      /* maximal backtrack length   */
-  HB_UShort              MaxLookaheadLength;
-				      /* maximal lookahead length   */
-  HB_UShort              MaxInputLength;
-				      /* maximal input length       */
-};
-
-typedef struct HB_ChainContextSubstFormat2_  HB_ChainContextSubstFormat2;
-
-
-struct  HB_ChainContextSubstFormat3_
-{
-  HB_Coverage*           BacktrackCoverage;
-				      /* array of backtrack Coverage
-					 tables                        */
-  HB_Coverage*           InputCoverage;
-				      /* array of input coverage
-					 tables                        */
-  HB_Coverage*           LookaheadCoverage;
-				      /* array of lookahead coverage
-					 tables                        */
-  HB_SubstLookupRecord*  SubstLookupRecord;
-				      /* array of substitution lookups */
-  HB_UShort               BacktrackGlyphCount;
-				      /* number of backtrack glyphs    */
-  HB_UShort               InputGlyphCount;
-				      /* number of input glyphs        */
-  HB_UShort               LookaheadGlyphCount;
-				      /* number of lookahead glyphs    */
-  HB_UShort               SubstCount; /* number of SubstLookupRecords  */
-};
-
-typedef struct HB_ChainContextSubstFormat3_  HB_ChainContextSubstFormat3;
-
-
-struct  HB_ChainContextSubst_
-{
-  union
-  {
-    HB_ChainContextSubstFormat1  ccsf1;
-    HB_ChainContextSubstFormat2  ccsf2;
-    HB_ChainContextSubstFormat3  ccsf3;
-  } ccsf;
-
-  HB_Byte  SubstFormat;               /* 1, 2, or 3 */
-};
-
-typedef struct HB_ChainContextSubst_  HB_ChainContextSubst;
-
-
-#if 0
-/* LookupType 7 */
-struct HB_ExtensionSubst_
-{
-  HB_GSUB_SubTable *subtable;         /* referenced subtable */
-  HB_UShort      SubstFormat;         /* always 1 */
-  HB_UShort      LookuptType;         /* lookup-type of referenced subtable */
-};
-
-typedef struct HB_ExtensionSubst_  HB_ExtensionSubst;
-#endif
-
-
-/* LookupType 8 */
-struct HB_ReverseChainContextSubst_
-{
-  HB_Coverage*  LookaheadCoverage;   /* array of lookahead Coverage
-					 tables                          */
-  HB_UShort*     Substitute;          /* array of substitute Glyph ID    */
-  HB_Coverage*  BacktrackCoverage;   /* array of backtrack Coverage
-					 tables                          */
-  HB_Coverage   Coverage;	        /* coverage table for input glyphs */
-  HB_UShort      SubstFormat;         /* always 1 */
-  HB_UShort      BacktrackGlyphCount; /* number of backtrack glyphs      */
-  HB_UShort      LookaheadGlyphCount; /* number of lookahead glyphs      */
-  HB_UShort      GlyphCount;          /* number of Glyph IDs             */
-};
-
-typedef struct HB_ReverseChainContextSubst_  HB_ReverseChainContextSubst;
-
-
-union  HB_GSUB_SubTable_
-{
-  HB_SingleSubst              single;
-  HB_MultipleSubst            multiple;
-  HB_AlternateSubst           alternate;
-  HB_LigatureSubst            ligature;
-  HB_ContextSubst             context;
-  HB_ChainContextSubst        chain;
-  HB_ReverseChainContextSubst reverse;
-};
-
-
-
-
-HB_INTERNAL HB_Error
-_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st,
-				  HB_Stream     stream,
-				  HB_UShort     lookup_type );
-
-HB_INTERNAL void
-_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st,
-			      HB_UShort     lookup_type );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GSUB_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-gsub.c b/src/hb-old/harfbuzz-gsub.c
deleted file mode 100644
index ceb7034..0000000
--- a/src/hb-old/harfbuzz-gsub.c
+++ /dev/null
@@ -1,4329 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- * Copyright (C) 2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-open-private.h"
-#include "harfbuzz-gdef-private.h"
-
-static HB_Error  GSUB_Do_Glyph_Lookup( HB_GSUBHeader*   gsub,
-				       HB_UShort         lookup_index,
-				       HB_Buffer        buffer,
-				       HB_UShort         context_length,
-				       int               nesting_level );
-
-
-
-/**********************
- * Auxiliary functions
- **********************/
-
-
-
-HB_Error  HB_Load_GSUB_Table( HB_Stream stream,
-			      HB_GSUBHeader** retptr,
-			      HB_GDEFHeader*  gdef,
-                              HB_Stream       gdefStream )
-{
-  HB_Error         error;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_GSUBHeader*  gsub;
-
-  if ( !retptr )
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( GOTO_Table( TTAG_GSUB ) )
-    return error;
-
-  base_offset = FILE_Pos();
-
-  if ( ALLOC ( gsub, sizeof( *gsub ) ) ) 
-      return error;
-  
-
-  /* skip version */
-
-  if ( FILE_Seek( base_offset + 4L ) ||
-       ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_ScriptList( &gsub->ScriptList,
-				  stream ) ) != HB_Err_Ok )
-    goto Fail4;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_FeatureList( &gsub->FeatureList,
-				   stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_LookupList( &gsub->LookupList,
-				  stream, HB_Type_GSUB ) ) != HB_Err_Ok )
-    goto Fail2;
-
-  gsub->gdef = gdef;      /* can be NULL */
-
-  if ( ( error =  _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream,
-								     gsub->LookupList.Lookup,
-								     gsub->LookupList.LookupCount ) ) )
-    goto Fail1;
-
-  *retptr = gsub;
-
-  return HB_Err_Ok;
-
-Fail1:
-  _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB );
-
-Fail2:
-  _HB_OPEN_Free_FeatureList( &gsub->FeatureList );
-
-Fail3:
-  _HB_OPEN_Free_ScriptList( &gsub->ScriptList );
-
-Fail4:
-  FREE ( gsub );
-
-
-  return error;
-}
-
-
-HB_Error   HB_Done_GSUB_Table( HB_GSUBHeader* gsub )
-{
-  _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB );
-  _HB_OPEN_Free_FeatureList( &gsub->FeatureList );
-  _HB_OPEN_Free_ScriptList( &gsub->ScriptList );
-
-  FREE( gsub );
-
-  return HB_Err_Ok;
-}
-
-/*****************************
- * SubTable related functions
- *****************************/
-
-
-/* LookupType 1 */
-
-/* SingleSubstFormat1 */
-/* SingleSubstFormat2 */
-
-static HB_Error  Load_SingleSubst( HB_GSUB_SubTable* st,
-				   HB_Stream         stream )
-{
-  HB_Error error;
-  HB_SingleSubst*  ss = &st->single;
-
-  HB_UShort n, count;
-  HB_UInt cur_offset, new_offset, base_offset;
-
-  HB_UShort*  s;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  ss->SubstFormat = GET_UShort();
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ss->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  switch ( ss->SubstFormat )
-  {
-  case 1:
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    ss->ssf.ssf1.DeltaGlyphID = GET_UShort();
-
-    FORGET_Frame();
-
-    break;
-
-  case 2:
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    count = ss->ssf.ssf2.GlyphCount = GET_UShort();
-
-    FORGET_Frame();
-
-    ss->ssf.ssf2.Substitute = NULL;
-
-    if ( ALLOC_ARRAY( ss->ssf.ssf2.Substitute, count, HB_UShort ) )
-      goto Fail2;
-
-    s = ss->ssf.ssf2.Substitute;
-
-    if ( ACCESS_Frame( count * 2L ) )
-      goto Fail1;
-
-    for ( n = 0; n < count; n++ )
-      s[n] = GET_UShort();
-
-    FORGET_Frame();
-
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( s );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &ss->Coverage );
-  return error;
-}
-
-
-static void  Free_SingleSubst( HB_GSUB_SubTable* st )
-{
-  HB_SingleSubst*  ss = &st->single;
-
-  switch ( ss->SubstFormat )
-  {
-  case 1:
-    break;
-
-  case 2:
-    FREE( ss->ssf.ssf2.Substitute );
-    break;
-
-  default:
-    break;
-  }
-
-  _HB_OPEN_Free_Coverage( &ss->Coverage );
-}
-
-
-static HB_Error  Lookup_SingleSubst( HB_GSUBHeader*   gsub,
-				     HB_GSUB_SubTable* st,
-				     HB_Buffer        buffer,
-				     HB_UShort         flags,
-				     HB_UShort         context_length,
-				     int               nesting_level )
-{
-  HB_UShort index, value, property;
-  HB_Error  error;
-  HB_SingleSubst*  ss = &st->single;
-  HB_GDEFHeader*   gdef = gsub->gdef;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &ss->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  switch ( ss->SubstFormat )
-  {
-  case 1:
-    value = ( IN_CURGLYPH() + ss->ssf.ssf1.DeltaGlyphID ) & 0xFFFF;
-    if ( REPLACE_Glyph( buffer, value, nesting_level ) )
-      return error;
-    break;
-
-  case 2:
-    if ( index >= ss->ssf.ssf2.GlyphCount )
-      return ERR(HB_Err_Invalid_SubTable);
-    value = ss->ssf.ssf2.Substitute[index];
-    if ( REPLACE_Glyph( buffer, value, nesting_level ) )
-      return error;
-    break;
-
-  default:
-    return ERR(HB_Err_Invalid_SubTable);
-  }
-
-  if ( gdef && gdef->NewGlyphClasses )
-  {
-    /* we inherit the old glyph class to the substituted glyph */
-
-    error = _HB_GDEF_Add_Glyph_Property( gdef, value, property );
-    if ( error && error != HB_Err_Not_Covered )
-      return error;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 2 */
-
-/* Sequence */
-
-static HB_Error  Load_Sequence( HB_Sequence*  s,
-				HB_Stream      stream )
-{
-  HB_Error error;
-
-  HB_UShort n, count;
-  HB_UShort*  sub;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = s->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  s->Substitute = NULL;
-
-  if ( count )
-  {
-    if ( ALLOC_ARRAY( s->Substitute, count, HB_UShort ) )
-      return error;
-
-    sub = s->Substitute;
-
-    if ( ACCESS_Frame( count * 2L ) )
-    {
-      FREE( sub );
-      return error;
-    }
-
-    for ( n = 0; n < count; n++ )
-      sub[n] = GET_UShort();
-
-    FORGET_Frame();
-  }
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_Sequence( HB_Sequence*  s )
-{
-  FREE( s->Substitute );
-}
-
-
-/* MultipleSubstFormat1 */
-
-static HB_Error  Load_MultipleSubst( HB_GSUB_SubTable* st,
-				     HB_Stream         stream )
-{
-  HB_Error error;
-  HB_MultipleSubst*  ms = &st->multiple;
-
-  HB_UShort      n = 0, m, count;
-  HB_UInt       cur_offset, new_offset, base_offset;
-
-  HB_Sequence*  s;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  ms->SubstFormat = GET_UShort();             /* should be 1 */
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ms->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = ms->SequenceCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ms->Sequence = NULL;
-
-  if ( ALLOC_ARRAY( ms->Sequence, count, HB_Sequence ) )
-    goto Fail2;
-
-  s = ms->Sequence;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_Sequence( &s[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_Sequence( &s[m] );
-
-  FREE( s );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &ms->Coverage );
-  return error;
-}
-
-
-static void  Free_MultipleSubst( HB_GSUB_SubTable* st )
-{
-  HB_UShort      n, count;
-  HB_MultipleSubst*  ms = &st->multiple;
-
-  HB_Sequence*  s;
-
-
-  if ( ms->Sequence )
-  {
-    count = ms->SequenceCount;
-    s     = ms->Sequence;
-
-    for ( n = 0; n < count; n++ )
-      Free_Sequence( &s[n] );
-
-    FREE( s );
-  }
-
-  _HB_OPEN_Free_Coverage( &ms->Coverage );
-}
-
-
-static HB_Error  Lookup_MultipleSubst( HB_GSUBHeader*    gsub,
-				       HB_GSUB_SubTable* st,
-				       HB_Buffer         buffer,
-				       HB_UShort          flags,
-				       HB_UShort          context_length,
-				       int                nesting_level )
-{
-  HB_Error  error;
-  HB_UShort index, property, n, count;
-  HB_UShort*s;
-  HB_MultipleSubst*  ms = &st->multiple;
-  HB_GDEFHeader*     gdef = gsub->gdef;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &ms->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if ( index >= ms->SequenceCount )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  count = ms->Sequence[index].GlyphCount;
-  s     = ms->Sequence[index].Substitute;
-
-  if ( ADD_String( buffer, 1, count, s, 0xFFFF, 0xFFFF ) )
-    return error;
-
-  if ( gdef && gdef->NewGlyphClasses )
-  {
-    /* this is a guess only ... */
-
-    if ( property == HB_GDEF_LIGATURE )
-      property = HB_GDEF_BASE_GLYPH;
-
-    for ( n = 0; n < count; n++ )
-    {
-      error = _HB_GDEF_Add_Glyph_Property( gdef, s[n], property );
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-    }
-  }
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 3 */
-
-/* AlternateSet */
-
-static HB_Error  Load_AlternateSet( HB_AlternateSet*  as,
-				    HB_Stream          stream )
-{
-  HB_Error error;
-
-  HB_UShort n, count;
-  HB_UShort*  a;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = as->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  as->Alternate = NULL;
-
-  if ( ALLOC_ARRAY( as->Alternate, count, HB_UShort ) )
-    return error;
-
-  a = as->Alternate;
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( a );
-    return error;
-  }
-
-  for ( n = 0; n < count; n++ )
-    a[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_AlternateSet( HB_AlternateSet*  as )
-{
-  FREE( as->Alternate );
-}
-
-
-/* AlternateSubstFormat1 */
-
-static HB_Error  Load_AlternateSubst( HB_GSUB_SubTable* st,
-				      HB_Stream         stream )
-{
-  HB_Error error;
-  HB_AlternateSubst* as = &st->alternate;
-
-  HB_UShort          n = 0, m, count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_AlternateSet*  aset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  as->SubstFormat = GET_UShort();             /* should be 1 */
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &as->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = as->AlternateSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  as->AlternateSet = NULL;
-
-  if ( ALLOC_ARRAY( as->AlternateSet, count, HB_AlternateSet ) )
-    goto Fail2;
-
-  aset = as->AlternateSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_AlternateSet( &aset[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_AlternateSet( &aset[m] );
-
-  FREE( aset );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &as->Coverage );
-  return error;
-}
-
-
-static void  Free_AlternateSubst( HB_GSUB_SubTable* st )
-{
-  HB_UShort          n, count;
-  HB_AlternateSubst* as = &st->alternate;
-
-  HB_AlternateSet*  aset;
-
-
-  if ( as->AlternateSet )
-  {
-    count = as->AlternateSetCount;
-    aset  = as->AlternateSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_AlternateSet( &aset[n] );
-
-    FREE( aset );
-  }
-
-  _HB_OPEN_Free_Coverage( &as->Coverage );
-}
-
-
-static HB_Error  Lookup_AlternateSubst( HB_GSUBHeader*    gsub,
-					HB_GSUB_SubTable* st,
-					HB_Buffer         buffer,
-					HB_UShort          flags,
-					HB_UShort          context_length,
-					int                nesting_level )
-{
-  HB_Error          error;
-  HB_UShort         index, value, alt_index, property;
-  HB_AlternateSubst* as = &st->alternate;
-  HB_GDEFHeader*     gdef = gsub->gdef;
-  HB_AlternateSet  aset;
-
-  HB_UNUSED(nesting_level);
-
-  if ( context_length != 0xFFFF && context_length < 1 )
-    return HB_Err_Not_Covered;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &as->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  aset = as->AlternateSet[index];
-
-  /* we use a user-defined callback function to get the alternate index */
-
-  if ( gsub->altfunc )
-    alt_index = (gsub->altfunc)( buffer->out_pos, IN_CURGLYPH(),
-				 aset.GlyphCount, aset.Alternate,
-				 gsub->data );
-  else
-    alt_index = 0;
-
-  value = aset.Alternate[alt_index];
-  if ( REPLACE_Glyph( buffer, value, nesting_level ) )
-    return error;
-
-  if ( gdef && gdef->NewGlyphClasses )
-  {
-    /* we inherit the old glyph class to the substituted glyph */
-
-    error = _HB_GDEF_Add_Glyph_Property( gdef, value, property );
-    if ( error && error != HB_Err_Not_Covered )
-      return error;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 4 */
-
-/* Ligature */
-
-static HB_Error  Load_Ligature( HB_Ligature*  l,
-				HB_Stream      stream )
-{
-  HB_Error error;
-
-  HB_UShort n, count;
-  HB_UShort*  c;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  l->LigGlyph       = GET_UShort();
-  l->ComponentCount = GET_UShort();
-
-  FORGET_Frame();
-
-  l->Component = NULL;
-
-  count = l->ComponentCount - 1;      /* only ComponentCount - 1 elements */
-
-  if ( ALLOC_ARRAY( l->Component, count, HB_UShort ) )
-    return error;
-
-  c = l->Component;
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( c );
-    return error;
-  }
-
-  for ( n = 0; n < count; n++ )
-    c[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_Ligature( HB_Ligature*  l )
-{
-  FREE( l->Component );
-}
-
-
-/* LigatureSet */
-
-static HB_Error  Load_LigatureSet( HB_LigatureSet*  ls,
-				   HB_Stream         stream )
-{
-  HB_Error error;
-
-  HB_UShort      n = 0, m, count;
-  HB_UInt       cur_offset, new_offset, base_offset;
-
-  HB_Ligature*  l;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ls->LigatureCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ls->Ligature = NULL;
-
-  if ( ALLOC_ARRAY( ls->Ligature, count, HB_Ligature ) )
-    return error;
-
-  l = ls->Ligature;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_Ligature( &l[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_Ligature( &l[m] );
-
-  FREE( l );
-  return error;
-}
-
-
-static void  Free_LigatureSet( HB_LigatureSet*  ls )
-{
-  HB_UShort      n, count;
-
-  HB_Ligature*  l;
-
-
-  if ( ls->Ligature )
-  {
-    count = ls->LigatureCount;
-    l     = ls->Ligature;
-
-    for ( n = 0; n < count; n++ )
-      Free_Ligature( &l[n] );
-
-    FREE( l );
-  }
-}
-
-
-/* LigatureSubstFormat1 */
-
-static HB_Error  Load_LigatureSubst( HB_GSUB_SubTable* st,
-				     HB_Stream         stream )
-{
-  HB_Error error;
-  HB_LigatureSubst*  ls = &st->ligature;
-
-  HB_UShort         n = 0, m, count;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_LigatureSet*  lset;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  ls->SubstFormat = GET_UShort();             /* should be 1 */
-  new_offset      = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ls->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = ls->LigatureSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ls->LigatureSet = NULL;
-
-  if ( ALLOC_ARRAY( ls->LigatureSet, count, HB_LigatureSet ) )
-    goto Fail2;
-
-  lset = ls->LigatureSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LigatureSet( &lset[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_LigatureSet( &lset[m] );
-
-  FREE( lset );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &ls->Coverage );
-  return error;
-}
-
-
-static void  Free_LigatureSubst( HB_GSUB_SubTable* st )
-{
-  HB_UShort         n, count;
-  HB_LigatureSubst*  ls = &st->ligature;
-
-  HB_LigatureSet*  lset;
-
-
-  if ( ls->LigatureSet )
-  {
-    count = ls->LigatureSetCount;
-    lset  = ls->LigatureSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_LigatureSet( &lset[n] );
-
-    FREE( lset );
-  }
-
-  _HB_OPEN_Free_Coverage( &ls->Coverage );
-}
-
-
-static HB_Error  Lookup_LigatureSubst( HB_GSUBHeader*    gsub,
-				       HB_GSUB_SubTable* st,
-				       HB_Buffer         buffer,
-				       HB_UShort          flags,
-				       HB_UShort          context_length,
-				       int                nesting_level )
-{
-  HB_UShort      index, property;
-  HB_Error       error;
-  HB_UShort      numlig, i, j, is_mark, first_is_mark = FALSE;
-  HB_UShort*     c;
-  HB_LigatureSubst*  ls = &st->ligature;
-  HB_GDEFHeader*     gdef = gsub->gdef;
-
-  HB_Ligature*  lig;
-
-  HB_UNUSED(nesting_level);
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  if ( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
-    first_is_mark = TRUE;
-
-  error = _HB_OPEN_Coverage_Index( &ls->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if ( index >= ls->LigatureSetCount )
-     return ERR(HB_Err_Invalid_SubTable);
-
-  lig = ls->LigatureSet[index].Ligature;
-
-  for ( numlig = ls->LigatureSet[index].LigatureCount;
-	numlig;
-	numlig--, lig++ )
-  {
-    if ( buffer->in_pos + lig->ComponentCount > buffer->in_length )
-      goto next_ligature;               /* Not enough glyphs in input */
-
-    c    = lig->Component;
-
-    is_mark = first_is_mark;
-
-    if ( context_length != 0xFFFF && context_length < lig->ComponentCount )
-      break;
-
-    for ( i = 1, j = buffer->in_pos + 1; i < lig->ComponentCount; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + lig->ComponentCount - i == (HB_Int)buffer->in_length )
-	  goto next_ligature;
-	j++;
-      }
-
-      if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) )
-	is_mark = FALSE;
-
-      if ( IN_GLYPH( j ) != c[i - 1] )
-	goto next_ligature;
-    }
-
-    if ( gdef && gdef->NewGlyphClasses )
-    {
-      /* this is just a guess ... */
-
-      error = _HB_GDEF_Add_Glyph_Property( gdef, lig->LigGlyph,
-				  is_mark ? HB_GDEF_MARK : HB_GDEF_LIGATURE );
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-    }
-
-    if ( j == buffer->in_pos + i ) /* No input glyphs skipped */
-    {
-      /* We don't use a new ligature ID if there are no skipped
-	 glyphs and the ligature already has an ID.             */
-
-      if ( IN_LIGID( buffer->in_pos ) )
-      {
-	if ( ADD_String( buffer, i, 1, &lig->LigGlyph,
-			0xFFFF, 0xFFFF ) )
-	  return error;
-      }
-      else
-      {
-	HB_UShort ligID = _hb_buffer_allocate_ligid( buffer );
-	if ( ADD_String( buffer, i, 1, &lig->LigGlyph,
-			0xFFFF, ligID ) )
-	  return error;
-      }
-    }
-    else
-    {
-      HB_UShort ligID = _hb_buffer_allocate_ligid( buffer );
-      if ( ADD_Glyph( buffer, lig->LigGlyph, 0xFFFF, ligID ) )
-	return error;
-
-      /* Now we must do a second loop to copy the skipped glyphs to
-	 `out' and assign component values to it.  We start with the
-	 glyph after the first component.  Glyphs between component
-	 i and i+1 belong to component i.  Together with the ligID
-	 value it is later possible to check whether a specific
-	 component value really belongs to a given ligature.         */
-
-      for ( i = 0; i < lig->ComponentCount - 1; i++ )
-      {
-	while ( CHECK_Property( gdef, IN_CURITEM(),
-				flags, &property ) )
-	  if ( ADD_Glyph( buffer, IN_CURGLYPH(), i, ligID ) )
-	    return error;
-
-	(buffer->in_pos)++;
-      }
-    }
-
-    return HB_Err_Ok;
-
-  next_ligature:
-    ;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-/* Do the actual substitution for a context substitution (either format
-   5 or 6).  This is only called after we've determined that the input
-   matches the subrule.                                                 */
-
-static HB_Error  Do_ContextSubst( HB_GSUBHeader*        gsub,
-				  HB_UShort              GlyphCount,
-				  HB_UShort              SubstCount,
-				  HB_SubstLookupRecord* subst,
-				  HB_Buffer             buffer,
-				  int                    nesting_level )
-{
-  HB_Error  error;
-  HB_UInt   i, old_pos;
-
-
-  i = 0;
-
-  while ( i < GlyphCount )
-  {
-    if ( SubstCount && i == subst->SequenceIndex )
-    {
-      old_pos = buffer->in_pos;
-
-      /* Do a substitution */
-
-      error = GSUB_Do_Glyph_Lookup( gsub, subst->LookupListIndex, buffer,
-				    GlyphCount, nesting_level );
-
-      subst++;
-      SubstCount--;
-      i += buffer->in_pos - old_pos;
-
-      if ( error == HB_Err_Not_Covered )
-      {
-	if ( COPY_Glyph( buffer ) )
-	  return error;
-	i++;
-      }
-      else if ( error )
-	return error;
-    }
-    else
-    {
-      /* No substitution for this index */
-
-      if ( COPY_Glyph( buffer ) )
-	return error;
-      i++;
-    }
-  }
-
-  return HB_Err_Ok;
-}
-
-
-/* LookupType 5 */
-
-/* SubRule */
-
-static HB_Error  Load_SubRule( HB_SubRule*  sr,
-			       HB_Stream     stream )
-{
-  HB_Error error;
-
-  HB_UShort               n, count;
-  HB_UShort*              i;
-
-  HB_SubstLookupRecord*  slr;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  sr->GlyphCount = GET_UShort();
-  sr->SubstCount = GET_UShort();
-
-  FORGET_Frame();
-
-  sr->Input = NULL;
-
-  count = sr->GlyphCount - 1;         /* only GlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( sr->Input, count, HB_UShort ) )
-    return error;
-
-  i = sr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  sr->SubstLookupRecord = NULL;
-
-  count = sr->SubstCount;
-
-  if ( ALLOC_ARRAY( sr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = sr->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  FREE( i );
-  return error;
-}
-
-
-static void  Free_SubRule( HB_SubRule*  sr )
-{
-  FREE( sr->SubstLookupRecord );
-  FREE( sr->Input );
-}
-
-
-/* SubRuleSet */
-
-static HB_Error  Load_SubRuleSet( HB_SubRuleSet*  srs,
-				  HB_Stream        stream )
-{
-  HB_Error error;
-
-  HB_UShort     n = 0, m, count;
-  HB_UInt      cur_offset, new_offset, base_offset;
-
-  HB_SubRule*  sr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = srs->SubRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  srs->SubRule = NULL;
-
-  if ( ALLOC_ARRAY( srs->SubRule, count, HB_SubRule ) )
-    return error;
-
-  sr = srs->SubRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_SubRule( &sr[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_SubRule( &sr[m] );
-
-  FREE( sr );
-  return error;
-}
-
-
-static void  Free_SubRuleSet( HB_SubRuleSet*  srs )
-{
-  HB_UShort     n, count;
-
-  HB_SubRule*  sr;
-
-
-  if ( srs->SubRule )
-  {
-    count = srs->SubRuleCount;
-    sr    = srs->SubRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_SubRule( &sr[n] );
-
-    FREE( sr );
-  }
-}
-
-
-/* ContextSubstFormat1 */
-
-static HB_Error  Load_ContextSubst1( HB_ContextSubstFormat1*  csf1,
-				     HB_Stream                 stream )
-{
-  HB_Error error;
-
-  HB_UShort        n = 0, m, count;
-  HB_UInt         cur_offset, new_offset, base_offset;
-
-  HB_SubRuleSet*  srs;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &csf1->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = csf1->SubRuleSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csf1->SubRuleSet = NULL;
-
-  if ( ALLOC_ARRAY( csf1->SubRuleSet, count, HB_SubRuleSet ) )
-    goto Fail2;
-
-  srs = csf1->SubRuleSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_SubRuleSet( &srs[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_SubRuleSet( &srs[m] );
-
-  FREE( srs );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &csf1->Coverage );
-  return error;
-}
-
-
-static void  Free_ContextSubst1( HB_ContextSubstFormat1* csf1 )
-{
-  HB_UShort        n, count;
-
-  HB_SubRuleSet*  srs;
-
-
-  if ( csf1->SubRuleSet )
-  {
-    count = csf1->SubRuleSetCount;
-    srs   = csf1->SubRuleSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_SubRuleSet( &srs[n] );
-
-    FREE( srs );
-  }
-
-  _HB_OPEN_Free_Coverage( &csf1->Coverage );
-}
-
-
-/* SubClassRule */
-
-static HB_Error  Load_SubClassRule( HB_ContextSubstFormat2*  csf2,
-				    HB_SubClassRule*         scr,
-				    HB_Stream                 stream )
-{
-  HB_Error error;
-
-  HB_UShort               n, count;
-
-  HB_UShort*              c;
-  HB_SubstLookupRecord*  slr;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  scr->GlyphCount = GET_UShort();
-  scr->SubstCount = GET_UShort();
-
-  if ( scr->GlyphCount > csf2->MaxContextLength )
-    csf2->MaxContextLength = scr->GlyphCount;
-
-  FORGET_Frame();
-
-  scr->Class = NULL;
-
-  count = scr->GlyphCount - 1;        /* only GlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( scr->Class, count, HB_UShort ) )
-    return error;
-
-  c = scr->Class;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    c[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  scr->SubstLookupRecord = NULL;
-
-  count = scr->SubstCount;
-
-  if ( ALLOC_ARRAY( scr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = scr->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  FREE( c );
-  return error;
-}
-
-
-static void  Free_SubClassRule( HB_SubClassRule*  scr )
-{
-  FREE( scr->SubstLookupRecord );
-  FREE( scr->Class );
-}
-
-
-/* SubClassSet */
-
-static HB_Error  Load_SubClassSet( HB_ContextSubstFormat2*  csf2,
-				   HB_SubClassSet*          scs,
-				   HB_Stream                 stream )
-{
-  HB_Error error;
-
-  HB_UShort          n = 0, m, count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_SubClassRule*  scr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = scs->SubClassRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  scs->SubClassRule = NULL;
-
-  if ( ALLOC_ARRAY( scs->SubClassRule, count, HB_SubClassRule ) )
-    return error;
-
-  scr = scs->SubClassRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_SubClassRule( csf2, &scr[n],
-				      stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_SubClassRule( &scr[m] );
-
-  FREE( scr );
-  return error;
-}
-
-
-static void  Free_SubClassSet( HB_SubClassSet*  scs )
-{
-  HB_UShort          n, count;
-
-  HB_SubClassRule*  scr;
-
-
-  if ( scs->SubClassRule )
-  {
-    count = scs->SubClassRuleCount;
-    scr   = scs->SubClassRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_SubClassRule( &scr[n] );
-
-    FREE( scr );
-  }
-}
-
-
-/* ContextSubstFormat2 */
-
-static HB_Error  Load_ContextSubst2( HB_ContextSubstFormat2*  csf2,
-				     HB_Stream                 stream )
-{
-  HB_Error error;
-
-  HB_UShort         n = 0, m, count;
-  HB_UInt          cur_offset, new_offset, base_offset;
-
-  HB_SubClassSet*  scs;
-
-
-  base_offset = FILE_Pos() - 2;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &csf2->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 4L ) )
-    goto Fail3;
-
-  new_offset = GET_UShort() + base_offset;
-
-  /* `SubClassSetCount' is the upper limit for class values, thus we
-     read it now to make an additional safety check.                 */
-
-  count = csf2->SubClassSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_ClassDefinition( &csf2->ClassDef, count,
-				       stream ) ) != HB_Err_Ok )
-    goto Fail3;
-  (void)FILE_Seek( cur_offset );
-
-  csf2->SubClassSet      = NULL;
-  csf2->MaxContextLength = 0;
-
-  if ( ALLOC_ARRAY( csf2->SubClassSet, count, HB_SubClassSet ) )
-    goto Fail2;
-
-  scs = csf2->SubClassSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    if ( new_offset != base_offset )      /* not a NULL offset */
-    {
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_SubClassSet( csf2, &scs[n],
-				       stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-    {
-      /* we create a SubClassSet table with no entries */
-
-      csf2->SubClassSet[n].SubClassRuleCount = 0;
-      csf2->SubClassSet[n].SubClassRule      = NULL;
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_SubClassSet( &scs[m] );
-
-  FREE( scs );
-
-Fail2:
-  _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef );
-
-Fail3:
-  _HB_OPEN_Free_Coverage( &csf2->Coverage );
-  return error;
-}
-
-
-static void  Free_ContextSubst2( HB_ContextSubstFormat2*  csf2 )
-{
-  HB_UShort         n, count;
-
-  HB_SubClassSet*  scs;
-
-
-  if ( csf2->SubClassSet )
-  {
-    count = csf2->SubClassSetCount;
-    scs   = csf2->SubClassSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_SubClassSet( &scs[n] );
-
-    FREE( scs );
-  }
-
-  _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef );
-  _HB_OPEN_Free_Coverage( &csf2->Coverage );
-}
-
-
-/* ContextSubstFormat3 */
-
-static HB_Error  Load_ContextSubst3( HB_ContextSubstFormat3*  csf3,
-				     HB_Stream                 stream )
-{
-  HB_Error error;
-
-  HB_UShort               n = 0, m, count;
-  HB_UInt                cur_offset, new_offset, base_offset;
-
-  HB_Coverage*           c;
-  HB_SubstLookupRecord*  slr;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  csf3->GlyphCount = GET_UShort();
-  csf3->SubstCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csf3->Coverage = NULL;
-
-  count = csf3->GlyphCount;
-
-  if ( ALLOC_ARRAY( csf3->Coverage, count, HB_Coverage ) )
-    return error;
-
-  c = csf3->Coverage;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  csf3->SubstLookupRecord = NULL;
-
-  count = csf3->SubstCount;
-
-  if ( ALLOC_ARRAY( csf3->SubstLookupRecord, count,
-		    HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = csf3->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  for ( m = 0; m < n; m++ )
-    _HB_OPEN_Free_Coverage( &c[m] );
-
-  FREE( c );
-  return error;
-}
-
-
-static void  Free_ContextSubst3( HB_ContextSubstFormat3*  csf3 )
-{
-  HB_UShort      n, count;
-
-  HB_Coverage*  c;
-
-
-  FREE( csf3->SubstLookupRecord );
-
-  if ( csf3->Coverage )
-  {
-    count = csf3->GlyphCount;
-    c     = csf3->Coverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-}
-
-
-/* ContextSubst */
-
-static HB_Error  Load_ContextSubst( HB_GSUB_SubTable* st,
-				    HB_Stream         stream )
-{
-  HB_Error error;
-  HB_ContextSubst*  cs = &st->context;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cs->SubstFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( cs->SubstFormat )
-  {
-  case 1:  return Load_ContextSubst1( &cs->csf.csf1, stream );
-  case 2:  return Load_ContextSubst2( &cs->csf.csf2, stream );
-  case 3:  return Load_ContextSubst3( &cs->csf.csf3, stream );
-  default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-static void  Free_ContextSubst( HB_GSUB_SubTable* st )
-{
-  HB_ContextSubst*  cs = &st->context;
-
-  switch ( cs->SubstFormat )
-  {
-  case 1:  Free_ContextSubst1( &cs->csf.csf1 ); break;
-  case 2:  Free_ContextSubst2( &cs->csf.csf2 ); break;
-  case 3:  Free_ContextSubst3( &cs->csf.csf3 ); break;
-  default:						break;
-  }
-}
-
-
-static HB_Error  Lookup_ContextSubst1( HB_GSUBHeader*          gsub,
-				       HB_ContextSubstFormat1* csf1,
-				       HB_Buffer               buffer,
-				       HB_UShort                flags,
-				       HB_UShort                context_length,
-				       int                      nesting_level )
-{
-  HB_UShort        index, property;
-  HB_UShort        i, j, k, numsr;
-  HB_Error         error;
-
-  HB_SubRule*     sr;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &csf1->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  sr    = csf1->SubRuleSet[index].SubRule;
-  numsr = csf1->SubRuleSet[index].SubRuleCount;
-
-  for ( k = 0; k < numsr; k++ )
-  {
-    if ( context_length != 0xFFFF && context_length < sr[k].GlyphCount )
-      goto next_subrule;
-
-    if ( buffer->in_pos + sr[k].GlyphCount > buffer->in_length )
-      goto next_subrule;                        /* context is too long */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < sr[k].GlyphCount; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + sr[k].GlyphCount - i == (HB_Int)buffer->in_length )
-	  goto next_subrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != sr[k].Input[i - 1] )
-	goto next_subrule;
-    }
-
-    return Do_ContextSubst( gsub, sr[k].GlyphCount,
-			    sr[k].SubstCount, sr[k].SubstLookupRecord,
-			    buffer,
-			    nesting_level );
-  next_subrule:
-    ;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Lookup_ContextSubst2( HB_GSUBHeader*          gsub,
-				       HB_ContextSubstFormat2* csf2,
-				       HB_Buffer               buffer,
-				       HB_UShort                flags,
-				       HB_UShort                context_length,
-				       int                      nesting_level )
-{
-  HB_UShort          index, property;
-  HB_Error           error;
-  HB_UShort          i, j, k, known_classes;
-
-  HB_UShort*         classes;
-  HB_UShort*         cl;
-
-  HB_SubClassSet*   scs;
-  HB_SubClassRule*  sr;
-  HB_GDEFHeader*    gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  /* Note: The coverage table in format 2 doesn't give an index into
-	   anything.  It just lets us know whether or not we need to
-	   do any lookup at all.                                     */
-
-  error = _HB_OPEN_Coverage_Index( &csf2->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if (csf2->MaxContextLength < 1)
-    return HB_Err_Not_Covered;
-
-  if ( ALLOC_ARRAY( classes, csf2->MaxContextLength, HB_UShort ) )
-    return error;
-
-  error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_CURGLYPH(),
-		     &classes[0], NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    goto End;
-  known_classes = 0;
-
-  scs = &csf2->SubClassSet[classes[0]];
-  if ( !scs )
-  {
-    error = ERR(HB_Err_Invalid_SubTable);
-    goto End;
-  }
-
-  for ( k = 0; k < scs->SubClassRuleCount; k++ )
-  {
-    sr  = &scs->SubClassRule[k];
-
-    if ( context_length != 0xFFFF && context_length < sr->GlyphCount )
-      goto next_subclassrule;
-
-    if ( buffer->in_pos + sr->GlyphCount > buffer->in_length )
-      goto next_subclassrule;                      /* context is too long */
-
-    cl   = sr->Class;
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < sr->GlyphCount; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End;
-
-	if ( j + sr->GlyphCount - i < (HB_Int)buffer->in_length )
-	  goto next_subclassrule;
-	j++;
-      }
-
-      if ( i > known_classes )
-      {
-	/* Keeps us from having to do this for each rule */
-
-	error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End;
-	known_classes = i;
-      }
-
-      if ( cl[i - 1] != classes[i] )
-	goto next_subclassrule;
-    }
-
-    error = Do_ContextSubst( gsub, sr->GlyphCount,
-			     sr->SubstCount, sr->SubstLookupRecord,
-			     buffer,
-			     nesting_level );
-    goto End;
-
-  next_subclassrule:
-    ;
-  }
-
-  error = HB_Err_Not_Covered;
-
-End:
-  FREE( classes );
-  return error;
-}
-
-
-static HB_Error  Lookup_ContextSubst3( HB_GSUBHeader*          gsub,
-				       HB_ContextSubstFormat3* csf3,
-				       HB_Buffer               buffer,
-				       HB_UShort                flags,
-				       HB_UShort                context_length,
-				       int                      nesting_level )
-{
-  HB_Error         error;
-  HB_UShort        index, i, j, property;
-
-  HB_Coverage*    c;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  if ( context_length != 0xFFFF && context_length < csf3->GlyphCount )
-    return HB_Err_Not_Covered;
-
-  if ( buffer->in_pos + csf3->GlyphCount > buffer->in_length )
-    return HB_Err_Not_Covered;         /* context is too long */
-
-  c    = csf3->Coverage;
-
-  for ( i = 1, j = buffer->in_pos + 1; i < csf3->GlyphCount; i++, j++ )
-  {
-    while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + csf3->GlyphCount - i == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  return Do_ContextSubst( gsub, csf3->GlyphCount,
-			  csf3->SubstCount, csf3->SubstLookupRecord,
-			  buffer,
-			  nesting_level );
-}
-
-
-static HB_Error  Lookup_ContextSubst( HB_GSUBHeader*    gsub,
-				      HB_GSUB_SubTable* st,
-				      HB_Buffer         buffer,
-				      HB_UShort          flags,
-				      HB_UShort          context_length,
-				      int                nesting_level )
-{
-  HB_ContextSubst*  cs = &st->context;
-
-  switch ( cs->SubstFormat )
-  {
-  case 1:  return Lookup_ContextSubst1( gsub, &cs->csf.csf1, buffer, flags, context_length, nesting_level );
-  case 2:  return Lookup_ContextSubst2( gsub, &cs->csf.csf2, buffer, flags, context_length, nesting_level );
-  case 3:  return Lookup_ContextSubst3( gsub, &cs->csf.csf3, buffer, flags, context_length, nesting_level );
-  default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-/* LookupType 6 */
-
-/* ChainSubRule */
-
-static HB_Error  Load_ChainSubRule( HB_ChainSubRule*  csr,
-				    HB_Stream          stream )
-{
-  HB_Error error;
-
-  HB_UShort               n, count;
-  HB_UShort*              b;
-  HB_UShort*              i;
-  HB_UShort*              l;
-
-  HB_SubstLookupRecord*  slr;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  csr->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csr->Backtrack = NULL;
-
-  count = csr->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( csr->Backtrack, count, HB_UShort ) )
-    return error;
-
-  b = csr->Backtrack;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail4;
-
-  for ( n = 0; n < count; n++ )
-    b[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  csr->InputGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csr->Input = NULL;
-
-  count = csr->InputGlyphCount - 1;  /* only InputGlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( csr->Input, count, HB_UShort ) )
-    goto Fail4;
-
-  i = csr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail3;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  csr->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csr->Lookahead = NULL;
-
-  count = csr->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( csr->Lookahead, count, HB_UShort ) )
-    goto Fail3;
-
-  l = csr->Lookahead;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    l[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  csr->SubstCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csr->SubstLookupRecord = NULL;
-
-  count = csr->SubstCount;
-
-  if ( ALLOC_ARRAY( csr->SubstLookupRecord, count, HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = csr->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  FREE( l );
-
-Fail3:
-  FREE( i );
-
-Fail4:
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainSubRule( HB_ChainSubRule*  csr )
-{
-  FREE( csr->SubstLookupRecord );
-  FREE( csr->Lookahead );
-  FREE( csr->Input );
-  FREE( csr->Backtrack );
-}
-
-
-/* ChainSubRuleSet */
-
-static HB_Error  Load_ChainSubRuleSet( HB_ChainSubRuleSet*  csrs,
-				       HB_Stream             stream )
-{
-  HB_Error error;
-
-  HB_UShort          n = 0, m, count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_ChainSubRule*  csr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = csrs->ChainSubRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  csrs->ChainSubRule = NULL;
-
-  if ( ALLOC_ARRAY( csrs->ChainSubRule, count, HB_ChainSubRule ) )
-    return error;
-
-  csr = csrs->ChainSubRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainSubRule( &csr[n], stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_ChainSubRule( &csr[m] );
-
-  FREE( csr );
-  return error;
-}
-
-
-static void  Free_ChainSubRuleSet( HB_ChainSubRuleSet*  csrs )
-{
-  HB_UShort          n, count;
-
-  HB_ChainSubRule*  csr;
-
-
-  if ( csrs->ChainSubRule )
-  {
-    count = csrs->ChainSubRuleCount;
-    csr   = csrs->ChainSubRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainSubRule( &csr[n] );
-
-    FREE( csr );
-  }
-}
-
-
-/* ChainContextSubstFormat1 */
-
-static HB_Error  Load_ChainContextSubst1(
-		   HB_ChainContextSubstFormat1*  ccsf1,
-		   HB_Stream                      stream )
-{
-  HB_Error error;
-
-  HB_UShort             n = 0, m, count;
-  HB_UInt              cur_offset, new_offset, base_offset;
-
-  HB_ChainSubRuleSet*  csrs;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ccsf1->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = ccsf1->ChainSubRuleSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccsf1->ChainSubRuleSet = NULL;
-
-  if ( ALLOC_ARRAY( ccsf1->ChainSubRuleSet, count, HB_ChainSubRuleSet ) )
-    goto Fail2;
-
-  csrs = ccsf1->ChainSubRuleSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainSubRuleSet( &csrs[n], stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_ChainSubRuleSet( &csrs[m] );
-
-  FREE( csrs );
-
-Fail2:
-  _HB_OPEN_Free_Coverage( &ccsf1->Coverage );
-  return error;
-}
-
-
-static void  Free_ChainContextSubst1( HB_ChainContextSubstFormat1*  ccsf1 )
-{
-  HB_UShort             n, count;
-
-  HB_ChainSubRuleSet*  csrs;
-
-
-  if ( ccsf1->ChainSubRuleSet )
-  {
-    count = ccsf1->ChainSubRuleSetCount;
-    csrs  = ccsf1->ChainSubRuleSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainSubRuleSet( &csrs[n] );
-
-    FREE( csrs );
-  }
-
-  _HB_OPEN_Free_Coverage( &ccsf1->Coverage );
-}
-
-
-/* ChainSubClassRule */
-
-static HB_Error  Load_ChainSubClassRule(
-		   HB_ChainContextSubstFormat2*  ccsf2,
-		   HB_ChainSubClassRule*         cscr,
-		   HB_Stream                      stream )
-{
-  HB_Error error;
-
-  HB_UShort               n, count;
-
-  HB_UShort*              b;
-  HB_UShort*              i;
-  HB_UShort*              l;
-  HB_SubstLookupRecord*  slr;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cscr->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( cscr->BacktrackGlyphCount > ccsf2->MaxBacktrackLength )
-    ccsf2->MaxBacktrackLength = cscr->BacktrackGlyphCount;
-
-  cscr->Backtrack = NULL;
-
-  count = cscr->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( cscr->Backtrack, count, HB_UShort ) )
-    return error;
-
-  b = cscr->Backtrack;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail4;
-
-  for ( n = 0; n < count; n++ )
-    b[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  cscr->InputGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( cscr->InputGlyphCount > ccsf2->MaxInputLength )
-    ccsf2->MaxInputLength = cscr->InputGlyphCount;
-
-  cscr->Input = NULL;
-
-  count = cscr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */
-
-  if ( ALLOC_ARRAY( cscr->Input, count, HB_UShort ) )
-    goto Fail4;
-
-  i = cscr->Input;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail3;
-
-  for ( n = 0; n < count; n++ )
-    i[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  cscr->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( cscr->LookaheadGlyphCount > ccsf2->MaxLookaheadLength )
-    ccsf2->MaxLookaheadLength = cscr->LookaheadGlyphCount;
-
-  cscr->Lookahead = NULL;
-
-  count = cscr->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( cscr->Lookahead, count, HB_UShort ) )
-    goto Fail3;
-
-  l = cscr->Lookahead;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail2;
-
-  for ( n = 0; n < count; n++ )
-    l[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  cscr->SubstCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cscr->SubstLookupRecord = NULL;
-
-  count = cscr->SubstCount;
-
-  if ( ALLOC_ARRAY( cscr->SubstLookupRecord, count,
-		    HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = cscr->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  FREE( l );
-
-Fail3:
-  FREE( i );
-
-Fail4:
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainSubClassRule( HB_ChainSubClassRule*  cscr )
-{
-  FREE( cscr->SubstLookupRecord );
-  FREE( cscr->Lookahead );
-  FREE( cscr->Input );
-  FREE( cscr->Backtrack );
-}
-
-
-/* SubClassSet */
-
-static HB_Error  Load_ChainSubClassSet(
-		   HB_ChainContextSubstFormat2*  ccsf2,
-		   HB_ChainSubClassSet*          cscs,
-		   HB_Stream                      stream )
-{
-  HB_Error error;
-
-  HB_UShort               n = 0, m, count;
-  HB_UInt                cur_offset, new_offset, base_offset;
-
-  HB_ChainSubClassRule*  cscr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = cscs->ChainSubClassRuleCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cscs->ChainSubClassRule = NULL;
-
-  if ( ALLOC_ARRAY( cscs->ChainSubClassRule, count,
-		    HB_ChainSubClassRule ) )
-    return error;
-
-  cscr = cscs->ChainSubClassRule;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_ChainSubClassRule( ccsf2, &cscr[n],
-					   stream ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_ChainSubClassRule( &cscr[m] );
-
-  FREE( cscr );
-  return error;
-}
-
-
-static void  Free_ChainSubClassSet( HB_ChainSubClassSet*  cscs )
-{
-  HB_UShort               n, count;
-
-  HB_ChainSubClassRule*  cscr;
-
-
-  if ( cscs->ChainSubClassRule )
-  {
-    count = cscs->ChainSubClassRuleCount;
-    cscr  = cscs->ChainSubClassRule;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainSubClassRule( &cscr[n] );
-
-    FREE( cscr );
-  }
-}
-
-
-/* ChainContextSubstFormat2 */
-
-static HB_Error  Load_ChainContextSubst2(
-		   HB_ChainContextSubstFormat2*  ccsf2,
-		   HB_Stream                      stream )
-{
-  HB_Error error;
-
-  HB_UShort              n = 0, m, count;
-  HB_UInt               cur_offset, new_offset, base_offset;
-  HB_UInt               backtrack_offset, input_offset, lookahead_offset;
-
-  HB_ChainSubClassSet*  cscs;
-
-
-  base_offset = FILE_Pos() - 2;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &ccsf2->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-  if ( ACCESS_Frame( 8L ) )
-    goto Fail5;
-
-  backtrack_offset = GET_UShort();
-  input_offset     = GET_UShort();
-  lookahead_offset = GET_UShort();
-
-  /* `ChainSubClassSetCount' is the upper limit for input class values,
-     thus we read it now to make an additional safety check. No limit
-     is known or needed for the other two class definitions          */
-
-  count = ccsf2->ChainSubClassSetCount = GET_UShort();
-
-  FORGET_Frame();
-
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->BacktrackClassDef, 65535,
-						       backtrack_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-      goto Fail5;
-
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->InputClassDef, count,
-						       input_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-      goto Fail4;
-  if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->LookaheadClassDef, 65535,
-						       lookahead_offset, base_offset,
-						       stream ) ) != HB_Err_Ok )
-    goto Fail3;
-
-  ccsf2->ChainSubClassSet   = NULL;
-  ccsf2->MaxBacktrackLength = 0;
-  ccsf2->MaxInputLength     = 0;
-  ccsf2->MaxLookaheadLength = 0;
-
-  if ( ALLOC_ARRAY( ccsf2->ChainSubClassSet, count, HB_ChainSubClassSet ) )
-    goto Fail2;
-
-  cscs = ccsf2->ChainSubClassSet;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    if ( new_offset != base_offset )      /* not a NULL offset */
-    {
-      cur_offset = FILE_Pos();
-      if ( FILE_Seek( new_offset ) ||
-	   ( error = Load_ChainSubClassSet( ccsf2, &cscs[n],
-					    stream ) ) != HB_Err_Ok )
-	goto Fail1;
-      (void)FILE_Seek( cur_offset );
-    }
-    else
-    {
-      /* we create a ChainSubClassSet table with no entries */
-
-      ccsf2->ChainSubClassSet[n].ChainSubClassRuleCount = 0;
-      ccsf2->ChainSubClassSet[n].ChainSubClassRule      = NULL;
-    }
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_ChainSubClassSet( &cscs[m] );
-
-  FREE( cscs );
-
-Fail2:
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef );
-
-Fail3:
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef );
-
-Fail4:
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef );
-
-Fail5:
-  _HB_OPEN_Free_Coverage( &ccsf2->Coverage );
-  return error;
-}
-
-
-static void  Free_ChainContextSubst2( HB_ChainContextSubstFormat2*  ccsf2 )
-{
-  HB_UShort              n, count;
-
-  HB_ChainSubClassSet*  cscs;
-
-
-  if ( ccsf2->ChainSubClassSet )
-  {
-    count = ccsf2->ChainSubClassSetCount;
-    cscs  = ccsf2->ChainSubClassSet;
-
-    for ( n = 0; n < count; n++ )
-      Free_ChainSubClassSet( &cscs[n] );
-
-    FREE( cscs );
-  }
-
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef );
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef );
-  _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef );
-
-  _HB_OPEN_Free_Coverage( &ccsf2->Coverage );
-}
-
-
-/* ChainContextSubstFormat3 */
-
-static HB_Error  Load_ChainContextSubst3(
-		   HB_ChainContextSubstFormat3*  ccsf3,
-		   HB_Stream                      stream )
-{
-  HB_Error error;
-
-  HB_UShort               n, nb = 0, ni =0, nl = 0, m, count;
-  HB_UShort               backtrack_count, input_count, lookahead_count;
-  HB_UInt                cur_offset, new_offset, base_offset;
-
-  HB_Coverage*           b;
-  HB_Coverage*           i;
-  HB_Coverage*           l;
-  HB_SubstLookupRecord*  slr;
-
-
-  base_offset = FILE_Pos() - 2L;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  ccsf3->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccsf3->BacktrackCoverage = NULL;
-
-  backtrack_count = ccsf3->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( ccsf3->BacktrackCoverage, backtrack_count,
-		    HB_Coverage ) )
-    return error;
-
-  b = ccsf3->BacktrackCoverage;
-
-  for ( nb = 0; nb < backtrack_count; nb++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail4;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
-      goto Fail4;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  ccsf3->InputGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccsf3->InputCoverage = NULL;
-
-  input_count = ccsf3->InputGlyphCount;
-
-  if ( ALLOC_ARRAY( ccsf3->InputCoverage, input_count, HB_Coverage ) )
-    goto Fail4;
-
-  i = ccsf3->InputCoverage;
-
-  for ( ni = 0; ni < input_count; ni++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail3;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok )
-      goto Fail3;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  ccsf3->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccsf3->LookaheadCoverage = NULL;
-
-  lookahead_count = ccsf3->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( ccsf3->LookaheadCoverage, lookahead_count,
-		    HB_Coverage ) )
-    goto Fail3;
-
-  l = ccsf3->LookaheadCoverage;
-
-  for ( nl = 0; nl < lookahead_count; nl++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  ccsf3->SubstCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ccsf3->SubstLookupRecord = NULL;
-
-  count = ccsf3->SubstCount;
-
-  if ( ALLOC_ARRAY( ccsf3->SubstLookupRecord, count,
-		    HB_SubstLookupRecord ) )
-    goto Fail2;
-
-  slr = ccsf3->SubstLookupRecord;
-
-  if ( ACCESS_Frame( count * 4L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-  {
-    slr[n].SequenceIndex   = GET_UShort();
-    slr[n].LookupListIndex = GET_UShort();
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( slr );
-
-Fail2:
-  for ( m = 0; m < nl; m++ )
-    _HB_OPEN_Free_Coverage( &l[m] );
-
-  FREE( l );
-
-Fail3:
-  for ( m = 0; m < ni; m++ )
-    _HB_OPEN_Free_Coverage( &i[m] );
-
-  FREE( i );
-
-Fail4:
-  for ( m = 0; m < nb; m++ )
-    _HB_OPEN_Free_Coverage( &b[m] );
-
-  FREE( b );
-  return error;
-}
-
-
-static void  Free_ChainContextSubst3( HB_ChainContextSubstFormat3*  ccsf3 )
-{
-  HB_UShort      n, count;
-
-  HB_Coverage*  c;
-
-
-  FREE( ccsf3->SubstLookupRecord );
-
-  if ( ccsf3->LookaheadCoverage )
-  {
-    count = ccsf3->LookaheadGlyphCount;
-    c     = ccsf3->LookaheadCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  if ( ccsf3->InputCoverage )
-  {
-    count = ccsf3->InputGlyphCount;
-    c     = ccsf3->InputCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  if ( ccsf3->BacktrackCoverage )
-  {
-    count = ccsf3->BacktrackGlyphCount;
-    c     = ccsf3->BacktrackCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-}
-
-
-/* ChainContextSubst */
-
-static HB_Error  Load_ChainContextSubst( HB_GSUB_SubTable* st,
-					 HB_Stream         stream )
-{
-  HB_Error error;
-  HB_ChainContextSubst*  ccs = &st->chain;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  ccs->SubstFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( ccs->SubstFormat ) {
-    case 1:  return Load_ChainContextSubst1( &ccs->ccsf.ccsf1, stream );
-    case 2:  return Load_ChainContextSubst2( &ccs->ccsf.ccsf2, stream );
-    case 3:  return Load_ChainContextSubst3( &ccs->ccsf.ccsf3, stream );
-    default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-static void  Free_ChainContextSubst( HB_GSUB_SubTable* st )
-{
-  HB_ChainContextSubst*  ccs = &st->chain;
-
-  switch ( ccs->SubstFormat ) {
-    case 1:  Free_ChainContextSubst1( &ccs->ccsf.ccsf1 ); break;
-    case 2:  Free_ChainContextSubst2( &ccs->ccsf.ccsf2 ); break;
-    case 3:  Free_ChainContextSubst3( &ccs->ccsf.ccsf3 ); break;
-    default:							  break;
-  }
-}
-
-
-static HB_Error  Lookup_ChainContextSubst1( HB_GSUBHeader*               gsub,
-					    HB_ChainContextSubstFormat1* ccsf1,
-					    HB_Buffer                    buffer,
-					    HB_UShort                     flags,
-					    HB_UShort                     context_length,
-					    int                           nesting_level )
-{
-  HB_UShort          index, property;
-  HB_UShort          i, j, k, num_csr;
-  HB_UShort          bgc, igc, lgc;
-  HB_Error           error;
-
-  HB_ChainSubRule*  csr;
-  HB_ChainSubRule   curr_csr;
-  HB_GDEFHeader*    gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  error = _HB_OPEN_Coverage_Index( &ccsf1->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  csr     = ccsf1->ChainSubRuleSet[index].ChainSubRule;
-  num_csr = ccsf1->ChainSubRuleSet[index].ChainSubRuleCount;
-
-  for ( k = 0; k < num_csr; k++ )
-  {
-    curr_csr = csr[k];
-    bgc      = curr_csr.BacktrackGlyphCount;
-    igc      = curr_csr.InputGlyphCount;
-    lgc      = curr_csr.LookaheadGlyphCount;
-
-    if ( context_length != 0xFFFF && context_length < igc )
-      goto next_chainsubrule;
-
-    /* check whether context is too long; it is a first guess only */
-
-    if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-      goto next_chainsubrule;
-
-    if ( bgc )
-    {
-      /* since we don't know in advance the number of glyphs to inspect,
-	 we search backwards for matches in the backtrack glyph array    */
-
-      for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
-      {
-	while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
-	{
-	  if ( error && error != HB_Err_Not_Covered )
-	    return error;
-
-	  if ( j + 1 == bgc - i )
-	    goto next_chainsubrule;
-	  j--;
-	}
-
-	/* In OpenType 1.3, it is undefined whether the offsets of
-	   backtrack glyphs is in logical order or not.  Version 1.4
-	   will clarify this:
-
-	     Logical order -      a  b  c  d  e  f  g  h  i  j
-					      i
-	     Input offsets -                  0  1
-	     Backtrack offsets -  3  2  1  0
-	     Lookahead offsets -                    0  1  2  3           */
-
-	if ( OUT_GLYPH( j ) != curr_csr.Backtrack[i] )
-	  goto next_chainsubrule;
-      }
-    }
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	  goto next_chainsubrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != curr_csr.Input[i - 1] )
-	  goto next_chainsubrule;
-    }
-
-    /* we are starting to check for lookahead glyphs right after the
-       last context glyph                                            */
-
-    for ( i = 0; i < lgc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + lgc - i == (HB_Int)buffer->in_length )
-	  goto next_chainsubrule;
-	j++;
-      }
-
-      if ( IN_GLYPH( j ) != curr_csr.Lookahead[i] )
-	goto next_chainsubrule;
-    }
-
-    return Do_ContextSubst( gsub, igc,
-			    curr_csr.SubstCount,
-			    curr_csr.SubstLookupRecord,
-			    buffer,
-			    nesting_level );
-
-  next_chainsubrule:
-    ;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Lookup_ChainContextSubst2( HB_GSUBHeader*               gsub,
-					    HB_ChainContextSubstFormat2* ccsf2,
-					    HB_Buffer                    buffer,
-					    HB_UShort                     flags,
-					    HB_UShort                     context_length,
-					    int                           nesting_level )
-{
-  HB_UShort              index, property;
-  HB_Error               error;
-  HB_UShort              i, j, k;
-  HB_UShort              bgc, igc, lgc;
-  HB_UShort              known_backtrack_classes,
-			 known_input_classes,
-			 known_lookahead_classes;
-
-  HB_UShort*             backtrack_classes;
-  HB_UShort*             input_classes;
-  HB_UShort*             lookahead_classes;
-
-  HB_UShort*             bc;
-  HB_UShort*             ic;
-  HB_UShort*             lc;
-
-  HB_ChainSubClassSet*  cscs;
-  HB_ChainSubClassRule  ccsr;
-  HB_GDEFHeader*        gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  /* Note: The coverage table in format 2 doesn't give an index into
-	   anything.  It just lets us know whether or not we need to
-	   do any lookup at all.                                     */
-
-  error = _HB_OPEN_Coverage_Index( &ccsf2->Coverage, IN_CURGLYPH(), &index );
-  if ( error )
-    return error;
-
-  if (ccsf2->MaxInputLength < 1)
-    return HB_Err_Not_Covered;
-
-  if ( ALLOC_ARRAY( backtrack_classes, ccsf2->MaxBacktrackLength, HB_UShort ) )
-    return error;
-  known_backtrack_classes = 0;
-
-  if ( ALLOC_ARRAY( input_classes, ccsf2->MaxInputLength, HB_UShort ) )
-    goto End3;
-  known_input_classes = 1;
-
-  if ( ALLOC_ARRAY( lookahead_classes, ccsf2->MaxLookaheadLength, HB_UShort ) )
-    goto End2;
-  known_lookahead_classes = 0;
-
-  error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_CURGLYPH(),
-		     &input_classes[0], NULL );
-  if ( error && error != HB_Err_Not_Covered )
-    goto End1;
-
-  cscs = &ccsf2->ChainSubClassSet[input_classes[0]];
-  if ( !cscs )
-  {
-    error = ERR(HB_Err_Invalid_SubTable);
-    goto End1;
-  }
-
-  for ( k = 0; k < cscs->ChainSubClassRuleCount; k++ )
-  {
-    ccsr = cscs->ChainSubClassRule[k];
-    bgc  = ccsr.BacktrackGlyphCount;
-    igc  = ccsr.InputGlyphCount;
-    lgc  = ccsr.LookaheadGlyphCount;
-
-    if ( context_length != 0xFFFF && context_length < igc )
-      goto next_chainsubclassrule;
-
-    /* check whether context is too long; it is a first guess only */
-
-    if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-      goto next_chainsubclassrule;
-
-    if ( bgc )
-    {
-      /* Since we don't know in advance the number of glyphs to inspect,
-	 we search backwards for matches in the backtrack glyph array.
-	 Note that `known_backtrack_classes' starts at index 0.         */
-
-      bc       = ccsr.Backtrack;
-
-      for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
-      {
-	while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
-	{
-	  if ( error && error != HB_Err_Not_Covered )
-	    goto End1;
-
-	  if ( j + 1 == bgc - i )
-	    goto next_chainsubclassrule;
-	  j--;
-	}
-
-	if ( i >= known_backtrack_classes )
-	{
-	  /* Keeps us from having to do this for each rule */
-
-	  error = _HB_OPEN_Get_Class( &ccsf2->BacktrackClassDef, OUT_GLYPH( j ),
-			     &backtrack_classes[i], NULL );
-	  if ( error && error != HB_Err_Not_Covered )
-	    goto End1;
-	  known_backtrack_classes = i;
-	}
-
-	if ( bc[i] != backtrack_classes[i] )
-	  goto next_chainsubclassrule;
-      }
-    }
-
-    ic       = ccsr.Input;
-
-    /* Start at 1 because [0] is implied */
-
-    for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-
-	if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	  goto next_chainsubclassrule;
-	j++;
-      }
-
-      if ( i >= known_input_classes )
-      {
-	error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_GLYPH( j ),
-			   &input_classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-	known_input_classes = i;
-      }
-
-      if ( ic[i - 1] != input_classes[i] )
-	goto next_chainsubclassrule;
-    }
-
-    /* we are starting to check for lookahead glyphs right after the
-       last context glyph                                            */
-
-    lc       = ccsr.Lookahead;
-
-    for ( i = 0; i < lgc; i++, j++ )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-
-	if ( j + lgc - i == (HB_Int)buffer->in_length )
-	  goto next_chainsubclassrule;
-	j++;
-      }
-
-      if ( i >= known_lookahead_classes )
-      {
-	error = _HB_OPEN_Get_Class( &ccsf2->LookaheadClassDef, IN_GLYPH( j ),
-			   &lookahead_classes[i], NULL );
-	if ( error && error != HB_Err_Not_Covered )
-	  goto End1;
-	known_lookahead_classes = i;
-      }
-
-      if ( lc[i] != lookahead_classes[i] )
-	goto next_chainsubclassrule;
-    }
-
-    error = Do_ContextSubst( gsub, igc,
-			     ccsr.SubstCount,
-			     ccsr.SubstLookupRecord,
-			     buffer,
-			     nesting_level );
-    goto End1;
-
-  next_chainsubclassrule:
-    ;
-  }
-
-  error = HB_Err_Not_Covered;
-
-End1:
-  FREE( lookahead_classes );
-
-End2:
-  FREE( input_classes );
-
-End3:
-  FREE( backtrack_classes );
-  return error;
-}
-
-
-static HB_Error  Lookup_ChainContextSubst3( HB_GSUBHeader*               gsub,
-					    HB_ChainContextSubstFormat3* ccsf3,
-					    HB_Buffer                    buffer,
-					    HB_UShort                     flags,
-					    HB_UShort                     context_length,
-					    int                           nesting_level )
-{
-  HB_UShort        index, i, j, property;
-  HB_UShort        bgc, igc, lgc;
-  HB_Error         error;
-
-  HB_Coverage*    bc;
-  HB_Coverage*    ic;
-  HB_Coverage*    lc;
-  HB_GDEFHeader*  gdef;
-
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  bgc = ccsf3->BacktrackGlyphCount;
-  igc = ccsf3->InputGlyphCount;
-  lgc = ccsf3->LookaheadGlyphCount;
-
-  if ( context_length != 0xFFFF && context_length < igc )
-    return HB_Err_Not_Covered;
-
-  /* check whether context is too long; it is a first guess only */
-
-  if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length )
-    return HB_Err_Not_Covered;
-
-  if ( bgc )
-  {
-    /* Since we don't know in advance the number of glyphs to inspect,
-       we search backwards for matches in the backtrack glyph array    */
-
-    bc       = ccsf3->BacktrackCoverage;
-
-    for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- )
-    {
-      while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + 1 == bgc - i )
-	  return HB_Err_Not_Covered;
-	j--;
-      }
-
-      error = _HB_OPEN_Coverage_Index( &bc[i], OUT_GLYPH( j ), &index );
-      if ( error )
-	return error;
-    }
-  }
-
-  ic       = ccsf3->InputCoverage;
-
-  for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ )
-  {
-    /* We already called CHECK_Property for IN_GLYPH( buffer->in_pos ) */
-    while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + igc - i + lgc == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  /* we are starting for lookahead glyphs right after the last context
-     glyph                                                             */
-
-  lc       = ccsf3->LookaheadCoverage;
-
-  for ( i = 0; i < lgc; i++, j++ )
-  {
-    while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + lgc - i == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  return Do_ContextSubst( gsub, igc,
-			  ccsf3->SubstCount,
-			  ccsf3->SubstLookupRecord,
-			  buffer,
-			  nesting_level );
-}
-
-
-static HB_Error  Lookup_ChainContextSubst( HB_GSUBHeader*    gsub,
-					   HB_GSUB_SubTable* st,
-					   HB_Buffer         buffer,
-					   HB_UShort          flags,
-					   HB_UShort          context_length,
-					   int                nesting_level )
-{
-  HB_ChainContextSubst*  ccs = &st->chain;
-
-  switch ( ccs->SubstFormat ) {
-    case 1:  return Lookup_ChainContextSubst1( gsub, &ccs->ccsf.ccsf1, buffer, flags, context_length, nesting_level );
-    case 2:  return Lookup_ChainContextSubst2( gsub, &ccs->ccsf.ccsf2, buffer, flags, context_length, nesting_level );
-    case 3:  return Lookup_ChainContextSubst3( gsub, &ccs->ccsf.ccsf3, buffer, flags, context_length, nesting_level );
-    default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-}
-
-
-static HB_Error  Load_ReverseChainContextSubst( HB_GSUB_SubTable* st,
-					        HB_Stream         stream )
-{
-  HB_Error error;
-  HB_ReverseChainContextSubst*  rccs = &st->reverse;
-
-  HB_UShort               m, count;
-
-  HB_UShort               nb = 0, nl = 0, n;
-  HB_UShort               backtrack_count, lookahead_count;
-  HB_UInt                cur_offset, new_offset, base_offset;
-
-  HB_Coverage*           b;
-  HB_Coverage*           l;
-  HB_UShort*              sub;
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  rccs->SubstFormat = GET_UShort();
-
-  if ( rccs->SubstFormat != 1 )
-    return ERR(HB_Err_Invalid_SubTable_Format);
-
-  FORGET_Frame();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  cur_offset = FILE_Pos();
-  if ( FILE_Seek( new_offset ) ||
-       ( error = _HB_OPEN_Load_Coverage( &rccs->Coverage, stream ) ) != HB_Err_Ok )
-    return error;
-  (void)FILE_Seek( cur_offset );
-
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail4;
-
-  rccs->BacktrackGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  rccs->BacktrackCoverage = NULL;
-
-  backtrack_count = rccs->BacktrackGlyphCount;
-
-  if ( ALLOC_ARRAY( rccs->BacktrackCoverage, backtrack_count,
-		    HB_Coverage ) )
-    goto Fail4;
-
-  b = rccs->BacktrackCoverage;
-
-  for ( nb = 0; nb < backtrack_count; nb++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail3;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok )
-      goto Fail3;
-    (void)FILE_Seek( cur_offset );
-  }
-
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail3;
-
-  rccs->LookaheadGlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  rccs->LookaheadCoverage = NULL;
-
-  lookahead_count = rccs->LookaheadGlyphCount;
-
-  if ( ALLOC_ARRAY( rccs->LookaheadCoverage, lookahead_count,
-		    HB_Coverage ) )
-    goto Fail3;
-
-  l = rccs->LookaheadCoverage;
-
-  for ( nl = 0; nl < lookahead_count; nl++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail2;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok )
-      goto Fail2;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  rccs->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  rccs->Substitute = NULL;
-
-  count = rccs->GlyphCount;
-
-  if ( ALLOC_ARRAY( rccs->Substitute, count,
-		    HB_UShort ) )
-    goto Fail2;
-
-  sub = rccs->Substitute;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail1;
-
-  for ( n = 0; n < count; n++ )
-    sub[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( sub );
-
-Fail2:
-  for ( m = 0; m < nl; m++ )
-    _HB_OPEN_Free_Coverage( &l[m] );
-
-  FREE( l );
-
-Fail3:
-  for ( m = 0; m < nb; m++ )
-    _HB_OPEN_Free_Coverage( &b[m] );
-
-  FREE( b );
-
-Fail4:
-  _HB_OPEN_Free_Coverage( &rccs->Coverage );
-  return error;
-}
-
-
-static void  Free_ReverseChainContextSubst( HB_GSUB_SubTable* st )
-{
-  HB_UShort      n, count;
-  HB_ReverseChainContextSubst*  rccs = &st->reverse;
-
-  HB_Coverage*  c;
-
-  _HB_OPEN_Free_Coverage( &rccs->Coverage );
-
-  if ( rccs->LookaheadCoverage )
-  {
-    count = rccs->LookaheadGlyphCount;
-    c     = rccs->LookaheadCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  if ( rccs->BacktrackCoverage )
-  {
-    count = rccs->BacktrackGlyphCount;
-    c     = rccs->BacktrackCoverage;
-
-    for ( n = 0; n < count; n++ )
-      _HB_OPEN_Free_Coverage( &c[n] );
-
-    FREE( c );
-  }
-
-  FREE ( rccs->Substitute );
-}
-
-
-static HB_Error  Lookup_ReverseChainContextSubst( HB_GSUBHeader*    gsub,
-						  HB_GSUB_SubTable* st,
-						  HB_Buffer         buffer,
-						  HB_UShort          flags,
-						  HB_UShort         context_length,
-						  int               nesting_level )
-{
-  HB_UShort        index, input_index, i, j, property;
-  HB_UShort        bgc, lgc;
-  HB_Error         error;
-
-  HB_ReverseChainContextSubst*  rccs = &st->reverse;
-  HB_Coverage*    bc;
-  HB_Coverage*    lc;
-  HB_GDEFHeader*  gdef;
-
-  if ( nesting_level != 1 || context_length != 0xFFFF )
-    return HB_Err_Not_Covered;
-
-  gdef = gsub->gdef;
-
-  if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) )
-    return error;
-
-  bgc = rccs->BacktrackGlyphCount;
-  lgc = rccs->LookaheadGlyphCount;
-
-  /* check whether context is too long; it is a first guess only */
-
-  if ( bgc > buffer->in_pos || buffer->in_pos + 1 + lgc > buffer->in_length )
-    return HB_Err_Not_Covered;
-
-  if ( bgc )
-  {
-    /* Since we don't know in advance the number of glyphs to inspect,
-       we search backwards for matches in the backtrack glyph array    */
-
-    bc       = rccs->BacktrackCoverage;
-
-    for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- )
-    {
-      while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-      {
-	if ( error && error != HB_Err_Not_Covered )
-	  return error;
-
-	if ( j + 1 == bgc - i )
-	  return HB_Err_Not_Covered;
-	j--;
-      }
-
-      error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index );
-      if ( error )
-	return error;
-    }
-  }
-
-  j = buffer->in_pos;
-
-  error = _HB_OPEN_Coverage_Index( &rccs->Coverage, IN_GLYPH( j ), &input_index );
-  if ( error )
-      return error;
-
-  lc       = rccs->LookaheadCoverage;
-
-  for ( i = 0, j = buffer->in_pos + 1; i < lgc; i++, j++ )
-  {
-    while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) )
-    {
-      if ( error && error != HB_Err_Not_Covered )
-	return error;
-
-      if ( j + lgc - i == (HB_Int)buffer->in_length )
-	return HB_Err_Not_Covered;
-      j++;
-    }
-
-    error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index );
-    if ( error )
-      return error;
-  }
-
-  IN_CURGLYPH() = rccs->Substitute[input_index];
-  buffer->in_pos--; /* Reverse! */
-
-  return error;
-}
-
-
-
-/***********
- * GSUB API
- ***********/
-
-
-
-HB_Error  HB_GSUB_Select_Script( HB_GSUBHeader*  gsub,
-				 HB_UInt         script_tag,
-				 HB_UShort*       script_index )
-{
-  HB_UShort          n;
-
-  HB_ScriptList*    sl;
-  HB_ScriptRecord*  sr;
-
-
-  if ( !gsub || !script_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  for ( n = 0; n < sl->ScriptCount; n++ )
-    if ( script_tag == sr[n].ScriptTag )
-    {
-      *script_index = n;
-
-      return HB_Err_Ok;
-    }
-
-  return HB_Err_Not_Covered;
-}
-
-
-
-HB_Error  HB_GSUB_Select_Language( HB_GSUBHeader*  gsub,
-				   HB_UInt         language_tag,
-				   HB_UShort        script_index,
-				   HB_UShort*       language_index,
-				   HB_UShort*       req_feature_index )
-{
-  HB_UShort           n;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-
-
-  if ( !gsub || !language_index || !req_feature_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  for ( n = 0; n < s->LangSysCount; n++ )
-    if ( language_tag == lsr[n].LangSysTag )
-    {
-      *language_index = n;
-      *req_feature_index = lsr[n].LangSys.ReqFeatureIndex;
-
-      return HB_Err_Ok;
-    }
-
-  return HB_Err_Not_Covered;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
-   default language (DefaultLangSys)                              */
-
-
-HB_Error  HB_GSUB_Select_Feature( HB_GSUBHeader*  gsub,
-				  HB_UInt         feature_tag,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UShort*       feature_index )
-{
-  HB_UShort           n;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-  HB_LangSys*        ls;
-  HB_UShort*          fi;
-
-  HB_FeatureList*    fl;
-  HB_FeatureRecord*  fr;
-
-
-  if ( !gsub || !feature_index )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  fl = &gsub->FeatureList;
-  fr = fl->FeatureRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( language_index == 0xFFFF )
-    ls = &s->DefaultLangSys;
-  else
-  {
-    if ( language_index >= s->LangSysCount )
-      return ERR(HB_Err_Invalid_Argument);
-
-    ls = &lsr[language_index].LangSys;
-  }
-
-  fi = ls->FeatureIndex;
-
-  for ( n = 0; n < ls->FeatureCount; n++ )
-  {
-    if ( fi[n] >= fl->FeatureCount )
-      return ERR(HB_Err_Invalid_SubTable_Format);
-
-    if ( feature_tag == fr[fi[n]].FeatureTag )
-    {
-      *feature_index = fi[n];
-
-      return HB_Err_Ok;
-    }
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-/* The next three functions return a null-terminated list */
-
-
-HB_Error  HB_GSUB_Query_Scripts( HB_GSUBHeader*  gsub,
-				 HB_UInt**       script_tag_list )
-{
-  HB_UShort          n;
-  HB_Error           error;
-  HB_UInt*          stl;
-
-  HB_ScriptList*    sl;
-  HB_ScriptRecord*  sr;
-
-
-  if ( !gsub || !script_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < sl->ScriptCount; n++ )
-    stl[n] = sr[n].ScriptTag;
-  stl[n] = 0;
-
-  *script_tag_list = stl;
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GSUB_Query_Languages( HB_GSUBHeader*  gsub,
-				   HB_UShort        script_index,
-				   HB_UInt**       language_tag_list )
-{
-  HB_UShort           n;
-  HB_Error            error;
-  HB_UInt*           ltl;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-
-
-  if ( !gsub || !language_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < s->LangSysCount; n++ )
-    ltl[n] = lsr[n].LangSysTag;
-  ltl[n] = 0;
-
-  *language_tag_list = ltl;
-
-  return HB_Err_Ok;
-}
-
-
-/* selecting 0xFFFF for language_index asks for the values of the
-   default language (DefaultLangSys)                              */
-
-
-HB_Error  HB_GSUB_Query_Features( HB_GSUBHeader*  gsub,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UInt**       feature_tag_list )
-{
-  HB_UShort           n;
-  HB_Error            error;
-  HB_UInt*           ftl;
-
-  HB_ScriptList*     sl;
-  HB_ScriptRecord*   sr;
-  HB_ScriptTable*    s;
-  HB_LangSysRecord*  lsr;
-  HB_LangSys*        ls;
-  HB_UShort*          fi;
-
-  HB_FeatureList*    fl;
-  HB_FeatureRecord*  fr;
-
-
-  if ( !gsub || !feature_tag_list )
-    return ERR(HB_Err_Invalid_Argument);
-
-  sl = &gsub->ScriptList;
-  sr = sl->ScriptRecord;
-
-  fl = &gsub->FeatureList;
-  fr = fl->FeatureRecord;
-
-  if ( script_index >= sl->ScriptCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  s   = &sr[script_index].Script;
-  lsr = s->LangSysRecord;
-
-  if ( language_index == 0xFFFF )
-    ls = &s->DefaultLangSys;
-  else
-  {
-    if ( language_index >= s->LangSysCount )
-      return ERR(HB_Err_Invalid_Argument);
-
-    ls = &lsr[language_index].LangSys;
-  }
-
-  fi = ls->FeatureIndex;
-
-  if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) )
-    return error;
-
-  for ( n = 0; n < ls->FeatureCount; n++ )
-  {
-    if ( fi[n] >= fl->FeatureCount )
-    {
-      FREE( ftl );
-      return ERR(HB_Err_Invalid_SubTable_Format);
-    }
-    ftl[n] = fr[fi[n]].FeatureTag;
-  }
-  ftl[n] = 0;
-
-  *feature_tag_list = ftl;
-
-  return HB_Err_Ok;
-}
-
-
-/* Do an individual subtable lookup.  Returns HB_Err_Ok if substitution
-   has been done, or HB_Err_Not_Covered if not.                        */
-static HB_Error  GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub,
-				       HB_UShort       lookup_index,
-				       HB_Buffer      buffer,
-				       HB_UShort       context_length,
-				       int             nesting_level )
-{
-  HB_Error               error = HB_Err_Not_Covered;
-  HB_UShort              i, flags, lookup_count;
-  HB_Lookup*             lo;
-  int                    lookup_type;
-
-  nesting_level++;
-
-  if ( nesting_level > HB_MAX_NESTING_LEVEL )
-    return ERR(HB_Err_Not_Covered); /* ERR() call intended */
-
-  lookup_count = gsub->LookupList.LookupCount;
-  if (lookup_index >= lookup_count)
-    return error;
-
-  lo    = &gsub->LookupList.Lookup[lookup_index];
-  flags = lo->LookupFlag;
-  lookup_type = lo->LookupType;
-
-  for ( i = 0; i < lo->SubTableCount; i++ )
-  {
-    HB_GSUB_SubTable *st = &lo->SubTable[i].st.gsub;
-
-    switch (lookup_type) {
-      case HB_GSUB_LOOKUP_SINGLE:
-	error = Lookup_SingleSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GSUB_LOOKUP_MULTIPLE:
-	error = Lookup_MultipleSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GSUB_LOOKUP_ALTERNATE:
-	error = Lookup_AlternateSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GSUB_LOOKUP_LIGATURE:
-	error = Lookup_LigatureSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GSUB_LOOKUP_CONTEXT:
-	error = Lookup_ContextSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      case HB_GSUB_LOOKUP_CHAIN:
-	error = Lookup_ChainContextSubst	( gsub, st, buffer, flags, context_length, nesting_level ); break;
-    /*case HB_GSUB_LOOKUP_EXTENSION:
-	error = Lookup_ExtensionSubst		( gsub, st, buffer, flags, context_length, nesting_level ); break;*/
-      case HB_GSUB_LOOKUP_REVERSE_CHAIN:
-	error = Lookup_ReverseChainContextSubst	( gsub, st, buffer, flags, context_length, nesting_level ); break;
-      default:
-	error = HB_Err_Not_Covered;
-    };
-
-    /* Check whether we have a successful substitution or an error other
-       than HB_Err_Not_Covered                                          */
-    if ( error != HB_Err_Not_Covered )
-      return error;
-  }
-
-  return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st,
-			HB_Stream         stream,
-			HB_UShort         lookup_type )
-{
-  switch (lookup_type) {
-    case HB_GSUB_LOOKUP_SINGLE:		return Load_SingleSubst			( st, stream );
-    case HB_GSUB_LOOKUP_MULTIPLE:	return Load_MultipleSubst		( st, stream );
-    case HB_GSUB_LOOKUP_ALTERNATE:	return Load_AlternateSubst		( st, stream );
-    case HB_GSUB_LOOKUP_LIGATURE:	return Load_LigatureSubst		( st, stream );
-    case HB_GSUB_LOOKUP_CONTEXT:	return Load_ContextSubst		( st, stream );
-    case HB_GSUB_LOOKUP_CHAIN:		return Load_ChainContextSubst		( st, stream );
-  /*case HB_GSUB_LOOKUP_EXTENSION:	return Load_ExtensionSubst		( st, stream );*/
-    case HB_GSUB_LOOKUP_REVERSE_CHAIN:	return Load_ReverseChainContextSubst	( st, stream );
-    default:				return ERR(HB_Err_Invalid_SubTable_Format);
-  };
-}
-
-
-HB_INTERNAL void
-_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st,
-			HB_UShort         lookup_type )
-{
-  switch ( lookup_type ) {
-    case HB_GSUB_LOOKUP_SINGLE:		Free_SingleSubst		( st ); return;
-    case HB_GSUB_LOOKUP_MULTIPLE:	Free_MultipleSubst		( st ); return;
-    case HB_GSUB_LOOKUP_ALTERNATE:	Free_AlternateSubst		( st ); return;
-    case HB_GSUB_LOOKUP_LIGATURE:	Free_LigatureSubst		( st ); return;
-    case HB_GSUB_LOOKUP_CONTEXT:	Free_ContextSubst		( st ); return;
-    case HB_GSUB_LOOKUP_CHAIN:		Free_ChainContextSubst		( st ); return;
-  /*case HB_GSUB_LOOKUP_EXTENSION:	Free_ExtensionSubst		( st ); return;*/
-    case HB_GSUB_LOOKUP_REVERSE_CHAIN:	Free_ReverseChainContextSubst	( st ); return;
-    default:									return;
-  };
-}
-
-
-
-/* apply one lookup to the input string object */
-
-static HB_Error  GSUB_Do_String_Lookup( HB_GSUBHeader*   gsub,
-				   HB_UShort         lookup_index,
-				   HB_Buffer        buffer )
-{
-  HB_Error  error, retError = HB_Err_Not_Covered;
-
-  HB_UInt*  properties = gsub->LookupList.Properties;
-  int       lookup_type = gsub->LookupList.Lookup[lookup_index].LookupType;
-
-  const int       nesting_level = 0;
-  /* 0xFFFF indicates that we don't have a context length yet */
-  const HB_UShort context_length = 0xFFFF;
-
-  switch (lookup_type) {
-
-    case HB_GSUB_LOOKUP_SINGLE:
-    case HB_GSUB_LOOKUP_MULTIPLE:
-    case HB_GSUB_LOOKUP_ALTERNATE:
-    case HB_GSUB_LOOKUP_LIGATURE:
-    case HB_GSUB_LOOKUP_CONTEXT:
-    case HB_GSUB_LOOKUP_CHAIN:
-      /* in/out forward substitution (implemented lazy) */
-
-      _hb_buffer_clear_output ( buffer );
-      buffer->in_pos = 0;
-  while ( buffer->in_pos < buffer->in_length )
-  {
-    if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
-    {
-	  error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level );
-      if ( error )
-      {
-	if ( error != HB_Err_Not_Covered )
-	  return error;
-      }
-      else
-	retError = error;
-    }
-    else
-      error = HB_Err_Not_Covered;
-
-    if ( error == HB_Err_Not_Covered )
-	  if ( COPY_Glyph ( buffer ) )
-	return error;
-  }
-      /* we shouldn't swap if error occurred.
-       *
-       * also don't swap if nothing changed (ie HB_Err_Not_Covered).
-       * shouldn't matter in that case though.
-       */
-      if ( retError == HB_Err_Ok )
-	_hb_buffer_swap( buffer );
-
-  return retError;
-
-    case HB_GSUB_LOOKUP_REVERSE_CHAIN:
-      /* in-place backward substitution */
-
-      buffer->in_pos = buffer->in_length - 1;
-    do
-    {
-      if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] )
-	{
-	  error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level );
-	  if ( error )
-	    {
-	      if ( error != HB_Err_Not_Covered )
-		return error;
-	    }
-	  else
-	    retError = error;
-	}
-	else
-	  error = HB_Err_Not_Covered;
-
-	if ( error == HB_Err_Not_Covered )
-	  buffer->in_pos--;
-      }
-      while ((HB_Int) buffer->in_pos >= 0);
-
-      return retError;
-
-  /*case HB_GSUB_LOOKUP_EXTENSION:*/
-    default:
-  return retError;
-  };
-}
-
-
-HB_Error  HB_GSUB_Add_Feature( HB_GSUBHeader*  gsub,
-			       HB_UShort        feature_index,
-			       HB_UInt          property )
-{
-  HB_UShort    i;
-
-  HB_Feature  feature;
-  HB_UInt*     properties;
-  HB_UShort*   index;
-  HB_UShort    lookup_count;
-
-  /* Each feature can only be added once */
-
-  if ( !gsub ||
-       feature_index >= gsub->FeatureList.FeatureCount ||
-       gsub->FeatureList.ApplyCount == gsub->FeatureList.FeatureCount )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gsub->FeatureList.ApplyOrder[gsub->FeatureList.ApplyCount++] = feature_index;
-
-  properties = gsub->LookupList.Properties;
-
-  feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
-  index   = feature.LookupListIndex;
-  lookup_count = gsub->LookupList.LookupCount;
-
-  for ( i = 0; i < feature.LookupListCount; i++ )
-  {
-    HB_UShort lookup_index = index[i];
-    if (lookup_index < lookup_count)
-      properties[lookup_index] |= property;
-  }
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GSUB_Clear_Features( HB_GSUBHeader*  gsub )
-{
-  HB_UShort i;
-
-  HB_UInt*  properties;
-
-
-  if ( !gsub )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gsub->FeatureList.ApplyCount = 0;
-
-  properties = gsub->LookupList.Properties;
-
-  for ( i = 0; i < gsub->LookupList.LookupCount; i++ )
-    properties[i] = 0;
-
-  return HB_Err_Ok;
-}
-
-
-
-HB_Error  HB_GSUB_Register_Alternate_Function( HB_GSUBHeader*  gsub,
-					       HB_AltFunction  altfunc,
-					       void*            data )
-{
-  if ( !gsub )
-    return ERR(HB_Err_Invalid_Argument);
-
-  gsub->altfunc = altfunc;
-  gsub->data    = data;
-
-  return HB_Err_Ok;
-}
-
-/* returns error if one happened, otherwise returns HB_Err_Not_Covered if no
- * feature were applied, or HB_Err_Ok otherwise.
- */
-HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
-				HB_Buffer        buffer )
-{
-  HB_Error          error, retError = HB_Err_Not_Covered;
-  int               i, j, lookup_count, num_features;
-
-  if ( !gsub ||
-       !buffer)
-    return ERR(HB_Err_Invalid_Argument);
-
-  if ( buffer->in_length == 0 )
-    return retError;
-
-  lookup_count = gsub->LookupList.LookupCount;
-  num_features = gsub->FeatureList.ApplyCount;
-
-  for ( i = 0; i < num_features; i++)
-  {
-    HB_UShort  feature_index = gsub->FeatureList.ApplyOrder[i];
-    HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
-
-    for ( j = 0; j < feature.LookupListCount; j++ )
-    {
-      HB_UShort         lookup_index = feature.LookupListIndex[j];
-
-      /* Skip nonexistant lookups */
-      if (lookup_index >= lookup_count)
-       continue;
-
-	error = GSUB_Do_String_Lookup( gsub, lookup_index, buffer );
-      if ( error )
-      {
-	if ( error != HB_Err_Not_Covered )
-	  return error;
-      }
-      else
-	retError = error;
-    }
-  }
-
-  error = retError;
-
-  return error;
-}
-
-
-/* END */
diff --git a/src/hb-old/harfbuzz-gsub.h b/src/hb-old/harfbuzz-gsub.h
deleted file mode 100644
index b00df44..0000000
--- a/src/hb-old/harfbuzz-gsub.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_GSUB_H
-#define HARFBUZZ_GSUB_H
-
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-buffer.h"
-
-HB_BEGIN_HEADER
-
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/* Lookup types for glyph substitution */
-
-#define HB_GSUB_LOOKUP_SINGLE        1
-#define HB_GSUB_LOOKUP_MULTIPLE      2
-#define HB_GSUB_LOOKUP_ALTERNATE     3
-#define HB_GSUB_LOOKUP_LIGATURE      4
-#define HB_GSUB_LOOKUP_CONTEXT       5
-#define HB_GSUB_LOOKUP_CHAIN         6
-#define HB_GSUB_LOOKUP_EXTENSION     7
-#define HB_GSUB_LOOKUP_REVERSE_CHAIN 8
-
-
-/* A pointer to a function which selects the alternate glyph.  `pos' is
-   the position of the glyph with index `glyphID', `num_alternates'
-   gives the number of alternates in the `alternates' array.  `data'
-   points to the user-defined structure specified during a call to
-   HB_GSUB_Register_Alternate_Function().  The function must return an
-   index into the `alternates' array.                                   */
-
-typedef HB_UShort  (*HB_AltFunction)(HB_UInt    pos,
-				      HB_UShort   glyphID,
-				      HB_UShort   num_alternates,
-				      HB_UShort*  alternates,
-				      void*       data );
-
-
-struct  HB_GSUBHeader_
-{
-  HB_GDEFHeader*  gdef;
-
-  /* the next two fields are used for an alternate substitution callback
-     function to select the proper alternate glyph.                      */
-
-  void*            data;
-  HB_AltFunction  altfunc;
-
-  HB_UInt         offset;
-
-  HB_16Dot16         Version;
-
-  HB_ScriptList   ScriptList;
-  HB_FeatureList  FeatureList;
-  HB_LookupList   LookupList;
-};
-
-typedef struct HB_GSUBHeader_   HB_GSUBHeader;
-typedef HB_GSUBHeader*  HB_GSUB;
-
-
-HB_Error  HB_Load_GSUB_Table( HB_Stream       stream,
-			      HB_GSUBHeader** gsub,
-			      HB_GDEFHeader*  gdef,
-                              HB_Stream       gdefStream );
-
-
-HB_Error  HB_Done_GSUB_Table( HB_GSUBHeader*  gsub );
-
-
-HB_Error  HB_GSUB_Select_Script( HB_GSUBHeader*  gsub,
-				 HB_UInt         script_tag,
-				 HB_UShort*       script_index );
-
-HB_Error  HB_GSUB_Select_Language( HB_GSUBHeader*  gsub,
-				   HB_UInt         language_tag,
-				   HB_UShort        script_index,
-				   HB_UShort*       language_index,
-				   HB_UShort*       req_feature_index );
-
-HB_Error  HB_GSUB_Select_Feature( HB_GSUBHeader*  gsub,
-				  HB_UInt         feature_tag,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UShort*       feature_index );
-
-
-HB_Error  HB_GSUB_Query_Scripts( HB_GSUBHeader*  gsub,
-				 HB_UInt**       script_tag_list );
-
-HB_Error  HB_GSUB_Query_Languages( HB_GSUBHeader*  gsub,
-				   HB_UShort        script_index,
-				   HB_UInt**       language_tag_list );
-
-HB_Error  HB_GSUB_Query_Features( HB_GSUBHeader*  gsub,
-				  HB_UShort        script_index,
-				  HB_UShort        language_index,
-				  HB_UInt**       feature_tag_list );
-
-
-HB_Error  HB_GSUB_Add_Feature( HB_GSUBHeader*  gsub,
-			       HB_UShort        feature_index,
-			       HB_UInt          property );
-
-HB_Error  HB_GSUB_Clear_Features( HB_GSUBHeader*  gsub );
-
-
-HB_Error  HB_GSUB_Register_Alternate_Function( HB_GSUBHeader*  gsub,
-					       HB_AltFunction  altfunc,
-					       void*            data );
-
-
-HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
-				HB_Buffer        buffer );
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_GSUB_H */
diff --git a/src/hb-old/harfbuzz-hangul.c b/src/hb-old/harfbuzz-hangul.c
deleted file mode 100644
index 6f89ed6..0000000
--- a/src/hb-old/harfbuzz-hangul.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-/*
-// Hangul is a syllable based script. Unicode reserves a large range
-// for precomposed hangul, where syllables are already precomposed to
-// their final glyph shape. In addition, a so called jamo range is
-// defined, that can be used to express old Hangul. Modern hangul
-// syllables can also be expressed as jamo, and should be composed
-// into syllables. The operation is rather simple and mathematical.
-
-// Every hangul jamo is classified as being either a Leading consonant
-// (L), and intermediat Vowel (V) or a trailing consonant (T). Modern
-// hangul syllables (the ones in the precomposed area can be of type
-// LV or LVT.
-//
-// Syllable breaks do _not_ occur between:
-//
-// L              L, V or precomposed
-// V, LV          V, T
-// LVT, T         T
-//
-// A standard syllable is of the form L+V+T*. The above rules allow
-// nonstandard syllables L*V*T*. To transform them into standard
-// syllables fill characters L_f and V_f can be inserted.
-*/
-
-enum {
-    Hangul_SBase = 0xac00,
-    Hangul_LBase = 0x1100,
-    Hangul_VBase = 0x1161,
-    Hangul_TBase = 0x11a7,
-    Hangul_SCount = 11172,
-    Hangul_LCount = 19,
-    Hangul_VCount = 21,
-    Hangul_TCount = 28,
-    Hangul_NCount = 21*28
-};
-
-#define hangul_isPrecomposed(uc) \
-    (uc >= Hangul_SBase && uc < Hangul_SBase + Hangul_SCount)
-
-#define hangul_isLV(uc) \
-    ((uc - Hangul_SBase) % Hangul_TCount == 0)
-
-typedef enum {
-    L,
-    V,
-    T,
-    LV,
-    LVT,
-    X
-} HangulType;
-
-static HangulType hangul_type(unsigned short uc) {
-    if (uc > Hangul_SBase && uc < Hangul_SBase + Hangul_SCount)
-        return hangul_isLV(uc) ? LV : LVT;
-    if (uc < Hangul_LBase || uc > 0x11ff)
-        return X;
-    if (uc < Hangul_VBase)
-        return L;
-    if (uc < Hangul_TBase)
-        return V;
-    return T;
-}
-
-static int hangul_nextSyllableBoundary(const HB_UChar16 *s, int start, int end)
-{
-    const HB_UChar16 *uc = s + start;
-
-    HangulType state = hangul_type(*uc);
-    int pos = 1;
-
-    while (pos < end - start) {
-        HangulType newState = hangul_type(uc[pos]);
-        switch(newState) {
-        case X:
-            goto finish;
-        case L:
-        case V:
-        case T:
-            if (state > newState)
-                goto finish;
-            state = newState;
-            break;
-        case LV:
-            if (state > L)
-                goto finish;
-            state = V;
-            break;
-        case LVT:
-            if (state > L)
-                goto finish;
-            state = T;
-        }
-        ++pos;
-    }
-
- finish:
-    return start+pos;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature hangul_features [] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('l', 'j', 'm', 'o'), CcmpProperty },
-    { HB_MAKE_TAG('v', 'j', 'm', 'o'), CcmpProperty },
-    { HB_MAKE_TAG('t', 'j', 'm', 'o'), CcmpProperty },
-    { 0, 0 }
-};
-#endif
-
-static HB_Bool hangul_shape_syllable(HB_ShaperItem *item, HB_Bool openType)
-{
-    const HB_UChar16 *ch = item->string + item->item.pos;
-    int len = item->item.length;
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = item->num_glyphs;
-#endif
-
-    int i;
-    HB_UChar16 composed = 0;
-    /* see if we can compose the syllable into a modern hangul */
-    if (item->item.length == 2) {
-        int LIndex = ch[0] - Hangul_LBase;
-        int VIndex = ch[1] - Hangul_VBase;
-        if (LIndex >= 0 && LIndex < Hangul_LCount &&
-            VIndex >= 0 && VIndex < Hangul_VCount)
-            composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + Hangul_SBase;
-    } else if (item->item.length == 3) {
-        int LIndex = ch[0] - Hangul_LBase;
-        int VIndex = ch[1] - Hangul_VBase;
-        int TIndex = ch[2] - Hangul_TBase;
-        if (LIndex >= 0 && LIndex < Hangul_LCount &&
-            VIndex >= 0 && VIndex < Hangul_VCount &&
-            TIndex >= 0 && TIndex < Hangul_TCount)
-            composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + TIndex + Hangul_SBase;
-    }
-
-
-
-    /* if we have a modern hangul use the composed form */
-    if (composed) {
-        ch = &composed;
-        len = 1;
-    }
-
-    if (!item->font->klass->convertStringToGlyphIndices(item->font,
-                                                        ch, len,
-                                                        item->glyphs, &item->num_glyphs,
-                                                        item->item.bidiLevel % 2))
-        return FALSE;
-    for (i = 0; i < len; i++) {
-        item->attributes[i].mark = FALSE;
-        item->attributes[i].clusterStart = FALSE;
-        item->attributes[i].justification = 0;
-        item->attributes[i].zeroWidth = FALSE;
-        /*IDEBUG("    %d: %4x", i, ch[i].unicode()); */
-    }
-
-#ifndef NO_OPENTYPE
-    if (!composed && openType) {
-        HB_Bool positioned;
-
-        HB_STACKARRAY(unsigned short, logClusters, len);
-        for (i = 0; i < len; ++i)
-            logClusters[i] = i;
-        item->log_clusters = logClusters;
-
-        HB_OpenTypeShape(item, /*properties*/0);
-
-        positioned = HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE);
-
-        HB_FREE_STACKARRAY(logClusters);
-
-        if (!positioned)
-            return FALSE;
-    } else {
-        HB_HeuristicPosition(item);
-    }
-#endif
-
-    item->attributes[0].clusterStart = TRUE;
-    return TRUE;
-}
-
-HB_Bool HB_HangulShape(HB_ShaperItem *item)
-{
-    const HB_UChar16 *uc = item->string + item->item.pos;
-    HB_Bool allPrecomposed = TRUE;
-    int i;
-
-    assert(item->item.script == HB_Script_Hangul);
-
-    for (i = 0; i < (int)item->item.length; ++i) {
-        if (!hangul_isPrecomposed(uc[i])) {
-            allPrecomposed = FALSE;
-            break;
-        }
-    }
-
-    if (!allPrecomposed) {
-        HB_Bool openType = FALSE;
-        unsigned short *logClusters = item->log_clusters;
-        HB_ShaperItem syllable;
-        int first_glyph = 0;
-        int sstart = item->item.pos;
-        int end = sstart + item->item.length;
-
-#ifndef NO_OPENTYPE
-        openType = HB_SelectScript(item, hangul_features);
-#endif
-        syllable = *item;
-
-        while (sstart < end) {
-            int send = hangul_nextSyllableBoundary(item->string, sstart, end);
-
-            syllable.item.pos = sstart;
-            syllable.item.length = send-sstart;
-            syllable.glyphs = item->glyphs + first_glyph;
-            syllable.attributes = item->attributes + first_glyph;
-            syllable.offsets = item->offsets + first_glyph;
-            syllable.advances = item->advances + first_glyph;
-            syllable.num_glyphs = item->num_glyphs - first_glyph;
-            if (!hangul_shape_syllable(&syllable, openType)) {
-                item->num_glyphs += syllable.num_glyphs;
-                return FALSE;
-            }
-            /* fix logcluster array */
-            for (i = sstart; i < send; ++i)
-                logClusters[i-item->item.pos] = first_glyph;
-            sstart = send;
-            first_glyph += syllable.num_glyphs;
-        }
-        item->num_glyphs = first_glyph;
-        return TRUE;
-    }
-
-    return HB_BasicShape(item);
-}
-
-
diff --git a/src/hb-old/harfbuzz-hebrew.c b/src/hb-old/harfbuzz-hebrew.c
deleted file mode 100644
index e3135e5..0000000
--- a/src/hb-old/harfbuzz-hebrew.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-#include <assert.h>
-
-/*
-// Uniscribe also defines dlig for Hebrew, but we leave this out for now, as it's mostly
-// ligatures one does not want in modern Hebrew (as lam-alef ligatures).
-*/
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature hebrew_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    {0, 0}
-};
-#endif
-
-/* Hebrew shaping. In the non opentype case we try to use the
-   presentation forms specified for Hebrew. Especially for the
-   ligatures with Dagesh this gives much better results than we could
-   achieve manually.
-*/
-HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item)
-{
-    enum {
-        Dagesh = 0x5bc,
-        ShinDot = 0x5c1,
-        SinDot = 0x5c2,
-        Patah = 0x5b7,
-        Qamats = 0x5b8,
-        Holam = 0x5b9,
-        Rafe = 0x5bf
-    };
-
-    assert(shaper_item->item.script == HB_Script_Hebrew);
-
-#ifndef NO_OPENTYPE
-    if (HB_SelectScript(shaper_item, hebrew_features)) {
-
-        const int availableGlyphs = shaper_item->num_glyphs;
-        if (!HB_ConvertStringToGlyphIndices(shaper_item))
-            return FALSE;
-
-        HB_HeuristicSetGlyphAttributes(shaper_item);
-        HB_OpenTypeShape(shaper_item, /*properties*/0);
-        return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE);
-    }
-#endif
-
-    {
-        const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos;
-        unsigned short *logClusters = shaper_item->log_clusters;
-        HB_GlyphAttributes *attributes = shaper_item->attributes;
-
-        HB_Bool haveGlyphs;
-        int slen = 1;
-        int cluster_start = 0;
-        hb_uint32 i;
-
-        HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length);
-        *shapedChars = *uc;
-        logClusters[0] = 0;
-
-        for (i = 1; i < shaper_item->item.length; ++i) {
-            hb_uint16 base = shapedChars[cluster_start];
-            hb_uint16 shaped = 0;
-            HB_Bool invalid = FALSE;
-            if (uc[i] == Dagesh) {
-                if (base >= 0x5d0
-                    && base <= 0x5ea
-                    && base != 0x5d7
-                    && base != 0x5dd
-                    && base != 0x5df
-                    && base != 0x5e2
-                    && base != 0x5e5) {
-                    shaped = base - 0x5d0 + 0xfb30;
-                } else if (base == 0xfb2a || base == 0xfb2b /* Shin with Shin or Sin dot */) {
-                    shaped = base + 2;
-                } else {
-                    invalid = TRUE;
-                }
-            } else if (uc[i] == ShinDot) {
-                if (base == 0x05e9)
-                    shaped = 0xfb2a;
-                else if (base == 0xfb49)
-                    shaped = 0xfb2c;
-                else
-                    invalid = TRUE;
-            } else if (uc[i] == SinDot) {
-                if (base == 0x05e9)
-                    shaped = 0xfb2b;
-                else if (base == 0xfb49)
-                    shaped = 0xfb2d;
-                else
-                    invalid = TRUE;
-            } else if (uc[i] == Patah) {
-                if (base == 0x5d0)
-                    shaped = 0xfb2e;
-            } else if (uc[i] == Qamats) {
-                if (base == 0x5d0)
-                    shaped = 0xfb2f;
-            } else if (uc[i] == Holam) {
-                if (base == 0x5d5)
-                    shaped = 0xfb4b;
-            } else if (uc[i] == Rafe) {
-                if (base == 0x5d1)
-                    shaped = 0xfb4c;
-                else if (base == 0x5db)
-                    shaped = 0xfb4d;
-                else if (base == 0x5e4)
-                    shaped = 0xfb4e;
-            }
-
-            if (invalid) {
-                shapedChars[slen] = 0x25cc;
-                attributes[slen].clusterStart = TRUE;
-                attributes[slen].mark = FALSE;
-                attributes[slen].combiningClass = 0;
-                cluster_start = slen;
-                ++slen;
-            }
-            if (shaped) {
-                if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) {
-                    shapedChars[cluster_start] = shaped;
-                } else
-                    shaped = 0;
-            }
-            if (!shaped) {
-                HB_CharCategory category;
-                int cmb;
-                shapedChars[slen] = uc[i];
-                HB_GetUnicodeCharProperties(shaper_item->ufuncs, uc[i], &category, &cmb);
-                if (category != HB_Mark_NonSpacing) {
-                    attributes[slen].clusterStart = TRUE;
-                    attributes[slen].mark = FALSE;
-                    attributes[slen].combiningClass = 0;
-                    attributes[slen].dontPrint = HB_IsControlChar(uc[i]);
-                    cluster_start = slen;
-                } else {
-                    attributes[slen].clusterStart = FALSE;
-                    attributes[slen].mark = TRUE;
-                    attributes[slen].combiningClass = cmb;
-                }
-                ++slen;
-            }
-            logClusters[i] = cluster_start;
-        }
-
-        haveGlyphs = shaper_item->font->klass
-            ->convertStringToGlyphIndices(shaper_item->font,
-                                          shapedChars, slen,
-                                          shaper_item->glyphs, &shaper_item->num_glyphs,
-                                          shaper_item->item.bidiLevel % 2);
-
-        HB_FREE_STACKARRAY(shapedChars);
-
-        if (!haveGlyphs)
-            return FALSE;
-
-        HB_HeuristicPosition(shaper_item);
-    }
-
-    return TRUE;
-}
-
diff --git a/src/hb-old/harfbuzz-impl.c b/src/hb-old/harfbuzz-impl.c
deleted file mode 100644
index ddbf36b..0000000
--- a/src/hb-old/harfbuzz-impl.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-
-
-HB_INTERNAL HB_Pointer
-_hb_alloc(size_t     size,
-	  HB_Error  *perror )
-{
-  HB_Error    error = (HB_Error)0;
-  HB_Pointer  block = NULL;
-
-  if ( size > 0 )
-  {
-    block = calloc( 1, size );
-    if ( !block )
-      error = ERR(HB_Err_Out_Of_Memory);
-  }
-
-  *perror = error;
-  return block;
-}
-
-
-HB_INTERNAL HB_Pointer
-_hb_realloc(HB_Pointer  block,
-	    size_t      new_size,
-	    HB_Error   *perror )
-{
-    HB_Pointer  block2 = NULL;
-    HB_Error    error  = (HB_Error)0;
-
-    block2 = realloc( block, new_size );
-    if ( block2 == NULL && new_size != 0 )
-        error = ERR(HB_Err_Out_Of_Memory);
-
-    if ( !error )
-        block = block2;
-
-    *perror = error;
-    return block;
-}
-
-
-HB_INTERNAL void
-_hb_free( HB_Pointer  block )
-{
-  if ( block )
-    free( block );
-}
-
-
-/* helper func to set a breakpoint on */
-HB_INTERNAL HB_Error
-_hb_err (HB_Error code)
-{
-  return code;
-}
diff --git a/src/hb-old/harfbuzz-impl.h b/src/hb-old/harfbuzz-impl.h
deleted file mode 100644
index 3f370b6..0000000
--- a/src/hb-old/harfbuzz-impl.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_IMPL_H
-#define HARFBUZZ_IMPL_H
-
-#include "harfbuzz-global.h"
-
-#include <stdlib.h>
-
-HB_BEGIN_HEADER
-
-#ifndef HB_INTERNAL
-# ifndef __MINGW32__
-#  define HB_INTERNAL __attribute__((__visibility__("hidden")))
-# else
-#  define HB_INTERNAL
-# endif
-#endif
-
-#ifndef NULL
-# define NULL ((void *)0)
-#endif
-
-#ifndef FALSE
-# define FALSE 0
-#endif
-
-#ifndef TRUE
-# define TRUE 1
-#endif
-
-#ifndef TTAG_GDEF
-# define TTAG_GDEF  HB_MAKE_TAG( 'G', 'D', 'E', 'F' )
-#endif
-#ifndef TTAG_GPOS
-# define TTAG_GPOS  HB_MAKE_TAG( 'G', 'P', 'O', 'S' )
-#endif
-#ifndef TTAG_GSUB
-# define TTAG_GSUB  HB_MAKE_TAG( 'G', 'S', 'U', 'B' )
-#endif
-
-#ifndef HB_UNUSED
-# define HB_UNUSED(arg) ((arg) = (arg))
-#endif
-
-#define HB_LIKELY(cond) (cond)
-#define HB_UNLIKELY(cond) (cond)
-
-#define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0]))
-
-
-
-#define HB_IsHighSurrogate(ucs) \
-    (((ucs) & 0xfc00) == 0xd800)
-
-#define HB_IsLowSurrogate(ucs) \
-    (((ucs) & 0xfc00) == 0xdc00)
-
-#define HB_SurrogateToUcs4(high, low) \
-    (((HB_UChar32)(high))<<10) + (low) - 0x35fdc00;
-
-
-
-
-
-#define  ALLOC(_ptr,_size)   \
-           ( (_ptr) = _hb_alloc( _size, &error ), error != 0 )
-
-#define  REALLOC(_ptr,_newsz)  \
-           ( (_ptr) = _hb_realloc( (_ptr), (_newsz), &error ), error != 0 )
-
-#define  FREE(_ptr)                    \
-  do {                                 \
-    if ( (_ptr) )                      \
-    {                                  \
-      _hb_free( _ptr );     \
-      _ptr = NULL;                     \
-    }                                  \
-  } while (0)
-
-#define  ALLOC_ARRAY(_ptr,_count,_type)   \
-           ALLOC(_ptr,(_count)*sizeof(_type))
-
-#define  REALLOC_ARRAY(_ptr,_newcnt,_type) \
-           REALLOC(_ptr,(_newcnt)*sizeof(_type))
-
-#define  MEM_Copy(dest,source,count)   memcpy( (char*)(dest), (const char*)(source), (size_t)(count) )
-
-#define ERR(err)   _hb_err (err)
-
-
-HB_INTERNAL HB_Pointer
-_hb_alloc( size_t    size,
-	   HB_Error *perror_ );
-
-HB_INTERNAL HB_Pointer
-_hb_realloc( HB_Pointer block,
-	     size_t     new_size,
-	     HB_Error  *perror_ );
-
-HB_INTERNAL void
-_hb_free( HB_Pointer block );
-
-
-/* helper func to set a breakpoint on */
-HB_INTERNAL HB_Error
-_hb_err (HB_Error code);
-
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_IMPL_H */
diff --git a/src/hb-old/harfbuzz-indic.cpp b/src/hb-old/harfbuzz-indic.cpp
deleted file mode 100644
index 086d45c..0000000
--- a/src/hb-old/harfbuzz-indic.cpp
+++ /dev/null
@@ -1,1868 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#define FLAG(x) (1 << (x))
-
-static HB_Bool isLetter(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs)
-{
-    const int test = FLAG(HB_Letter_Uppercase) |
-                     FLAG(HB_Letter_Lowercase) |
-                     FLAG(HB_Letter_Titlecase) |
-                     FLAG(HB_Letter_Modifier) |
-                     FLAG(HB_Letter_Other);
-    return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test);
-}
-
-static HB_Bool isMark(hb_unicode_funcs_t *ufuncs, HB_UChar16 ucs)
-{
-    const int test = FLAG(HB_Mark_NonSpacing) |
-                     FLAG(HB_Mark_SpacingCombining) |
-                     FLAG(HB_Mark_Enclosing);
-    return !!(FLAG(HB_GetUnicodeCharCategory(ufuncs, ucs)) & test);
-}
-
-enum Form {
-    Invalid = 0x0,
-    UnknownForm = Invalid,
-    Consonant,
-    Nukta,
-    Halant,
-    Matra,
-    VowelMark,
-    StressMark,
-    IndependentVowel,
-    LengthMark,
-    Control,
-    Other
-};
-
-static const unsigned char indicForms[0xe00-0x900] = {
-    // Devangari
-    Invalid, VowelMark, VowelMark, VowelMark,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Matra, Matra, Matra,
-    Matra, Matra, Matra, Matra,
-    Matra, Halant, UnknownForm, UnknownForm,
-
-    Other, StressMark, StressMark, StressMark,
-    StressMark, UnknownForm, UnknownForm, UnknownForm,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    IndependentVowel, IndependentVowel, VowelMark, VowelMark,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Consonant,
-    Consonant, Consonant /* ??? */, Consonant, Consonant,
-
-    // Bengali
-    Invalid, VowelMark, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Invalid, Invalid, IndependentVowel,
-
-    IndependentVowel, Invalid, Invalid, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Invalid, Consonant, Invalid,
-    Invalid, Invalid, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Invalid, Invalid, Matra,
-    Matra, Invalid, Invalid, Matra,
-    Matra, Halant, Consonant, UnknownForm,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, VowelMark,
-    Invalid, Invalid, Invalid, Invalid,
-    Consonant, Consonant, Invalid, Consonant,
-
-    IndependentVowel, IndependentVowel, VowelMark, VowelMark,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Consonant, Consonant, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Gurmukhi
-    Invalid, VowelMark, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
-    Invalid, Invalid, Invalid, IndependentVowel,
-
-    IndependentVowel, Invalid, Invalid, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Invalid, Consonant, Consonant,
-    Invalid, Consonant, Consonant, Invalid,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Invalid,
-    Invalid, Invalid, Invalid, Matra,
-    Matra, Invalid, Invalid, Matra,
-    Matra, Halant, UnknownForm, UnknownForm,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, UnknownForm, UnknownForm, UnknownForm,
-    Invalid, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Invalid,
-
-    Other, Other, Invalid, Invalid,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    StressMark, StressMark, Consonant, Consonant,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Gujarati
-    Invalid, VowelMark, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
-
-    IndependentVowel, IndependentVowel, Invalid, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Invalid, Consonant, Consonant,
-    Invalid, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Matra, Invalid, Matra,
-    Matra, Matra, Invalid, Matra,
-    Matra, Halant, UnknownForm, UnknownForm,
-
-    Other, UnknownForm, UnknownForm, UnknownForm,
-    UnknownForm, UnknownForm, UnknownForm, UnknownForm,
-    UnknownForm, UnknownForm, UnknownForm, UnknownForm,
-    UnknownForm, UnknownForm, UnknownForm, UnknownForm,
-
-    IndependentVowel, IndependentVowel, VowelMark, VowelMark,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Oriya
-    Invalid, VowelMark, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Invalid, Invalid, IndependentVowel,
-
-    IndependentVowel, Invalid, Invalid, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Invalid, Consonant, Consonant,
-    Invalid, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Invalid, Invalid, Invalid, Matra,
-    Matra, Invalid, Invalid, Matra,
-    Matra, Halant, UnknownForm, UnknownForm,
-
-    Other, Invalid, Invalid, Invalid,
-    Invalid, UnknownForm, LengthMark, LengthMark,
-    Invalid, Invalid, Invalid, Invalid,
-    Consonant, Consonant, Invalid, Consonant,
-
-    IndependentVowel, IndependentVowel, Invalid, Invalid,
-    Invalid, Invalid, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Consonant, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    //Tamil
-    Invalid, Invalid, VowelMark, Other,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
-    Invalid, Invalid, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-    IndependentVowel, Consonant, Invalid, Invalid,
-    Invalid, Consonant, Consonant, Invalid,
-    Consonant, Invalid, Consonant, Consonant,
-
-    Invalid, Invalid, Invalid, Consonant,
-    Consonant, Invalid, Invalid, Invalid,
-    Consonant, Consonant, Consonant, Invalid,
-    Invalid, Invalid, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Invalid, Invalid, Matra, Matra,
-
-    Matra, Matra, Matra, Invalid,
-    Invalid, Invalid, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Halant, Invalid, Invalid,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, LengthMark,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Telugu
-    Invalid, VowelMark, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Invalid, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Invalid, Invalid, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Halant, Invalid, Invalid,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, LengthMark, Matra, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-
-    IndependentVowel, IndependentVowel, Invalid, Invalid,
-    Invalid, Invalid, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Kannada
-    Invalid, Invalid, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Invalid, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Nukta, Other, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Halant, Invalid, Invalid,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, LengthMark, LengthMark, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Consonant, Invalid,
-
-    IndependentVowel, IndependentVowel, VowelMark, VowelMark,
-    Invalid, Invalid, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Malayalam
-    Invalid, Invalid, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, Invalid, IndependentVowel, IndependentVowel,
-    IndependentVowel, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, UnknownForm, UnknownForm,
-    Invalid, Invalid, Matra, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Invalid, Invalid, Matra, Matra,
-    Matra, Invalid, Matra, Matra,
-    Matra, Halant, Invalid, Invalid,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Matra,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-
-    IndependentVowel, IndependentVowel, Invalid, Invalid,
-    Invalid, Invalid, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-
-    // Sinhala
-    Invalid, Invalid, VowelMark, VowelMark,
-    Invalid, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-
-    IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel,
-    IndependentVowel, IndependentVowel, IndependentVowel, Invalid,
-    Invalid, Invalid, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-
-    Consonant, Consonant, Invalid, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Consonant,
-    Invalid, Consonant, Invalid, Invalid,
-
-    Consonant, Consonant, Consonant, Consonant,
-    Consonant, Consonant, Consonant, Invalid,
-    Invalid, Invalid, Halant, Invalid,
-    Invalid, Invalid, Invalid, Matra,
-
-    Matra, Matra, Matra, Matra,
-    Matra, Invalid, Matra, Invalid,
-    Matra, Matra, Matra, Matra,
-    Matra, Matra, Matra, Matra,
-
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-    Invalid, Invalid, Invalid, Invalid,
-
-    Invalid, Invalid, Matra, Matra,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-    Other, Other, Other, Other,
-};
-
-enum Position {
-    None,
-    Pre,
-    Above,
-    Below,
-    Post,
-    Split,
-    Base,
-    Reph,
-    Vattu,
-    Inherit
-};
-
-static const unsigned char indicPosition[0xe00-0x900] = {
-    // Devanagari
-    None, Above, Above, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    Below, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, Post, Pre,
-
-    Post, Below, Below, Below,
-    Below, Above, Above, Above,
-    Above, Post, Post, Post,
-    Post, None, None, None,
-
-    None, Above, Below, Above,
-    Above, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, Below, Below,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Bengali
-    None, Above, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    Below, None, None, Post,
-
-    Below, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    Below, None, Post, Pre,
-
-    Post, Below, Below, Below,
-    Below, None, None, Pre,
-    Pre, None, None, Split,
-    Split, Below, None, None,
-
-    None, None, None, None,
-    None, None, None, Post,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, Below, Below,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    Below, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Gurmukhi
-    None, Above, Above, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, Post,
-
-    Below, None, None, None,
-    None, Below, None, None,
-    None, Below, None, None,
-    Below, None, Post, Pre,
-
-    Post, Below, Below, None,
-    None, None, None, Above,
-    Above, None, None, Above,
-    Above, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    Above, Above, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Gujarati
-    None, Above, Above, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    Below, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, Post, Pre,
-
-    Post, Below, Below, Below,
-    Below, Above, None, Above,
-    Above, Post, None, Post,
-    Post, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, Below, Below,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Oriya
-    None, Above, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    Below, None, None, None,
-    Below, None, None, None,
-    Below, Below, Below, Post,
-
-    Below, None, Below, Below,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, Post, Above,
-
-    Post, Below, Below, Below,
-    None, None, None, Pre,
-    Split, None, None, Split,
-    Split, None, None, None,
-
-    None, None, None, None,
-    None, None, Above, Post,
-    None, None, None, None,
-    None, None, None, Post,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, Below, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Tamil
-    None, None, Above, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, Post, Post,
-
-    Above, Below, Below, None,
-    None, None, Pre, Pre,
-    Pre, None, Split, Split,
-    Split, Halant, None, None,
-
-    None, None, None, None,
-    None, None, None, Post,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Telugu
-    None, Post, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, Below, Below, Below,
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-    Below, None, Below, Below,
-    Below, Below, Below, Below,
-
-    Below, None, Below, Below,
-    None, Below, Below, Below,
-    Below, Below, None, None,
-    None, None, Post, Above,
-
-    Above, Post, Post, Post,
-    Post, None, Above, Above,
-    Split, None, Post, Above,
-    Above, Halant, None, None,
-
-    None, None, None, None,
-    None, Above, Below, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Kannada
-    None, None, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, Below, Below, Below,
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-    Below, Below, Below, Below,
-
-    Below, None, Below, Below,
-    None, Below, Below, Below,
-    Below, Below, None, None,
-    None, None, Post, Above,
-
-    Split, Post, Post, Post,
-    Post, None, Above, Split,
-    Split, None, Split, Split,
-    Above, Halant, None, None,
-
-    None, None, None, None,
-    None, Post, Post, None,
-    None, None, None, None,
-    None, None, Below, None,
-
-    None, None, Below, Below,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Malayalam
-    None, None, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, Post,
-
-    Post, None, Below, None,
-    None, Post, None, None,
-    None, None, None, None,
-    None, None, Post, Post,
-
-    Post, Post, Post, Post,
-    None, None, Pre, Pre,
-    Pre, None, Split, Split,
-    Split, Halant, None, None,
-
-    None, None, None, None,
-    None, None, None, Post,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    // Sinhala
-    None, None, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, Post,
-
-    Post, Post, Above, Above,
-    Below, None, Below, None,
-    Post, Pre, Split, Pre,
-    Split, Split, Split, Post,
-
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None,
-
-    None, None, Post, Post,
-    None, None, None, None,
-    None, None, None, None,
-    None, None, None, None
-};
-
-static inline Form form(unsigned short uc) {
-    if (uc < 0x900 || uc > 0xdff) {
-        if (uc == 0x25cc)
-            return Consonant;
-        if (uc == 0x200c || uc == 0x200d)
-            return Control;
-        return Other;
-    }
-    return (Form)indicForms[uc-0x900];
-}
-
-static inline Position indic_position(unsigned short uc) {
-    if (uc < 0x900 || uc > 0xdff)
-        return None;
-    return (Position) indicPosition[uc-0x900];
-}
-
-
-enum IndicScriptProperties {
-    HasReph = 0x01,
-    HasSplit = 0x02
-};
-
-const hb_uint8 scriptProperties[10] = {
-    // Devanagari,
-    HasReph,
-    // Bengali,
-    HasReph|HasSplit,
-    // Gurmukhi,
-    0,
-    // Gujarati,
-    HasReph,
-    // Oriya,
-    HasReph|HasSplit,
-    // Tamil,
-    HasSplit,
-    // Telugu,
-    HasSplit,
-    // Kannada,
-    HasSplit|HasReph,
-    // Malayalam,
-    HasSplit,
-    // Sinhala,
-    HasSplit
-};
-
-struct IndicOrdering {
-    Form form;
-    Position position;
-};
-
-static const IndicOrdering devanagari_order [] = {
-    { Consonant, Below },
-    { Matra, Below },
-    { VowelMark, Below },
-    { StressMark, Below },
-    { Matra, Above },
-    { Matra, Post },
-    { Consonant, Reph },
-    { VowelMark, Above },
-    { StressMark, Above },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering bengali_order [] = {
-    { Consonant, Below },
-    { Matra, Below },
-    { Matra, Above },
-    { Consonant, Reph },
-    { VowelMark, Above },
-    { Consonant, Post },
-    { Matra, Post },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering gurmukhi_order [] = {
-    { Consonant, Below },
-    { Matra, Below },
-    { Matra, Above },
-    { Consonant, Post },
-    { Matra, Post },
-    { VowelMark, Above },
-    { (Form)0, None }
-};
-
-static const IndicOrdering tamil_order [] = {
-    { Matra, Above },
-    { Matra, Post },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering telugu_order [] = {
-    { Matra, Above },
-    { Matra, Below },
-    { Matra, Post },
-    { Consonant, Below },
-    { Consonant, Post },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering kannada_order [] = {
-    { Matra, Above },
-    { Matra, Post },
-    { Consonant, Below },
-    { Consonant, Post },
-    { LengthMark, Post },
-    { Consonant, Reph },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering malayalam_order [] = {
-    { Consonant, Below },
-    { Matra, Below },
-    { Consonant, Reph },
-    { Consonant, Post },
-    { Matra, Post },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering sinhala_order [] = {
-    { Matra, Below },
-    { Matra, Above },
-    { Matra, Post },
-    { VowelMark, Post },
-    { (Form)0, None }
-};
-
-static const IndicOrdering * const indic_order[] = {
-    devanagari_order, // Devanagari
-    bengali_order, // Bengali
-    gurmukhi_order, // Gurmukhi
-    devanagari_order, // Gujarati
-    bengali_order, // Oriya
-    tamil_order, // Tamil
-    telugu_order, // Telugu
-    kannada_order, // Kannada
-    malayalam_order, // Malayalam
-    sinhala_order // Sinhala
-};
-
-
-
-// vowel matras that have to be split into two parts.
-static const unsigned short split_matras[]  = {
-    //  matra, split1, split2, split3
-
-    // bengalis
-    0x9cb, 0x9c7, 0x9be, 0x0,
-    0x9cc, 0x9c7, 0x9d7, 0x0,
-    // oriya
-    0xb48, 0xb47, 0xb56, 0x0,
-    0xb4b, 0xb47, 0xb3e, 0x0,
-    0xb4c, 0xb47, 0xb57, 0x0,
-    // tamil
-    0xbca, 0xbc6, 0xbbe, 0x0,
-    0xbcb, 0xbc7, 0xbbe, 0x0,
-    0xbcc, 0xbc6, 0xbd7, 0x0,
-    // telugu
-    0xc48, 0xc46, 0xc56, 0x0,
-    // kannada
-    0xcc0, 0xcbf, 0xcd5, 0x0,
-    0xcc7, 0xcc6, 0xcd5, 0x0,
-    0xcc8, 0xcc6, 0xcd6, 0x0,
-    0xcca, 0xcc6, 0xcc2, 0x0,
-    0xccb, 0xcc6, 0xcc2, 0xcd5,
-    // malayalam
-    0xd4a, 0xd46, 0xd3e, 0x0,
-    0xd4b, 0xd47, 0xd3e, 0x0,
-    0xd4c, 0xd46, 0xd57, 0x0,
-    // sinhala
-    0xdda, 0xdd9, 0xdca, 0x0,
-    0xddc, 0xdd9, 0xdcf, 0x0,
-    0xddd, 0xdd9, 0xdcf, 0xdca,
-    0xdde, 0xdd9, 0xddf, 0x0,
-    0xffff
-};
-
-static inline void splitMatra(unsigned short *reordered, int matra, int &len)
-{
-    unsigned short matra_uc = reordered[matra];
-    //qDebug("matra=%d, reordered[matra]=%x", matra, reordered[matra]);
-
-    const unsigned short *split = split_matras;
-    while (split[0] < matra_uc)
-        split += 4;
-
-    assert(*split == matra_uc);
-    ++split;
-
-    int added_chars = split[2] == 0x0 ? 1 : 2;
-
-    memmove(reordered + matra + added_chars, reordered + matra, (len-matra)*sizeof(unsigned short));
-    reordered[matra] = split[0];
-    reordered[matra+1] = split[1];
-    if(added_chars == 2)
-        reordered[matra+2] = split[2];
-    len += added_chars;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature indic_features[] = {
-    { HB_MAKE_TAG('l', 'o', 'c', 'a'), LocaProperty },
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty },
-    { HB_MAKE_TAG('n', 'u', 'k', 't'), NuktaProperty },
-    { HB_MAKE_TAG('a', 'k', 'h', 'n'), AkhantProperty },
-    { HB_MAKE_TAG('r', 'p', 'h', 'f'), RephProperty },
-    { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty },
-    { HB_MAKE_TAG('h', 'a', 'l', 'f'), HalfFormProperty },
-    { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty },
-    { HB_MAKE_TAG('c', 'j', 'c', 't'), ConjunctFormProperty },
-    { HB_MAKE_TAG('v', 'a', 't', 'u'), VattuProperty },
-    { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty },
-    { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
-    { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
-    { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty },
-    { HB_MAKE_TAG('h', 'a', 'l', 'n'), HalantProperty },
-    { HB_MAKE_TAG('c', 'a', 'l', 't'), IndicCaltProperty },
-    { 0, 0 }
-};
-#endif
-
-// #define INDIC_DEBUG
-#ifdef INDIC_DEBUG
-#define IDEBUG hb_debug
-#include <stdarg.h>
-
-static void hb_debug(const char *msg, ...)
-{
-    va_list ap;
-    va_start(ap, msg); // use variable arg list
-    vfprintf(stderr, msg, ap);
-    va_end(ap);
-    fprintf(stderr, "\n");
-}
-
-#else
-#define IDEBUG if(0) printf
-#endif
-
-#if 0 //def INDIC_DEBUG
-static QString propertiesToString(int properties)
-{
-    QString res;
-    properties = ~properties;
-    if (properties & LocaProperty)
-        res += "Loca ";
-    if (properties & CcmpProperty)
-        res += "Ccmp ";
-    if (properties & InitProperty)
-        res += "Init ";
-    if (properties & NuktaProperty)
-        res += "Nukta ";
-    if (properties & AkhantProperty)
-        res += "Akhant ";
-    if (properties & RephProperty)
-        res += "Reph ";
-    if (properties & PreFormProperty)
-        res += "PreForm ";
-    if (properties & BelowFormProperty)
-        res += "BelowForm ";
-    if (properties & AboveFormProperty)
-        res += "AboveForm ";
-    if (properties & HalfFormProperty)
-        res += "HalfForm ";
-    if (properties & PostFormProperty)
-        res += "PostForm ";
-    if (properties & ConjunctFormProperty)
-        res += "PostForm ";
-    if (properties & VattuProperty)
-        res += "Vattu ";
-    if (properties & PreSubstProperty)
-        res += "PreSubst ";
-    if (properties & BelowSubstProperty)
-        res += "BelowSubst ";
-    if (properties & AboveSubstProperty)
-        res += "AboveSubst ";
-    if (properties & PostSubstProperty)
-        res += "PostSubst ";
-    if (properties & HalantProperty)
-        res += "Halant ";
-    if (properties & CligProperty)
-        res += "Clig ";
-    if (properties & IndicCaltProperty)
-        res += "Calt ";
-    return res;
-}
-#endif
-
-static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool invalid)
-{
-    HB_Script script = item->item.script;
-    assert(script >= HB_Script_Devanagari && script <= HB_Script_Sinhala);
-    const unsigned short script_base = 0x0900 + 0x80*(script-HB_Script_Devanagari);
-    const unsigned short ra = script_base + 0x30;
-    const unsigned short halant = script_base + 0x4d;
-    const unsigned short nukta = script_base + 0x3c;
-    bool control = false;
-
-    int len = (int)item->item.length;
-    IDEBUG(">>>>> indic shape: from=%d, len=%d invalid=%d", item->item.pos, item->item.length, invalid);
-
-    if ((int)item->num_glyphs < len+4) {
-        item->num_glyphs = len+4;
-        return false;
-    }
-
-    HB_STACKARRAY(HB_UChar16, reordered, len + 4);
-    HB_STACKARRAY(hb_uint8, position, len + 4);
-
-    unsigned char properties = scriptProperties[script-HB_Script_Devanagari];
-
-    if (invalid) {
-        *reordered = 0x25cc;
-        memcpy(reordered+1, item->string + item->item.pos, len*sizeof(HB_UChar16));
-        len++;
-    } else {
-        memcpy(reordered, item->string + item->item.pos, len*sizeof(HB_UChar16));
-    }
-    if (reordered[len-1] == 0x200c) // zero width non joiner
-        len--;
-
-    int i;
-    int base = 0;
-    int reph = -1;
-
-#ifdef INDIC_DEBUG
-    IDEBUG("original:");
-    for (i = 0; i < len; i++) {
-        IDEBUG("    %d: %4x", i, reordered[i]);
-    }
-#endif
-
-    if (len != 1) {
-        HB_UChar16 *uc = reordered;
-        bool beginsWithRa = false;
-
-        // Rule 1: find base consonant
-        //
-        // The shaping engine finds the base consonant of the
-        // syllable, using the following algorithm: starting from the
-        // end of the syllable, move backwards until a consonant is
-        // found that does not have a below-base or post-base form
-        // (post-base forms have to follow below-base forms), or
-        // arrive at the first consonant. The consonant stopped at
-        // will be the base.
-        //
-        //  * If the syllable starts with Ra + H (in a script that has
-        //    'Reph'), Ra is excluded from candidates for base
-        //    consonants.
-        //
-        // * In Kannada and Telugu, the base consonant cannot be
-        //   farther than 3 consonants from the end of the syllable.
-        // #### replace the HasReph property by testing if the feature exists in the font!
-        if (form(*uc) == Consonant || (script == HB_Script_Bengali && form(*uc) == IndependentVowel)) {
-            if ((properties & HasReph) && (len > 2) &&
-                (*uc == ra || *uc == 0x9f0) && *(uc+1) == halant)
-                beginsWithRa = true;
-
-            if (beginsWithRa && form(*(uc+2)) == Control)
-                beginsWithRa = false;
-
-            base = (beginsWithRa ? 2 : 0);
-            IDEBUG("    length = %d, beginsWithRa = %d, base=%d", len, beginsWithRa, base);
-
-            int lastConsonant = 0;
-            int matra = -1;
-            // we remember:
-            // * the last consonant since we need it for rule 2
-            // * the matras position for rule 3 and 4
-
-            // figure out possible base glyphs
-            memset(position, 0, len);
-            if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) {
-                bool vattu = false;
-                for (i = base; i < len; ++i) {
-                    position[i] = form(uc[i]);
-                    if (position[i] == Consonant) {
-                        lastConsonant = i;
-                        vattu = (!vattu && uc[i] == ra);
-                        if (vattu) {
-                            IDEBUG("excluding vattu glyph at %d from base candidates", i);
-                            position[i] = Vattu;
-                        }
-                    } else if (position[i] == Matra) {
-                        matra = i;
-                    }
-                }
-            } else {
-                for (i = base; i < len; ++i) {
-                    position[i] = form(uc[i]);
-                    if (position[i] == Consonant)
-                        lastConsonant = i;
-                    else if (matra < 0 && position[i] == Matra)
-                        matra = i;
-                }
-            }
-            int skipped = 0;
-            Position pos = Post;
-            for (i = len-1; i >= base; i--) {
-                if (position[i] != Consonant && (position[i] != Control || script == HB_Script_Kannada))
-                    continue;
-
-                if (i < len-1 && position[i] == Control && position[i+1] == Consonant) {
-                    base = i+1;
-                    break;
-                }
-
-                Position charPosition = indic_position(uc[i]);
-                if (pos == Post && charPosition == Post) {
-                    pos = Post;
-                } else if ((pos == Post || pos == Below) && charPosition == Below) {
-                    if (script == HB_Script_Devanagari || script == HB_Script_Gujarati)
-                        base = i;
-                    pos = Below;
-                } else {
-                    base = i;
-                    break;
-                }
-                if (skipped == 2 && (script == HB_Script_Kannada || script == HB_Script_Telugu)) {
-                    base = i;
-                    break;
-                }
-                ++skipped;
-            }
-
-            IDEBUG("    base consonant at %d skipped=%d, lastConsonant=%d", base, skipped, lastConsonant);
-
-            // Rule 2:
-            //
-            // If the base consonant is not the last one, Uniscribe
-            // moves the halant from the base consonant to the last
-            // one.
-            if (lastConsonant > base) {
-                int halantPos = 0;
-                if (uc[base+1] == halant)
-                    halantPos = base + 1;
-                else if (uc[base+1] == nukta && uc[base+2] == halant)
-                    halantPos = base + 2;
-                if (halantPos > 0) {
-                    IDEBUG("    moving halant from %d to %d!", base+1, lastConsonant);
-                    for (i = halantPos; i < lastConsonant; i++)
-                        uc[i] = uc[i+1];
-                    uc[lastConsonant] = halant;
-                }
-            }
-
-            // Rule 3:
-            //
-            // If the syllable starts with Ra + H, Uniscribe moves
-            // this combination so that it follows either:
-
-            // * the post-base 'matra' (if any) or the base consonant
-            //   (in scripts that show similarity to Devanagari, i.e.,
-            //   Devanagari, Gujarati, Bengali)
-            // * the base consonant (other scripts)
-            // * the end of the syllable (Kannada)
-
-            Position matra_position = None;
-            if (matra > 0)
-                matra_position = indic_position(uc[matra]);
-            IDEBUG("    matra at %d with form %d, base=%d", matra, matra_position, base);
-
-            if (beginsWithRa && base != 0) {
-                int toPos = base+1;
-                if (toPos < len && uc[toPos] == nukta)
-                    toPos++;
-                if (toPos < len && uc[toPos] == halant)
-                    toPos++;
-                if (toPos < len && uc[toPos] == 0x200d)
-                    toPos++;
-                if (toPos < len-1 && uc[toPos] == ra && uc[toPos+1] == halant)
-                    toPos += 2;
-                if (script == HB_Script_Devanagari || script == HB_Script_Gujarati || script == HB_Script_Bengali) {
-                    if (matra_position == Post || matra_position == Split) {
-                        toPos = matra+1;
-                        matra -= 2;
-                    }
-                } else if (script == HB_Script_Kannada) {
-                    toPos = len;
-                    matra -= 2;
-                }
-
-                IDEBUG("moving leading ra+halant to position %d", toPos);
-                for (i = 2; i < toPos; i++)
-                    uc[i-2] = uc[i];
-                uc[toPos-2] = ra;
-                uc[toPos-1] = halant;
-                base -= 2;
-                if (properties & HasReph)
-                    reph = toPos-2;
-            }
-
-            // Rule 4:
-
-            // Uniscribe splits two- or three-part matras into their
-            // parts. This splitting is a character-to-character
-            // operation).
-            //
-            //      Uniscribe describes some moving operations for these
-            //      matras here. For shaping however all pre matras need
-            //      to be at the beginning of the syllable, so we just move
-            //      them there now.
-            if (matra_position == Split) {
-                splitMatra(uc, matra, len);
-                // Handle three-part matras (0xccb in Kannada)
-                matra_position = indic_position(uc[matra]);
-            }
-
-            if (matra_position == Pre) {
-                unsigned short m = uc[matra];
-                while (matra--)
-                    uc[matra+1] = uc[matra];
-                uc[0] = m;
-                base++;
-            }
-        }
-
-        // Rule 5:
-        //
-        // Uniscribe classifies consonants and 'matra' parts as
-        // pre-base, above-base (Reph), below-base or post-base. This
-        // classification exists on the character code level and is
-        // language-dependent, not font-dependent.
-        for (i = 0; i < base; ++i)
-            position[i] = Pre;
-        position[base] = Base;
-        for (i = base+1; i < len; ++i) {
-            position[i] = indic_position(uc[i]);
-            // #### replace by adjusting table
-            if (uc[i] == nukta || uc[i] == halant)
-                position[i] = Inherit;
-        }
-        if (reph > 0) {
-            // recalculate reph, it might have changed.
-            for (i = base+1; i < len; ++i)
-                if (uc[i] == ra)
-                    reph = i;
-            position[reph] = Reph;
-            position[reph+1] = Inherit;
-        }
-
-        // all reordering happens now to the chars after the base
-        int fixed = base+1;
-        if (fixed < len && uc[fixed] == nukta)
-            fixed++;
-        if (fixed < len && uc[fixed] == halant)
-            fixed++;
-        if (fixed < len && uc[fixed] == 0x200d)
-            fixed++;
-
-#ifdef INDIC_DEBUG
-        for (i = fixed; i < len; ++i)
-            IDEBUG("position[%d] = %d, form=%d uc=%x", i, position[i], form(uc[i]), uc[i]);
-#endif
-        // we continuosly position the matras and vowel marks and increase the fixed
-        // until we reached the end.
-        const IndicOrdering *finalOrder = indic_order[script-HB_Script_Devanagari];
-
-        IDEBUG("    reordering pass:");
-        IDEBUG("        base=%d fixed=%d", base, fixed);
-        int toMove = 0;
-        while (finalOrder[toMove].form && fixed < len-1) {
-            IDEBUG("        fixed = %d, toMove=%d, moving form %d with pos %d", fixed, toMove, finalOrder[toMove].form, finalOrder[toMove].position);
-            for (i = fixed; i < len; i++) {
-//                IDEBUG() << "           i=" << i << "uc=" << hex << uc[i] << "form=" << form(uc[i])
-//                         << "position=" << position[i];
-                if (form(uc[i]) == finalOrder[toMove].form &&
-                     position[i] == finalOrder[toMove].position) {
-                    // need to move this glyph
-                    int to = fixed;
-                    if (i < len-1 && position[i+1] == Inherit) {
-                        IDEBUG("         moving two chars from %d to %d", i, to);
-                        unsigned short ch = uc[i];
-                        unsigned short ch2 = uc[i+1];
-                        unsigned char pos = position[i];
-                        for (int j = i+1; j > to+1; j--) {
-                            uc[j] = uc[j-2];
-                            position[j] = position[j-2];
-                        }
-                        uc[to] = ch;
-                        uc[to+1] = ch2;
-                        position[to] = pos;
-                        position[to+1] = pos;
-                        fixed += 2;
-                    } else {
-                        IDEBUG("         moving one char from %d to %d", i, to);
-                        unsigned short ch = uc[i];
-                        unsigned char pos = position[i];
-                        for (int j = i; j > to; j--) {
-                            uc[j] = uc[j-1];
-                            position[j] = position[j-1];
-                        }
-                        uc[to] = ch;
-                        position[to] = pos;
-                        fixed++;
-                    }
-                }
-            }
-            toMove++;
-        }
-
-    }
-
-    if (reph > 0) {
-        // recalculate reph, it might have changed.
-        for (i = base+1; i < len; ++i)
-            if (reordered[i] == ra)
-                reph = i;
-    }
-
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = item->num_glyphs;
-#endif
-    if (!item->font->klass->convertStringToGlyphIndices(item->font,
-                                                        reordered, len,
-                                                        item->glyphs, &item->num_glyphs,
-                                                        item->item.bidiLevel % 2))
-        goto error;
-
-
-    IDEBUG("  base=%d, reph=%d", base, reph);
-    IDEBUG("reordered:");
-    for (i = 0; i < len; i++) {
-        item->attributes[i].mark = false;
-        item->attributes[i].clusterStart = false;
-        item->attributes[i].justification = 0;
-        item->attributes[i].zeroWidth = false;
-        IDEBUG("    %d: %4x", i, reordered[i]);
-    }
-
-    // now we have the syllable in the right order, and can start running it through open type.
-
-    for (i = 0; i < len; ++i)
-        control |= (form(reordered[i]) == Control);
-
-#ifndef NO_OPENTYPE
-    if (openType) {
-
-        // we need to keep track of where the base glyph is for some
-        // scripts and use the cluster feature for this.  This
-        // also means we have to correct the logCluster output from
-        // the open type engine manually afterwards.  for indic this
-        // is rather simple, as all chars just point to the first
-        // glyph in the syllable.
-        HB_STACKARRAY(unsigned short, clusters, len);
-        HB_STACKARRAY(unsigned int, properties, len);
-
-        for (i = 0; i < len; ++i)
-            clusters[i] = i;
-
-        // features we should always apply
-        for (i = 0; i < len; ++i)
-            properties[i] = ~(LocaProperty
-                              | CcmpProperty
-                              | NuktaProperty
-                              | VattuProperty
-                              | ConjunctFormProperty
-                              | PreSubstProperty
-                              | BelowSubstProperty
-                              | AboveSubstProperty
-                              | PostSubstProperty
-                              | HalantProperty
-                              | IndicCaltProperty
-                              | PositioningProperties);
-
-        // Loca always applies
-        // Ccmp always applies
-        // Init
-        if (item->item.pos == 0
-            || !(isLetter(item->ufuncs, item->string[item->item.pos-1]) || isMark(item->ufuncs, item->string[item->item.pos-1])))
-            properties[0] &= ~InitProperty;
-
-        // Nukta always applies
-        // Akhant
-        for (i = 0; i <= base; ++i)
-            properties[i] &= ~AkhantProperty;
-        // Reph
-        if (reph >= 0) {
-            properties[reph] &= ~RephProperty;
-            properties[reph+1] &= ~RephProperty;
-        }
-        // BelowForm
-        for (i = base+1; i < len; ++i)
-            properties[i] &= ~BelowFormProperty;
-
-        if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) {
-            // vattu glyphs need this aswell
-            bool vattu = false;
-            for (i = base-2; i > 1; --i) {
-                if (form(reordered[i]) == Consonant) {
-                    vattu = (!vattu && reordered[i] == ra);
-                    if (vattu) {
-                        IDEBUG("forming vattu ligature at %d", i);
-                        properties[i] &= ~BelowFormProperty;
-                        properties[i+1] &= ~BelowFormProperty;
-                    }
-                }
-            }
-        }
-        // HalfFormProperty
-        for (i = 0; i < base; ++i)
-            properties[i] &= ~HalfFormProperty;
-        if (control) {
-            for (i = 2; i < len; ++i) {
-                if (reordered[i] == 0x200d /* ZWJ */) {
-                    properties[i-1] &= ~HalfFormProperty;
-                    properties[i-2] &= ~HalfFormProperty;
-                } else if (reordered[i] == 0x200c /* ZWNJ */) {
-                    properties[i-1] &= ~HalfFormProperty;
-                    properties[i-2] &= ~HalfFormProperty;
-                }
-            }
-        }
-        // PostFormProperty
-        for (i = base+1; i < len; ++i)
-            properties[i] &= ~PostFormProperty;
-        // vattu always applies
-        // pres always applies
-        // blws always applies
-        // abvs always applies
-        // psts always applies
-        // halant always applies
-        // calt always applies
-
-#ifdef INDIC_DEBUG
-//        {
-//            IDEBUG("OT properties:");
-//            for (int i = 0; i < len; ++i)
-//                qDebug("    i: %s", ::propertiesToString(properties[i]).toLatin1().data());
-//        }
-#endif
-
-        // initialize
-        item->log_clusters = clusters;
-        HB_OpenTypeShape(item, properties);
-
-        int newLen = item->face->buffer->in_length;
-        HB_GlyphItem otl_glyphs = item->face->buffer->in_string;
-
-        // move the left matra back to its correct position in malayalam and tamil
-        if ((script == HB_Script_Malayalam || script == HB_Script_Tamil) && (form(reordered[0]) == Matra)) {
-//             qDebug("reordering matra, len=%d", newLen);
-            // need to find the base in the shaped string and move the matra there
-            int basePos = 0;
-            while (basePos < newLen && (int)otl_glyphs[basePos].cluster <= base)
-                basePos++;
-            --basePos;
-            if (basePos < newLen && basePos > 1) {
-//                 qDebug("moving prebase matra to position %d in syllable newlen=%d", basePos, newLen);
-                HB_GlyphItemRec m = otl_glyphs[0];
-                --basePos;
-                for (i = 0; i < basePos; ++i)
-                    otl_glyphs[i] = otl_glyphs[i+1];
-                otl_glyphs[basePos] = m;
-            }
-        }
-
-        HB_Bool positioned = HB_OpenTypePosition(item, availableGlyphs, false);
-
-        HB_FREE_STACKARRAY(clusters);
-        HB_FREE_STACKARRAY(properties);
-
-        if (!positioned)
-            goto error;
-
-        if (control) {
-            IDEBUG("found a control char in the syllable");
-            hb_uint32 i = 0, j = 0;
-            while (i < item->num_glyphs) {
-                if (form(reordered[otl_glyphs[i].cluster]) == Control) {
-                    ++i;
-                    if (i >= item->num_glyphs)
-                        break;
-                }
-                item->glyphs[j] = item->glyphs[i];
-                item->attributes[j] = item->attributes[i];
-                item->offsets[j] = item->offsets[i];
-                item->advances[j] = item->advances[i];
-                ++i;
-                ++j;
-            }
-            item->num_glyphs = j;
-        }
-
-    } else {
-        HB_HeuristicPosition(item);
-    }
-#endif // NO_OPENTYPE
-    item->attributes[0].clusterStart = true;
-
-    HB_FREE_STACKARRAY(reordered);
-    HB_FREE_STACKARRAY(position);
-
-    IDEBUG("<<<<<<");
-    return true;
-
-error:
-    HB_FREE_STACKARRAY(reordered);
-    HB_FREE_STACKARRAY(position);
-    return false;
-}
-
-/* syllables are of the form:
-
-   (Consonant Nukta? Halant)* Consonant Matra? VowelMark? StressMark?
-   (Consonant Nukta? Halant)* Consonant Halant
-   IndependentVowel VowelMark? StressMark?
-
-   We return syllable boundaries on invalid combinations aswell
-*/
-static int indic_nextSyllableBoundary(HB_Script script, const HB_UChar16 *s, int start, int end, bool *invalid)
-{
-    *invalid = false;
-    IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end);
-    const HB_UChar16 *uc = s+start;
-
-    int pos = 0;
-    Form state = form(uc[pos]);
-    IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);
-    pos++;
-
-    if (state != Consonant && state != IndependentVowel) {
-        if (state != Other)
-            *invalid = true;
-        goto finish;
-    }
-
-    while (pos < end - start) {
-        Form newState = form(uc[pos]);
-        IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]);
-        switch(newState) {
-        case Control:
-            newState = state;
- 	    if (state == Halant && uc[pos] == 0x200d /* ZWJ */)
-  		break;
-            // the control character should be the last char in the item
-            ++pos;
-            goto finish;
-        case Consonant:
-	    if (state == Halant && (script != HB_Script_Sinhala || uc[pos-1] == 0x200d /* ZWJ */))
-                break;
-            goto finish;
-        case Halant:
-            if (state == Nukta || state == Consonant)
-                break;
-            // Bengali has a special exception allowing the combination Vowel_A/E + Halant + Ya
-            if (script == HB_Script_Bengali && pos == 1 &&
-                 (uc[0] == 0x0985 || uc[0] == 0x098f))
-                break;
-            // Sinhala uses the Halant as a component of certain matras. Allow these, but keep the state on Matra.
-            if (script == HB_Script_Sinhala && state == Matra) {
-                ++pos;
-                continue;
-            }
-            if (script == HB_Script_Malayalam && state == Matra && uc[pos-1] == 0x0d41) {
-                ++pos;
-                continue;
-            }
-            goto finish;
-        case Nukta:
-            if (state == Consonant)
-                break;
-            goto finish;
-        case StressMark:
-            if (state == VowelMark)
-                break;
-            // fall through
-        case VowelMark:
-            if (state == Matra || state == LengthMark || state == IndependentVowel)
-                break;
-            // fall through
-        case Matra:
-            if (state == Consonant || state == Nukta)
-                break;
-            if (state == Matra) {
-                // ### needs proper testing for correct two/three part matras
-                break;
-            }
-            // ### not sure if this is correct. If it is, does it apply only to Bengali or should
-            // it work for all Indic languages?
-            // the combination Independent_A + Vowel Sign AA is allowed.
-            if (script == HB_Script_Bengali && uc[pos] == 0x9be && uc[pos-1] == 0x985)
-                break;
-            if (script == HB_Script_Tamil && state == Matra) {
-                if (uc[pos-1] == 0x0bc6 &&
-                     (uc[pos] == 0xbbe || uc[pos] == 0xbd7))
-                    break;
-                if (uc[pos-1] == 0x0bc7 && uc[pos] == 0xbbe)
-                    break;
-            }
-            goto finish;
-
-        case LengthMark:
-            if (state == Matra) {
-                // ### needs proper testing for correct two/three part matras
-                break;
-            }
-        case IndependentVowel:
-        case Invalid:
-        case Other:
-            goto finish;
-        }
-        state = newState;
-        pos++;
-    }
- finish:
-    return pos+start;
-}
-
-HB_Bool HB_IndicShape(HB_ShaperItem *item)
-{
-    assert(item->item.script >= HB_Script_Devanagari && item->item.script <= HB_Script_Sinhala);
-
-    HB_Bool openType = false;
-#ifndef NO_OPENTYPE
-    openType = HB_SelectScript(item, indic_features);
-#endif
-    unsigned short *logClusters = item->log_clusters;
-
-    HB_ShaperItem syllable = *item;
-    int first_glyph = 0;
-
-    int sstart = item->item.pos;
-    int end = sstart + item->item.length;
-    IDEBUG("indic_shape: from %d length %d", item->item.pos, item->item.length);
-    while (sstart < end) {
-        bool invalid;
-        int send = indic_nextSyllableBoundary(item->item.script, item->string, sstart, end, &invalid);
-        IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
-               invalid ? "true" : "false");
-        syllable.item.pos = sstart;
-        syllable.item.length = send-sstart;
-        syllable.glyphs = item->glyphs + first_glyph;
-        syllable.attributes = item->attributes + first_glyph;
-        syllable.offsets = item->offsets + first_glyph;
-        syllable.advances = item->advances + first_glyph;
-        syllable.num_glyphs = item->num_glyphs - first_glyph;
-        if (!indic_shape_syllable(openType, &syllable, invalid)) {
-            IDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
-            item->num_glyphs += syllable.num_glyphs;
-            return false;
-        }
-        // fix logcluster array
-        IDEBUG("syllable:");
-        hb_uint32 g;
-        for (g = first_glyph; g < first_glyph + syllable.num_glyphs; ++g)
-            IDEBUG("        %d -> glyph %x", g, item->glyphs[g]);
-        IDEBUG("    logclusters:");
-        int i;
-        for (i = sstart; i < send; ++i) {
-            IDEBUG("        %d -> glyph %d", i, first_glyph);
-            logClusters[i-item->item.pos] = first_glyph;
-        }
-        sstart = send;
-        first_glyph += syllable.num_glyphs;
-    }
-    item->num_glyphs = first_glyph;
-    return true;
-}
diff --git a/src/hb-old/harfbuzz-khmer.c b/src/hb-old/harfbuzz-khmer.c
deleted file mode 100644
index 150cbc1..0000000
--- a/src/hb-old/harfbuzz-khmer.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-/*
-//  Vocabulary
-//      Base ->         A consonant or an independent vowel in its full (not subscript) form. It is the
-//                      center of the syllable, it can be surrounded by coeng (subscript) consonants, vowels,
-//                      split vowels, signs... but there is only one base in a syllable, it has to be coded as
-//                      the first character of the syllable.
-//      split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant).
-//                      Khmer language has five of them. Khmer split vowels either have one part before the
-//                      base and one after the base or they have a part before the base and a part above the base.
-//                      The first part of all Khmer split vowels is the same character, identical to
-//                      the glyph of Khmer dependent vowel SRA EI
-//      coeng -->  modifier used in Khmer to construct coeng (subscript) consonants
-//                 Differently than indian languages, the coeng modifies the consonant that follows it,
-//                 not the one preceding it  Each consonant has two forms, the base form and the subscript form
-//                 the base form is the normal one (using the consonants code-point), the subscript form is
-//                 displayed when the combination coeng + consonant is encountered.
-//      Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant
-//      Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO)
-//      Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA)
-//      Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds
-//                           if it is attached to a consonant of the first series or a consonant of the second series
-//                           Most consonants have an equivalent in the other series, but some of theme exist only in
-//                           one series (for example SA). If we want to use the consonant SA with a vowel sound that
-//                           can only be done with a vowel sound that corresponds to a vowel accompanying a consonant
-//                           of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN
-//                           x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and
-//                           MUSIKATOAN a second series consonant to have a first series vowel sound.
-//                           Consonant shifter are both normally supercript marks, but, when they are followed by a
-//                           superscript, they change shape and take the form of subscript dependent vowel SRA U.
-//                           If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they
-//                           should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should
-//                           be placed after the coeng consonant.
-//      Dependent vowel ->   In khmer dependent vowels can be placed above, below, before or after the base
-//                           Each vowel has its own position. Only one vowel per syllable is allowed.
-//      Signs            ->  Khmer has above signs and post signs. Only one above sign and/or one post sign are
-//                           Allowed in a syllable.
-//
-//
-//   order is important here! This order must be the same that is found in each horizontal
-//   line in the statetable for Khmer (see khmerStateTable) .
-*/
-enum KhmerCharClassValues {
-    CC_RESERVED             =  0,
-    CC_CONSONANT            =  1, /* Consonant of type 1 or independent vowel */
-    CC_CONSONANT2           =  2, /* Consonant of type 2 */
-    CC_CONSONANT3           =  3, /* Consonant of type 3 */
-    CC_ZERO_WIDTH_NJ_MARK   =  4, /* Zero Width non joiner character (0x200C) */
-    CC_CONSONANT_SHIFTER    =  5,
-    CC_ROBAT                =  6, /* Khmer special diacritic accent -treated differently in state table */
-    CC_COENG                =  7, /* Subscript consonant combining character */
-    CC_DEPENDENT_VOWEL      =  8,
-    CC_SIGN_ABOVE           =  9,
-    CC_SIGN_AFTER           = 10,
-    CC_ZERO_WIDTH_J_MARK    = 11, /* Zero width joiner character */
-    CC_COUNT                = 12  /* This is the number of character classes */
-};
-
-
-enum KhmerCharClassFlags {
-    CF_CLASS_MASK    = 0x0000FFFF,
-
-    CF_CONSONANT     = 0x01000000,  /* flag to speed up comparing */
-    CF_SPLIT_VOWEL   = 0x02000000,  /* flag for a split vowel -> the first part is added in front of the syllable */
-    CF_DOTTED_CIRCLE = 0x04000000,  /* add a dotted circle if a character with this flag is the first in a syllable */
-    CF_COENG         = 0x08000000,  /* flag to speed up comparing */
-    CF_SHIFTER       = 0x10000000,  /* flag to speed up comparing */
-    CF_ABOVE_VOWEL   = 0x20000000,  /* flag to speed up comparing */
-
-    /* position flags */
-    CF_POS_BEFORE    = 0x00080000,
-    CF_POS_BELOW     = 0x00040000,
-    CF_POS_ABOVE     = 0x00020000,
-    CF_POS_AFTER     = 0x00010000,
-    CF_POS_MASK      = 0x000f0000
-};
-
-
-/* Characters that get referred to by name */
-enum KhmerChar {
-    C_SIGN_ZWNJ     = 0x200C,
-    C_SIGN_ZWJ      = 0x200D,
-    C_RO            = 0x179A,
-    C_VOWEL_AA      = 0x17B6,
-    C_SIGN_NIKAHIT  = 0x17C6,
-    C_VOWEL_E       = 0x17C1,
-    C_COENG         = 0x17D2
-};
-
-
-/*
-//  simple classes, they are used in the statetable (in this file) to control the length of a syllable
-//  they are also used to know where a character should be placed (location in reference to the base character)
-//  and also to know if a character, when independently displayed, should be displayed with a dotted-circle to
-//  indicate error in syllable construction
-*/
-enum {
-    _xx = CC_RESERVED,
-    _sa = CC_SIGN_ABOVE | CF_DOTTED_CIRCLE | CF_POS_ABOVE,
-    _sp = CC_SIGN_AFTER | CF_DOTTED_CIRCLE| CF_POS_AFTER,
-    _c1 = CC_CONSONANT | CF_CONSONANT,
-    _c2 = CC_CONSONANT2 | CF_CONSONANT,
-    _c3 = CC_CONSONANT3 | CF_CONSONANT,
-    _rb = CC_ROBAT | CF_POS_ABOVE | CF_DOTTED_CIRCLE,
-    _cs = CC_CONSONANT_SHIFTER | CF_DOTTED_CIRCLE | CF_SHIFTER,
-    _dl = CC_DEPENDENT_VOWEL | CF_POS_BEFORE | CF_DOTTED_CIRCLE,
-    _db = CC_DEPENDENT_VOWEL | CF_POS_BELOW | CF_DOTTED_CIRCLE,
-    _da = CC_DEPENDENT_VOWEL | CF_POS_ABOVE | CF_DOTTED_CIRCLE | CF_ABOVE_VOWEL,
-    _dr = CC_DEPENDENT_VOWEL | CF_POS_AFTER | CF_DOTTED_CIRCLE,
-    _co = CC_COENG | CF_COENG | CF_DOTTED_CIRCLE,
-
-    /* split vowel */
-    _va = _da | CF_SPLIT_VOWEL,
-    _vr = _dr | CF_SPLIT_VOWEL
-};
-
-
-/*
-//   Character class: a character class value
-//   ORed with character class flags.
-*/
-typedef unsigned long KhmerCharClass;
-
-
-/*
-//  Character class tables
-//  _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs...
-//  _sa Sign placed above the base
-//  _sp Sign placed after the base
-//  _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants)
-//  _c2 Consonant of type 2 (only RO)
-//  _c3 Consonant of type 3
-//  _rb Khmer sign robat u17CC. combining mark for subscript consonants
-//  _cd Consonant-shifter
-//  _dl Dependent vowel placed before the base (left of the base)
-//  _db Dependent vowel placed below the base
-//  _da Dependent vowel placed above the base
-//  _dr Dependent vowel placed behind the base (right of the base)
-//  _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following
-//      it to create a subscript consonant or independent vowel
-//  _va Khmer split vowel in which the first part is before the base and the second one above the base
-//  _vr Khmer split vowel in which the first part is before the base and the second one behind (right of) the base
-*/
-static const KhmerCharClass khmerCharClasses[] = {
-    _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, /* 1780 - 178F */
-    _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, /* 1790 - 179F */
-    _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, /* 17A0 - 17AF */
-    _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, /* 17B0 - 17BF */
-    _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, /* 17C0 - 17CF */
-    _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx  /* 17D0 - 17DF */
-};
-
-/* this enum must reflect the range of khmerCharClasses */
-enum KhmerCharClassesRange {
-    KhmerFirstChar = 0x1780,
-    KhmerLastChar  = 0x17df
-};
-
-/*
-//  Below we define how a character in the input string is either in the khmerCharClasses table
-//  (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear
-//  within the syllable, but are not in the table) we also get their type back, or an unknown object
-//  in which case we get _xx (CC_RESERVED) back
-*/
-static KhmerCharClass getKhmerCharClass(HB_UChar16 uc)
-{
-    if (uc == C_SIGN_ZWJ) {
-        return CC_ZERO_WIDTH_J_MARK;
-    }
-
-    if (uc == C_SIGN_ZWNJ) {
-        return CC_ZERO_WIDTH_NJ_MARK;
-    }
-
-    if (uc < KhmerFirstChar || uc > KhmerLastChar) {
-        return CC_RESERVED;
-    }
-
-    return khmerCharClasses[uc - KhmerFirstChar];
-}
-
-
-/*
-//  The stateTable is used to calculate the end (the length) of a well
-//  formed Khmer Syllable.
-//
-//  Each horizontal line is ordered exactly the same way as the values in KhmerClassTable
-//  CharClassValues. This coincidence of values allows the follow up of the table.
-//
-//  Each line corresponds to a state, which does not necessarily need to be a type
-//  of component... for example, state 2 is a base, with is always a first character
-//  in the syllable, but the state could be produced a consonant of any type when
-//  it is the first character that is analysed (in ground state).
-//
-//  Differentiating 3 types of consonants is necessary in order to
-//  forbid the use of certain combinations, such as having a second
-//  coeng after a coeng RO,
-//  The inexistent possibility of having a type 3 after another type 3 is permitted,
-//  eliminating it would very much complicate the table, and it does not create typing
-//  problems, as the case above.
-//
-//  The table is quite complex, in order to limit the number of coeng consonants
-//  to 2 (by means of the table).
-//
-//  There a peculiarity, as far as Unicode is concerned:
-//  - The consonant-shifter is considered in two possible different
-//    locations, the one considered in Unicode 3.0 and the one considered in
-//    Unicode 4.0. (there is a backwards compatibility problem in this standard).
-//
-//
-//  xx    independent character, such as a number, punctuation sign or non-khmer char
-//
-//  c1    Khmer consonant of type 1 or an independent vowel
-//        that is, a letter in which the subscript for is only under the
-//        base, not taking any space to the right or to the left
-//
-//  c2    Khmer consonant of type 2, the coeng form takes space under
-//        and to the left of the base (only RO is of this type)
-//
-//  c3    Khmer consonant of type 3. Its subscript form takes space under
-//        and to the right of the base.
-//
-//  cs    Khmer consonant shifter
-//
-//  rb    Khmer robat
-//
-//  co    coeng character (u17D2)
-//
-//  dv    dependent vowel (including split vowels, they are treated in the same way).
-//        even if dv is not defined above, the component that is really tested for is
-//        KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels
-//
-//  zwj   Zero Width joiner
-//
-//  zwnj  Zero width non joiner
-//
-//  sa    above sign
-//
-//  sp    post sign
-//
-//  there are lines with equal content but for an easier understanding
-//  (and maybe change in the future) we did not join them
-*/
-static const signed char khmerStateTable[][CC_COUNT] =
-{
-    /* xx  c1  c2  c3 zwnj cs  rb  co  dv  sa  sp zwj */
-    { 1,  2,  2,  2,  1,  1,  1,  6,  1,  1,  1,  2}, /*  0 - ground state */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*  1 - exit state (or sign to the right of the syllable) */
-    {-1, -1, -1, -1,  3,  4,  5,  6, 16, 17,  1, -1}, /*  2 - Base consonant */
-    {-1, -1, -1, -1, -1,  4, -1, -1, 16, -1, -1, -1}, /*  3 - First ZWNJ before a register shifter It can only be followed by a shifter or a vowel */
-    {-1, -1, -1, -1, 15, -1, -1,  6, 16, 17,  1, 14}, /*  4 - First register shifter */
-    {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1,  1, -1}, /*  5 - Robat */
-    {-1,  7,  8,  9, -1, -1, -1, -1, -1, -1, -1, -1}, /*  6 - First Coeng */
-    {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17,  1, 14}, /*  7 - First consonant of type 1 after coeng */
-    {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17,  1, 14}, /*  8 - First consonant of type 2 after coeng */
-    {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17,  1, 14}, /*  9 - First consonant or type 3 after ceong */
-    {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, /* 10 - Second Coeng (no register shifter before) */
-    {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17,  1, 14}, /* 11 - Second coeng consonant (or ind. vowel) no register shifter before */
-    {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, /* 12 - Second ZWNJ before a register shifter */
-    {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17,  1, 14}, /* 13 - Second register shifter */
-    {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 14 - ZWJ before vowel */
-    {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 15 - ZWNJ before vowel */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17,  1, 18}, /* 16 - dependent vowel */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1, 18}, /* 17 - sign above */
-    {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, /* 18 - ZWJ after vowel */
-    {-1,  1, -1,  1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 19 - Third coeng */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1, -1}, /* 20 - dependent vowel after a Robat */
-};
-
-
-/*  #define KHMER_DEBUG */
-#ifdef KHMER_DEBUG
-#define KHDEBUG qDebug
-#else
-#define KHDEBUG if(0) printf
-#endif
-
-/*
-//  Given an input string of characters and a location in which to start looking
-//  calculate, using the state table, which one is the last character of the syllable
-//  that starts in the starting position.
-*/
-static int khmer_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
-    const HB_UChar16 *uc = s + start;
-    int state = 0;
-    int pos = start;
-    *invalid = FALSE;
-
-    while (pos < end) {
-        KhmerCharClass charClass = getKhmerCharClass(*uc);
-        if (pos == start) {
-            *invalid = (charClass > 0) && ! (charClass & CF_CONSONANT);
-        }
-        state = khmerStateTable[state][charClass & CF_CLASS_MASK];
-
-        KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state,
-                charClass, *uc );
-
-        if (state < 0) {
-            break;
-        }
-        ++uc;
-        ++pos;
-    }
-    return pos;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature khmer_features[] = {
-    { HB_MAKE_TAG( 'p', 'r', 'e', 'f' ), PreFormProperty },
-    { HB_MAKE_TAG( 'b', 'l', 'w', 'f' ), BelowFormProperty },
-    { HB_MAKE_TAG( 'a', 'b', 'v', 'f' ), AboveFormProperty },
-    { HB_MAKE_TAG( 'p', 's', 't', 'f' ), PostFormProperty },
-    { HB_MAKE_TAG( 'p', 'r', 'e', 's' ), PreSubstProperty },
-    { HB_MAKE_TAG( 'b', 'l', 'w', 's' ), BelowSubstProperty },
-    { HB_MAKE_TAG( 'a', 'b', 'v', 's' ), AboveSubstProperty },
-    { HB_MAKE_TAG( 'p', 's', 't', 's' ), PostSubstProperty },
-    { HB_MAKE_TAG( 'c', 'l', 'i', 'g' ), CligProperty },
-    { 0, 0 }
-};
-#endif
-
-
-static HB_Bool khmer_shape_syllable(HB_Bool openType, HB_ShaperItem *item)
-{
-/*    KHDEBUG("syllable from %d len %d, str='%s'", item->from, item->length,
-  	    item->string->mid(item->from, item->length).toUtf8().data()); */
-
-    int len = 0;
-    int syllableEnd = item->item.pos + item->item.length;
-    unsigned short reordered[16];
-    unsigned char properties[16];
-    enum {
-	AboveForm = 0x01,
-	PreForm = 0x02,
-	PostForm = 0x04,
-	BelowForm = 0x08
-    };
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = item->num_glyphs;
-#endif
-    int coengRo;
-    int i;
-
-    /* according to the specs this is the max length one can get
-       ### the real value should be smaller */
-    assert(item->item.length < 13);
-
-    memset(properties, 0, 16*sizeof(unsigned char));
-
-#ifdef KHMER_DEBUG
-    qDebug("original:");
-    for (int i = from; i < syllableEnd; i++) {
-        qDebug("    %d: %4x", i, string[i]);
-    }
-#endif
-
-    /*
-    // write a pre vowel or the pre part of a split vowel first
-    // and look out for coeng + ro. RO is the only vowel of type 2, and
-    // therefore the only one that requires saving space before the base.
-    */
-    coengRo = -1;  /* There is no Coeng Ro, if found this value will change */
-    for (i = item->item.pos; i < syllableEnd; i += 1) {
-        KhmerCharClass charClass = getKhmerCharClass(item->string[i]);
-
-        /* if a split vowel, write the pre part. In Khmer the pre part
-           is the same for all split vowels, same glyph as pre vowel C_VOWEL_E */
-        if (charClass & CF_SPLIT_VOWEL) {
-            reordered[len] = C_VOWEL_E;
-            properties[len] = PreForm;
-            ++len;
-            break; /* there can be only one vowel */
-        }
-        /* if a vowel with pos before write it out */
-        if (charClass & CF_POS_BEFORE) {
-            reordered[len] = item->string[i];
-            properties[len] = PreForm;
-            ++len;
-            break; /* there can be only one vowel */
-        }
-        /* look for coeng + ro and remember position
-           works because coeng + ro is always in front of a vowel (if there is a vowel)
-           and because CC_CONSONANT2 is enough to identify it, as it is the only consonant
-           with this flag */
-        if ( (charClass & CF_COENG) && (i + 1 < syllableEnd) &&
-              ( (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT2) ) {
-            coengRo = i;
-        }
-    }
-
-    /* write coeng + ro if found */
-    if (coengRo > -1) {
-        reordered[len] = C_COENG;
-        properties[len] = PreForm;
-        ++len;
-        reordered[len] = C_RO;
-        properties[len] = PreForm;
-        ++len;
-    }
-
-    /*
-       shall we add a dotted circle?
-       If in the position in which the base should be (first char in the string) there is
-       a character that has the Dotted circle flag (a character that cannot be a base)
-       then write a dotted circle */
-    if (getKhmerCharClass(item->string[item->item.pos]) & CF_DOTTED_CIRCLE) {
-        reordered[len] = C_DOTTED_CIRCLE;
-        ++len;
-    }
-
-    /* copy what is left to the output, skipping before vowels and
-       coeng Ro if they are present */
-    for (i = item->item.pos; i < syllableEnd; i += 1) {
-        HB_UChar16 uc = item->string[i];
-        KhmerCharClass charClass = getKhmerCharClass(uc);
-
-        /* skip a before vowel, it was already processed */
-        if (charClass & CF_POS_BEFORE) {
-            continue;
-        }
-
-        /* skip coeng + ro, it was already processed */
-        if (i == coengRo) {
-            i += 1;
-            continue;
-        }
-
-        switch (charClass & CF_POS_MASK)
-        {
-            case CF_POS_ABOVE :
-                reordered[len] = uc;
-                properties[len] = AboveForm;
-                ++len;
-                break;
-
-            case CF_POS_AFTER :
-                reordered[len] = uc;
-                properties[len] = PostForm;
-                ++len;
-                break;
-
-            case CF_POS_BELOW :
-                reordered[len] = uc;
-                properties[len] = BelowForm;
-                ++len;
-                break;
-
-            default:
-                /* assign the correct flags to a coeng consonant
-                   Consonants of type 3 are taged as Post forms and those type 1 as below forms */
-                if ( (charClass & CF_COENG) && i + 1 < syllableEnd ) {
-                    unsigned char property = (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT3 ?
-                                              PostForm : BelowForm;
-                    reordered[len] = uc;
-                    properties[len] = property;
-                    ++len;
-                    i += 1;
-                    reordered[len] = item->string[i];
-                    properties[len] = property;
-                    ++len;
-                    break;
-                }
-
-                /* if a shifter is followed by an above vowel change the shifter to below form,
-                   an above vowel can have two possible positions i + 1 or i + 3
-                   (position i+1 corresponds to unicode 3, position i+3 to Unicode 4)
-                   and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two
-                   different positions, right after the shifter or after a vowel (Unicode 4) */
-                if ( (charClass & CF_SHIFTER) && (i + 1 < syllableEnd) ) {
-                    if (getKhmerCharClass(item->string[i+1]) & CF_ABOVE_VOWEL ) {
-                        reordered[len] = uc;
-                        properties[len] = BelowForm;
-                        ++len;
-                        break;
-                    }
-                    if (i + 2 < syllableEnd &&
-                        (item->string[i+1] == C_VOWEL_AA) &&
-                        (item->string[i+2] == C_SIGN_NIKAHIT) )
-                    {
-                        reordered[len] = uc;
-                        properties[len] = BelowForm;
-                        ++len;
-                        break;
-                    }
-                    if (i + 3 < syllableEnd && (getKhmerCharClass(item->string[i+3]) & CF_ABOVE_VOWEL) ) {
-                        reordered[len] = uc;
-                        properties[len] = BelowForm;
-                        ++len;
-                        break;
-                    }
-                    if (i + 4 < syllableEnd &&
-                        (item->string[i+3] == C_VOWEL_AA) &&
-                        (item->string[i+4] == C_SIGN_NIKAHIT) )
-                    {
-                        reordered[len] = uc;
-                        properties[len] = BelowForm;
-                        ++len;
-                        break;
-                    }
-                }
-
-                /* default - any other characters */
-                reordered[len] = uc;
-                ++len;
-                break;
-        } /* switch */
-    } /* for */
-
-    if (!item->font->klass->convertStringToGlyphIndices(item->font,
-                                                        reordered, len,
-                                                        item->glyphs, &item->num_glyphs,
-                                                        item->item.bidiLevel % 2))
-        return FALSE;
-
-
-    KHDEBUG("after shaping: len=%d", len);
-    for (i = 0; i < len; i++) {
-	item->attributes[i].mark = FALSE;
-	item->attributes[i].clusterStart = FALSE;
-	item->attributes[i].justification = 0;
-	item->attributes[i].zeroWidth = FALSE;
-	KHDEBUG("    %d: %4x property=%x", i, reordered[i], properties[i]);
-    }
-
-    /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
-    if (openType) {
- 	hb_uint32 where[16];
-        for (i = 0; i < len; ++i) {
-            where[i] = ~(PreSubstProperty
-                         | BelowSubstProperty
-                         | AboveSubstProperty
-                         | PostSubstProperty
-                         | CligProperty
-                         | PositioningProperties);
-            if (properties[i] == PreForm)
-                where[i] &= ~PreFormProperty;
-            else if (properties[i] == BelowForm)
-                where[i] &= ~BelowFormProperty;
-            else if (properties[i] == AboveForm)
-                where[i] &= ~AboveFormProperty;
-            else if (properties[i] == PostForm)
-                where[i] &= ~PostFormProperty;
-        }
-
-        HB_OpenTypeShape(item, where);
-        if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
-            return FALSE;
-    } else
-#endif
-    {
-	KHDEBUG("Not using openType");
-        HB_HeuristicPosition(item);
-    }
-
-    item->attributes[0].clusterStart = TRUE;
-    return TRUE;
-}
-
-HB_Bool HB_KhmerShape(HB_ShaperItem *item)
-{
-    HB_Bool openType = FALSE;
-    unsigned short *logClusters = item->log_clusters;
-    int i;
-
-    HB_ShaperItem syllable = *item;
-    int first_glyph = 0;
-
-    int sstart = item->item.pos;
-    int end = sstart + item->item.length;
-
-    assert(item->item.script == HB_Script_Khmer);
-
-#ifndef NO_OPENTYPE
-    openType = HB_SelectScript(item, khmer_features);
-#endif
-
-    KHDEBUG("khmer_shape: from %d length %d", item->item.pos, item->item.length);
-    while (sstart < end) {
-        HB_Bool invalid;
-        int send = khmer_nextSyllableBoundary(item->string, sstart, end, &invalid);
-        KHDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
-               invalid ? "TRUE" : "FALSE");
-        syllable.item.pos = sstart;
-        syllable.item.length = send-sstart;
-        syllable.glyphs = item->glyphs + first_glyph;
-        syllable.attributes = item->attributes + first_glyph;
-        syllable.offsets = item->offsets + first_glyph;
-        syllable.advances = item->advances + first_glyph;
-        syllable.num_glyphs = item->num_glyphs - first_glyph;
-        if (!khmer_shape_syllable(openType, &syllable)) {
-            KHDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
-            item->num_glyphs += syllable.num_glyphs;
-            return FALSE;
-        }
-        /* fix logcluster array */
-        KHDEBUG("syllable:");
-        for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i)
-            KHDEBUG("        %d -> glyph %x", i, item->glyphs[i]);
-        KHDEBUG("    logclusters:");
-        for (i = sstart; i < send; ++i) {
-            KHDEBUG("        %d -> glyph %d", i, first_glyph);
-            logClusters[i-item->item.pos] = first_glyph;
-        }
-        sstart = send;
-        first_glyph += syllable.num_glyphs;
-    }
-    item->num_glyphs = first_glyph;
-    return TRUE;
-}
diff --git a/src/hb-old/harfbuzz-myanmar.c b/src/hb-old/harfbuzz-myanmar.c
deleted file mode 100644
index 51ec14b..0000000
--- a/src/hb-old/harfbuzz-myanmar.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-enum MymrCharClassValues
-{
-    Mymr_CC_RESERVED             =  0,
-    Mymr_CC_CONSONANT            =  1, /* Consonant of type 1, that has subscript form */
-    Mymr_CC_CONSONANT2           =  2, /* Consonant of type 2, that has no subscript form */
-    Mymr_CC_NGA	          =  3, /* Consonant NGA */
-    Mymr_CC_YA		          =  4, /* Consonant YA */
-    Mymr_CC_RA		          =  5, /* Consonant RA */
-    Mymr_CC_WA		          =  6, /* Consonant WA */
-    Mymr_CC_HA		          =  7, /* Consonant HA */
-    Mymr_CC_IND_VOWEL		  =  8, /* Independent vowel */
-    Mymr_CC_ZERO_WIDTH_NJ_MARK   =  9, /* Zero Width non joiner character (0x200C) */
-    Mymr_CC_VIRAMA               = 10, /* Subscript consonant combining character */
-    Mymr_CC_PRE_VOWEL   	  = 11, /* Dependent vowel, prebase (Vowel e) */
-    Mymr_CC_BELOW_VOWEL   	  = 12, /* Dependent vowel, prebase (Vowel u, uu) */
-    Mymr_CC_ABOVE_VOWEL   	  = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */
-    Mymr_CC_POST_VOWEL   	  = 14, /* Dependent vowel, prebase (Vowel aa) */
-    Mymr_CC_SIGN_ABOVE           = 15,
-    Mymr_CC_SIGN_BELOW           = 16,
-    Mymr_CC_SIGN_AFTER           = 17,
-    Mymr_CC_ZERO_WIDTH_J_MARK    = 18, /* Zero width joiner character */
-    Mymr_CC_COUNT                = 19  /* This is the number of character classes */
-};
-
-enum MymrCharClassFlags
-{
-    Mymr_CF_CLASS_MASK    = 0x0000FFFF,
-
-    Mymr_CF_CONSONANT     = 0x01000000,  /* flag to speed up comparing */
-    Mymr_CF_MEDIAL	   = 0x02000000,  /* flag to speed up comparing */
-    Mymr_CF_IND_VOWEL 	   = 0x04000000,  /* flag to speed up comparing */
-    Mymr_CF_DEP_VOWEL 	   = 0x08000000,  /* flag to speed up comparing */
-    Mymr_CF_DOTTED_CIRCLE = 0x10000000,  /* add a dotted circle if a character with this flag is the first in a syllable */
-    Mymr_CF_VIRAMA        = 0x20000000,  /* flag to speed up comparing */
-
-    /* position flags */
-    Mymr_CF_POS_BEFORE    = 0x00080000,
-    Mymr_CF_POS_BELOW     = 0x00040000,
-    Mymr_CF_POS_ABOVE     = 0x00020000,
-    Mymr_CF_POS_AFTER     = 0x00010000,
-    Mymr_CF_POS_MASK      = 0x000f0000,
-
-    Mymr_CF_AFTER_KINZI   = 0x00100000
-};
-
-/* Characters that get refrered to by name */
-enum MymrChar
-{
-    Mymr_C_SIGN_ZWNJ     = 0x200C,
-    Mymr_C_SIGN_ZWJ      = 0x200D,
-    Mymr_C_DOTTED_CIRCLE = 0x25CC,
-    Mymr_C_RA            = 0x101B,
-    Mymr_C_YA            = 0x101A,
-    Mymr_C_NGA           = 0x1004,
-    Mymr_C_VOWEL_E       = 0x1031,
-    Mymr_C_VIRAMA        = 0x1039
-};
-
-enum
-{
-    Mymr_xx = Mymr_CC_RESERVED,
-    Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW,
-    Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT,
-    Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE,
-    Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI,
-    Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE,
-    Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
-    Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW,
-    Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL,
-    Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE,
-    Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
-    Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
-    Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
-    Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI,
-    Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI,
-    Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI,
-    Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI
-};
-
-
-typedef int MymrCharClass;
-
-
-static const MymrCharClass mymrCharClasses[] =
-{
-    Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1,
-    Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */
-    Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1,
-    Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */
-    Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id,
-    Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */
-    Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb,
-    Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */
-    Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
-    Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */
-    Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx,
-    Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */
-};
-
-static MymrCharClass
-getMyanmarCharClass (HB_UChar16 ch)
-{
-    if (ch == Mymr_C_SIGN_ZWJ)
-        return Mymr_CC_ZERO_WIDTH_J_MARK;
-
-    if (ch == Mymr_C_SIGN_ZWNJ)
-        return Mymr_CC_ZERO_WIDTH_NJ_MARK;
-
-    if (ch < 0x1000 || ch > 0x105f)
-        return Mymr_CC_RESERVED;
-
-    return mymrCharClasses[ch - 0x1000];
-}
-
-static const signed char mymrStateTable[][Mymr_CC_COUNT] =
-{
-/*   xx  c1, c2  ng  ya  ra  wa  ha  id zwnj vi  dl  db  da  dr  sa  sb  sp zwj */
-    { 1,  4,  4,  2,  4,  4,  4,  4, 24,  1, 27, 17, 18, 19, 20, 21,  1,  1,  4}, /*  0 - ground state */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*  1 - exit state (or sp to the right of the syllable) */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  3, 17, 18, 19, 20, 21, -1, -1,  4}, /*  2 - NGA */
-    {-1,  4,  4,  4,  4,  4,  4,  4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /*  3 - Virama after NGA */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  5, 17, 18, 19, 20, 21,  1,  1, -1}, /*  4 - Base consonant */
-    {-2,  6, -2, -2,  7,  8,  9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /*  5 - First virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /*  6 - c1 after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /*  7 - ya after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /*  8 - ra after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /*  9 - wa after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */
-    {-1, -1, -1, -1,  7,  8,  9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */
-    {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */
-    {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21,  1,  1, -1}, /* 17 - dl, Dependent vowel e */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21,  1,  1, -1}, /* 18 - db, Dependent vowel u,uu */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1,  1,  1, -1}, /* 19 - da, Dependent vowel i,ii,ai */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1,  1,  1, -1}, /* 20 - dr, Dependent vowel aa */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1,  1, -1}, /* 21 - sa, Sign anusvara */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1,  1, -1}, /* 23 - zwnj for atha */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  1, -1}, /* 24 - Independent vowel */
-    {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */
-    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1,  1, -1}, /* 26 - ra/ya after subscript consonant + virama */
-    {-1,  6, -1, -1,  7,  8,  9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */
-/* exit state -2 is for invalid order of medials and combination of invalids
-   with virama where virama should treat as start of next syllable
- */
-};
-
-
-
-/*#define MYANMAR_DEBUG */
-#ifdef MYANMAR_DEBUG
-#define MMDEBUG qDebug
-#else
-#define MMDEBUG if(0) printf
-#endif
-
-/*
-//  Given an input string of characters and a location in which to start looking
-//  calculate, using the state table, which one is the last character of the syllable
-//  that starts in the starting position.
-*/
-static int myanmar_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
-    const HB_UChar16 *uc = s + start;
-    int state = 0;
-    int pos = start;
-    *invalid = FALSE;
-
-    while (pos < end) {
-        MymrCharClass charClass = getMyanmarCharClass(*uc);
-        state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK];
-        if (pos == start)
-            *invalid = (HB_Bool)(charClass & Mymr_CF_DOTTED_CIRCLE);
-
-        MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc);
-
-        if (state < 0) {
-            if (state < -1)
-                --pos;
-            break;
-        }
-        ++uc;
-        ++pos;
-    }
-    return pos;
-}
-
-#ifndef NO_OPENTYPE
-/* ###### might have to change order of above and below forms and substitutions,
-   but according to Unicode below comes before above */
-static const HB_OpenTypeFeature myanmar_features[] = {
-    { HB_MAKE_TAG('p', 'r', 'e', 'f'), PreFormProperty },
-    { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty },
-    { HB_MAKE_TAG('a', 'b', 'v', 'f'), AboveFormProperty },
-    { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty },
-    { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty },
-    { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
-    { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
-    { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty },
-    { HB_MAKE_TAG('r', 'l', 'i', 'g'), CligProperty }, /* Myanmar1 uses this instead of the other features */
-    { 0, 0 }
-};
-#endif
-
-
-/*
-// Visual order before shaping should be:
-//
-//    [Vowel Mark E]
-//    [Virama + Medial Ra]
-//    [Base]
-//    [Virama + Consonant]
-//    [Nga + Virama] (Kinzi) ### should probably come before post forms (medial ya)
-//    [Vowels]
-//    [Marks]
-//
-// This means that we can keep the logical order apart from having to
-// move the pre vowel, medial ra and kinzi
-*/
-
-static HB_Bool myanmar_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid)
-{
-    /*
-//    MMDEBUG("\nsyllable from %d len %d, str='%s'", item->item.pos, item->item.length,
-//	    item->string->mid(item->from, item->length).toUtf8().data());
-    */
-
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = item->num_glyphs;
-#endif
-    const HB_UChar16 *uc = item->string + item->item.pos;
-    int vowel_e = -1;
-    int kinzi = -1;
-    int medial_ra = -1;
-    int base = -1;
-    int i;
-    int len = 0;
-    unsigned short reordered[32];
-    unsigned char properties[32];
-    enum {
-	AboveForm = 0x01,
-	PreForm = 0x02,
-	PostForm = 0x04,
-	BelowForm = 0x08
-    };
-    HB_Bool lastWasVirama = FALSE;
-    int basePos = -1;
-
-    memset(properties, 0, 32*sizeof(unsigned char));
-
-    /* according to the table the max length of a syllable should be around 14 chars */
-    assert(item->item.length < 32);
-
-#ifdef MYANMAR_DEBUG
-    printf("original:");
-    for (i = 0; i < (int)item->item.length; i++) {
-        printf("    %d: %4x", i, uc[i]);
-    }
-#endif
-    for (i = 0; i < (int)item->item.length; ++i) {
-        HB_UChar16 chr = uc[i];
-
-        if (chr == Mymr_C_VOWEL_E) {
-            vowel_e = i;
-            continue;
-        }
-        if (i == 0
-            && chr == Mymr_C_NGA
-            && i + 2 < (int)item->item.length
-            && uc[i+1] == Mymr_C_VIRAMA) {
-            int mc = getMyanmarCharClass(uc[i+2]);
-            /*MMDEBUG("maybe kinzi: mc=%x", mc);*/
-            if ((mc & Mymr_CF_CONSONANT) == Mymr_CF_CONSONANT) {
-                kinzi = i;
-                continue;
-            }
-        }
-        if (base >= 0
-            && chr == Mymr_C_VIRAMA
-            && i + 1 < (int)item->item.length
-            && uc[i+1] == Mymr_C_RA) {
-            medial_ra = i;
-            continue;
-        }
-        if (base < 0)
-            base = i;
-    }
-
-    MMDEBUG("\n  base=%d, vowel_e=%d, kinzi=%d, medial_ra=%d", base, vowel_e, kinzi, medial_ra);
-    /* write vowel_e if found */
-    if (vowel_e >= 0) {
-        reordered[0] = Mymr_C_VOWEL_E;
-        len = 1;
-    }
-    /* write medial_ra */
-    if (medial_ra >= 0) {
-        reordered[len] = Mymr_C_VIRAMA;
-        reordered[len+1] = Mymr_C_RA;
-        properties[len] = PreForm;
-        properties[len+1] = PreForm;
-        len += 2;
-    }
-
-    /* shall we add a dotted circle?
-       If in the position in which the base should be (first char in the string) there is
-       a character that has the Dotted circle flag (a character that cannot be a base)
-       then write a dotted circle */
-    if (invalid) {
-        reordered[len] = C_DOTTED_CIRCLE;
-        ++len;
-    }
-
-    /* copy the rest of the syllable to the output, inserting the kinzi
-       at the correct place */
-    for (i = 0; i < (int)item->item.length; ++i) {
-        hb_uint16 chr = uc[i];
-        MymrCharClass cc;
-        if (i == vowel_e)
-            continue;
-        if (i == medial_ra || i == kinzi) {
-            ++i;
-            continue;
-        }
-
-        cc = getMyanmarCharClass(uc[i]);
-        if (kinzi >= 0 && i > base && (cc & Mymr_CF_AFTER_KINZI)) {
-            reordered[len] = Mymr_C_NGA;
-            reordered[len+1] = Mymr_C_VIRAMA;
-	    if (len > 0)
-	      properties[len-1] = AboveForm;
-            properties[len] = AboveForm;
-            len += 2;
-            kinzi = -1;
-        }
-
-        if (lastWasVirama) {
-            int prop = 0;
-            switch(cc & Mymr_CF_POS_MASK) {
-            case Mymr_CF_POS_BEFORE:
-                prop = PreForm;
-                break;
-            case Mymr_CF_POS_BELOW:
-                prop = BelowForm;
-                break;
-            case Mymr_CF_POS_ABOVE:
-                prop = AboveForm;
-                break;
-            case Mymr_CF_POS_AFTER:
-                prop = PostForm;
-                break;
-            default:
-                break;
-            }
-            properties[len-1] = prop;
-            properties[len] = prop;
-            if(basePos >= 0 && basePos == len-2)
-                properties[len-2] = prop;
-        }
-        lastWasVirama = (chr == Mymr_C_VIRAMA);
-        if(i == base)
-            basePos = len;
-
-        if ((chr != Mymr_C_SIGN_ZWNJ && chr != Mymr_C_SIGN_ZWJ) || !len) {
-            reordered[len] = chr;
-            ++len;
-        }
-    }
-    if (kinzi >= 0) {
-        reordered[len] = Mymr_C_NGA;
-        reordered[len+1] = Mymr_C_VIRAMA;
-        properties[len] = AboveForm;
-        properties[len+1] = AboveForm;
-        len += 2;
-    }
-
-    if (!item->font->klass->convertStringToGlyphIndices(item->font,
-                                                        reordered, len,
-                                                        item->glyphs, &item->num_glyphs,
-                                                        item->item.bidiLevel % 2))
-        return FALSE;
-
-    MMDEBUG("after shaping: len=%d", len);
-    for (i = 0; i < len; i++) {
-	item->attributes[i].mark = FALSE;
-	item->attributes[i].clusterStart = FALSE;
-	item->attributes[i].justification = 0;
-	item->attributes[i].zeroWidth = FALSE;
-	MMDEBUG("    %d: %4x property=%x", i, reordered[i], properties[i]);
-    }
-
-    /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
-    if (openType) {
- 	hb_uint32 where[32];
-
-        for (i = 0; i < len; ++i) {
-            where[i] = ~(PreSubstProperty
-                         | BelowSubstProperty
-                         | AboveSubstProperty
-                         | PostSubstProperty
-                         | CligProperty
-                         | PositioningProperties);
-            if (properties[i] & PreForm)
-                where[i] &= ~PreFormProperty;
-            if (properties[i] & BelowForm)
-                where[i] &= ~BelowFormProperty;
-            if (properties[i] & AboveForm)
-                where[i] &= ~AboveFormProperty;
-            if (properties[i] & PostForm)
-                where[i] &= ~PostFormProperty;
-        }
-
-        HB_OpenTypeShape(item, where);
-        if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
-            return FALSE;
-    } else
-#endif
-    {
-	MMDEBUG("Not using openType");
-        HB_HeuristicPosition(item);
-    }
-
-    item->attributes[0].clusterStart = TRUE;
-    return TRUE;
-}
-
-HB_Bool HB_MyanmarShape(HB_ShaperItem *item)
-{
-    HB_Bool openType = FALSE;
-    unsigned short *logClusters = item->log_clusters;
-
-    HB_ShaperItem syllable = *item;
-    int first_glyph = 0;
-
-    int sstart = item->item.pos;
-    int end = sstart + item->item.length;
-    int i = 0;
-
-    assert(item->item.script == HB_Script_Myanmar);
-#ifndef NO_OPENTYPE
-    openType = HB_SelectScript(item, myanmar_features);
-#endif
-
-    MMDEBUG("myanmar_shape: from %d length %d", item->item.pos, item->item.length);
-    while (sstart < end) {
-        HB_Bool invalid;
-        int send = myanmar_nextSyllableBoundary(item->string, sstart, end, &invalid);
-        MMDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
-               invalid ? "TRUE" : "FALSE");
-        syllable.item.pos = sstart;
-        syllable.item.length = send-sstart;
-        syllable.glyphs = item->glyphs + first_glyph;
-        syllable.attributes = item->attributes + first_glyph;
-        syllable.advances = item->advances + first_glyph;
-        syllable.offsets = item->offsets + first_glyph;
-        syllable.num_glyphs = item->num_glyphs - first_glyph;
-        if (!myanmar_shape_syllable(openType, &syllable, invalid)) {
-            MMDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs);
-            item->num_glyphs += syllable.num_glyphs;
-            return FALSE;
-        }
-
-        /* fix logcluster array */
-        MMDEBUG("syllable:");
-        for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i)
-            MMDEBUG("        %d -> glyph %x", i, item->glyphs[i]);
-        MMDEBUG("    logclusters:");
-        for (i = sstart; i < send; ++i) {
-            MMDEBUG("        %d -> glyph %d", i, first_glyph);
-            logClusters[i-item->item.pos] = first_glyph;
-        }
-        sstart = send;
-        first_glyph += syllable.num_glyphs;
-    }
-    item->num_glyphs = first_glyph;
-    return TRUE;
-}
diff --git a/src/hb-old/harfbuzz-open-private.h b/src/hb-old/harfbuzz-open-private.h
deleted file mode 100644
index f1ca278..0000000
--- a/src/hb-old/harfbuzz-open-private.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_OPEN_PRIVATE_H
-#define HARFBUZZ_OPEN_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-open.h"
-#include "harfbuzz-gsub-private.h"
-#include "harfbuzz-gpos-private.h"
-
-HB_BEGIN_HEADER
-
-
-struct  HB_SubTable_
-{
-  union
-  {
-    HB_GSUB_SubTable  gsub;
-    HB_GPOS_SubTable  gpos;
-  } st;
-};
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ScriptList( HB_ScriptList* sl,
-			   HB_Stream     input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_FeatureList( HB_FeatureList* fl,
-			    HB_Stream         input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_LookupList( HB_LookupList*  ll,
-			   HB_Stream        input,
-			   HB_Type         type );
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Coverage( HB_Coverage* c,
-			 HB_Stream      input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
-				HB_UShort             limit,
-				HB_Stream             input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd,
-					       HB_UShort             limit,
-					       HB_UInt              class_offset,
-					       HB_UInt              base_offset,
-					       HB_Stream             input );
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Device( HB_Device** d,
-		       HB_Stream    input );
-
-HB_INTERNAL void  _HB_OPEN_Free_ScriptList( HB_ScriptList*  sl );
-HB_INTERNAL void  _HB_OPEN_Free_FeatureList( HB_FeatureList*  fl );
-HB_INTERNAL void  _HB_OPEN_Free_LookupList( HB_LookupList*  ll,
-		       HB_Type         type );
-
-HB_INTERNAL void  _HB_OPEN_Free_Coverage( HB_Coverage*  c );
-HB_INTERNAL void  _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition*  cd );
-HB_INTERNAL void  _HB_OPEN_Free_Device( HB_Device*  d );
-
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Coverage_Index( HB_Coverage* c,
-			  HB_UShort      glyphID,
-			  HB_UShort*     index );
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Class( HB_ClassDefinition* cd,
-		     HB_UShort             glyphID,
-		    HB_UShort*          klass,
-		     HB_UShort*            index );
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Device( HB_Device* d,
-		      HB_UShort    size,
-		      HB_Short*    value );
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_OPEN_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-open.c b/src/hb-old/harfbuzz-open.c
deleted file mode 100644
index f12f5b7..0000000
--- a/src/hb-old/harfbuzz-open.c
+++ /dev/null
@@ -1,1433 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-open-private.h"
-
-
-/***************************
- * Script related functions
- ***************************/
-
-
-/* LangSys */
-
-static HB_Error  Load_LangSys( HB_LangSys*  ls,
-			       HB_Stream     stream )
-{
-  HB_Error   error;
-  HB_UShort  n, count;
-  HB_UShort* fi;
-
-
-  if ( ACCESS_Frame( 6L ) )
-    return error;
-
-  ls->LookupOrderOffset    = GET_UShort();    /* should be 0 */
-  ls->ReqFeatureIndex      = GET_UShort();
-  count = ls->FeatureCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ls->FeatureIndex = NULL;
-
-  if ( ALLOC_ARRAY( ls->FeatureIndex, count, HB_UShort ) )
-    return error;
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( ls->FeatureIndex );
-    return error;
-  }
-
-  fi = ls->FeatureIndex;
-
-  for ( n = 0; n < count; n++ )
-    fi[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_LangSys( HB_LangSys*  ls )
-{
-  FREE( ls->FeatureIndex );
-}
-
-
-/* Script */
-
-static HB_Error  Load_Script( HB_ScriptTable*  s,
-			      HB_Stream    stream )
-{
-  HB_Error   error;
-  HB_UShort  n, m, count;
-  HB_UInt   cur_offset, new_offset, base_offset;
-
-  HB_LangSysRecord*  lsr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  new_offset = GET_UShort() + base_offset;
-
-  FORGET_Frame();
-
-  if ( new_offset != base_offset )        /* not a NULL offset */
-  {
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LangSys( &s->DefaultLangSys,
-				 stream ) ) != HB_Err_Ok )
-      return error;
-    (void)FILE_Seek( cur_offset );
-  }
-  else
-  {
-    /* we create a DefaultLangSys table with no entries */
-
-    s->DefaultLangSys.LookupOrderOffset = 0;
-    s->DefaultLangSys.ReqFeatureIndex   = 0xFFFF;
-    s->DefaultLangSys.FeatureCount      = 0;
-    s->DefaultLangSys.FeatureIndex      = NULL;
-  }
-
-  if ( ACCESS_Frame( 2L ) )
-    goto Fail2;
-
-  count = s->LangSysCount = GET_UShort();
-
-  /* safety check; otherwise the official handling of TrueType Open
-     fonts won't work */
-
-  if ( s->LangSysCount == 0 && s->DefaultLangSys.FeatureCount == 0 )
-  {
-    error = HB_Err_Not_Covered;
-    goto Fail2;
-  }
-
-  FORGET_Frame();
-
-  s->LangSysRecord = NULL;
-
-  if ( ALLOC_ARRAY( s->LangSysRecord, count, HB_LangSysRecord ) )
-    goto Fail2;
-
-  lsr = s->LangSysRecord;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 6L ) )
-      goto Fail1;
-
-    lsr[n].LangSysTag = GET_ULong();
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_LangSys( &lsr[m].LangSys );
-
-  FREE( s->LangSysRecord );
-
-Fail2:
-  Free_LangSys( &s->DefaultLangSys );
-  return error;
-}
-
-
-static void  Free_Script( HB_ScriptTable*  s )
-{
-  HB_UShort           n, count;
-
-  HB_LangSysRecord*  lsr;
-
-
-  Free_LangSys( &s->DefaultLangSys );
-
-  if ( s->LangSysRecord )
-  {
-    count = s->LangSysCount;
-    lsr   = s->LangSysRecord;
-
-    for ( n = 0; n < count; n++ )
-      Free_LangSys( &lsr[n].LangSys );
-
-    FREE( lsr );
-  }
-}
-
-
-/* ScriptList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ScriptList( HB_ScriptList* sl,
-			   HB_Stream        stream )
-{
-  HB_Error   error;
-
-  HB_UShort          n, script_count;
-  HB_UInt           cur_offset, new_offset, base_offset;
-
-  HB_ScriptRecord*  sr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  script_count = GET_UShort();
-
-  FORGET_Frame();
-
-  sl->ScriptRecord = NULL;
-
-  if ( ALLOC_ARRAY( sl->ScriptRecord, script_count, HB_ScriptRecord ) )
-    return error;
-
-  sr = sl->ScriptRecord;
-
-  sl->ScriptCount= 0;
-  for ( n = 0; n < script_count; n++ )
-  {
-    if ( ACCESS_Frame( 6L ) )
-      goto Fail;
-
-    sr[sl->ScriptCount].ScriptTag = GET_ULong();
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-
-    if ( FILE_Seek( new_offset ) )
-      goto Fail;
-
-    error = Load_Script( &sr[sl->ScriptCount].Script, stream );
-    if ( error == HB_Err_Ok )
-      sl->ScriptCount += 1;
-    else if ( error != HB_Err_Not_Covered )
-      goto Fail;
-
-    (void)FILE_Seek( cur_offset );
-  }
-
-  /* Empty tables are harmless and generated by fontforge.
-   * See http://bugzilla.gnome.org/show_bug.cgi?id=347073
-   */
-#if 0
-  if ( sl->ScriptCount == 0 )
-  {
-    error = ERR(HB_Err_Invalid_SubTable);
-    goto Fail;
-  }
-#endif
-  
-  return HB_Err_Ok;
-
-Fail:
-  for ( n = 0; n < sl->ScriptCount; n++ )
-    Free_Script( &sr[n].Script );
-
-  FREE( sl->ScriptRecord );
-  return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_ScriptList( HB_ScriptList* sl )
-{
-  HB_UShort          n, count;
-
-  HB_ScriptRecord*  sr;
-
-
-  if ( sl->ScriptRecord )
-  {
-    count = sl->ScriptCount;
-    sr    = sl->ScriptRecord;
-
-    for ( n = 0; n < count; n++ )
-      Free_Script( &sr[n].Script );
-
-    FREE( sr );
-  }
-}
-
-
-
-/*********************************
- * Feature List related functions
- *********************************/
-
-
-/* Feature */
-
-static HB_Error  Load_Feature( HB_Feature*  f,
-			       HB_Stream     stream )
-{
-  HB_Error   error;
-
-  HB_UShort   n, count;
-
-  HB_UShort*  lli;
-
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  f->FeatureParams           = GET_UShort();    /* should be 0 */
-  count = f->LookupListCount = GET_UShort();
-
-  FORGET_Frame();
-
-  f->LookupListIndex = NULL;
-
-  if ( ALLOC_ARRAY( f->LookupListIndex, count, HB_UShort ) )
-    return error;
-
-  lli = f->LookupListIndex;
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( f->LookupListIndex );
-    return error;
-  }
-
-  for ( n = 0; n < count; n++ )
-    lli[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_Feature( HB_Feature*  f )
-{
-  FREE( f->LookupListIndex );
-}
-
-
-/* FeatureList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_FeatureList( HB_FeatureList* fl,
-			    HB_Stream         stream )
-{
-  HB_Error   error;
-
-  HB_UShort           n, m, count;
-  HB_UInt            cur_offset, new_offset, base_offset;
-
-  HB_FeatureRecord*  fr;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = fl->FeatureCount = GET_UShort();
-
-  FORGET_Frame();
-
-  fl->FeatureRecord = NULL;
-
-  if ( ALLOC_ARRAY( fl->FeatureRecord, count, HB_FeatureRecord ) )
-    return error;
-  if ( ALLOC_ARRAY( fl->ApplyOrder, count, HB_UShort ) )
-    goto Fail2;
-  
-  fl->ApplyCount = 0;
-
-  fr = fl->FeatureRecord;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 6L ) )
-      goto Fail1;
-
-    fr[n].FeatureTag = GET_ULong();
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_Feature( &fr[n].Feature, stream ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  for ( m = 0; m < n; m++ )
-    Free_Feature( &fr[m].Feature );
-
-  FREE( fl->ApplyOrder );
-
-Fail2:
-  FREE( fl->FeatureRecord );
-
-  return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_FeatureList( HB_FeatureList*  fl )
-{
-  HB_UShort           n, count;
-
-  HB_FeatureRecord*  fr;
-
-
-  if ( fl->FeatureRecord )
-  {
-    count = fl->FeatureCount;
-    fr    = fl->FeatureRecord;
-
-    for ( n = 0; n < count; n++ )
-      Free_Feature( &fr[n].Feature );
-
-    FREE( fr );
-  }
-  
-  FREE( fl->ApplyOrder );
-}
-
-
-
-/********************************
- * Lookup List related functions
- ********************************/
-
-/* the subroutines of the following two functions are defined in
-   ftxgsub.c and ftxgpos.c respectively                          */
-
-
-/* SubTable */
-
-static HB_Error  Load_SubTable( HB_SubTable*  st,
-				HB_Stream     stream,
-				HB_Type       table_type,
-				HB_UShort     lookup_type )
-{
-  if ( table_type == HB_Type_GSUB )
-    return _HB_GSUB_Load_SubTable ( &st->st.gsub, stream, lookup_type );
-  else
-    return _HB_GPOS_Load_SubTable ( &st->st.gpos, stream, lookup_type );
-}
-
-
-static void  Free_SubTable( HB_SubTable*  st,
-			    HB_Type       table_type,
-			    HB_UShort      lookup_type )
-{
-  if ( table_type == HB_Type_GSUB )
-    _HB_GSUB_Free_SubTable ( &st->st.gsub, lookup_type );
-  else
-    _HB_GPOS_Free_SubTable ( &st->st.gpos, lookup_type );
-}
-
-
-/* Lookup */
-
-static HB_Error  Load_Lookup( HB_Lookup*   l,
-			      HB_Stream     stream,
-			      HB_Type      type )
-{
-  HB_Error   error;
-
-  HB_UShort      n, m, count;
-  HB_UInt       cur_offset, new_offset, base_offset;
-
-  HB_SubTable*  st;
-
-  HB_Bool        is_extension = FALSE;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 6L ) )
-    return error;
-
-  l->LookupType            = GET_UShort();
-  l->LookupFlag            = GET_UShort();
-  count = l->SubTableCount = GET_UShort();
-
-  FORGET_Frame();
-
-  l->SubTable = NULL;
-
-  if ( ALLOC_ARRAY( l->SubTable, count, HB_SubTable ) )
-    return error;
-
-  st = l->SubTable;
-
-  if ( ( type == HB_Type_GSUB && l->LookupType == HB_GSUB_LOOKUP_EXTENSION ) ||
-       ( type == HB_Type_GPOS && l->LookupType == HB_GPOS_LOOKUP_EXTENSION ) )
-    is_extension = TRUE;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-
-    if ( is_extension )
-    {
-      if ( FILE_Seek( new_offset ) || ACCESS_Frame( 8L ) )
-	goto Fail;
-
-      if (GET_UShort() != 1) /* format should be 1 */
-	goto Fail;
-
-      l->LookupType = GET_UShort();
-      new_offset += GET_ULong();
-
-      FORGET_Frame();
-    }
-
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_SubTable( &st[n], stream,
-				  type, l->LookupType ) ) != HB_Err_Ok )
-      goto Fail;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail:
-  for ( m = 0; m < n; m++ )
-    Free_SubTable( &st[m], type, l->LookupType );
-
-  FREE( l->SubTable );
-  return error;
-}
-
-
-static void  Free_Lookup( HB_Lookup*   l,
-			  HB_Type      type)
-{
-  HB_UShort      n, count;
-
-  HB_SubTable*  st;
-
-
-  if ( l->SubTable )
-  {
-    count = l->SubTableCount;
-    st    = l->SubTable;
-
-    for ( n = 0; n < count; n++ )
-      Free_SubTable( &st[n], type, l->LookupType );
-
-    FREE( st );
-  }
-}
-
-
-/* LookupList */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_LookupList( HB_LookupList* ll,
-			   HB_Stream        stream,
-			   HB_Type         type )
-{
-  HB_Error   error;
-
-  HB_UShort    n, m, count;
-  HB_UInt     cur_offset, new_offset, base_offset;
-
-  HB_Lookup*  l;
-
-
-  base_offset = FILE_Pos();
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = ll->LookupCount = GET_UShort();
-
-  FORGET_Frame();
-
-  ll->Lookup = NULL;
-
-  if ( ALLOC_ARRAY( ll->Lookup, count, HB_Lookup ) )
-    return error;
-  if ( ALLOC_ARRAY( ll->Properties, count, HB_UInt ) )
-    goto Fail2;
-
-  l = ll->Lookup;
-
-  for ( n = 0; n < count; n++ )
-  {
-    if ( ACCESS_Frame( 2L ) )
-      goto Fail1;
-
-    new_offset = GET_UShort() + base_offset;
-
-    FORGET_Frame();
-
-    cur_offset = FILE_Pos();
-    if ( FILE_Seek( new_offset ) ||
-	 ( error = Load_Lookup( &l[n], stream, type ) ) != HB_Err_Ok )
-      goto Fail1;
-    (void)FILE_Seek( cur_offset );
-  }
-
-  return HB_Err_Ok;
-
-Fail1:
-  FREE( ll->Properties );
-
-  for ( m = 0; m < n; m++ )
-    Free_Lookup( &l[m], type );
-
-Fail2:
-  FREE( ll->Lookup );
-  return error;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_LookupList( HB_LookupList* ll,
-		       HB_Type         type )
-{
-  HB_UShort    n, count;
-
-  HB_Lookup*  l;
-
-
-  FREE( ll->Properties );
-
-  if ( ll->Lookup )
-  {
-    count = ll->LookupCount;
-    l     = ll->Lookup;
-
-    for ( n = 0; n < count; n++ )
-      Free_Lookup( &l[n], type );
-
-    FREE( l );
-  }
-}
-
-
-
-/*****************************
- * Coverage related functions
- *****************************/
-
-
-/* CoverageFormat1 */
-
-static HB_Error  Load_Coverage1( HB_CoverageFormat1*  cf1,
-				 HB_Stream             stream )
-{
-  HB_Error   error;
-
-  HB_UShort  n, count;
-
-  HB_UShort* ga;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = cf1->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cf1->GlyphArray = NULL;
-
-  if ( ALLOC_ARRAY( cf1->GlyphArray, count, HB_UShort ) )
-    return error;
-
-  ga = cf1->GlyphArray;
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( cf1->GlyphArray );
-    return error;
-  }
-
-  for ( n = 0; n < count; n++ )
-    ga[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-static void  Free_Coverage1( HB_CoverageFormat1*  cf1)
-{
-  FREE( cf1->GlyphArray );
-}
-
-
-/* CoverageFormat2 */
-
-static HB_Error  Load_Coverage2( HB_CoverageFormat2*  cf2,
-				 HB_Stream             stream )
-{
-  HB_Error   error;
-
-  HB_UShort         n, count;
-
-  HB_RangeRecord*  rr;
-
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = cf2->RangeCount = GET_UShort();
-
-  FORGET_Frame();
-
-  cf2->RangeRecord = NULL;
-
-  if ( ALLOC_ARRAY( cf2->RangeRecord, count, HB_RangeRecord ) )
-    return error;
-
-  rr = cf2->RangeRecord;
-
-  if ( ACCESS_Frame( count * 6L ) )
-    goto Fail;
-
-  for ( n = 0; n < count; n++ )
-  {
-    rr[n].Start              = GET_UShort();
-    rr[n].End                = GET_UShort();
-    rr[n].StartCoverageIndex = GET_UShort();
-
-    /* sanity check; we are limited to 16bit integers */
-    if ( rr[n].Start > rr[n].End ||
-	 ( rr[n].End - rr[n].Start + (long)rr[n].StartCoverageIndex ) >=
-	   0x10000L )
-    {
-      error = ERR(HB_Err_Invalid_SubTable);
-      goto Fail;
-    }
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail:
-  FREE( cf2->RangeRecord );
-  return error;
-}
-
-
-static void  Free_Coverage2( HB_CoverageFormat2*  cf2 )
-{
-  FREE( cf2->RangeRecord );
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Coverage( HB_Coverage* c,
-			 HB_Stream      stream )
-{
-  HB_Error   error;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  c->CoverageFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( c->CoverageFormat )
-  {
-  case 1:  return Load_Coverage1( &c->cf.cf1, stream );
-  case 2:  return Load_Coverage2( &c->cf.cf2, stream );
-  default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_Coverage( HB_Coverage* c )
-{
-  switch ( c->CoverageFormat )
-  {
-  case 1:  Free_Coverage1( &c->cf.cf1 ); break;
-  case 2:  Free_Coverage2( &c->cf.cf2 ); break;
-  default:					 break;
-  }
-}
-
-
-static HB_Error  Coverage_Index1( HB_CoverageFormat1*  cf1,
-				  HB_UShort             glyphID,
-				  HB_UShort*            index )
-{
-  HB_UShort min, max, new_min, new_max, middle;
-
-  HB_UShort*  array = cf1->GlyphArray;
-
-
-  /* binary search */
-
-  if ( cf1->GlyphCount == 0 )
-    return HB_Err_Not_Covered;
-
-  new_min = 0;
-  new_max = cf1->GlyphCount - 1;
-
-  do
-  {
-    min = new_min;
-    max = new_max;
-
-    /* we use (min + max) / 2 = max - (max - min) / 2  to avoid
-       overflow and rounding errors                             */
-
-    middle = max - ( ( max - min ) >> 1 );
-
-    if ( glyphID == array[middle] )
-    {
-      *index = middle;
-      return HB_Err_Ok;
-    }
-    else if ( glyphID < array[middle] )
-    {
-      if ( middle == min )
-	break;
-      new_max = middle - 1;
-    }
-    else
-    {
-      if ( middle == max )
-	break;
-      new_min = middle + 1;
-    }
-  } while ( min < max );
-
-  return HB_Err_Not_Covered;
-}
-
-
-static HB_Error  Coverage_Index2( HB_CoverageFormat2*  cf2,
-				  HB_UShort             glyphID,
-				  HB_UShort*            index )
-{
-  HB_UShort         min, max, new_min, new_max, middle;
-
-  HB_RangeRecord*  rr = cf2->RangeRecord;
-
-
-  /* binary search */
-
-  if ( cf2->RangeCount == 0 )
-    return HB_Err_Not_Covered;
-
-  new_min = 0;
-  new_max = cf2->RangeCount - 1;
-
-  do
-  {
-    min = new_min;
-    max = new_max;
-
-    /* we use (min + max) / 2 = max - (max - min) / 2  to avoid
-       overflow and rounding errors                             */
-
-    middle = max - ( ( max - min ) >> 1 );
-
-    if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End )
-    {
-      *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start;
-      return HB_Err_Ok;
-    }
-    else if ( glyphID < rr[middle].Start )
-    {
-      if ( middle == min )
-	break;
-      new_max = middle - 1;
-    }
-    else
-    {
-      if ( middle == max )
-	break;
-      new_min = middle + 1;
-    }
-  } while ( min < max );
-
-  return HB_Err_Not_Covered;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Coverage_Index( HB_Coverage* c,
-			  HB_UShort      glyphID,
-			  HB_UShort*     index )
-{
-  switch ( c->CoverageFormat )
-  {
-  case 1:  return Coverage_Index1( &c->cf.cf1, glyphID, index );
-  case 2:  return Coverage_Index2( &c->cf.cf2, glyphID, index );
-  default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-
-/*************************************
- * Class Definition related functions
- *************************************/
-
-
-/* ClassDefFormat1 */
-
-static HB_Error  Load_ClassDef1( HB_ClassDefinition*  cd,
-				 HB_UShort             limit,
-				 HB_Stream             stream )
-{
-  HB_Error   error;
-
-  HB_UShort             n, count;
-
-  HB_UShort*            cva;
-
-  HB_ClassDefFormat1*  cdf1;
-
-
-  cdf1 = &cd->cd.cd1;
-
-  if ( ACCESS_Frame( 4L ) )
-    return error;
-
-  cdf1->StartGlyph         = GET_UShort();
-  count = cdf1->GlyphCount = GET_UShort();
-
-  FORGET_Frame();
-
-  /* sanity check; we are limited to 16bit integers */
-
-  if ( cdf1->StartGlyph + (long)count >= 0x10000L )
-    return ERR(HB_Err_Invalid_SubTable);
-
-  cdf1->ClassValueArray = NULL;
-
-  if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, HB_UShort ) )
-    return error;
-
-  cva = cdf1->ClassValueArray;
-
-  if ( ACCESS_Frame( count * 2L ) )
-    goto Fail;
-
-  for ( n = 0; n < count; n++ )
-  {
-    cva[n] = GET_UShort();
-    if ( cva[n] >= limit )
-    {
-      error = ERR(HB_Err_Invalid_SubTable);
-      goto Fail;
-    }
-  }
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-
-Fail:
-  FREE( cva );
-
-  return error;
-}
-
-
-static void  Free_ClassDef1( HB_ClassDefFormat1*  cdf1 )
-{
-  FREE( cdf1->ClassValueArray );
-}
-
-
-/* ClassDefFormat2 */
-
-static HB_Error  Load_ClassDef2( HB_ClassDefinition*  cd,
-				 HB_UShort             limit,
-				 HB_Stream             stream )
-{
-  HB_Error   error;
-
-  HB_UShort              n, count;
-
-  HB_ClassRangeRecord*  crr;
-
-  HB_ClassDefFormat2*   cdf2;
-
-
-  cdf2 = &cd->cd.cd2;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  count = GET_UShort();
-  cdf2->ClassRangeCount = 0; /* zero for now.  we fill with the number of good entries later */
-
-  FORGET_Frame();
-
-  cdf2->ClassRangeRecord = NULL;
-
-  if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, HB_ClassRangeRecord ) )
-    return error;
-
-  crr = cdf2->ClassRangeRecord;
-
-  if ( ACCESS_Frame( count * 6L ) )
-    goto Fail;
-
-  for ( n = 0; n < count; n++ )
-  {
-    crr[n].Start = GET_UShort();
-    crr[n].End   = GET_UShort();
-    crr[n].Class = GET_UShort();
-
-    /* sanity check */
-
-    if ( crr[n].Start > crr[n].End ||
-	 crr[n].Class >= limit )
-    {
-      /* XXX
-       * Corrupt entry.  Skip it.
-       * This is hit by Nafees Nastaliq font for example
-       */
-       n--;
-       count--;
-    }
-  }
-
-  FORGET_Frame();
-
-  cdf2->ClassRangeCount = count;
-
-  return HB_Err_Ok;
-
-Fail:
-  FREE( crr );
-
-  return error;
-}
-
-
-static void  Free_ClassDef2( HB_ClassDefFormat2*  cdf2 )
-{
-  FREE( cdf2->ClassRangeRecord );
-}
-
-
-/* ClassDefinition */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
-				HB_UShort             limit,
-				HB_Stream             stream )
-{
-  HB_Error   error;
-
-  if ( ACCESS_Frame( 2L ) )
-    return error;
-
-  cd->ClassFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  switch ( cd->ClassFormat )
-  {
-  case 1:  error = Load_ClassDef1( cd, limit, stream ); break;
-  case 2:  error = Load_ClassDef2( cd, limit, stream ); break;
-  default: error = ERR(HB_Err_Invalid_SubTable_Format);	break;
-  }
-
-  if ( error )
-    return error;
-
-  cd->loaded = TRUE;
-
-  return HB_Err_Ok;
-}
-
-
-static HB_Error
-_HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition*  cd )
-{
-  HB_Error   error;
-
-  cd->ClassFormat = 1; /* Meaningless */
-
-  if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, HB_UShort ) )
-    return error;
-
-  cd->loaded = TRUE;
-
-  return HB_Err_Ok;
-}
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd,
-					       HB_UShort             limit,
-					       HB_UInt              class_offset,
-					       HB_UInt              base_offset,
-					       HB_Stream             stream )
-{
-  HB_Error error;
-  HB_UInt               cur_offset;
-
-  cur_offset = FILE_Pos();
-
-  if ( class_offset )
-    {
-      if ( !FILE_Seek( class_offset + base_offset ) )
-	error = _HB_OPEN_Load_ClassDefinition( cd, limit, stream );
-    }
-  else
-     error = _HB_OPEN_Load_EmptyClassDefinition ( cd );
-
-  if (error == HB_Err_Ok)
-    (void)FILE_Seek( cur_offset ); /* Changes error as a side-effect */
-
-  return error;
-}
-
-HB_INTERNAL void
-_HB_OPEN_Free_ClassDefinition( HB_ClassDefinition*  cd )
-{
-  if ( !cd->loaded )
-    return;
-
-  switch ( cd->ClassFormat )
-  {
-  case 1:  Free_ClassDef1( &cd->cd.cd1 ); break;
-  case 2:  Free_ClassDef2( &cd->cd.cd2 ); break;
-  default:				  break;
-  }
-}
-
-
-static HB_Error  Get_Class1( HB_ClassDefFormat1*  cdf1,
-			     HB_UShort             glyphID,
-			     HB_UShort*            klass,
-			     HB_UShort*            index )
-{
-  HB_UShort*  cva = cdf1->ClassValueArray;
-
-
-  if ( index )
-    *index = 0;
-
-  if ( glyphID >= cdf1->StartGlyph &&
-       glyphID < cdf1->StartGlyph + cdf1->GlyphCount )
-  {
-    *klass = cva[glyphID - cdf1->StartGlyph];
-    return HB_Err_Ok;
-  }
-  else
-  {
-    *klass = 0;
-    return HB_Err_Not_Covered;
-  }
-}
-
-
-/* we need the index value of the last searched class range record
-   in case of failure for constructed GDEF tables                  */
-
-static HB_Error  Get_Class2( HB_ClassDefFormat2*  cdf2,
-			     HB_UShort             glyphID,
-			     HB_UShort*            klass,
-			     HB_UShort*            index )
-{
-  HB_Error               error = HB_Err_Ok;
-  HB_UShort              min, max, new_min, new_max, middle;
-
-  HB_ClassRangeRecord*  crr = cdf2->ClassRangeRecord;
-
-
-  /* binary search */
-
-  if ( cdf2->ClassRangeCount == 0 )
-    {
-      *klass = 0;
-      if ( index )
-	*index = 0;
-      
-      return HB_Err_Not_Covered;
-    }
-
-  new_min = 0;
-  new_max = cdf2->ClassRangeCount - 1;
-
-  do
-  {
-    min = new_min;
-    max = new_max;
-
-    /* we use (min + max) / 2 = max - (max - min) / 2  to avoid
-       overflow and rounding errors                             */
-
-    middle = max - ( ( max - min ) >> 1 );
-
-    if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End )
-    {
-      *klass = crr[middle].Class;
-      error  = HB_Err_Ok;
-      break;
-    }
-    else if ( glyphID < crr[middle].Start )
-    {
-      if ( middle == min )
-      {
-	*klass = 0;
-	error  = HB_Err_Not_Covered;
-	break;
-      }
-      new_max = middle - 1;
-    }
-    else
-    {
-      if ( middle == max )
-      {
-	*klass = 0;
-	error  = HB_Err_Not_Covered;
-	break;
-      }
-      new_min = middle + 1;
-    }
-  } while ( min < max );
-
-  if ( index )
-    *index = middle;
-
-  return error;
-}
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Class( HB_ClassDefinition* cd,
-		     HB_UShort             glyphID,
-		    HB_UShort*          klass,
-		     HB_UShort*            index )
-{
-  switch ( cd->ClassFormat )
-  {
-  case 1:  return Get_Class1( &cd->cd.cd1, glyphID, klass, index );
-  case 2:  return Get_Class2( &cd->cd.cd2, glyphID, klass, index );
-  default: return ERR(HB_Err_Invalid_SubTable_Format);
-  }
-
-  return HB_Err_Ok;               /* never reached */
-}
-
-
-
-/***************************
- * Device related functions
- ***************************/
-
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Load_Device( HB_Device** device,
-		       HB_Stream    stream )
-{
-  HB_Device*  d;
-  HB_Error   error;
-
-  HB_UShort   n, count;
-
-  HB_UShort*  dv;
-
-
-  if ( ACCESS_Frame( 6L ) )
-    return error;
-
-  if ( ALLOC( *device, sizeof(HB_Device)) )
-  {
-    *device = 0;
-    return error;
-  }
-
-  d = *device;
-
-  d->StartSize   = GET_UShort();
-  d->EndSize     = GET_UShort();
-  d->DeltaFormat = GET_UShort();
-
-  FORGET_Frame();
-
-  d->DeltaValue = NULL;
-
-  if ( d->StartSize > d->EndSize ||
-       d->DeltaFormat == 0 || d->DeltaFormat > 3 )
-    {
-      /* XXX
-       * I've seen fontforge generate DeltaFormat == 0.
-       * Just return Ok and let the NULL DeltaValue disable
-       * this table.
-       */
-      return HB_Err_Ok;
-    }
-
-  count = ( ( d->EndSize - d->StartSize + 1 ) >>
-	      ( 4 - d->DeltaFormat ) ) + 1;
-
-  if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) )
-  {
-    FREE( *device );
-    *device = 0;
-    return error;
-  }
-
-  if ( ACCESS_Frame( count * 2L ) )
-  {
-    FREE( d->DeltaValue );
-    FREE( *device );
-    *device = 0;
-    return error;
-  }
-
-  dv = d->DeltaValue;
-
-  for ( n = 0; n < count; n++ )
-    dv[n] = GET_UShort();
-
-  FORGET_Frame();
-
-  return HB_Err_Ok;
-}
-
-
-HB_INTERNAL void
-_HB_OPEN_Free_Device( HB_Device* d )
-{
-  if ( d )
-  {
-    FREE( d->DeltaValue );
-    FREE( d );
-  }
-}
-
-
-/* Since we have the delta values stored in compressed form, we must
-   uncompress it now.  To simplify the interface, the function always
-   returns a meaningful value in `value'; the error is just for
-   information.
-			       |                |
-   format = 1: 0011223344556677|8899101112131415|...
-			       |                |
-		    byte 1           byte 2
-
-     00: (byte >> 14) & mask
-     11: (byte >> 12) & mask
-     ...
-
-     mask = 0x0003
-			       |                |
-   format = 2: 0000111122223333|4444555566667777|...
-			       |                |
-		    byte 1           byte 2
-
-     0000: (byte >> 12) & mask
-     1111: (byte >>  8) & mask
-     ...
-
-     mask = 0x000F
-			       |                |
-   format = 3: 0000000011111111|2222222233333333|...
-			       |                |
-		    byte 1           byte 2
-
-     00000000: (byte >> 8) & mask
-     11111111: (byte >> 0) & mask
-     ....
-
-     mask = 0x00FF                                    */
-
-HB_INTERNAL HB_Error
-_HB_OPEN_Get_Device( HB_Device* d,
-		      HB_UShort    size,
-		      HB_Short*    value )
-{
-  HB_UShort  byte, bits, mask, s;
-
-  if ( d && d->DeltaValue && size >= d->StartSize && size <= d->EndSize )
-  {
-    HB_UShort f = d->DeltaFormat;
-    s    = size - d->StartSize;
-    byte = d->DeltaValue[s >> ( 4 - f )];
-    bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) );
-    mask = 0xFFFF >> ( 16 - ( 1 << f ) );
-
-    *value = (HB_Short)( bits & mask );
-
-    /* conversion to a signed value */
-
-    if ( *value >= ( ( mask + 1 ) >> 1 ) )
-      *value -= mask + 1;
-
-    return HB_Err_Ok;
-  }
-  else
-  {
-    *value = 0;
-    return HB_Err_Not_Covered;
-  }
-}
-
-
-/* END */
diff --git a/src/hb-old/harfbuzz-open.h b/src/hb-old/harfbuzz-open.h
deleted file mode 100644
index 4ba6cf5..0000000
--- a/src/hb-old/harfbuzz-open.h
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_OPEN_H
-#define HARFBUZZ_OPEN_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/* Use this if a feature applies to all glyphs */
-#define HB_ALL_GLYPHS                    0xFFFF
-
-#define HB_DEFAULT_LANGUAGE              0xFFFF
-
-#define HB_MAX_NESTING_LEVEL             100
-
-
-/* Script list related structures */
-
-struct  HB_LangSys_
-{
-  HB_UShort*  FeatureIndex;           /* array of Feature indices  */
-  HB_UShort   LookupOrderOffset;      /* always 0 for TT Open 1.0  */
-  HB_UShort   ReqFeatureIndex;        /* required FeatureIndex     */
-  HB_UShort   FeatureCount;           /* number of Feature indices */
-};
-
-typedef struct HB_LangSys_  HB_LangSys;
-
-
-struct  HB_LangSysRecord_
-{
-  HB_LangSys  LangSys;               /* LangSys table         */
-  HB_UInt     LangSysTag;            /* LangSysTag identifier */
-};
-
-typedef struct HB_LangSysRecord_  HB_LangSysRecord;
-
-
-struct  HB_ScriptTable_
-{
-  HB_LangSysRecord*  LangSysRecord;  /* array of LangSysRecords  */
-  HB_LangSys         DefaultLangSys; /* DefaultLangSys table     */
-  HB_UShort           LangSysCount;   /* number of LangSysRecords */
-};
-
-typedef struct HB_ScriptTable_  HB_ScriptTable;
-
-
-struct  HB_ScriptRecord_
-{
-  HB_UInt        ScriptTag;              /* ScriptTag identifier */
-  HB_ScriptTable  Script;                 /* Script table         */
-};
-
-typedef struct HB_ScriptRecord_  HB_ScriptRecord;
-
-
-struct  HB_ScriptList_
-{
-  HB_ScriptRecord*  ScriptRecord;    /* array of ScriptRecords  */
-  HB_UShort          ScriptCount;     /* number of ScriptRecords */
-};
-
-typedef struct HB_ScriptList_  HB_ScriptList;
-
-
-/* Feature list related structures */
-
-struct HB_Feature_
-{
-  HB_UShort*  LookupListIndex;        /* array of LookupList indices  */
-  HB_UShort   FeatureParams;          /* always 0 for TT Open 1.0     */
-  HB_UShort   LookupListCount;        /* number of LookupList indices */
-};
-
-typedef struct HB_Feature_  HB_Feature;
-
-
-struct  HB_FeatureRecord_
-{
-  HB_UInt     FeatureTag;            /* FeatureTag identifier */
-  HB_Feature  Feature;               /* Feature table         */
-};
-
-typedef struct HB_FeatureRecord_  HB_FeatureRecord;
-
-
-struct  HB_FeatureList_
-{
-  HB_UShort*		ApplyOrder;	/* order to apply features */
-  HB_FeatureRecord*  FeatureRecord;  /* array of FeatureRecords  */
-  HB_UShort           FeatureCount;   /* number of FeatureRecords */
-  HB_UShort		ApplyCount;	/* number of elements in ApplyOrder */
-};
-
-typedef struct HB_FeatureList_  HB_FeatureList;
-
-
-/* Lookup list related structures */
-
-typedef struct HB_SubTable_  HB_SubTable;
-
-
-struct  HB_Lookup_
-{
-  HB_SubTable*  SubTable;            /* array of SubTables  */
-  HB_UShort      LookupType;          /* Lookup type         */
-  HB_UShort      LookupFlag;          /* Lookup qualifiers   */
-  HB_UShort      SubTableCount;       /* number of SubTables */
-};
-
-typedef struct HB_Lookup_  HB_Lookup;
-
-
-/* The `Properties' field is not defined in the OpenType specification but
-   is needed for processing lookups.  If properties[n] is > 0, the
-   functions HB_GSUB_Apply_String() resp. HB_GPOS_Apply_String() will
-   process Lookup[n] for glyphs which have the specific bit not set in
-   the `properties' field of the input string object.                  */
-
-struct  HB_LookupList_
-{
-  HB_Lookup*  Lookup;                /* array of Lookup records */
-  HB_UInt*     Properties;            /* array of flags          */
-  HB_UShort    LookupCount;           /* number of Lookups       */
-};
-
-typedef struct HB_LookupList_  HB_LookupList;
-
-
-/* Possible LookupFlag bit masks.  `HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS' comes from the
-   OpenType 1.2 specification; HB_LOOKUP_FLAG_RIGHT_TO_LEFT has been (re)introduced in
-   OpenType 1.3 -- if set, the last glyph in a cursive attachment
-   sequence has to be positioned on the baseline -- regardless of the
-   writing direction.                                                    */
-
-#define HB_LOOKUP_FLAG_RIGHT_TO_LEFT         0x0001
-#define HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS    0x0002
-#define HB_LOOKUP_FLAG_IGNORE_LIGATURES      0x0004
-#define HB_LOOKUP_FLAG_IGNORE_MARKS          0x0008
-#define HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS  0xFF00
-
-
-struct  HB_CoverageFormat1_
-{
-  HB_UShort*  GlyphArray;             /* array of glyph IDs             */
-  HB_UShort   GlyphCount;             /* number of glyphs in GlyphArray */
-};
-
-typedef struct HB_CoverageFormat1_  HB_CoverageFormat1;
-
-
-struct HB_RangeRecord_
-{
-  HB_UShort  Start;                   /* first glyph ID in the range */
-  HB_UShort  End;                     /* last glyph ID in the range  */
-  HB_UShort  StartCoverageIndex;      /* coverage index of first
-					 glyph ID in the range       */
-};
-
-typedef struct HB_RangeRecord_  HB_RangeRecord;
-
-
-struct  HB_CoverageFormat2_
-{
-  HB_RangeRecord*  RangeRecord;      /* array of RangeRecords  */
-  HB_UShort         RangeCount;       /* number of RangeRecords */
-};
-
-typedef struct HB_CoverageFormat2_  HB_CoverageFormat2;
-
-
-struct  HB_Coverage_
-{
-  HB_Byte    CoverageFormat;          /* 1 or 2 */
-
-  union
-  {
-    HB_CoverageFormat1  cf1;
-    HB_CoverageFormat2  cf2;
-  } cf;
-};
-
-typedef struct HB_Coverage_  HB_Coverage;
-
-
-struct  HB_ClassDefFormat1_
-{
-  HB_UShort*  ClassValueArray;        /* array of class values       */
-  HB_UShort   StartGlyph;             /* first glyph ID of the
-					 ClassValueArray             */
-  HB_UShort   GlyphCount;             /* size of the ClassValueArray */
-};
-
-typedef struct HB_ClassDefFormat1_  HB_ClassDefFormat1;
-
-
-struct  HB_ClassRangeRecord_
-{
-  HB_UShort  Start;                   /* first glyph ID in the range    */
-  HB_UShort  End;                     /* last glyph ID in the range     */
-  HB_UShort  Class;                   /* applied to all glyphs in range */
-};
-
-typedef struct HB_ClassRangeRecord_  HB_ClassRangeRecord;
-
-
-struct  HB_ClassDefFormat2_
-{
-  HB_ClassRangeRecord*  ClassRangeRecord;
-				      /* array of ClassRangeRecords  */
-  HB_UShort              ClassRangeCount;
-				      /* number of ClassRangeRecords */
-};
-
-typedef struct HB_ClassDefFormat2_  HB_ClassDefFormat2;
-
-
-struct  HB_ClassDefinition_
-{
-  union
-  {
-    HB_ClassDefFormat1  cd1;
-    HB_ClassDefFormat2  cd2;
-  } cd;
-
-  HB_Byte    ClassFormat;             /* 1 or 2                      */
-  HB_Bool    loaded;
-};
-
-typedef struct HB_ClassDefinition_  HB_ClassDefinition;
-
-
-struct HB_Device_
-{
-  HB_UShort*  DeltaValue;             /* array of compressed data      */
-  HB_UShort   StartSize;              /* smallest size to correct      */
-  HB_UShort   EndSize;                /* largest size to correct       */
-  HB_Byte     DeltaFormat;            /* DeltaValue array data format:
-					 1, 2, or 3                    */
-};
-
-typedef struct HB_Device_  HB_Device;
-
-
-enum  HB_Type_
-{
-  HB_Type_GSUB,
-  HB_Type_GPOS
-};
-
-typedef enum HB_Type_  HB_Type;
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_OPEN_H */
diff --git a/src/hb-old/harfbuzz-shaper-all.cpp b/src/hb-old/harfbuzz-shaper-all.cpp
deleted file mode 100644
index 2dae501..0000000
--- a/src/hb-old/harfbuzz-shaper-all.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.cpp"
-#include "harfbuzz-indic.cpp"
-extern "C" {
-#include "harfbuzz-greek.c"
-#include "harfbuzz-tibetan.c"
-#include "harfbuzz-khmer.c"
-#include "harfbuzz-hebrew.c"
-#include "harfbuzz-arabic.c"
-#include "harfbuzz-hangul.c"
-#include "harfbuzz-myanmar.c"
-#include "harfbuzz-thai.c"
-}
-
diff --git a/src/hb-old/harfbuzz-shaper-private.h b/src/hb-old/harfbuzz-shaper-private.h
deleted file mode 100644
index 66fad4c..0000000
--- a/src/hb-old/harfbuzz-shaper-private.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_SHAPER_PRIVATE_H
-#define HARFBUZZ_SHAPER_PRIVATE_H
-
-HB_BEGIN_HEADER
-
-enum {
-    C_DOTTED_CIRCLE = 0x25CC
-};
-
-typedef enum 
-{
-    HB_Combining_BelowLeftAttached       = 200,
-    HB_Combining_BelowAttached           = 202,
-    HB_Combining_BelowRightAttached      = 204,
-    HB_Combining_LeftAttached            = 208,
-    HB_Combining_RightAttached           = 210,
-    HB_Combining_AboveLeftAttached       = 212,
-    HB_Combining_AboveAttached           = 214,
-    HB_Combining_AboveRightAttached      = 216,
-
-    HB_Combining_BelowLeft               = 218,
-    HB_Combining_Below                   = 220,
-    HB_Combining_BelowRight              = 222,
-    HB_Combining_Left                    = 224,
-    HB_Combining_Right                   = 226,
-    HB_Combining_AboveLeft               = 228,
-    HB_Combining_Above                   = 230,
-    HB_Combining_AboveRight              = 232,
-
-    HB_Combining_DoubleBelow             = 233,
-    HB_Combining_DoubleAbove             = 234,
-    HB_Combining_IotaSubscript           = 240
-} HB_CombiningClass;
-
-typedef enum {
-    LocaProperty = 0x1,
-    CcmpProperty = 0x2,
-    InitProperty = 0x4,
-    IsolProperty = 0x8,
-    FinaProperty = 0x10,
-    MediProperty = 0x20,
-    RligProperty = 0x40,
-    CaltProperty = 0x80,
-    LigaProperty = 0x100,
-    DligProperty = 0x200,
-    CswhProperty = 0x400,
-    MsetProperty = 0x800,
-
-    /* used by indic and myanmar shaper */
-    NuktaProperty = 0x8,
-    AkhantProperty = 0x10,
-    RephProperty = 0x20,
-    PreFormProperty = 0x40,
-    BelowFormProperty = 0x80,
-    AboveFormProperty = 0x100,
-    HalfFormProperty = 0x200,
-    PostFormProperty = 0x400,
-    ConjunctFormProperty = 0x800,
-    VattuProperty = 0x1000,
-    PreSubstProperty = 0x2000,
-    BelowSubstProperty = 0x4000,
-    AboveSubstProperty = 0x8000,
-    PostSubstProperty = 0x10000,
-    HalantProperty = 0x20000,
-    CligProperty = 0x40000,
-    IndicCaltProperty = 0x80000
-
-} HB_OpenTypeProperty;
-
-/* return true if ok. */
-typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item);
-
-typedef struct {
-    HB_ShapeFunction shape;
-} HB_ScriptEngine;
-
-extern const HB_ScriptEngine hb_scriptEngines[];
-
-extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item);
-extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item);
-
-typedef struct {
-    hb_uint32 tag;
-    hb_uint32 property;
-} HB_OpenTypeFeature;
-
-#define PositioningProperties 0x80000000
-
-HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features);
-
-HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties);
-HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters);
-
-void HB_HeuristicPosition(HB_ShaperItem *item);
-void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item);
-
-#define HB_IsControlChar(uc) \
-    ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \
-     || (uc >= 0x2028 && uc <= 0x202f /* LS, PS, LRE, RLE, PDF, LRO, RLO, NNBSP */) \
-     || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */))
-
-HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item);
-
-#define HB_GetGlyphAdvances(shaper_item) \
-    shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \
-                                               shaper_item->glyphs, shaper_item->num_glyphs, \
-                                               shaper_item->advances, \
-                                               shaper_item->face->current_flags);
-
-#define HB_DECLARE_STACKARRAY(Type, Name) \
-    Type stack##Name[512]; \
-    Type *Name = stack##Name;
-
-#define HB_INIT_STACKARRAY(Type, Name, Length) \
-    if ((Length) >= 512) \
-        Name = (Type *)malloc((Length) * sizeof(Type));
-
-#define HB_STACKARRAY(Type, Name, Length) \
-    HB_DECLARE_STACKARRAY(Type, Name) \
-    HB_INIT_STACKARRAY(Type, Name, Length)
-
-#define HB_FREE_STACKARRAY(Name) \
-    if (stack##Name != Name) \
-        free(Name);
-
-HB_END_HEADER
-
-#endif
diff --git a/src/hb-old/harfbuzz-shaper.cpp b/src/hb-old/harfbuzz-shaper.cpp
deleted file mode 100644
index dacc36c..0000000
--- a/src/hb-old/harfbuzz-shaper.cpp
+++ /dev/null
@@ -1,996 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include "harfbuzz-stream-private.h"
-#include <assert.h>
-#include <stdio.h>
-
-#define HB_MIN(a, b) ((a) < (b) ? (a) : (b))
-#define HB_MAX(a, b) ((a) > (b) ? (a) : (b))
-
-// --------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Basic processing
-//
-// --------------------------------------------------------------------------------------------------------------------------------------------
-
-static inline void positionCluster(HB_ShaperItem *item, int gfrom,  int glast)
-{
-    int nmarks = glast - gfrom;
-    assert(nmarks > 0);
-
-    HB_Glyph *glyphs = item->glyphs;
-    HB_GlyphAttributes *attributes = item->attributes;
-
-    HB_GlyphMetrics baseMetrics;
-    item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom], &baseMetrics);
-
-    if (item->item.script == HB_Script_Hebrew
-        && (-baseMetrics.y) > baseMetrics.height)
-        // we need to attach below the baseline, because of the hebrew iud.
-        baseMetrics.height = -baseMetrics.y;
-
-//     qDebug("---> positionCluster: cluster from %d to %d", gfrom, glast);
-//     qDebug("baseInfo: %f/%f (%f/%f) off=%f/%f", baseInfo.x, baseInfo.y, baseInfo.width, baseInfo.height, baseInfo.xoff, baseInfo.yoff);
-
-    HB_Fixed size = item->font->klass->getFontMetric(item->font, HB_FontAscent) / 10;
-    HB_Fixed offsetBase = HB_FIXED_CONSTANT(1) + (size - HB_FIXED_CONSTANT(4)) / 4;
-    if (size > HB_FIXED_CONSTANT(4))
-        offsetBase += HB_FIXED_CONSTANT(4);
-    else
-        offsetBase += size;
-    offsetBase = -offsetBase;
-    //qreal offsetBase = (size - 4) / 4 + qMin<qreal>(size, 4) + 1;
-//     qDebug("offset = %f", offsetBase);
-
-    bool rightToLeft = item->item.bidiLevel % 2;
-
-    int i;
-    unsigned char lastCmb = 0;
-    HB_GlyphMetrics attachmentRect;
-    memset(&attachmentRect, 0, sizeof(attachmentRect));
-
-    for(i = 1; i <= nmarks; i++) {
-        HB_Glyph mark = glyphs[gfrom+i];
-        HB_GlyphMetrics markMetrics;
-        item->font->klass->getGlyphMetrics(item->font, mark, &markMetrics);
-        HB_FixedPoint p;
-        p.x = p.y = 0;
-//          qDebug("markInfo: %f/%f (%f/%f) off=%f/%f", markInfo.x, markInfo.y, markInfo.width, markInfo.height, markInfo.xoff, markInfo.yoff);
-
-        HB_Fixed offset = offsetBase;
-        unsigned char cmb = attributes[gfrom+i].combiningClass;
-
-        // ### maybe the whole position determination should move down to heuristicSetGlyphAttributes. Would save some
-        // bits  in the glyphAttributes structure.
-        if (cmb < 200) {
-            // fixed position classes. We approximate by mapping to one of the others.
-            // currently I added only the ones for arabic, hebrew, lao and thai.
-
-            // for Lao and Thai marks with class 0, see below (heuristicSetGlyphAttributes)
-
-            // add a bit more offset to arabic, a bit hacky
-            if (cmb >= 27 && cmb <= 36 && offset < 3)
-                offset +=1;
-            // below
-            if ((cmb >= 10 && cmb <= 18) ||
-                 cmb == 20 || cmb == 22 ||
-                 cmb == 29 || cmb == 32)
-                cmb = HB_Combining_Below;
-            // above
-            else if (cmb == 23 || cmb == 27 || cmb == 28 ||
-                      cmb == 30 || cmb == 31 || (cmb >= 33 && cmb <= 36))
-                cmb = HB_Combining_Above;
-            //below-right
-            else if (cmb == 9 || cmb == 103 || cmb == 118)
-                cmb = HB_Combining_BelowRight;
-            // above-right
-            else if (cmb == 24 || cmb == 107 || cmb == 122)
-                cmb = HB_Combining_AboveRight;
-            else if (cmb == 25)
-                cmb = HB_Combining_AboveLeft;
-            // fixed:
-            //  19 21
-
-        }
-
-        // combining marks of different class don't interact. Reset the rectangle.
-        if (cmb != lastCmb) {
-            //qDebug("resetting rect");
-            attachmentRect = baseMetrics;
-        }
-
-        switch(cmb) {
-        case HB_Combining_DoubleBelow:
-                // ### wrong in rtl context!
-        case HB_Combining_BelowLeft:
-            p.y += offset;
-        case HB_Combining_BelowLeftAttached:
-            p.x += attachmentRect.x - markMetrics.x;
-            p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y;
-            break;
-        case HB_Combining_Below:
-            p.y += offset;
-        case HB_Combining_BelowAttached:
-            p.x += attachmentRect.x - markMetrics.x;
-            p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y;
-
-            p.x += (attachmentRect.width - markMetrics.width) / 2;
-            break;
-        case HB_Combining_BelowRight:
-            p.y += offset;
-        case HB_Combining_BelowRightAttached:
-            p.x += attachmentRect.x + attachmentRect.width - markMetrics.width - markMetrics.x;
-            p.y += attachmentRect.y + attachmentRect.height - markMetrics.y;
-            break;
-        case HB_Combining_Left:
-            p.x -= offset;
-        case HB_Combining_LeftAttached:
-            break;
-        case HB_Combining_Right:
-            p.x += offset;
-        case HB_Combining_RightAttached:
-            break;
-        case HB_Combining_DoubleAbove:
-            // ### wrong in RTL context!
-        case HB_Combining_AboveLeft:
-            p.y -= offset;
-        case HB_Combining_AboveLeftAttached:
-            p.x += attachmentRect.x - markMetrics.x;
-            p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
-            break;
-        case HB_Combining_Above:
-            p.y -= offset;
-        case HB_Combining_AboveAttached:
-            p.x += attachmentRect.x - markMetrics.x;
-            p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
-
-            p.x += (attachmentRect.width - markMetrics.width) / 2;
-            break;
-        case HB_Combining_AboveRight:
-            p.y -= offset;
-        case HB_Combining_AboveRightAttached:
-            p.x += attachmentRect.x + attachmentRect.width - markMetrics.x - markMetrics.width;
-            p.y += attachmentRect.y - markMetrics.y - markMetrics.height;
-            break;
-
-        case HB_Combining_IotaSubscript:
-            default:
-                break;
-        }
-//          qDebug("char=%x combiningClass = %d offset=%f/%f", mark, cmb, p.x(), p.y());
-        markMetrics.x += p.x;
-        markMetrics.y += p.y;
-
-        HB_GlyphMetrics unitedAttachmentRect = attachmentRect;
-        unitedAttachmentRect.x = HB_MIN(attachmentRect.x, markMetrics.x);
-        unitedAttachmentRect.y = HB_MIN(attachmentRect.y, markMetrics.y);
-        unitedAttachmentRect.width = HB_MAX(attachmentRect.x + attachmentRect.width, markMetrics.x + markMetrics.width) - unitedAttachmentRect.x;
-        unitedAttachmentRect.height = HB_MAX(attachmentRect.y + attachmentRect.height, markMetrics.y + markMetrics.height) - unitedAttachmentRect.y;
-        attachmentRect = unitedAttachmentRect;
-
-        lastCmb = cmb;
-        if (rightToLeft) {
-            item->offsets[gfrom+i].x = p.x;
-            item->offsets[gfrom+i].y = p.y;
-        } else {
-            item->offsets[gfrom+i].x = p.x - baseMetrics.xOffset;
-            item->offsets[gfrom+i].y = p.y - baseMetrics.yOffset;
-        }
-        item->advances[gfrom+i] = 0;
-    }
-}
-
-void HB_HeuristicPosition(HB_ShaperItem *item)
-{
-    HB_GetGlyphAdvances(item);
-    HB_GlyphAttributes *attributes = item->attributes;
-
-    int cEnd = -1;
-    int i = item->num_glyphs;
-    while (i--) {
-        if (cEnd == -1 && attributes[i].mark) {
-            cEnd = i;
-        } else if (cEnd != -1 && !attributes[i].mark) {
-            positionCluster(item, i, cEnd);
-            cEnd = -1;
-        }
-    }
-}
-
-// set the glyph attributes heuristically. Assumes a 1 to 1 relationship between chars and glyphs
-// and no reordering.
-// also computes logClusters heuristically
-void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item)
-{
-    const HB_UChar16 *uc = item->string + item->item.pos;
-    hb_uint32 length = item->item.length;
-
-    // ### zeroWidth and justification are missing here!!!!!
-
-    assert(item->num_glyphs <= length);
-
-//     qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs);
-    HB_GlyphAttributes *attributes = item->attributes;
-    unsigned short *logClusters = item->log_clusters;
-
-    hb_uint32 glyph_pos = 0;
-    hb_uint32 i;
-    for (i = 0; i < length; i++) {
-        if (HB_IsHighSurrogate(uc[i]) && i < length - 1
-            && HB_IsLowSurrogate(uc[i + 1])) {
-            logClusters[i] = glyph_pos;
-            logClusters[++i] = glyph_pos;
-        } else {
-            logClusters[i] = glyph_pos;
-        }
-        ++glyph_pos;
-    }
-    assert(glyph_pos == item->num_glyphs);
-
-    // first char in a run is never (treated as) a mark
-    int cStart = 0;
-    const bool symbolFont = item->face->isSymbolFont;
-    attributes[0].mark = false;
-    attributes[0].clusterStart = true;
-    attributes[0].dontPrint = (!symbolFont && uc[0] == 0x00ad) || HB_IsControlChar(uc[0]);
-
-    int pos = 0;
-    HB_CharCategory lastCat;
-    int dummy;
-    HB_GetUnicodeCharProperties(item->ufuncs, uc[0], &lastCat, &dummy);
-    for (i = 1; i < length; ++i) {
-        if (logClusters[i] == pos)
-            // same glyph
-            continue;
-        ++pos;
-        while (pos < logClusters[i]) {
-            attributes[pos] = attributes[pos-1];
-            ++pos;
-        }
-        // hide soft-hyphens by default
-        if ((!symbolFont && uc[i] == 0x00ad) || HB_IsControlChar(uc[i]))
-            attributes[pos].dontPrint = true;
-        HB_CharCategory cat;
-        int cmb;
-        HB_GetUnicodeCharProperties(item->ufuncs, uc[i], &cat, &cmb);
-        if (cat != HB_Mark_NonSpacing) {
-            attributes[pos].mark = false;
-            attributes[pos].clusterStart = true;
-            attributes[pos].combiningClass = 0;
-            cStart = logClusters[i];
-        } else {
-            if (cmb == 0) {
-                // Fix 0 combining classes
-                if ((uc[pos] & 0xff00) == 0x0e00) {
-                    // thai or lao
-                    if (uc[pos] == 0xe31 ||
-                         uc[pos] == 0xe34 ||
-                         uc[pos] == 0xe35 ||
-                         uc[pos] == 0xe36 ||
-                         uc[pos] == 0xe37 ||
-                         uc[pos] == 0xe47 ||
-                         uc[pos] == 0xe4c ||
-                         uc[pos] == 0xe4d ||
-                         uc[pos] == 0xe4e) {
-                        cmb = HB_Combining_AboveRight;
-                    } else if (uc[pos] == 0xeb1 ||
-                                uc[pos] == 0xeb4 ||
-                                uc[pos] == 0xeb5 ||
-                                uc[pos] == 0xeb6 ||
-                                uc[pos] == 0xeb7 ||
-                                uc[pos] == 0xebb ||
-                                uc[pos] == 0xecc ||
-                                uc[pos] == 0xecd) {
-                        cmb = HB_Combining_Above;
-                    } else if (uc[pos] == 0xebc) {
-                        cmb = HB_Combining_Below;
-                    }
-                }
-            }
-
-            attributes[pos].mark = true;
-            attributes[pos].clusterStart = false;
-            attributes[pos].combiningClass = cmb;
-            logClusters[i] = cStart;
-        }
-        // one gets an inter character justification point if the current char is not a non spacing mark.
-        // as then the current char belongs to the last one and one gets a space justification point
-        // after the space char.
-        if (lastCat == HB_Separator_Space)
-            attributes[pos-1].justification = HB_Space;
-        else if (cat != HB_Mark_NonSpacing)
-            attributes[pos-1].justification = HB_Character;
-        else
-            attributes[pos-1].justification = HB_NoJustification;
-
-        lastCat = cat;
-    }
-    pos = logClusters[length-1];
-    if (lastCat == HB_Separator_Space)
-        attributes[pos].justification = HB_Space;
-    else
-        attributes[pos].justification = HB_Character;
-}
-
-#ifndef NO_OPENTYPE
-static const HB_OpenTypeFeature basic_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty },
-    { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty },
-    {0, 0}
-};
-#endif
-
-HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item)
-{
-    if (shaper_item->glyphIndicesPresent) {
-        shaper_item->num_glyphs = shaper_item->initialGlyphCount;
-        shaper_item->glyphIndicesPresent = false;
-        return true;
-    }
-    return shaper_item->font->klass
-           ->convertStringToGlyphIndices(shaper_item->font,
-                                         shaper_item->string + shaper_item->item.pos, shaper_item->item.length,
-                                         shaper_item->glyphs, &shaper_item->num_glyphs,
-                                         shaper_item->item.bidiLevel % 2);
-}
-
-HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item)
-{
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = shaper_item->num_glyphs;
-#endif
-
-    if (!HB_ConvertStringToGlyphIndices(shaper_item))
-        return false;
-
-    HB_HeuristicSetGlyphAttributes(shaper_item);
-
-#ifndef NO_OPENTYPE
-    if (HB_SelectScript(shaper_item, basic_features)) {
-        HB_OpenTypeShape(shaper_item, /*properties*/0);
-        return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/true);
-    }
-#endif
-
-    HB_HeuristicPosition(shaper_item);
-    return true;
-}
-
-const HB_ScriptEngine HB_ScriptEngines[] = {
-    // Common
-    { HB_BasicShape},
-    // Greek
-    { HB_GreekShape},
-    // Cyrillic
-    { HB_BasicShape},
-    // Armenian
-    { HB_BasicShape},
-    // Hebrew
-    { HB_HebrewShape},
-    // Arabic
-    { HB_ArabicShape},
-    // Syriac
-    { HB_ArabicShape},
-    // Thaana
-    { HB_BasicShape},
-    // Devanagari
-    { HB_IndicShape},
-    // Bengali
-    { HB_IndicShape},
-    // Gurmukhi
-    { HB_IndicShape},
-    // Gujarati
-    { HB_IndicShape},
-    // Oriya
-    { HB_IndicShape},
-    // Tamil
-    { HB_IndicShape},
-    // Telugu
-    { HB_IndicShape},
-    // Kannada
-    { HB_IndicShape},
-    // Malayalam
-    { HB_IndicShape},
-    // Sinhala
-    { HB_IndicShape},
-    // Thai
-    { HB_BasicShape},
-    // Lao
-    { HB_BasicShape},
-    // Tibetan
-    { HB_TibetanShape},
-    // Myanmar
-    { HB_MyanmarShape},
-    // Georgian
-    { HB_BasicShape},
-    // Hangul
-    { HB_HangulShape},
-    // Ogham
-    { HB_BasicShape},
-    // Runic
-    { HB_BasicShape},
-    // Khmer
-    { HB_KhmerShape},
-    // N'Ko
-    { HB_ArabicShape}
-};
-
-
-static inline char *tag_to_string(HB_UInt tag)
-{
-    static char string[5];
-    string[0] = (tag >> 24)&0xff;
-    string[1] = (tag >> 16)&0xff;
-    string[2] = (tag >> 8)&0xff;
-    string[3] = tag&0xff;
-    string[4] = 0;
-    return string;
-}
-
-#ifdef OT_DEBUG
-static void dump_string(HB_Buffer buffer)
-{
-    for (uint i = 0; i < buffer->in_length; ++i) {
-        qDebug("    %x: cluster=%d", buffer->in_string[i].gindex, buffer->in_string[i].cluster);
-    }
-}
-#define DEBUG printf
-#else
-#define DEBUG if (1) ; else printf
-#endif
-
-#if 0
-#define DefaultLangSys 0xffff
-#define DefaultScript HB_MAKE_TAG('D', 'F', 'L', 'T')
-#endif
-
-enum {
-    RequiresGsub = 1,
-    RequiresGpos = 2
-};
-
-struct OTScripts {
-    unsigned int tag;
-    int flags;
-};
-static const OTScripts ot_scripts [] = {
-    // Common
-    { HB_MAKE_TAG('l', 'a', 't', 'n'), 0 },
-    // Greek
-    { HB_MAKE_TAG('g', 'r', 'e', 'k'), 0 },
-    // Cyrillic
-    { HB_MAKE_TAG('c', 'y', 'r', 'l'), 0 },
-    // Armenian
-    { HB_MAKE_TAG('a', 'r', 'm', 'n'), 0 },
-    // Hebrew
-    { HB_MAKE_TAG('h', 'e', 'b', 'r'), 1 },
-    // Arabic
-    { HB_MAKE_TAG('a', 'r', 'a', 'b'), 1 },
-    // Syriac
-    { HB_MAKE_TAG('s', 'y', 'r', 'c'), 1 },
-    // Thaana
-    { HB_MAKE_TAG('t', 'h', 'a', 'a'), 1 },
-    // Devanagari
-    { HB_MAKE_TAG('d', 'e', 'v', 'a'), 1 },
-    // Bengali
-    { HB_MAKE_TAG('b', 'e', 'n', 'g'), 1 },
-    // Gurmukhi
-    { HB_MAKE_TAG('g', 'u', 'r', 'u'), 1 },
-    // Gujarati
-    { HB_MAKE_TAG('g', 'u', 'j', 'r'), 1 },
-    // Oriya
-    { HB_MAKE_TAG('o', 'r', 'y', 'a'), 1 },
-    // Tamil
-    { HB_MAKE_TAG('t', 'a', 'm', 'l'), 1 },
-    // Telugu
-    { HB_MAKE_TAG('t', 'e', 'l', 'u'), 1 },
-    // Kannada
-    { HB_MAKE_TAG('k', 'n', 'd', 'a'), 1 },
-    // Malayalam
-    { HB_MAKE_TAG('m', 'l', 'y', 'm'), 1 },
-    // Sinhala
-    { HB_MAKE_TAG('s', 'i', 'n', 'h'), 1 },
-    // Thai
-    { HB_MAKE_TAG('t', 'h', 'a', 'i'), 1 },
-    // Lao
-    { HB_MAKE_TAG('l', 'a', 'o', ' '), 1 },
-    // Tibetan
-    { HB_MAKE_TAG('t', 'i', 'b', 't'), 1 },
-    // Myanmar
-    { HB_MAKE_TAG('m', 'y', 'm', 'r'), 1 },
-    // Georgian
-    { HB_MAKE_TAG('g', 'e', 'o', 'r'), 0 },
-    // Hangul
-    { HB_MAKE_TAG('h', 'a', 'n', 'g'), 1 },
-    // Ogham
-    { HB_MAKE_TAG('o', 'g', 'a', 'm'), 0 },
-    // Runic
-    { HB_MAKE_TAG('r', 'u', 'n', 'r'), 0 },
-    // Khmer
-    { HB_MAKE_TAG('k', 'h', 'm', 'r'), 1 },
-    // N'Ko
-    { HB_MAKE_TAG('n', 'k', 'o', ' '), 1 }
-};
-enum { NumOTScripts = sizeof(ot_scripts)/sizeof(OTScripts) };
-
-static HB_Bool checkScript(HB_Face face, int script)
-{
-    assert(script < HB_ScriptCount);
-
-    if (!face->gsub && !face->gpos)
-        return false;
-
-    unsigned int tag = ot_scripts[script].tag;
-    int requirements = ot_scripts[script].flags;
-
-    if (requirements & RequiresGsub) {
-        if (!face->gsub)
-            return false;
-
-        HB_UShort script_index;
-        HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index);
-        if (error) {
-            DEBUG("could not select script %d in GSub table: %d", (int)script, error);
-            error = HB_GSUB_Select_Script(face->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index);
-            if (error)
-                return false;
-        }
-    }
-
-    if (requirements & RequiresGpos) {
-        if (!face->gpos)
-            return false;
-
-        HB_UShort script_index;
-        HB_Error error = HB_GPOS_Select_Script(face->gpos, script, &script_index);
-        if (error) {
-            DEBUG("could not select script in gpos table: %d", error);
-            error = HB_GPOS_Select_Script(face->gpos, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index);
-            if (error)
-                return false;
-        }
-
-    }
-    return true;
-}
-
-static HB_Stream getTableStream(void *font, HB_GetFontTableFunc tableFunc, HB_Tag tag)
-{
-    HB_Error error;
-    HB_UInt length = 0;
-    HB_Stream stream = 0;
-
-    if (!font)
-        return 0;
-
-    error = tableFunc(font, tag, 0, &length);
-    if (error)
-        return 0;
-    stream = (HB_Stream)malloc(sizeof(HB_StreamRec));
-    if (!stream)
-        return 0;
-    stream->base = (HB_Byte*)malloc(length);
-    if (!stream->base) {
-        free(stream);
-        return 0;
-    }
-    error = tableFunc(font, tag, stream->base, &length);
-    if (error) {
-        _hb_close_stream(stream);
-        return 0;
-    }
-    stream->size = length;
-    stream->pos = 0;
-    stream->cursor = NULL;
-    return stream;
-}
-
-HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc)
-{
-    HB_Face face = (HB_Face )malloc(sizeof(HB_FaceRec));
-    if (!face)
-        return 0;
-
-    face->isSymbolFont = false;
-    face->gdef = 0;
-    face->gpos = 0;
-    face->gsub = 0;
-    face->current_script = HB_ScriptCount;
-    face->current_flags = HB_ShaperFlag_Default;
-    face->has_opentype_kerning = false;
-    face->tmpAttributes = 0;
-    face->tmpLogClusters = 0;
-    face->glyphs_substituted = false;
-    face->buffer = 0;
-
-    HB_Error error = HB_Err_Ok;
-    HB_Stream stream;
-    HB_Stream gdefStream;
-
-    gdefStream = getTableStream(font, tableFunc, TTAG_GDEF);
-    error = HB_Err_Not_Covered;
-    if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) {
-        //DEBUG("error loading gdef table: %d", error);
-        face->gdef = 0;
-    }
-
-    //DEBUG() << "trying to load gsub table";
-    stream = getTableStream(font, tableFunc, TTAG_GSUB);
-    error = HB_Err_Not_Covered;
-    if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef, gdefStream))) {
-        face->gsub = 0;
-        if (error != HB_Err_Not_Covered) {
-            //DEBUG("error loading gsub table: %d", error);
-        } else {
-            //DEBUG("face doesn't have a gsub table");
-        }
-    }
-    _hb_close_stream(stream);
-
-    stream = getTableStream(font, tableFunc, TTAG_GPOS);
-    error = HB_Err_Not_Covered;
-    if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef, gdefStream))) {
-        face->gpos = 0;
-        DEBUG("error loading gpos table: %d", error);
-    }
-    _hb_close_stream(stream);
-
-    _hb_close_stream(gdefStream);
-
-    for (unsigned int i = 0; i < HB_ScriptCount; ++i)
-        face->supported_scripts[i] = checkScript(face, i);
-
-    if (HB_Buffer_new(&face->buffer) != HB_Err_Ok) {
-        HB_FreeFace(face);
-        return 0;
-    }
-
-    return face;
-}
-
-void HB_FreeFace(HB_Face face)
-{
-    if (!face)
-        return;
-    if (face->gpos)
-        HB_Done_GPOS_Table(face->gpos);
-    if (face->gsub)
-        HB_Done_GSUB_Table(face->gsub);
-    if (face->gdef)
-        HB_Done_GDEF_Table(face->gdef);
-    if (face->buffer)
-        HB_Buffer_free(face->buffer);
-    if (face->tmpAttributes)
-        free(face->tmpAttributes);
-    if (face->tmpLogClusters)
-        free(face->tmpLogClusters);
-    free(face);
-}
-
-HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *features)
-{
-    HB_Script script = shaper_item->item.script;
-
-    if (!shaper_item->face->supported_scripts[script])
-        return false;
-
-    HB_Face face = shaper_item->face;
-    if (face->current_script == script && face->current_flags == shaper_item->shaperFlags)
-        return true;
-
-    face->current_script = script;
-    face->current_flags = shaper_item->shaperFlags;
-
-    assert(script < HB_ScriptCount);
-    // find script in our list of supported scripts.
-    unsigned int tag = ot_scripts[script].tag;
-
-    if (face->gsub && features) {
-#ifdef OT_DEBUG
-        {
-            HB_FeatureList featurelist = face->gsub->FeatureList;
-            int numfeatures = featurelist.FeatureCount;
-            DEBUG("gsub table has %d features", numfeatures);
-            for (int i = 0; i < numfeatures; i++) {
-                HB_FeatureRecord *r = featurelist.FeatureRecord + i;
-                DEBUG("   feature '%s'", tag_to_string(r->FeatureTag));
-            }
-        }
-#endif
-        HB_GSUB_Clear_Features(face->gsub);
-        HB_UShort script_index;
-        HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index);
-        if (!error) {
-            DEBUG("script %s has script index %d", tag_to_string(script), script_index);
-            while (features->tag) {
-                HB_UShort feature_index;
-                error = HB_GSUB_Select_Feature(face->gsub, features->tag, script_index, 0xffff, &feature_index);
-                if (!error) {
-                    DEBUG("  adding feature %s", tag_to_string(features->tag));
-                    HB_GSUB_Add_Feature(face->gsub, feature_index, features->property);
-                }
-                ++features;
-            }
-        }
-    }
-
-    // reset
-    face->has_opentype_kerning = false;
-
-    if (face->gpos) {
-        HB_GPOS_Clear_Features(face->gpos);
-        HB_UShort script_index;
-        HB_Error error = HB_GPOS_Select_Script(face->gpos, tag, &script_index);
-        if (!error) {
-#ifdef OT_DEBUG
-            {
-                HB_FeatureList featurelist = face->gpos->FeatureList;
-                int numfeatures = featurelist.FeatureCount;
-                DEBUG("gpos table has %d features", numfeatures);
-                for(int i = 0; i < numfeatures; i++) {
-                    HB_FeatureRecord *r = featurelist.FeatureRecord + i;
-                    HB_UShort feature_index;
-                    HB_GPOS_Select_Feature(face->gpos, r->FeatureTag, script_index, 0xffff, &feature_index);
-                    DEBUG("   feature '%s'", tag_to_string(r->FeatureTag));
-                }
-            }
-#endif
-            HB_UInt *feature_tag_list_buffer;
-            error = HB_GPOS_Query_Features(face->gpos, script_index, 0xffff, &feature_tag_list_buffer);
-            if (!error) {
-                HB_UInt *feature_tag_list = feature_tag_list_buffer;
-                while (*feature_tag_list) {
-                    HB_UShort feature_index;
-                    if (*feature_tag_list == HB_MAKE_TAG('k', 'e', 'r', 'n')) {
-                        if (face->current_flags & HB_ShaperFlag_NoKerning) {
-                            ++feature_tag_list;
-                            continue;
-                        }
-                        face->has_opentype_kerning = true;
-                    }
-                    error = HB_GPOS_Select_Feature(face->gpos, *feature_tag_list, script_index, 0xffff, &feature_index);
-                    if (!error)
-                        HB_GPOS_Add_Feature(face->gpos, feature_index, PositioningProperties);
-                    ++feature_tag_list;
-                }
-                FREE(feature_tag_list_buffer);
-            }
-        }
-    }
-
-    return true;
-}
-
-HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties)
-{
-    HB_GlyphAttributes *tmpAttributes;
-    unsigned int *tmpLogClusters;
-
-    HB_Face face = item->face;
-
-    face->length = item->num_glyphs;
-
-    HB_Buffer_clear(face->buffer);
-
-    tmpAttributes = (HB_GlyphAttributes *) realloc(face->tmpAttributes, face->length*sizeof(HB_GlyphAttributes));
-    if (!tmpAttributes)
-        return false;
-    face->tmpAttributes = tmpAttributes;
-
-    tmpLogClusters = (unsigned int *) realloc(face->tmpLogClusters, face->length*sizeof(unsigned int));
-    if (!tmpLogClusters)
-        return false;
-    face->tmpLogClusters = tmpLogClusters;
-
-    for (int i = 0; i < face->length; ++i) {
-        HB_Buffer_add_glyph(face->buffer, item->glyphs[i], properties ? properties[i] : 0, i);
-        face->tmpAttributes[i] = item->attributes[i];
-        face->tmpLogClusters[i] = item->log_clusters[i];
-    }
-
-#ifdef OT_DEBUG
-    DEBUG("-----------------------------------------");
-//     DEBUG("log clusters before shaping:");
-//     for (int j = 0; j < length; j++)
-//         DEBUG("    log[%d] = %d", j, item->log_clusters[j]);
-    DEBUG("original glyphs: %p", item->glyphs);
-    for (int i = 0; i < length; ++i)
-        DEBUG("   glyph=%4x", hb_buffer->in_string[i].gindex);
-//     dump_string(hb_buffer);
-#endif
-
-    face->glyphs_substituted = false;
-    if (face->gsub) {
-        unsigned int error = HB_GSUB_Apply_String(face->gsub, face->buffer);
-        if (error && error != HB_Err_Not_Covered)
-            return false;
-        face->glyphs_substituted = (error != HB_Err_Not_Covered);
-    }
-
-#ifdef OT_DEBUG
-//     DEBUG("log clusters before shaping:");
-//     for (int j = 0; j < length; j++)
-//         DEBUG("    log[%d] = %d", j, item->log_clusters[j]);
-    DEBUG("shaped glyphs:");
-    for (int i = 0; i < length; ++i)
-        DEBUG("   glyph=%4x", hb_buffer->in_string[i].gindex);
-    DEBUG("-----------------------------------------");
-//     dump_string(hb_buffer);
-#endif
-
-    return true;
-}
-
-HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters)
-{
-    HB_Face face = item->face;
-
-    bool glyphs_positioned = false;
-    if (face->gpos) {
-        if (face->buffer->positions)
-            memset(face->buffer->positions, 0, face->buffer->in_length*sizeof(HB_PositionRec));
-        // #### check that passing "false,false" is correct
-        glyphs_positioned = HB_GPOS_Apply_String(item->font, face->gpos, face->current_flags, face->buffer, false, false) != HB_Err_Not_Covered;
-    }
-
-    if (!face->glyphs_substituted && !glyphs_positioned) {
-        HB_GetGlyphAdvances(item);
-        return true; // nothing to do for us
-    }
-
-    // make sure we have enough space to write everything back
-    if (availableGlyphs < (int)face->buffer->in_length) {
-        item->num_glyphs = face->buffer->in_length;
-        return false;
-    }
-
-    HB_Glyph *glyphs = item->glyphs;
-    HB_GlyphAttributes *attributes = item->attributes;
-
-    for (unsigned int i = 0; i < face->buffer->in_length; ++i) {
-        glyphs[i] = face->buffer->in_string[i].gindex;
-        attributes[i] = face->tmpAttributes[face->buffer->in_string[i].cluster];
-        if (i && face->buffer->in_string[i].cluster == face->buffer->in_string[i-1].cluster)
-            attributes[i].clusterStart = false;
-    }
-    item->num_glyphs = face->buffer->in_length;
-
-    if (doLogClusters && face->glyphs_substituted) {
-        // we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper.
-        unsigned short *logClusters = item->log_clusters;
-        int clusterStart = 0;
-        int oldCi = 0;
-        // #### the reconstruction of the logclusters currently does not work if the original string
-        // contains surrogate pairs
-        for (unsigned int i = 0; i < face->buffer->in_length; ++i) {
-            int ci = face->buffer->in_string[i].cluster;
-            //         DEBUG("   ci[%d] = %d mark=%d, cmb=%d, cs=%d",
-            //                i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart);
-            if (!attributes[i].mark && attributes[i].clusterStart && ci != oldCi) {
-                for (int j = oldCi; j < ci; j++)
-                    logClusters[j] = clusterStart;
-                clusterStart = i;
-                oldCi = ci;
-            }
-        }
-        for (int j = oldCi; j < face->length; j++)
-            logClusters[j] = clusterStart;
-    }
-
-    // calulate the advances for the shaped glyphs
-//     DEBUG("unpositioned: ");
-
-    // positioning code:
-    if (glyphs_positioned) {
-        HB_GetGlyphAdvances(item);
-        HB_Position positions = face->buffer->positions;
-        HB_Fixed *advances = item->advances;
-
-//         DEBUG("positioned glyphs:");
-        for (unsigned int i = 0; i < face->buffer->in_length; i++) {
-//             DEBUG("    %d:\t orig advance: (%d/%d)\tadv=(%d/%d)\tpos=(%d/%d)\tback=%d\tnew_advance=%d", i,
-//                    glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(),
-//                    (int)(positions[i].x_advance >> 6), (int)(positions[i].y_advance >> 6),
-//                    (int)(positions[i].x_pos >> 6), (int)(positions[i].y_pos >> 6),
-//                    positions[i].back, positions[i].new_advance);
-
-            HB_Fixed adjustment = positions[i].x_advance;
-
-            if (!(face->current_flags & HB_ShaperFlag_UseDesignMetrics))
-                adjustment = HB_FIXED_ROUND(adjustment);
-
-            if (positions[i].new_advance) {
-                ; //advances[i] = adjustment;
-            } else {
-                advances[i] += adjustment;
-            }
-
-            int back = 0;
-            HB_FixedPoint *offsets = item->offsets;
-            offsets[i].x = positions[i].x_pos;
-            offsets[i].y = positions[i].y_pos;
-            while (positions[i - back].back) {
-                back += positions[i - back].back;
-                offsets[i].x += positions[i - back].x_pos;
-                offsets[i].y += positions[i - back].y_pos;
-            }
-            offsets[i].y = -offsets[i].y;
-
-            if (item->item.bidiLevel % 2) {
-                // ### may need to go back multiple glyphs like in ltr
-                back = positions[i].back;
-                while (back--)
-                    offsets[i].x -= advances[i-back];
-            } else {
-                back = 0;
-                while (positions[i - back].back) {
-                    back += positions[i - back].back;
-                    offsets[i].x -= advances[i-back];
-                }
-            }
-//             DEBUG("   ->\tadv=%d\tpos=(%d/%d)",
-//                    glyphs[i].advance.x.toInt(), glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt());
-        }
-        item->kerning_applied = face->has_opentype_kerning;
-    } else {
-        HB_HeuristicPosition(item);
-    }
-
-#ifdef OT_DEBUG
-    if (doLogClusters) {
-        DEBUG("log clusters after shaping:");
-        for (int j = 0; j < length; j++)
-            DEBUG("    log[%d] = %d", j, item->log_clusters[j]);
-    }
-    DEBUG("final glyphs:");
-    for (int i = 0; i < (int)hb_buffer->in_length; ++i)
-        DEBUG("   glyph=%4x char_index=%d mark: %d cmp: %d, clusterStart: %d advance=%d/%d offset=%d/%d",
-               glyphs[i].glyph, hb_buffer->in_string[i].cluster, glyphs[i].attributes.mark,
-               glyphs[i].attributes.combiningClass, glyphs[i].attributes.clusterStart,
-               glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(),
-               glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt());
-    DEBUG("-----------------------------------------");
-#endif
-    return true;
-}
-
-HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
-{
-    HB_Bool result = false;
-    if (shaper_item->num_glyphs < shaper_item->item.length) {
-        shaper_item->num_glyphs = shaper_item->item.length;
-        return false;
-    }
-    assert(shaper_item->item.script < HB_ScriptCount);
-    if (!shaper_item->ufuncs)
-        shaper_item->ufuncs = hb_unicode_funcs_get_default ();
-    result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item);
-    shaper_item->glyphIndicesPresent = false;
-    return result;
-}
diff --git a/src/hb-old/harfbuzz-shaper.h b/src/hb-old/harfbuzz-shaper.h
deleted file mode 100644
index 8aa86d9..0000000
--- a/src/hb-old/harfbuzz-shaper.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_SHAPER_H
-#define HARFBUZZ_SHAPER_H
-
-#include "harfbuzz-global.h"
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-gpos.h"
-#include "harfbuzz-gsub.h"
-#include "harfbuzz-external.h"
-#include "harfbuzz-stream-private.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-/*
-   using anything else than signed or unsigned for bitfields in C is non standard,
-   but accepted by almost all compilers. And it gives a significant reduction in
-   memory consumption as HB_CharAttributes and HB_GlyphAttributes will not have
-   a 4 byte alignment
-*/
-#ifdef  __xlC__
-typedef unsigned hb_bitfield;
-#else
-typedef hb_uint8 hb_bitfield;
-#endif
-
-typedef enum {
-        HB_Script_Common,
-        HB_Script_Greek,
-        HB_Script_Cyrillic,
-        HB_Script_Armenian,
-        HB_Script_Hebrew,
-        HB_Script_Arabic,
-        HB_Script_Syriac,
-        HB_Script_Thaana,
-        HB_Script_Devanagari,
-        HB_Script_Bengali,
-        HB_Script_Gurmukhi,
-        HB_Script_Gujarati,
-        HB_Script_Oriya,
-        HB_Script_Tamil,
-        HB_Script_Telugu,
-        HB_Script_Kannada,
-        HB_Script_Malayalam,
-        HB_Script_Sinhala,
-        HB_Script_Thai,
-        HB_Script_Lao,
-        HB_Script_Tibetan,
-        HB_Script_Myanmar,
-        HB_Script_Georgian,
-        HB_Script_Hangul,
-        HB_Script_Ogham,
-        HB_Script_Runic,
-        HB_Script_Khmer,
-        HB_Script_Nko,
-        HB_Script_Inherited,
-        HB_ScriptCount = HB_Script_Inherited
-        /*
-        HB_Script_Latin = Common,
-        HB_Script_Ethiopic = Common,
-        HB_Script_Cherokee = Common,
-        HB_Script_CanadianAboriginal = Common,
-        HB_Script_Mongolian = Common,
-        HB_Script_Hiragana = Common,
-        HB_Script_Katakana = Common,
-        HB_Script_Bopomofo = Common,
-        HB_Script_Han = Common,
-        HB_Script_Yi = Common,
-        HB_Script_OldItalic = Common,
-        HB_Script_Gothic = Common,
-        HB_Script_Deseret = Common,
-        HB_Script_Tagalog = Common,
-        HB_Script_Hanunoo = Common,
-        HB_Script_Buhid = Common,
-        HB_Script_Tagbanwa = Common,
-        HB_Script_Limbu = Common,
-        HB_Script_TaiLe = Common,
-        HB_Script_LinearB = Common,
-        HB_Script_Ugaritic = Common,
-        HB_Script_Shavian = Common,
-        HB_Script_Osmanya = Common,
-        HB_Script_Cypriot = Common,
-        HB_Script_Braille = Common,
-        HB_Script_Buginese = Common,
-        HB_Script_Coptic = Common,
-        HB_Script_NewTaiLue = Common,
-        HB_Script_Glagolitic = Common,
-        HB_Script_Tifinagh = Common,
-        HB_Script_SylotiNagri = Common,
-        HB_Script_OldPersian = Common,
-        HB_Script_Kharoshthi = Common,
-        HB_Script_Balinese = Common,
-        HB_Script_Cuneiform = Common,
-        HB_Script_Phoenician = Common,
-        HB_Script_PhagsPa = Common,
-        */
-} HB_Script;
-
-typedef struct
-{
-    hb_uint32 pos;
-    hb_uint32 length;
-    HB_Script script;
-    hb_uint8 bidiLevel;
-} HB_ScriptItem;
-
-
-typedef enum {
-    HB_LeftToRight = 0,
-    HB_RightToLeft = 1
-} HB_StringToGlyphsFlags;
-
-typedef enum {
-    HB_ShaperFlag_Default = 0,
-    HB_ShaperFlag_NoKerning = 1,
-    HB_ShaperFlag_UseDesignMetrics = 2
-} HB_ShaperFlag;
-
-/* 
-   highest value means highest priority for justification. Justification is done by first inserting kashidas
-   starting with the highest priority positions, then stretching spaces, afterwards extending inter char
-   spacing, and last spacing between arabic words.
-   NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics.
-*/
-typedef enum {
-    HB_NoJustification= 0,   /* Justification can't be applied after this glyph */
-    HB_Arabic_Space   = 1,   /* This glyph represents a space inside arabic text */
-    HB_Character      = 2,   /* Inter-character justification point follows this glyph */
-    HB_Space          = 4,   /* This glyph represents a blank outside an Arabic run */
-    HB_Arabic_Normal  = 7,   /* Normal Middle-Of-Word glyph that connects to the right (begin) */
-    HB_Arabic_Waw     = 8,   /* Next character is final form of Waw/Ain/Qaf/Fa */
-    HB_Arabic_BaRa    = 9,   /* Next two chars are Ba + Ra/Ya/AlefMaksura */
-    HB_Arabic_Alef    = 10,  /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */
-    HB_Arabic_HaaDal  = 11,  /* Next character is final form of Haa/Dal/Taa Marbutah */
-    HB_Arabic_Seen    = 12,  /* Initial or Medial form Of Seen/Sad */
-    HB_Arabic_Kashida = 13   /* Kashida(U+640) in middle of word */
-} HB_JustificationClass;
-
-/* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep
- * it like that. If this is a problem please tell Trolltech :)
- */
-typedef struct {
-    hb_bitfield justification   :4;  /* Justification class */
-    hb_bitfield clusterStart    :1;  /* First glyph of representation of cluster */
-    hb_bitfield mark            :1;  /* needs to be positioned around base char */
-    hb_bitfield zeroWidth       :1;  /* ZWJ, ZWNJ etc, with no width */
-    hb_bitfield dontPrint       :1;
-    hb_bitfield combiningClass  :8;
-} HB_GlyphAttributes;
-
-typedef struct HB_FaceRec_ {
-    HB_Bool isSymbolFont;
-
-    HB_GDEF gdef;
-    HB_GSUB gsub;
-    HB_GPOS gpos;
-    HB_Bool supported_scripts[HB_ScriptCount];
-    HB_Buffer buffer;
-    HB_Script current_script;
-    int current_flags; /* HB_ShaperFlags */
-    HB_Bool has_opentype_kerning;
-    HB_Bool glyphs_substituted;
-    HB_GlyphAttributes *tmpAttributes;
-    unsigned int *tmpLogClusters;
-    int length;
-    int orig_nglyphs;
-} HB_FaceRec;
-
-typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
-
-HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc);
-void HB_FreeFace(HB_Face face);
-
-typedef struct {
-    HB_Fixed x, y;
-    HB_Fixed width, height;
-    HB_Fixed xOffset, yOffset;
-} HB_GlyphMetrics;
-
-typedef enum {
-    HB_FontAscent
-} HB_FontMetric;
-
-typedef struct {
-    HB_Bool  (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
-    void     (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
-    HB_Bool  (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
-    /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
-    HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
-    void     (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
-    HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
-} HB_FontClass;
-
-typedef struct HB_Font_ {
-    const HB_FontClass *klass;
-
-    /* Metrics */
-    HB_UShort x_ppem, y_ppem;
-    HB_16Dot16 x_scale, y_scale;
-
-    void *userData;
-} HB_FontRec;
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-typedef struct HB_ShaperItem_ HB_ShaperItem;
-
-struct HB_ShaperItem_ {
-    hb_unicode_funcs_t *ufuncs;
-    const HB_UChar16 *string;               /* input: the Unicode UTF16 text to be shaped */
-    hb_uint32 stringLength;                 /* input: the length of the input in 16-bit words */
-    HB_ScriptItem item;                     /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
-    HB_Font font;                           /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
-    HB_Face face;                           /* input: the shaper state; current script, access to the OpenType tables , etc. */
-    int shaperFlags;                        /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
-    HB_Bool glyphIndicesPresent;            /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
-    hb_uint32 initialGlyphCount;            /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
-
-    hb_uint32 num_glyphs;                   /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
-                                            /* output: required capacity (may be larger than actual capacity) */
-
-    HB_Glyph *glyphs;                       /* output: <num_glyphs> indices of shaped glyphs */
-    HB_GlyphAttributes *attributes;         /* output: <num_glyphs> glyph attributes */
-    HB_Fixed *advances;                     /* output: <num_glyphs> advances */
-    HB_FixedPoint *offsets;                 /* output: <num_glyphs> offsets */
-    unsigned short *log_clusters;           /* output: for each output glyph, the index in the input of the start of its logical cluster */
-    /* XXX the discription for log_clusters is wrong.  It maps each input position to output glyph position! */
-
-    /* internal */
-    HB_Bool kerning_applied;                /* output: true if kerning was applied by the shaper */
-};
-
-HB_Bool HB_ShapeItem(HB_ShaperItem *item);
-
-HB_END_HEADER
-
-#endif
diff --git a/src/hb-old/harfbuzz-stream-private.h b/src/hb-old/harfbuzz-stream-private.h
deleted file mode 100644
index fbd9f81..0000000
--- a/src/hb-old/harfbuzz-stream-private.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_STREAM_PRIVATE_H
-#define HARFBUZZ_STREAM_PRIVATE_H
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream.h"
-
-HB_BEGIN_HEADER
-
-HB_INTERNAL void
-_hb_close_stream( HB_Stream stream );
-
-HB_INTERNAL HB_Int
-_hb_stream_pos( HB_Stream stream );
-
-HB_INTERNAL HB_Error
-_hb_stream_seek( HB_Stream stream,
-                 HB_UInt   pos );
-
-HB_INTERNAL HB_Error
-_hb_stream_frame_enter( HB_Stream stream,
-                        HB_UInt   size );
-
-HB_INTERNAL void
-_hb_stream_frame_exit( HB_Stream stream );
-
-/* convenience macros */
-
-#define  SET_ERR(c)   ( (error = (c)) != 0 )
-
-#define  GOTO_Table(tag) (0)
-#define  FILE_Pos()      _hb_stream_pos( stream )
-#define  FILE_Seek(pos)  SET_ERR( _hb_stream_seek( stream, pos ) )
-#define  ACCESS_Frame(size)  SET_ERR( _hb_stream_frame_enter( stream, size ) )
-#define  FORGET_Frame()      _hb_stream_frame_exit( stream )
-
-#define  GET_Byte()      (*stream->cursor++)
-#define  GET_Short()     (stream->cursor += 2, (HB_Short)( \
-				(*(((HB_Byte*)stream->cursor)-2) << 8) | \
-				 *(((HB_Byte*)stream->cursor)-1) \
-			 ))
-#define  GET_Long()      (stream->cursor += 4, (HB_Int)( \
-				(*(((HB_Byte*)stream->cursor)-4) << 24) | \
-				(*(((HB_Byte*)stream->cursor)-3) << 16) | \
-				(*(((HB_Byte*)stream->cursor)-2) << 8) | \
-				 *(((HB_Byte*)stream->cursor)-1) \
-			 ))
-
-
-#define  GET_Char()      ((HB_Char)GET_Byte())
-#define  GET_UShort()    ((HB_UShort)GET_Short())
-#define  GET_ULong()     ((HB_UInt)GET_Long())
-#define  GET_Tag4()      GET_ULong()
-
-HB_END_HEADER
-
-#endif /* HARFBUZZ_STREAM_PRIVATE_H */
diff --git a/src/hb-old/harfbuzz-stream.c b/src/hb-old/harfbuzz-stream.c
deleted file mode 100644
index 2d9638f..0000000
--- a/src/hb-old/harfbuzz-stream.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2005  David Turner
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2007  Red Hat, Inc.
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#include "harfbuzz-impl.h"
-#include "harfbuzz-stream-private.h"
-#include <stdlib.h>
-
-#if 0
-#include <stdio.h>
-#define  LOG(x)  _hb_log x
-
-static void
-_hb_log( const char*   format, ... )
-{
-  va_list  ap;
- 
-  va_start( ap, format );
-  vfprintf( stderr, format, ap );
-  va_end( ap );
-}
-
-#else
-#define  LOG(x)  do {} while (0)
-#endif
-
-HB_INTERNAL void
-_hb_close_stream( HB_Stream stream )
-{
-  if (!stream)
-      return;
-  free(stream->base);
-  free(stream);
-}
-
-
-HB_INTERNAL HB_Int
-_hb_stream_pos( HB_Stream stream )
-{
-  LOG(( "_hb_stream_pos() -> %ld\n", stream->pos ));
-  return stream->pos;
-}
-
-
-HB_INTERNAL HB_Error
-_hb_stream_seek( HB_Stream stream,
-		 HB_UInt pos )
-{
-  HB_Error  error = (HB_Error)0;
-
-  stream->pos = pos;
-  if (pos > stream->size)
-      error = ERR(HB_Err_Read_Error);
-
-  LOG(( "_hb_stream_seek(%ld) -> 0x%04X\n", pos, error ));
-  return error;
-}
-
-
-HB_INTERNAL HB_Error
-_hb_stream_frame_enter( HB_Stream stream,
-			HB_UInt count )
-{
-  HB_Error  error = HB_Err_Ok;
-
-  /* check new position, watch for overflow */
-  if (HB_UNLIKELY (stream->pos + count > stream->size ||
-		   stream->pos + count < stream->pos))
-  {
-    error = ERR(HB_Err_Read_Error);
-    goto Exit;
-  }
-
-  /* set cursor */
-  stream->cursor = stream->base + stream->pos;
-  stream->pos   += count;
-
-Exit:
-  LOG(( "_hb_stream_frame_enter(%ld) -> 0x%04X\n", count, error ));
-  return error;
-}
-
-
-HB_INTERNAL void
-_hb_stream_frame_exit( HB_Stream stream )
-{
-  stream->cursor = NULL;
-
-  LOG(( "_hb_stream_frame_exit()\n" ));
-}
diff --git a/src/hb-old/harfbuzz-stream.h b/src/hb-old/harfbuzz-stream.h
deleted file mode 100644
index a155cc2..0000000
--- a/src/hb-old/harfbuzz-stream.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2005  David Turner
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_STREAM_H
-#define HARFBUZZ_STREAM_H
-
-#include "harfbuzz-global.h"
-
-HB_BEGIN_HEADER
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(push, 1)
-#endif
-
-typedef struct HB_StreamRec_
-{
-    HB_Byte*       base;
-    HB_Byte*       cursor;
-    HB_UInt        size;
-    HB_UInt        pos;
-} HB_StreamRec;
-
-#ifdef HB_USE_PACKED_STRUCTS
-#pragma pack(pop)
-#endif
-
-HB_END_HEADER
-
-#endif
diff --git a/src/hb-old/harfbuzz-tibetan.c b/src/hb-old/harfbuzz-tibetan.c
deleted file mode 100644
index 8b3e953..0000000
--- a/src/hb-old/harfbuzz-tibetan.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#include "harfbuzz-shaper.h"
-#include "harfbuzz-shaper-private.h"
-
-#include <assert.h>
-
-/*
- tibetan syllables are of the form:
-    head position consonant
-    first sub-joined consonant
-    ....intermediate sub-joined consonants (if any)
-    last sub-joined consonant
-    sub-joined vowel (a-chung U+0F71)
-    standard or compound vowel sign (or 'virama' for devanagari transliteration)
-*/
-
-typedef enum {
-    TibetanOther,
-    TibetanHeadConsonant,
-    TibetanSubjoinedConsonant,
-    TibetanSubjoinedVowel,
-    TibetanVowel
-} TibetanForm;
-
-/* this table starts at U+0f40 */
-static const unsigned char tibetanForm[0x80] = {
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant,
-    TibetanOther, TibetanOther, TibetanOther, TibetanOther,
-
-    TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel,
-    TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-    TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-    TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-
-    TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-    TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel,
-    TibetanOther, TibetanOther, TibetanOther, TibetanOther,
-    TibetanOther, TibetanOther, TibetanOther, TibetanOther,
-
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant,
-    TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther
-};
-
-
-#define tibetan_form(c) \
-    ((c) >= 0x0f40 && (c) < 0x0fc0 ? (TibetanForm)tibetanForm[(c) - 0x0f40] : TibetanOther)
-
-static const HB_OpenTypeFeature tibetan_features[] = {
-    { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty },
-    { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty },
-    { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty },
-    { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty },
-    {0, 0}
-};
-
-static HB_Bool tibetan_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid)
-{
-    hb_uint32 i;
-    const HB_UChar16 *str = item->string + item->item.pos;
-    int len = item->item.length;
-#ifndef NO_OPENTYPE
-    const int availableGlyphs = item->num_glyphs;
-#endif
-    HB_Bool haveGlyphs;
-    HB_STACKARRAY(HB_UChar16, reordered, len + 4);
-
-    if (item->num_glyphs < item->item.length + 4) {
-        item->num_glyphs = item->item.length + 4;
-        HB_FREE_STACKARRAY(reordered);
-        return FALSE;
-    }
-
-    if (invalid) {
-        *reordered = 0x25cc;
-        memcpy(reordered+1, str, len*sizeof(HB_UChar16));
-        len++;
-        str = reordered;
-    }
-
-    haveGlyphs = item->font->klass->convertStringToGlyphIndices(item->font,
-                                                                str, len,
-                                                                item->glyphs, &item->num_glyphs,
-                                                                item->item.bidiLevel % 2);
-
-    HB_FREE_STACKARRAY(reordered);
-
-    if (!haveGlyphs)
-        return FALSE;
-
-    for (i = 0; i < item->item.length; i++) {
-        item->attributes[i].mark = FALSE;
-        item->attributes[i].clusterStart = FALSE;
-        item->attributes[i].justification = 0;
-        item->attributes[i].zeroWidth = FALSE;
-/*        IDEBUG("    %d: %4x", i, str[i]); */
-    }
-
-    /* now we have the syllable in the right order, and can start running it through open type. */
-
-#ifndef NO_OPENTYPE
-    if (openType) {
-        HB_OpenTypeShape(item, /*properties*/0);
-        if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE))
-            return FALSE;
-    } else {
-        HB_HeuristicPosition(item);
-    }
-#endif
-
-    item->attributes[0].clusterStart = TRUE;
-    return TRUE;
-}
-
-
-static int tibetan_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid)
-{
-    const HB_UChar16 *uc = s + start;
-
-    int pos = 0;
-    TibetanForm state = tibetan_form(*uc);
-
-/*     qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/
-    pos++;
-
-    if (state != TibetanHeadConsonant) {
-        if (state != TibetanOther)
-            *invalid = TRUE;
-        goto finish;
-    }
-
-    while (pos < end - start) {
-        TibetanForm newState = tibetan_form(uc[pos]);
-        switch(newState) {
-        case TibetanSubjoinedConsonant:
-        case TibetanSubjoinedVowel:
-            if (state != TibetanHeadConsonant &&
-                 state != TibetanSubjoinedConsonant)
-                goto finish;
-            state = newState;
-            break;
-        case TibetanVowel:
-            if (state != TibetanHeadConsonant &&
-                 state != TibetanSubjoinedConsonant &&
-                 state != TibetanSubjoinedVowel)
-                goto finish;
-            break;
-        case TibetanOther:
-        case TibetanHeadConsonant:
-            goto finish;
-        }
-        pos++;
-    }
-
-finish:
-    *invalid = FALSE;
-    return start+pos;
-}
-
-HB_Bool HB_TibetanShape(HB_ShaperItem *item)
-{
-
-    HB_Bool openType = FALSE;
-    unsigned short *logClusters = item->log_clusters;
-
-    HB_ShaperItem syllable = *item;
-    int first_glyph = 0;
-
-    int sstart = item->item.pos;
-    int end = sstart + item->item.length;
-
-    assert(item->item.script == HB_Script_Tibetan);
-
-#ifndef QT_NO_OPENTYPE
-    openType = HB_SelectScript(item, tibetan_features);
-#endif
-
-    while (sstart < end) {
-        HB_Bool invalid;
-        int i;
-        int send = tibetan_nextSyllableBoundary(item->string, sstart, end, &invalid);
-/*        IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart,
-                 invalid ? "TRUE" : "FALSE"); */
-        syllable.item.pos = sstart;
-        syllable.item.length = send-sstart;
-        syllable.glyphs = item->glyphs + first_glyph;
-        syllable.attributes = item->attributes + first_glyph;
-        syllable.offsets = item->offsets + first_glyph;
-        syllable.advances = item->advances + first_glyph;
-        syllable.num_glyphs = item->num_glyphs - first_glyph;
-        if (!tibetan_shape_syllable(openType, &syllable, invalid)) {
-            item->num_glyphs += syllable.num_glyphs;
-            return FALSE;
-        }
-        /* fix logcluster array */
-        for (i = sstart; i < send; ++i)
-            logClusters[i-item->item.pos] = first_glyph;
-        sstart = send;
-        first_glyph += syllable.num_glyphs;
-    }
-    item->num_glyphs = first_glyph;
-    return TRUE;
-}
diff --git a/src/hb-old/harfbuzz.h b/src/hb-old/harfbuzz.h
deleted file mode 100644
index e91a33e..0000000
--- a/src/hb-old/harfbuzz.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 1998-2004  David Turner and Werner Lemberg
- * Copyright (C) 2006  Behdad Esfahbod
- *
- * This is part of HarfBuzz, an OpenType Layout engine library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HARFBUZZ_H
-#define HARFBUZZ_H
-
-#include "harfbuzz-external.h"
-#include "harfbuzz-global.h"
-#include "harfbuzz-buffer.h"
-#include "harfbuzz-gdef.h"
-#include "harfbuzz-gsub.h"
-#include "harfbuzz-gpos.h"
-#include "harfbuzz-open.h"
-#include "harfbuzz-shaper.h"
-
-#endif /* HARFBUZZ_OPEN_H */



More information about the HarfBuzz mailing list