为了把宋体字库做到rockbox上,我用otf2bdf把字库转换成bdf格式,再用rockbox的工具把bdf转换成其特有的字库格式,可是没有办法预览bdf字库的转换效果,很麻烦。于是就写了这个简单的程序。

   1 # a BDF font viewer
   2 import sys, os
   3 import string
   4 from   wxPython.wx import *
   5 
   6 binstr=[
   7         "0000",
   8         "0001",
   9         "0010",
  10         "0011",
  11         "0100",
  12         "0101",
  13         "0110",
  14         "0111",
  15         "1000",
  16         "1001",
  17         "1010",
  18         "1011",
  19         "1100",
  20         "1101",
  21         "1110",
  22         "1111",
  23 ]
  24 
  25 fonts=[]
  26 
  27 def OpenFont(fontfilename):
  28     global fonts
  29     fontfile = open(fontfilename)
  30     fonts =[]
  31     ishex =0
  32     font = ""
  33     for line in fontfile:
  34         if line == "BITMAP\n":
  35             ishex=1
  36             continue
  37         if line == "ENDCHAR\n":
  38             ishex=0
  39             fonts.append(font)
  40             font=""
  41             continue
  42         if ishex:
  43             font += line
  44     fontfile.close()
  45     print len(fonts)
  46 
  47 class DrawPanel(wxPanel):
  48     def __init__(self, parent):
  49         wxPanel.__init__(self, parent, -1)
  50         self.SetBackgroundColour(wxWHITE)
  51         self.Bind(EVT_PAINT, self.OnPaint)
  52         self.fontStart=0
  53 
  54     def SetFontStart(self, start):
  55         self.fontStart = start
  56         self.Refresh()
  57 
  58     def DrawFont(self, id, x, y):
  59         font = fonts[id]
  60         hexlist = string.split(font, "\n")
  61         xx=x
  62         yy=y
  63         DC=wxPaintDC(self)
  64         DC.SetPen(wxBLACK_PEN)
  65         hexlist.reverse()
  66         for line in hexlist:
  67             for char in line:
  68                 v = int(char, 16)
  69                 for dot in binstr[v]:
  70                     if dot == "1":
  71                         DC.DrawPoint(xx,yy)
  72                     xx +=1
  73             yy -= 1
  74             xx = x
  75 
  76     def OnPaint(self, evt):
  77         dc = wxPaintDC(self)
  78         dc.Clear()
  79         w, h = self.GetClientSizeTuple()
  80         w = (w-5)/20
  81         h = (h-5)/20
  82         try:
  83             for x in xrange(0, w):
  84                 for y in xrange(0, h):
  85                     fontLoc = self.fontStart + x + y * w
  86                     if fontLoc<len(fonts):
  87                         self.DrawFont(fontLoc, x*20+5, y*20+25)
  88         except:
  89             pass
  90 
  91 class main_window(wxFrame):
  92     def __init__(self, parent, id, title):
  93         wxFrame.__init__(self, parent, -1, title, size = (400, 400), style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
  94         menuBar = wxMenuBar()
  95         menu=wxMenu()
  96         menu.Append(1000, "open bdf font")
  97         menu.Append(1002, "prev page")
  98         menu.Append(1001,"next page")
  99         menuBar.Append(menu, "MENU")
 100         self.SetMenuBar(menuBar)
 101         self.panel = DrawPanel(self)
 102         self.Show(true)
 103         self.Bind(EVT_CLOSE,self.OnCloseWindow)
 104         self.Bind(EVT_MENU,self.OnOpenFile, id=1000)
 105         self.Bind(EVT_MENU, self.NextPage, id=1001)
 106         self.Bind(EVT_MENU, self.PrevPage, id=1002)
 107         self.fontstart=0
 108         self.panel.SetFontStart(self.fontstart)
 109 
 110     def PrevPage(self, event):
 111         if self.fontstart-400>=0:
 112             self.fontstart -= 400
 113             self.panel.SetFontStart(self.fontstart)
 114 
 115     def NextPage(self, event):
 116         if self.fontstart+400<len(fonts):
 117             self.fontstart += 400
 118             self.panel.SetFontStart(self.fontstart)
 119 
 120     def OnOpenFile(self, event):
 121         dlg = wxFileDialog(self, message="select a bdf font", defaultDir=os.getcwd(), defaultFile="", wildcard="*.bdf", style=wxSAVE|wxCHANGE_DIR)
 122         if dlg.ShowModal()==wxID_OK:
 123             path = dlg.GetPath()
 124             OpenFont(path)
 125             self.panel.SetFontStart(0)
 126 
 127     def OnCloseWindow(self, event):
 128         print "close"
 129         self.Destroy()
 130 
 131 class App(wxApp):
 132     def OnInit(self):
 133         frame = main_window(None, -1, "")
 134         self.SetTopWindow(frame)
 135         return true
 136 
 137 app = App(0)
 138 app.MainLoop()

1. 反馈