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