19d7dc222990efdab0681ce7c519ef3a73d3fd718Behdad Esfahbod# Copyright 2013 Google, Inc. All Rights Reserved. 29d7dc222990efdab0681ce7c519ef3a73d3fd718Behdad Esfahbod# 39d7dc222990efdab0681ce7c519ef3a73d3fd718Behdad Esfahbod# Google Author(s): Matt Fontaine 49d7dc222990efdab0681ce7c519ef3a73d3fd718Behdad Esfahbod 5b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 61ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import 730e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom fontTools.misc.py23 import * 88413c108d21e8cf0e9059bbfffde8d13f2616340Behdad Esfahbodfrom fontTools.misc import sstruct 930e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodfrom . import E_B_D_T_ 102b06aaa2a6bcd363c25fb0c43f6bb906906594bdBehdad Esfahbodfrom .BitmapGlyphMetrics import BigGlyphMetrics, bigGlyphMetricsFormat, SmallGlyphMetrics, smallGlyphMetricsFormat 112b06aaa2a6bcd363c25fb0c43f6bb906906594bdBehdad Esfahbodfrom .E_B_D_T_ import BitmapGlyph, BitmapPlusSmallMetricsMixin, BitmapPlusBigMetricsMixin 1230e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbodimport struct 13b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 14b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaineclass table_C_B_D_T_(E_B_D_T_.table_E_B_D_T_): 15b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 16b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine # Change the data locator table being referenced. 17b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine locatorName = 'CBLC' 18b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 19b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine # Modify the format class accessor for color bitmap use. 20b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def getImageFormatClass(self, imageFormat): 21b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine try: 22b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine return E_B_D_T_.table_E_B_D_T_.getImageFormatClass(self, imageFormat) 23b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine except KeyError: 24b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine return cbdt_bitmap_classes[imageFormat] 25b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 26b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine# Helper method for removing export features not supported by color bitmaps. 27b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine# Write data in the parent class will default to raw if an option is unsupported. 28b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontainedef _removeUnsupportedForColor(dataFunctions): 29b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataFunctions = dict(dataFunctions) 30b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine del dataFunctions['row'] 31b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine return dataFunctions 32b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 33b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaineclass ColorBitmapGlyph(BitmapGlyph): 34b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 35b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine fileExtension = '.png' 36b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine xmlDataFunctions = _removeUnsupportedForColor(BitmapGlyph.xmlDataFunctions) 37b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 38b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaineclass cbdt_bitmap_format_17(BitmapPlusSmallMetricsMixin, ColorBitmapGlyph): 39b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 40b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def decompile(self): 41b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine self.metrics = SmallGlyphMetrics() 42b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dummy, data = sstruct.unpack2(smallGlyphMetricsFormat, self.data, self.metrics) 43b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine (dataLen,) = struct.unpack(">L", data[:4]) 44b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine data = data[4:] 45b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 46b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine # For the image data cut it to the size specified by dataLen. 47b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine assert dataLen <= len(data), "Data overun in format 17" 48b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine self.imageData = data[:dataLen] 49b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 50b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def compile(self, ttFont): 51b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList = [] 52b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(sstruct.pack(smallGlyphMetricsFormat, self.metrics)) 53b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(struct.pack(">L", len(self.imageData))) 54b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(self.imageData) 5518316aa769566eeb6f3f4a6ed2685fa8f8e861c2Behdad Esfahbod return bytesjoin(dataList) 56b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 57b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaineclass cbdt_bitmap_format_18(BitmapPlusBigMetricsMixin, ColorBitmapGlyph): 58b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 59b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def decompile(self): 60b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine self.metrics = BigGlyphMetrics() 61b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dummy, data = sstruct.unpack2(bigGlyphMetricsFormat, self.data, self.metrics) 62b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine (dataLen,) = struct.unpack(">L", data[:4]) 63b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine data = data[4:] 64b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 65b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine # For the image data cut it to the size specified by dataLen. 66b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine assert dataLen <= len(data), "Data overun in format 18" 67b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine self.imageData = data[:dataLen] 68b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 69b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def compile(self, ttFont): 70b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList = [] 71b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(sstruct.pack(bigGlyphMetricsFormat, self.metrics)) 72b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(struct.pack(">L", len(self.imageData))) 73b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine dataList.append(self.imageData) 7418316aa769566eeb6f3f4a6ed2685fa8f8e861c2Behdad Esfahbod return bytesjoin(dataList) 75b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 76b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaineclass cbdt_bitmap_format_19(ColorBitmapGlyph): 77b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 78b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def decompile(self): 79b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine (dataLen,) = struct.unpack(">L", self.data[:4]) 80b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine data = self.data[4:] 81b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 82b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine assert dataLen <= len(data), "Data overun in format 19" 83b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine self.imageData = data[:dataLen] 84b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 85b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine def compile(self, ttFont): 86b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine return struct.pack(">L", len(self.imageData)) + self.imageData 87b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 88b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine# Dict for CBDT extended formats. 89b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontainecbdt_bitmap_classes = { 90b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 17: cbdt_bitmap_format_17, 91b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 18: cbdt_bitmap_format_18, 92b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine 19: cbdt_bitmap_format_19, 93b9ba77541323c56a8f88c96f16bb6e32279d975dMatt Fontaine} 94