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