为了把宋体字库做到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()