📄 bitmapfonts.java
字号:
package BitmapFont;import java.util.*;import java.awt.*;import java.awt.image.*;import java.io.*;import gl4java.*;import gl4java.awt.*;import gl4java.GLFunc;import BitmapFont.*;public class BitmapFonts { int nofchs; // number of characters int pointSize; // point size int maxWidth; // maximum width int height; int leading; int ascent; int descent; BitmapFont[] fonts; int[] indexByChar; static final char minChar = 32; static final char maxChar = 127; static final int maxAllowedWidth = 100; static final int maxAllowedHeight = 100; public BitmapFonts() { // do nothing indexByChar = new int[maxChar+1]; for(int i=0; i<=maxChar; i++) { // if it doesn't exist, use the first one // which happens to be " " in our case indexByChar[i] = 0; } } public void generate(String fname, int fsize) { nofchs = maxChar-minChar+1; BufferedImage bim = new BufferedImage(maxAllowedWidth, maxAllowedHeight, BufferedImage.TYPE_INT_RGB); int[] B = new int[maxAllowedWidth*maxAllowedHeight]; Graphics g = bim.getGraphics(); g.setFont(new Font(fname, Font.BOLD, fsize)); FontMetrics fm = g.getFontMetrics(); pointSize = fsize; maxWidth = 0; ascent = fm.getAscent(); descent = fm.getDescent(); leading = fm.getLeading(); // use pointSize instead of getHeight, which has padding (leading, etc) height = pointSize; fonts = new BitmapFont[nofchs]; String ascii; int i=0; for(char ch = minChar; ch<=maxChar; ch++) { ascii = ""+ch; g.clearRect(0,0, maxAllowedWidth, maxAllowedHeight); g.setColor(Color.green); g.drawString(ascii, 0, fm.getLeading()+fm.getAscent()); BitmapFont f = new BitmapFont(ch); f.generate(bim, B, fm); if(maxWidth<fm.charWidth(ch)) maxWidth = fm.charWidth(ch); fonts[i++] = f; indexByChar[ch] = i; } } public void write(DataOutputStream fout) throws IOException { fout.writeInt(nofchs); fout.writeInt(pointSize); fout.writeInt(maxWidth); fout.writeInt(height); fout.writeInt(leading); fout.writeInt(ascent); fout.writeInt(descent); for(int i=0; i<nofchs; i++) { BitmapFont f = fonts[i]; f.write(fout); } } public void read(DataInputStream fin) throws IOException { nofchs = fin.readInt(); pointSize = fin.readInt(); maxWidth = fin.readInt(); height = fin.readInt(); leading = fin.readInt(); ascent = fin.readInt(); descent = fin.readInt(); fonts = new BitmapFont[nofchs]; for(int i=0; i<nofchs; i++) { BitmapFont f = new BitmapFont(); f.read(fin); fonts[i] = f; indexByChar[f.ch] = i; } } public void print(boolean verbose) { System.out.println("number of characters: "+nofchs); System.out.println("point size: "+pointSize); System.out.println("maximum width: "+maxWidth); System.out.println("height: "+height); System.out.println("leading: "+leading); System.out.println("ascent: "+ascent); System.out.println("descent: "+descent); for(int i=0; i<nofchs; i++) { BitmapFont f = fonts[i]; f.print(verbose); } } public void setupGL(GLFunc gl, int offset) { for(int i=0; i<nofchs; i++) { BitmapFont f = fonts[i]; gl.glNewList(f.ch+offset, GLEnum.GL_COMPILE); gl.glBitmap(f.width, f.height, 0, descent, f.width, 0, f.data); gl.glEndList(); } } public int charWidth(char ch) { return fonts[indexByChar[ch]].width; } public int getDescent() { return descent; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -