.circleci/config.yml            |   13 ++++
 src/Makefile.sources            |    2 
 src/dev-run.sh                  |    5 +
 src/hb-aat-layout-fmtx-table.hh |   67 ++++++++++++++++++++++
 src/hb-aat-layout-kerx-table.hh |    4 -
 src/hb-aat-layout-ltag-table.hh |   80 +++++++++++++++++++++++++++
 src/hb-aat-layout-morx-table.hh |    4 -
 src/hb-aat-layout.cc            |    4 +
 src/hb-directwrite.cc           |  118 +++++++++++++++-------------------------
 9 files changed, 219 insertions(+), 78 deletions(-)

New commits:
commit 158f2810b2868c7398dc80cbb089b88a566ce99e
Author: Ebrahim Byagowi <ebra...@gnu.org>
Date:   Mon Mar 26 12:04:30 2018 +0430

    [aat/ltag] Implement the table parsing (#911)

diff --git a/src/Makefile.sources b/src/Makefile.sources
index cfd2b61a..abf1bf49 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -82,7 +82,9 @@ HB_OT_sources = \
        hb-aat-layout.cc \
        hb-aat-layout-common-private.hh \
        hb-aat-layout-ankr-table.hh \
+       hb-aat-layout-fmtx-table.hh \
        hb-aat-layout-kerx-table.hh \
+       hb-aat-layout-ltag-table.hh \
        hb-aat-layout-morx-table.hh \
        hb-aat-layout-trak-table.hh \
        hb-aat-layout-private.hh \
diff --git a/src/hb-aat-layout-fmtx-table.hh b/src/hb-aat-layout-fmtx-table.hh
index a1e5cfcd..4ce81d36 100644
--- a/src/hb-aat-layout-fmtx-table.hh
+++ b/src/hb-aat-layout-fmtx-table.hh
@@ -27,19 +27,19 @@
 
 #include "hb-aat-layout-common-private.hh"
 
-#define HB_AAT_TAG_FMTX HB_TAG('f','m','t','x')
+#define HB_AAT_TAG_fmtx HB_TAG('f','m','t','x')
 
 
 namespace AAT {
 
 
 /*
- * fmtx -- Font Metrics
+ * fmtx -- Font metrics
  */
 
 struct fmtx
 {
-  static const hb_tag_t tableTag = HB_AAT_TAG_FMTX;
+  static const hb_tag_t tableTag = HB_AAT_TAG_fmtx;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index ce7ca105..d0624ecc 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -31,7 +31,7 @@
 #include "hb-open-type-private.hh"
 #include "hb-aat-layout-common-private.hh"
 
-#define HB_AAT_TAG_KERX HB_TAG('k','e','r','x')
+#define HB_AAT_TAG_kerx HB_TAG('k','e','r','x')
 
 
 namespace AAT {
@@ -284,7 +284,7 @@ struct SubtableGlyphCoverageArray
 
 struct kerx
 {
-  static const hb_tag_t tableTag = HB_AAT_TAG_KERX;
+  static const hb_tag_t tableTag = HB_AAT_TAG_kerx;
 
   inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
   {
diff --git a/src/hb-aat-layout-ltag-table.hh b/src/hb-aat-layout-ltag-table.hh
new file mode 100644
index 00000000..62eaf203
--- /dev/null
+++ b/src/hb-aat-layout-ltag-table.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_LTAG_TABLE_HH
+#define HB_AAT_LAYOUT_LTAG_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_ltag HB_TAG('l','t','a','g')
+
+
+namespace AAT {
+
+struct FTStringRange
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      tag (base).sanitize (c, length));
+  }
+
+  protected:
+  OffsetTo<UnsizedArrayOf<HBUINT8> >
+               tag;    /* Offset from the start of the table to
+                          the beginning of the string */
+  HBUINT16     length; /* String length (in bytes) */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+/*
+ * ltag -- Language tags
+ */
+
+struct ltag
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_ltag;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      tagRanges.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32     version;/* Table version; currently 1 */
+  HBUINT32     flags;  /* Table flags; currently none defined */
+  ArrayOf<FTStringRange, HBUINT32>
+       tagRanges;      /* Range for each tag's string */
+  public:
+  DEFINE_SIZE_ARRAY (12, tagRanges);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_LTAG_TABLE_HH */
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 4cc28242..2ec25893 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -30,7 +30,7 @@
 #include "hb-open-type-private.hh"
 #include "hb-aat-layout-common-private.hh"
 
-#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x')
+#define HB_AAT_TAG_morx HB_TAG('m','o','r','x')
 
 
 namespace AAT {
@@ -677,7 +677,7 @@ struct Chain
 
 struct morx
 {
-  static const hb_tag_t tableTag = HB_AAT_TAG_MORX;
+  static const hb_tag_t tableTag = HB_AAT_TAG_morx;
 
   inline void apply (hb_aat_apply_context_t *c) const
   {
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 878cec64..ab743733 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -31,7 +31,7 @@
 #include "hb-aat-layout-common-private.hh"
 #include "hb-open-type-private.hh"
 
-#define HB_AAT_TAG_TRAK HB_TAG('t','r','a','k')
+#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
 
 
 namespace AAT {
@@ -135,7 +135,7 @@ struct TrackData
 
 struct trak
 {
-  static const hb_tag_t tableTag = HB_AAT_TAG_TRAK;
+  static const hb_tag_t tableTag = HB_AAT_TAG_trak;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index a22b270e..61792f92 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -33,6 +33,7 @@
 #include "hb-aat-layout-ankr-table.hh"
 #include "hb-aat-layout-fmtx-table.hh" // Just so we compile it; unused 
otherwise.
 #include "hb-aat-layout-kerx-table.hh"
+#include "hb-aat-layout-ltag-table.hh" // Just so we compile it; unused 
otherwise.
 #include "hb-aat-layout-morx-table.hh"
 #include "hb-aat-layout-trak-table.hh"
 
@@ -111,7 +112,7 @@ _get_trak (hb_face_t *face, hb_blob_t **blob = nullptr)
 // {
 //   OT::Sanitizer<AAT::morx> sanitizer;
 //   sanitizer.set_num_glyphs (face->get_num_glyphs ());
-//   hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table 
(HB_AAT_TAG_MORX));
+//   hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table 
(HB_AAT_TAG_morx));
 //   OT::Sanitizer<AAT::morx>::lock_instance (morx_blob);
 
 //   if (0)
commit 9eee38a55cdcbfd34b530dcc8defff84057a9eb2
Author: Ebrahim Byagowi <ebra...@gnu.org>
Date:   Sun Mar 25 23:56:02 2018 +0430

    [aat/fmtx] Implement the table parsing (#910)

diff --git a/src/hb-aat-layout-fmtx-table.hh b/src/hb-aat-layout-fmtx-table.hh
new file mode 100644
index 00000000..a1e5cfcd
--- /dev/null
+++ b/src/hb-aat-layout-fmtx-table.hh
@@ -0,0 +1,67 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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.
+ */
+
+#ifndef HB_AAT_LAYOUT_FMTX_TABLE_HH
+#define HB_AAT_LAYOUT_FMTX_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_FMTX HB_TAG('f','m','t','x')
+
+
+namespace AAT {
+
+
+/*
+ * fmtx -- Font Metrics
+ */
+
+struct fmtx
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_FMTX;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  FixedVersion<>version;               /* Version (set to 0x00020000). */
+  HBUINT32     glyphIndex;             /* The glyph whose points represent the 
metrics. */
+  HBUINT8      horizontalBefore;       /* Point number for the horizontal 
ascent. */
+  HBUINT8      horizontalAfter;        /* Point number for the horizontal 
descent. */
+  HBUINT8      horizontalCaretHead;    /* Point number for the horizontal 
caret head. */
+  HBUINT8      horizontalCaretBase;    /* Point number for the horizontal 
caret base. */
+  HBUINT8      verticalBefore;         /* Point number for the vertical 
ascent. */
+  HBUINT8      verticalAfter;          /* Point number for the vertical 
descent. */
+  HBUINT8      verticalCaretHead;      /* Point number for the vertical caret 
head. */
+  HBUINT8      verticalCaretBase;      /* Point number for the vertical caret 
base. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_FMTX_TABLE_HH */
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index ab743733..878cec64 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -31,7 +31,7 @@
 #include "hb-aat-layout-common-private.hh"
 #include "hb-open-type-private.hh"
 
-#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
+#define HB_AAT_TAG_TRAK HB_TAG('t','r','a','k')
 
 
 namespace AAT {
@@ -135,7 +135,7 @@ struct TrackData
 
 struct trak
 {
-  static const hb_tag_t tableTag = HB_AAT_TAG_trak;
+  static const hb_tag_t tableTag = HB_AAT_TAG_TRAK;
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index 45268e3e..a22b270e 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -31,6 +31,7 @@
 
 #include "hb-aat-layout-private.hh"
 #include "hb-aat-layout-ankr-table.hh"
+#include "hb-aat-layout-fmtx-table.hh" // Just so we compile it; unused 
otherwise.
 #include "hb-aat-layout-kerx-table.hh"
 #include "hb-aat-layout-morx-table.hh"
 #include "hb-aat-layout-trak-table.hh"
commit 1d3f4f835175c658c63e96be12052b80d27cf6fa
Author: Ebrahim Byagowi <ebra...@gnu.org>
Date:   Sun Mar 25 18:45:50 2018 +0430

    [ci] Add a build only apple-gcc-4.2 i686 bot

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 19beeeea..73d33271 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -15,6 +15,18 @@ jobs:
       - run: make 2>&1 | grep -v -e '^/var/folders/*' -e 
'^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*'
       - run: make check || .ci/fail.sh
 
+  macos-notest-apple-gcc-i686-4.2:
+    macos:
+      xcode: "8.3.3"
+    steps:
+      - checkout
+      - run: brew update-reset
+      - run: brew install wget pkg-config libtool ragel
+      - run: wget 
https://packages.macports.org/apple-gcc42/apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2
 && tar zxvf apple-gcc42-5666.3_15+universal.darwin_15.i386-x86_64.tbz2
+      - run: CPP=$PWD/opt/local/bin/i686-apple-darwin15-cpp-apple-4.2.1 
CC=$PWD/opt/local/bin/i686-apple-darwin15-gcc-apple-4.2.1 
CXX=$PWD/opt/local/bin/i686-apple-darwin15-g++-apple-4.2.1 ./autogen.sh
+      # Ignoring assembler complains, https://stackoverflow.com/a/39867021
+      - run: make 2>&1 | grep -v -e '^/var/folders/*' -e 
'^[[:space:]]*\.section' -e '^[[:space:]]*\^[[:space:]]*~*'
+
   distcheck:
     docker:
       - image: ubuntu:17.10
@@ -178,6 +190,7 @@ workflows:
     jobs:
       # macOS
       - macos-llvm-gcc-4.2
+      - macos-notest-apple-gcc-i686-4.2
 
       # both autotools and cmake
       - distcheck
commit fe18c471a4aee1f6eba62383b64f0a8969cbc6ea
Author: Ebrahim Byagowi <ebra...@gnu.org>
Date:   Sun Mar 25 18:19:23 2018 +0430

    [dwrite] minor

diff --git a/src/dev-run.sh b/src/dev-run.sh
index e7d0973b..82de6888 100755
--- a/src/dev-run.sh
+++ b/src/dev-run.sh
@@ -1,8 +1,9 @@
 #!/bin/bash
 # Suggested setup to use the script:
 #  (on the root of the project)
-#  $ NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject 
--with-cairo
-#  $ mkdir build && cd build && ../configure && make -j5 && cd ..
+#  $ NOCONFIGURE=1 ./autogen.sh && mkdir build && cd build
+#  $ ../configure --with-freetype --with-glib --with-gobject --with-cairo
+#  $ make -j5 && cd ..
 #  $ src/dev-run.sh [FONT-FILE] [TEXT]
 #
 # Or, using cmake:
diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc
index f1277277..3175fe05 100644
--- a/src/hb-directwrite.cc
+++ b/src/hb-directwrite.cc
@@ -1,4 +1,4 @@
-/*
+/*
  * Copyright © 2015-2018  Ebrahim Byagowi
  *
  *  This is part of HarfBuzz, a text shaping library.
@@ -71,7 +71,7 @@ public:
 
   // IDWriteFontFileLoader methods
   virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey (void const* 
fontFileReferenceKey,
-    UINT32 fontFileReferenceKeySize,
+    uint32_t fontFileReferenceKeySize,
     OUT IDWriteFontFileStream** fontFileStream)
   {
     *fontFileStream = mFontFileStream;
@@ -103,9 +103,8 @@ public:
     OUT void** fragmentContext)
   {
     // We are required to do bounds checking.
-    if (fileOffset + fragmentSize > mSize) {
+    if (fileOffset + fragmentSize > mSize)
       return E_FAIL;
-    }
 
     // truncate the 64 bit fileOffset to size_t sized index into mData
     size_t index = static_cast<size_t> (fileOffset);
@@ -135,7 +134,8 @@ public:
 * shaper face data
 */
 
-struct hb_directwrite_shaper_face_data_t {
+struct hb_directwrite_shaper_face_data_t
+{
   IDWriteFactory *dwriteFactory;
   IDWriteFontFile *fontFile;
   IDWriteFontFileStream *fontFileStream;
@@ -179,20 +179,16 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face)
     return nullptr; \
   } HB_STMT_END;
 
-  if (FAILED (hr)) {
+  if (FAILED (hr))
     FAIL ("Failed to load font file from data!");
-    return nullptr;
-  }
 
   BOOL isSupported;
   DWRITE_FONT_FILE_TYPE fileType;
   DWRITE_FONT_FACE_TYPE faceType;
-  UINT32 numberOfFaces;
+  uint32_t numberOfFaces;
   hr = fontFile->Analyze (&isSupported, &fileType, &faceType, &numberOfFaces);
-  if (FAILED (hr) || !isSupported) {
+  if (FAILED (hr) || !isSupported)
     FAIL ("Font file is not supported.");
-    return nullptr;
-  }
 
 #undef FAIL
 
@@ -217,7 +213,8 @@ _hb_directwrite_shaper_face_data_destroy 
(hb_directwrite_shaper_face_data_t *dat
     data->fontFace->Release ();
   if (data->fontFile)
     data->fontFile->Release ();
-  if (data->dwriteFactory) {
+  if (data->dwriteFactory)
+  {
     if (data->fontFileLoader)
       data->dwriteFactory->UnregisterFontFileLoader (data->fontFileLoader);
     data->dwriteFactory->Release ();
@@ -237,7 +234,8 @@ _hb_directwrite_shaper_face_data_destroy 
(hb_directwrite_shaper_face_data_t *dat
  * shaper font data
  */
 
-struct hb_directwrite_shaper_font_data_t {
+struct hb_directwrite_shaper_font_data_t
+{
 };
 
 hb_directwrite_shaper_font_data_t *
@@ -324,9 +322,11 @@ public:
     , mReadingDirection (readingDirection)
     , mCurrentRun (nullptr) { };
 
-  ~TextAnalysis () {
+  ~TextAnalysis ()
+  {
     // delete runs, except mRunHead which is part of the TextAnalysis object
-    for (Run *run = mRunHead.nextRun; run;) {
+    for (Run *run = mRunHead.nextRun; run;)
+    {
       Run *origRun = run;
       run = run->nextRun;
       delete origRun;
@@ -334,7 +334,8 @@ public:
   }
 
   STDMETHODIMP GenerateResults (IDWriteTextAnalyzer* textAnalyzer,
-    Run **runHead) {
+    Run **runHead)
+  {
     // Analyzes the text using the script analyzer and returns
     // the result as a series of runs.
 
@@ -350,9 +351,8 @@ public:
     mCurrentRun = &mRunHead;
 
     // Call each of the analyzers in sequence, recording their results.
-    if (SUCCEEDED (hr = textAnalyzer->AnalyzeScript (this, 0, mTextLength, 
this))) {
+    if (SUCCEEDED (hr = textAnalyzer->AnalyzeScript (this, 0, mTextLength, 
this)))
       *runHead = &mRunHead;
-    }
 
     return hr;
   }
@@ -363,12 +363,14 @@ public:
     OUT wchar_t const** textString,
     OUT uint32_t* textLength)
   {
-    if (textPosition >= mTextLength) {
+    if (textPosition >= mTextLength)
+    {
       // No text at this position, valid query though.
       *textString = nullptr;
       *textLength = 0;
     }
-    else {
+    else
+    {
       *textString = mText + textPosition;
       *textLength = mTextLength - textPosition;
     }
@@ -379,13 +381,15 @@ public:
     OUT wchar_t const** textString,
     OUT uint32_t* textLength)
   {
-    if (textPosition == 0 || textPosition > mTextLength) {
+    if (textPosition == 0 || textPosition > mTextLength)
+    {
       // Either there is no text before here (== 0), or this
       // is an invalid position. The query is considered valid though.
       *textString = nullptr;
       *textLength = 0;
     }
-    else {
+    else
+    {
       *textString = mText;
       *textLength = textPosition;
     }
@@ -458,14 +462,10 @@ protected:
     // Split the tail if needed (the length remaining is less than the
     // current run's size).
     if (*textLength < mCurrentRun->mTextLength)
-    {
       SplitCurrentRun (mCurrentRun->mTextStart + *textLength);
-    }
     else
-    {
       // Just advance the current run.
       mCurrentRun = mCurrentRun->nextRun;
-    }
     *textLength -= origRun->mTextLength;
 
     // Return a reference to the run that was just current.
@@ -480,17 +480,14 @@ protected:
     // corresponding run for the text position.
 
     if (mCurrentRun && mCurrentRun->ContainsTextPosition (textPosition))
-    {
       return;
-    }
 
-    for (Run *run = &mRunHead; run; run = run->nextRun) {
+    for (Run *run = &mRunHead; run; run = run->nextRun)
       if (run->ContainsTextPosition (textPosition))
       {
         mCurrentRun = run;
         return;
       }
-    }
     //NS_NOTREACHED ("We should always be able to find the text position in 
one \
             //                of our runs");
   }
@@ -592,25 +589,23 @@ _hb_directwrite_shape_full (hb_shape_plan_t    
*shape_plan,
       textString[chars_len++] = c;
     else if (unlikely (c > 0x10FFFFu))
       textString[chars_len++] = 0xFFFDu;
-    else {
+    else
+    {
       textString[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10);
       textString[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1u << 10) - 1));
     }
   }
 
   ALLOCATE_ARRAY (WORD, log_clusters, chars_len);
-  // if (num_features)
+  /* Need log_clusters to assign features. */
+  chars_len = 0;
+  for (unsigned int i = 0; i < buffer->len; i++)
   {
-    /* Need log_clusters to assign features. */
-    chars_len = 0;
-    for (unsigned int i = 0; i < buffer->len; i++)
-    {
-      hb_codepoint_t c = buffer->info[i].codepoint;
-      unsigned int cluster = buffer->info[i].cluster;
-      log_clusters[chars_len++] = cluster;
-      if (hb_in_range (c, 0x10000u, 0x10FFFFu))
-        log_clusters[chars_len++] = cluster; /* Surrogates. */
-    }
+    hb_codepoint_t c = buffer->info[i].codepoint;
+    unsigned int cluster = buffer->info[i].cluster;
+    log_clusters[chars_len++] = cluster;
+    if (hb_in_range (c, 0x10000u, 0x10FFFFu))
+      log_clusters[chars_len++] = cluster; /* Surrogates. */
   }
 
   // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES
@@ -638,10 +633,7 @@ _hb_directwrite_shape_full (hb_shape_plan_t    *shape_plan,
   } HB_STMT_END;
 
   if (FAILED (hr))
-  {
     FAIL ("Analyzer failed to generate results.");
-    return false;
-  }
 
   uint32_t maxGlyphCount = 3 * textLength / 2 + 16;
   uint32_t glyphCount;
@@ -654,21 +646,23 @@ _hb_directwrite_shape_full (hb_shape_plan_t    
*shape_plan,
       hb_language_to_string (buffer->props.language), 20);
   }
 
-  DWRITE_TYPOGRAPHIC_FEATURES singleFeatures;
-  singleFeatures.featureCount = num_features;
+  // TODO: it does work but doesn't care about ranges
+  DWRITE_TYPOGRAPHIC_FEATURES typographic_features;
+  typographic_features.featureCount = num_features;
   if (num_features)
   {
-    singleFeatures.features = new DWRITE_FONT_FEATURE[num_features];
+    typographic_features.features = new DWRITE_FONT_FEATURE[num_features];
     for (unsigned int i = 0; i < num_features; ++i)
     {
-      singleFeatures.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG)
+      typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG)
         hb_uint32_swap (features[i].tag);
-      singleFeatures.features[i].parameter = features[i].value;
+      typographic_features.features[i].parameter = features[i].value;
     }
   }
   const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures =
-    (const DWRITE_TYPOGRAPHIC_FEATURES*) &singleFeatures;
+    (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features;
   const uint32_t featureRangeLengths[] = { textLength };
+  //
 
   uint16_t* clusterMap = new uint16_t[textLength];
   DWRITE_SHAPING_TEXT_PROPERTIES* textProperties =
@@ -693,10 +687,7 @@ retry_getglyphs:
     goto retry_getglyphs;
   }
   if (FAILED (hr))
-  {
     FAIL ("Analyzer failed to get glyphs.");
-    return false;
-  }
 
   float* glyphAdvances = new float[maxGlyphCount];
   DWRITE_GLYPH_OFFSET* glyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount];
@@ -730,10 +721,7 @@ retry_getglyphs:
     glyphAdvances, glyphOffsets);
 
   if (FAILED (hr))
-  {
     FAIL ("Analyzer failed to get glyph placements.");
-    return false;
-  }
 
   IDWriteTextAnalyzer1* analyzer1;
   analyzer->QueryInterface (&analyzer1);
@@ -748,10 +736,7 @@ retry_getglyphs:
       glyphProperties, justificationOpportunities);
 
     if (FAILED (hr))
-    {
       FAIL ("Analyzer failed to get justification opportunities.");
-      return false;
-    }
 
     float* justifiedGlyphAdvances = new float[maxGlyphCount];
     DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new 
DWRITE_GLYPH_OFFSET[glyphCount];
@@ -759,18 +744,12 @@ retry_getglyphs:
       glyphAdvances, glyphOffsets, justifiedGlyphAdvances, 
justifiedGlyphOffsets);
 
     if (FAILED (hr))
-    {
       FAIL ("Analyzer failed to get justified glyph advances.");
-      return false;
-    }
 
     DWRITE_SCRIPT_PROPERTIES scriptProperties;
     hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties);
     if (FAILED (hr))
-    {
       FAIL ("Analyzer failed to get script properties.");
-      return false;
-    }
     uint32_t justificationCharacter = scriptProperties.justificationCharacter;
 
     // if a script justificationCharacter is not space, it can have 
GetJustifiedGlyphs
@@ -801,10 +780,7 @@ retry_getglyphs:
         goto retry_getjustifiedglyphs;
       }
       if (FAILED (hr))
-      {
         FAIL ("Analyzer failed to get justified glyphs.");
-        return false;
-      }
 
       delete [] clusterMap;
       delete [] glyphIndices;
@@ -896,7 +872,7 @@ retry_getglyphs:
   delete [] glyphOffsets;
 
   if (num_features)
-    delete [] singleFeatures.features;
+    delete [] typographic_features.features;
 
   /* Wow, done! */
   return true;
_______________________________________________
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to