package tests; import org.ibex.nestedvm.Runtime; import org.ibex.nestedvm.Interpreter; import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.io.*; public class FreeTypeDemo { private JFrame frame; private static final int OURWIDTH=640; private static final int OURHEIGHT=256; private static final int BASELINE=160; private byte[] render = new byte[OURWIDTH*OURHEIGHT]; private int size = 72; private StringBuffer sb = new StringBuffer(); private View view; private Image image; private Runnable renderThread; private String theText; private boolean renderNeeded; private String name; private Runtime rt; int renderAddr; int stringAddr; int stringSize; public static void main(String[] argv) throws Exception { new FreeTypeDemo(argv); } public FreeTypeDemo(String[] argv) throws Exception { if(argv.length >= 2 && argv[1].startsWith("int")) { name = "Interpreter"; rt = new Interpreter("build/FreeTypeDemoHelper.mips"); } else { rt = (Runtime) Class.forName("tests.FreeTypeDemoHelper").newInstance(); name = "Compiler"; } rt.start(new String[]{ "freetype.mips"}); if(rt.execute()) throw new Error("freetype.mips exited"); byte[] font = InputStreamToByteArray.convert(new FileInputStream(argv[0])); int fontAddr = rt.malloc(font.length); if(fontAddr == 0) throw new Error("malloc() failed"); rt.copyout(font,fontAddr,font.length); rt.setUserInfo(0,fontAddr); rt.setUserInfo(1,font.length); renderAddr = rt.malloc(OURWIDTH*OURHEIGHT); if(renderAddr == 0) throw new Error("malloc() failed"); if(rt.execute()) throw new Error("freetype.mips exited (" + rt.getUserInfo(1) +")"); createImage(); frame = new JFrame("FreeTypeDemo - " + name); frame.setSize(OURWIDTH,OURHEIGHT); view = new View(); frame.getContentPane().add(view,BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); view.requestFocus(); renderThread = new Runnable() { public void run() { try { for(;;) { synchronized(this) { while(!renderNeeded) wait(); renderNeeded = false; } renderText(theText==null ? "" : theText); } } catch(Exception e) { throw new Error(e); } } }; new Thread(renderThread).start(); keyPress('\n'); } private static ColorModel cmodel = new DirectColorModel(8, 0xff,0xff,0xff); private void createImage() { for(int i=0;i