Merge 99417 from klp-modular-dev-plus-aosp into lmp-preview-dev

Merge 99417194b394702484d8250736e95f524fd51fe2 into lmp-preview-dev
diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py
index e371521..cd5a92f 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 9879a4e..546b327 100644
--- a/Lib/fontTools/ttLib/__init__.py
+++ b/Lib/fontTools/ttLib/__init__.py
@@ -41,10 +41,6 @@
 
 """
 
-#
-# $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 @@
 	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 c6bc93a..c65fd28 100644
--- a/Lib/fontTools/ttLib/sfnt.py
+++ b/Lib/fontTools/ttLib/sfnt.py
@@ -15,6 +15,7 @@
 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 @@
 			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 @@
 		# 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 @@
 	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 fbfd2ee..0519e78 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 @@
 			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 @@
 			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 @@
 		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 9fa9dd8..928298b 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 @@
 	
 	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)