• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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