From a772c9a2e2c40abdc52aa266fc67b4ecfaa3ea00 Mon Sep 17 00:00:00 2001
From: Vivien Nicolas <21@vingtetun.org>
Date: Wed, 22 Jun 2011 11:25:00 +0200
Subject: [PATCH] Fill more gaps for Format 6 dense array

---
 fonts.js | 50 ++++++++++++++++++++++++--------------------------
 1 file changed, 24 insertions(+), 26 deletions(-)

diff --git a/fonts.js b/fonts.js
index ded1b70c2..a008dfce0 100644
--- a/fonts.js
+++ b/fonts.js
@@ -427,39 +427,37 @@ var Font = (function () {
             var firstCode = FontsUtils.bytesToInteger(font.getBytes(2));
             var entryCount = FontsUtils.bytesToInteger(font.getBytes(2));
 
-            // Since Format 6 is a dense array, check for gaps in the indexes
-            // to fill them later if needed
-            var gaps = [];
-            for (var j = 1; j <= entryCount; j++)
-              gaps.push(j);
-
-            var encoding = properties.encoding;
             var glyphs = [];
+            var min = 0xffff, max = 0;
             for (var j = 0; j < entryCount; j++) {
               var charcode = FontsUtils.bytesToInteger(font.getBytes(2));
-              var index = gaps.indexOf(charcode);
-              if (index != -1)
-                gaps.splice(index, 1);
+              glyphs.push(charcode);
 
-              glyphs.push({unicode: charcode + firstCode});
+              if (charcode < min)
+                min = charcode;
+              if (charcode > max)
+                max = charcode;
             }
 
-            while (gaps.length)
-              glyphs.push({unicode: gaps.pop() + firstCode });
-
-            var ranges = getRanges(glyphs);
-
-            var pos = firstCode;
-            var bias = 1;
-            for (var j = 0; j < ranges.length; j++) {
-              var range = ranges[j];
-              var start = range[0];
-              var end = range[1];
-              for (var k = start; k < end; k++) {
-                encoding[pos] = glyphs[pos - firstCode].unicode;
-                pos++;
-              }
+            // Since Format 6 is a dense array, check for gaps
+            for (var j = min; j < max; j++) {
+              if (glyphs.indexOf(j) == -1)
+                glyphs.push(j);
             }
+
+            for (var j = 0; j < glyphs.length; j++)
+              glyphs[j] = { unicode: glyphs[j] + firstCode };
+
+            var ranges= getRanges(glyphs);
+            assert(ranges.length == 1, "Got " + ranges.length + " ranges in a dense array");
+
+            var encoding = properties.encoding;
+            var denseRange = ranges[0];
+            var start = denseRange[0];
+            var end = denseRange[1];
+            var index = firstCode;
+            for (var j = start; j <= end; j++)
+              encoding[index++] = glyphs[j - firstCode - 1].unicode;
             cmap.data = createCMapTable(glyphs);
           }
         }