diff options
author | Deepanshu Gupta <deepanshu@google.com> | 2014-05-30 08:31:06 -0700 |
---|---|---|
committer | Deepanshu Gupta <deepanshu@google.com> | 2014-05-30 08:31:06 -0700 |
commit | 910cfd519908eef792e4bb375135aa1599258949 (patch) | |
tree | 1fa49de77d453e0e3a6974ee52ed03cbac61975a | |
parent | b63fac4ffb1101be501886bc1c9c79ae5795276c (diff) | |
parent | 62dd7b2a0e0ab1109b56572c568ef5f582d8a0fd (diff) | |
download | fonttools-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.py | 4 | ||||
-rw-r--r-- | Lib/fontTools/ttLib/__init__.py | 26 | ||||
-rw-r--r-- | Lib/fontTools/ttLib/sfnt.py | 28 | ||||
-rw-r--r-- | Lib/fontTools/ttLib/tables/_c_m_a_p.py | 41 | ||||
-rw-r--r-- | Lib/fontTools/ttLib/tables/_k_e_r_n.py | 6 |
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) |