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