//Chloe Chao //Parse a special homemade font file //Translate text (A-Z) from the textfield into homemade font import java.applet.*; import java.awt.*; import java.awt.image.*; import java.net.*; import java.util.*; import java.io.*; public class FontBlurParser extends Applet { public void init() { UNIT = 4; LEFT_MARGIN = 20; TOP_MARGIN = 30; alphabet = new Vector(); Panel p = new Panel(); p.setLayout(new GridLayout(0,3)); //Create the URL textfield and place in view. makeUrlField(); p.add("West", urlField); // Create the blur factor textfield. makeBlurField(); p.add("Center", blurField); //Create the button and place in view. makeButton(); p.add("East", button); // Use BorderLayout. BorderLayout b = new BorderLayout(); setLayout(b); add( "North", p ); //Create the display Image and place in view. makeImageCanvas(); add( "South", imageCanvas ); displayImage = createImage(size().width,size().height); offg = displayImage.getGraphics(); offg.setColor( Color.white ); imageCanvas.setImage(displayImage); imageCanvas.repaint(); //Read in the homemade font file. fetch("http://acg.media.mit.edu/mas962/users/cchao/ps5/fontcode.txt"); } public void paint (Graphics g) { paintComponents(g); imageCanvas.setImage(displayImage); imageCanvas.repaint(); g.drawImage(displayImage, 0, 0, this); } public boolean action(Event e, Object arg) { if (e.target == button) { String toBeCoded = urlField.getText(); Double tempDouble; if (blurField.getText() != null) tempDouble = new Double(blurField.getText()); else tempDouble = new Double(0.0); double blurFactor = tempDouble.doubleValue(); if (blurFactor < 0.0) blurFactor = 0.0; else if (blurFactor > 1.0) blurFactor = 1.0; offg = displayImage.getGraphics(); coded( blurFactor, toBeCoded.toUpperCase() ); //This guarantees uppercase. repaint(); return true; } return false; } public Image blurImage(double bf, CodeString cs1, int gx, int gy) { int dim = UNIT*12; //Image i2 = this.createImage( dim, dim ); Image i2 = cs1.getImage(); Graphics g2 = i2.getGraphics(); g2.setColor( Color.white ); g2.fillRect( 0, 0, dim, dim ); double b2f = bf; bf = 1.00-b2f; // The scale is actually the inverse. 1.0 is most legible, 0 is least. if( b2f >.9 ) { // No arcs or lines. g2.setColor( Color.black ); for( int i=0; i.8 ) { // No more arcs. g2.setColor( Color.lightGray ); for( int i=0; i.7 ) { g2.setColor( Color.lightGray ); for( int i=0; i.6 ) { g2.setColor( Color.gray ); for( int i=0; i.5 ) { g2.setColor( Color.darkGray ); for( int i=0; i.4 ) { g2.setColor( Color.black ); for( int i=0; i.5) { bf = .5; } g2.setColor( Color.darkGray ); // System.out.println( "Should've printed serif "+ cs1.serifs.size()); for( int i=0; i.5) g2.setColor( Color.black.brighter() ); else g2.setColor( Color.black ); for( int i=0; i(size().width-12*UNIT) ) { currx = LEFT_MARGIN; curry+=(12*UNIT); } }//end for each letter }// end coded() public void fetch (String address) { byte buf[] = null; Image img; Graphics gg; if (!alphabet.isEmpty()) alphabet.removeAllElements(); try { URL url = new URL(address); StreamTokenizer tokens = new StreamTokenizer(url.openStream()); int token; tokens.ordinaryChar(';'); // signifies end of commands tokens.ordinaryChar('|'); // signifies eol tokens.whitespaceChars( '(', ')' ); tokens.eolIsSignificant(true); tokens.commentChar('%'); // Get first token. token = tokens.nextToken(); // if (FILE_READABLE) { // While not eof while (token != tokens.TT_EOF) { // While not eol while ( token != tokens.TT_EOL ) { // Take the first character of the line as the letter. if( tokens.sval != null ) { String codestr = tokens.sval; char code = codestr.charAt(0); //System.out.println("code: "+code); Image ii=createImage(UNIT*12, UNIT*12 ); CodeString cs = new CodeString( code, UNIT, ii ); alphabet.addElement( cs ); img = cs.getImage(); gg = img.getGraphics(); gg.setColor( Color.black ); // Get the next token and start parsing for operators. // I don't have any error-checking. Sorry. //token = tokens.nextToken(); while( (token=tokens.nextToken())!='|' ) { if( token == tokens.TT_WORD ) { if (tokens.sval.equals( "serifs" )) { // Get the number of serifs to draw. //tokens.nextToken(); //int numOfSerifs = (int)tokens.nval; //for(int i=0; i