def load(self): self.chars = {} # W0201 self.width = {} # W0201 self.advance = {} # W0201 self.offsets = {} # W0201 self.kerns = {} # W0201 self.default_kern = 0 # W0201 pages = {} with renpy.loader.load(self.filename) as f: for l in f: kind, args = parse_bmfont_line(l) if kind == "common": self.height = int(args["lineHeight"]) # W0201 self.baseline = int(args["base"]) # W0201 elif kind == "page": pages[int(args["id"])] = renpy.display.im.Image( args["file"]).load(unscaled=True) elif kind == "char": c = chr(int(args["id"])) x = int(args["x"]) y = int(args["y"]) w = int(args["width"]) h = int(args["height"]) xo = int(args["xoffset"]) yo = int(args["yoffset"]) xadvance = int(args["xadvance"]) page = int(args["page"]) ss = pages[page].subsurface((x, y, w, h)) ss = renpy.display.scale.surface_scale(ss) self.chars[c] = ss self.width[c] = w + xo self.advance[c] = xadvance self.offsets[c] = (xo, yo) elif kind == "kerning": first = chr(int(args["first"])) second = chr(int(args["second"])) self.kerns[first + second] = int(args["amount"]) if u'\u00a0' not in self.chars: self.chars[u'\u00a0'] = self.chars[u' '] self.width[u'\u00a0'] = self.width[u' '] self.advance[u'\u00a0'] = self.advance[u' '] self.offsets[u'\u00a0'] = self.offsets[u' '] self.chars[u'\u200b'] = renpy.display.pgrender.surface( (0, self.height), True) self.width[u'\u200b'] = 0 self.advance[u'\u200b'] = 0 self.offsets[u'\u200b'] = (0, 0)
def draw(self, target, xo, yo, color, glyphs, underline, strikethrough, black_color): if black_color is None: return for g in glyphs: if not g.width: continue c = chr(g.character) cxo, cyo = self.offsets[c] x = g.x + xo + cxo y = g.y + yo + cyo - g.ascent char_surf = self.chars[c] if renpy.config.recolor_sfonts: if color != WHITE or black_color != BLACK: new_surf = renpy.display.pgrender.surface( char_surf.get_size(), True) renpy.display.module.twomap(char_surf, new_surf, color, black_color) char_surf = new_surf target.blit(char_surf, (x, y))
def load(self): self.chars = { } # W0201 self.width = { } # W0201 self.advance = { } # W0201 self.offsets = { } # W0201 # Load in the image. surf = renpy.display.im.Image(self.filename).load(unscaled=True) # Parse the xml file. with renpy.loader.load(self.xml) as f: tree = etree.fromstring(f.read()) height = 0 # Find each character. for e in tree.findall("char"): char = int(e.attrib["id"]) if char < 0: continue c = chr(char) x = int(e.attrib["x"]) y = int(e.attrib["y"]) w = int(e.attrib["width"]) h = int(e.attrib["height"]) ss = surf.subsurface((x, y, w, h)) ss = renpy.display.scale.surface_scale(ss) self.chars[c] = ss self.width[c] = w self.advance[c] = w self.offsets[c] = (0, 0) height = max(height, h) self.height = height # W0201 self.baseline = height # W0201 # Create space characters. if u' ' not in self.chars: self.chars[u' '] = renpy.display.pgrender.surface((self.spacewidth, height), True) self.width[u' '] = self.spacewidth self.advance[u' '] = self.spacewidth self.offsets[u' '] = (0, 0) if u'\u00a0' not in self.chars: self.chars[u'\u00a0'] = self.chars[u' '] self.width[u'\u00a0'] = self.width[u' '] self.advance[u'\u00a0'] = self.advance[u' '] self.offsets[u'\u00a0'] = self.offsets[u' '] self.chars[u'\u200b'] = renpy.display.pgrender.surface((0, height), True) self.width[u'\u200b'] = 0 self.advance[u'\u200b'] = 0 self.offsets[u'\u200b'] = (0, 0)
def name(self): c = self.u16() rv = u"" for _i in range(c): rv += chr(self.u16()) return rv
def segment(self, s): """ Segments `s` into fonts. Generates (font, string) tuples. """ mark = 0 pos = 0 font = None old_font = None if self.char_map: s = [ord(i) for i in s] s = "".join(chr(self.char_map.get(i, i)) for i in s) for i, c in enumerate(s): n = ord(c) font = self.map.get(ord(c), None) if font is None: font = self.map.get(None, None) if font is None: raise Exception( "Character U+{0:04x} not found in FontGroup".format(n)) if font != old_font: if pos: yield old_font, s[mark:pos] old_font = font mark = pos pos += 1 if font is not None: yield font, s[mark:]