from Tkinter import * class bmpFont: def __init__(self): self.fontWidth = 0 self.fontHeight = 0 self.glyphs = [] self.fillFont() return def chgColor(self, color): for g in self.glyphs: g.config(foreground=color) return def chgBackColor(self, color): for g in self.glyphs: g.config(background=color) def fillFont(self): """ Populate our glyphs creating bitmap images on the fly from the Photoimage passed in imgData. imgData needs to be a base64 string of a gif. The .gif image needs to be a 16x16 grid in ASCII order starting at 0. No padding between glyphs, so glyph width is imgData width / 16. Glyph height is imgData height / 16. White is transparent, any other is pixel data. """ self.glyphs = [] tmpPic = PhotoImage(data=self.fontData() ) glyphWidth = tmpPic.width() / 16 glyphHeight = tmpPic.height() / 16 yOffset = 0 for row in range(16): xOffset = 0 for col in range(16): tmpBmp = self.chopPic(tmpPic, xOffset, yOffset, glyphWidth, glyphHeight) self.glyphs.append(tmpBmp) xOffset = xOffset + glyphWidth yOffset = yOffset + glyphHeight self.fontWidth = glyphWidth self.fontHeight = glyphHeight return def chopPic(self, pImg, x0,y0,w,h): """ Given a TkInter photoimage pImg, x,y,w,h as ints, return a string representation of a Tkinter bitmapImage created from the data in pImg from (x,y) to (x+w, y+h) that has dimension w,h. NOTE: pImg must use white (255, 255, 255) for transparent, any other for foreground color. """ # first add the first bits... lcX11Data = """ #define im_width """ lcX11Data = lcX11Data + str(w) + """ #define im_height """ lcX11Data = lcX11Data + str(h) + """ static char im_bits[] = { """ # now add the actual data in hex strings lnCounter = 0 for y in range(h): # Now read across the row for bytes in range(0,w,8): lcBinStr = '' if bytes + 8 > w: xEnd = w else: xEnd = bytes + 8 for x in range(xEnd-1, bytes-1,-1): if pImg.get(x0 + x, y0 + y ) == '255 255 255': lcBinStr = lcBinStr + '0' else: lcBinStr = lcBinStr + '1' lcHexStr = str(hex(int(lcBinStr,2))) lcX11Data = lcX11Data + lcHexStr lcX11Data = lcX11Data + """,""" lnCounter = lnCounter + 1 # Add the last chunk lcX11Data = lcX11Data + """ }; """ # create a bitmap image using the data lcRetVal = BitmapImage(data= lcX11Data) return lcRetVal def fontData(self): return """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 OixLkz8N6gAUAAA7"""