aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepanshu Gupta <deepanshu@google.com>2014-05-30 08:31:06 -0700
committerDeepanshu Gupta <deepanshu@google.com>2014-05-30 08:31:06 -0700
commit910cfd519908eef792e4bb375135aa1599258949 (patch)
tree1fa49de77d453e0e3a6974ee52ed03cbac61975a
parentb63fac4ffb1101be501886bc1c9c79ae5795276c (diff)
parent62dd7b2a0e0ab1109b56572c568ef5f582d8a0fd (diff)
downloadfonttools-910cfd519908eef792e4bb375135aa1599258949.tar.gz
Merge https://github.com/behdad/fonttoolsandroid-4.4w_r1kitkat-wear
Merge new changes from the above repository. It contains some essential bugfixes.
-rw-r--r--Lib/fontTools/cffLib.py4
-rw-r--r--Lib/fontTools/ttLib/__init__.py26
-rw-r--r--Lib/fontTools/ttLib/sfnt.py28
-rw-r--r--Lib/fontTools/ttLib/tables/_c_m_a_p.py41
-rw-r--r--Lib/fontTools/ttLib/tables/_k_e_r_n.py6
5 files changed, 34 insertions, 71 deletions
diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py
index e3715211..cd5a92f4 100644
--- a/Lib/fontTools/cffLib.py
+++ b/Lib/fontTools/cffLib.py
@@ -1,9 +1,5 @@
"""cffLib.py -- read/write tools for Adobe CFF fonts."""
-#
-# $Id: cffLib.py,v 1.34 2008-03-07 19:56:17 jvr Exp $
-#
-
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc import sstruct
diff --git a/Lib/fontTools/ttLib/__init__.py b/Lib/fontTools/ttLib/__init__.py
index 9879a4e1..546b3271 100644
--- a/Lib/fontTools/ttLib/__init__.py
+++ b/Lib/fontTools/ttLib/__init__.py
@@ -41,10 +41,6 @@ Dumping 'prep' table...
"""
-#
-# $Id: __init__.py,v 1.51 2009-02-22 08:55:00 pabs3 Exp $
-#
-
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
import os
@@ -970,3 +966,25 @@ def reorderFontTables(inFile, outFile, tableOrder=None, checkChecksums=False):
for tag in sortedTagList(tables, tableOrder):
writer[tag] = reader[tag]
writer.close()
+
+
+def maxPowerOfTwo(x):
+ """Return the highest exponent of two, so that
+ (2 ** exponent) <= x. Return 0 if x is 0.
+ """
+ exponent = 0
+ while x:
+ x = x >> 1
+ exponent = exponent + 1
+ return max(exponent - 1, 0)
+
+
+def getSearchRange(n, itemSize):
+ """Calculate searchRange, entrySelector, rangeShift.
+ """
+ # This stuff needs to be stored in the file, because?
+ exponent = maxPowerOfTwo(n)
+ searchRange = (2 ** exponent) * itemSize
+ entrySelector = exponent
+ rangeShift = max(0, n * itemSize - searchRange)
+ return searchRange, entrySelector, rangeShift
diff --git a/Lib/fontTools/ttLib/sfnt.py b/Lib/fontTools/ttLib/sfnt.py
index c6bc93a9..c65fd28d 100644
--- a/Lib/fontTools/ttLib/sfnt.py
+++ b/Lib/fontTools/ttLib/sfnt.py
@@ -15,6 +15,7 @@ a table's length chages you need to rewrite the whole file anyway.
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc import sstruct
+from fontTools.ttLib import getSearchRange
import struct
@@ -116,7 +117,7 @@ class SFNTWriter(object):
self.directorySize = sfntDirectorySize
self.DirectoryEntry = SFNTDirectoryEntry
- self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(numTables)
+ self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(numTables, 16)
self.nextTableOffset = self.directorySize + numTables * self.DirectoryEntry.formatSize
# clear out directory area
@@ -242,7 +243,7 @@ class SFNTWriter(object):
# Haven't debugged.
if self.DirectoryEntry != SFNTDirectoryEntry:
# Create a SFNT directory for checksum calculation purposes
- self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(self.numTables)
+ self.searchRange, self.entrySelector, self.rangeShift = getSearchRange(self.numTables, 16)
directory = sstruct.pack(sfntDirectoryFormat, self)
tables = sorted(self.tables.items())
for tag, entry in tables:
@@ -464,29 +465,6 @@ def calcChecksum(data):
return value
-def maxPowerOfTwo(x):
- """Return the highest exponent of two, so that
- (2 ** exponent) <= x
- """
- exponent = 0
- while x:
- x = x >> 1
- exponent = exponent + 1
- return max(exponent - 1, 0)
-
-
-def getSearchRange(n):
- """Calculate searchRange, entrySelector, rangeShift for the
- sfnt directory. 'n' is the number of tables.
- """
- # This stuff needs to be stored in the file, because?
- exponent = maxPowerOfTwo(n)
- searchRange = (2 ** exponent) * 16
- entrySelector = exponent
- rangeShift = n * 16 - searchRange
- return searchRange, entrySelector, rangeShift
-
-
if __name__ == "__main__":
import doctest
doctest.testmod()
diff --git a/Lib/fontTools/ttLib/tables/_c_m_a_p.py b/Lib/fontTools/ttLib/tables/_c_m_a_p.py
index fbfd2ee7..0519e78b 100644
--- a/Lib/fontTools/ttLib/tables/_c_m_a_p.py
+++ b/Lib/fontTools/ttLib/tables/_c_m_a_p.py
@@ -1,6 +1,7 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc.textTools import safeEval, readHex
+from fontTools.ttLib import getSearchRange
from fontTools.unicode import Unicode
from . import DefaultTable
import sys
@@ -694,35 +695,11 @@ class cmap_format_4(CmapSubtable):
getGlyphName = self.ttFont.getGlyphName
names = list(map(getGlyphName, gids ))
list(map(operator.setitem, [cmap]*lenCmap, charCodes, names))
-
-
-
- def setIDDelta(self, idDelta):
- # The lowest gid in glyphIndexArray, after subtracting idDelta, must be 1.
- # idDelta is a short, and must be between -32K and 32K
- # startCode can be between 0 and 64K-1, and the first glyph index can be between 1 and 64K-1
- # This means that we have a problem because we can need to assign to idDelta values
- # between -(64K-2) and 64K -1.
- # Since the final gi is reconstructed from the glyphArray GID by:
- # (short)finalGID = (gid + idDelta) % 0x10000),
- # we can get from a startCode of 0 to a final GID of 64 -1K by subtracting 1, and casting the
- # negative number to an unsigned short.
- # Similarly , we can get from a startCode of 64K-1 to a final GID of 1 by adding 2, because of
- # the modulo arithmetic.
-
- if idDelta > 0x7FFF:
- idDelta = idDelta - 0x10000
- elif idDelta < -0x7FFF:
- idDelta = idDelta + 0x10000
-
- return idDelta
def compile(self, ttFont):
if self.data:
return struct.pack(">HHH", self.format, self.length, self.language) + self.data
-
- from fontTools.ttLib.sfnt import maxPowerOfTwo
charCodes = list(self.cmap.keys())
lenCharCodes = len(charCodes)
@@ -787,8 +764,7 @@ class cmap_format_4(CmapSubtable):
for charCode in range(startCode[i], endCode[i] + 1):
indices.append(cmap[charCode])
if (indices == list(range(indices[0], indices[0] + len(indices)))):
- idDeltaTemp = self.setIDDelta(indices[0] - startCode[i])
- idDelta.append( idDeltaTemp)
+ idDelta.append((indices[0] - startCode[i]) % 0x10000)
idRangeOffset.append(0)
else:
# someone *definitely* needs to get killed.
@@ -798,22 +774,19 @@ class cmap_format_4(CmapSubtable):
idDelta.append(1) # 0xffff + 1 == (tadaa!) 0. So this end code maps to .notdef
idRangeOffset.append(0)
- # Insane.
+ # Insane.
segCount = len(endCode)
segCountX2 = segCount * 2
- maxExponent = maxPowerOfTwo(segCount)
- searchRange = 2 * (2 ** maxExponent)
- entrySelector = maxExponent
- rangeShift = 2 * segCount - searchRange
+ searchRange, entrySelector, rangeShift = getSearchRange(segCount, 2)
charCodeArray = array.array("H", endCode + [0] + startCode)
- idDeltaeArray = array.array("h", idDelta)
+ idDeltaArray = array.array("H", idDelta)
restArray = array.array("H", idRangeOffset + glyphIndexArray)
if sys.byteorder != "big":
charCodeArray.byteswap()
- idDeltaeArray.byteswap()
+ idDeltaArray.byteswap()
restArray.byteswap()
- data = charCodeArray.tostring() + idDeltaeArray.tostring() + restArray.tostring()
+ data = charCodeArray.tostring() + idDeltaArray.tostring() + restArray.tostring()
length = struct.calcsize(cmap_format_4_format) + len(data)
header = struct.pack(cmap_format_4_format, self.format, length, self.language,
diff --git a/Lib/fontTools/ttLib/tables/_k_e_r_n.py b/Lib/fontTools/ttLib/tables/_k_e_r_n.py
index 9fa9dd85..928298bc 100644
--- a/Lib/fontTools/ttLib/tables/_k_e_r_n.py
+++ b/Lib/fontTools/ttLib/tables/_k_e_r_n.py
@@ -1,6 +1,6 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
-from fontTools.ttLib import sfnt
+from fontTools.ttLib import getSearchRange
from fontTools.misc.textTools import safeEval, readHex
from fontTools.misc.fixedTools import fixedToFloat as fi2fl, floatToFixed as fl2fi
from . import DefaultTable
@@ -116,9 +116,7 @@ class KernTable_format_0(object):
def compile(self, ttFont):
nPairs = len(self.kernTable)
- entrySelector = sfnt.maxPowerOfTwo(nPairs)
- searchRange = (2 ** entrySelector) * 6
- rangeShift = (nPairs - (2 ** entrySelector)) * 6
+ searchRange, entrySelector, rangeShift = getSearchRange(nPairs, 6)
data = struct.pack(">HHHH", nPairs, searchRange, entrySelector, rangeShift)
# yeehee! (I mean, turn names into indices)