Exemple #1
0
    def __init__(self, sfnt):
        for table in (b'head', b'hhea', b'hmtx', b'cmap', b'OS/2', b'post',
                      b'name'):
            if table not in sfnt:
                raise UnsupportedFont('This font has no %s table'%table)
        self.sfnt = sfnt

        self.head = self.sfnt[b'head']
        hhea = self.sfnt[b'hhea']
        hhea.read_data(self.sfnt[b'hmtx'])
        self.ascent = hhea.ascender
        self.descent = hhea.descender
        self.bbox = (self.head.x_min, self.head.y_min, self.head.x_max,
                     self.head.y_max)
        self._advance_widths = hhea.advance_widths
        self.cmap = self.sfnt[b'cmap']
        self.units_per_em = self.head.units_per_em
        self.os2 = self.sfnt[b'OS/2']
        self.os2.read_data()
        self.post = self.sfnt[b'post']
        self.post.read_data()
        self.names = get_all_font_names(self.sfnt[b'name'].raw, raw_is_table=True)
        self.is_otf = 'CFF ' in self.sfnt.tables
        self._sig = hash(self.sfnt[b'name'].raw)

        # Metrics for embedding in PDF
        pdf_scale = self.pdf_scale = lambda x:int(round(x*1000./self.units_per_em))
        self.pdf_ascent, self.pdf_descent = map(pdf_scale,
                        (self.os2.typo_ascender, self.os2.typo_descender))
        self.pdf_bbox = tuple(map(pdf_scale, self.bbox))
        self.pdf_capheight = pdf_scale(getattr(self.os2, 'cap_height',
                                               self.os2.typo_ascender))
        self.pdf_avg_width = pdf_scale(self.os2.average_char_width)
        self.pdf_stemv = 50 + int((self.os2.weight_class / 65.0) ** 2)
Exemple #2
0
 def create_sfnt(self, text_item):
     get_table = partial(self.qt_hack.get_sfnt_table, text_item)
     try:
         ans = Font(Sfnt(get_table))
     except UnsupportedFont as e:
         raise UnsupportedFont('The font %s is not a valid sfnt. Error: %s'%(
             text_item.font().family(), e))
     glyph_map = self.qt_hack.get_glyph_map(text_item)
     gm = {}
     for uc, glyph_id in enumerate(glyph_map):
         if glyph_id not in gm:
             gm[glyph_id] = unichr(uc)
     ans.full_glyph_map = gm
     return ans
Exemple #3
0
 def create_sfnt(self, text_item):
     get_table = partial(self.qt_hack.get_sfnt_table, text_item)
     try:
         ans = Font(Sfnt(get_table))
     except UnsupportedFont as e:
         raise UnsupportedFont(
             'The font %s is not a valid sfnt. Error: %s' %
             (text_item.font().family(), e))
     glyph_map = self.qt_hack.get_glyph_map(text_item)
     gm = {}
     ans.ignore_glyphs = set()
     for uc, glyph_id in enumerate(glyph_map):
         if glyph_id not in gm:
             gm[glyph_id] = codepoint_to_chr(uc)
             if uc in (0xad, 0x200b):
                 ans.ignore_glyphs.add(glyph_id)
     ans.full_glyph_map = gm
     return ans