/* Replicate the strings ("FS") functionality in Protel Autotrax .pcb layout file */ import java.awt.geom.*; import java.lang.Float; // NEED TO CONVERT THIS FILE TO DOUBLES !!!!!!!! public class StringPlot extends Object { StringBuffer incomingString; float sizeMultiplier = 1; public StringPlot() { } public StringPlot( String stringToPlot, int charHeight ) { incomingString = new StringBuffer(stringToPlot); sizeMultiplier = (charHeight / 6.0f) * 0.072f; } public GeneralPath doPlot(Point2D currentPoint, int stringRotation, boolean layerFlip) { GeneralPath stringPath = new GeneralPath(); GeneralPath charPath = new GeneralPath(); int index = 0; stringPath.reset(); float accumulatedX = 0.0f; // will transform after while(index < incomingString.length()) { if(Character.isUpperCase(incomingString.charAt(index))) { charPath = doUpperCaseCharPlot(incomingString.charAt(index)); } else if(Character.isLowerCase(incomingString.charAt(index))) { charPath = doLowerCaseCharPlot(incomingString.charAt(index)); } else if(Character.isDigit(incomingString.charAt(index))) { charPath = doDigitCharPlot(incomingString.charAt(index)); } else if(Character.isSpaceChar(incomingString.charAt(index))) { charPath.reset(); charPath.moveTo(0f,0f); charPath.moveTo(6f,0f); accumulatedX +=6f; // because getBounds2D() isn't registering // System.out.println("charPath.getBounds2D().getWidth() = " + charPath.getBounds2D().getWidth());// tells us so } else { charPath = doOtherCharPlot(incomingString.charAt(index)); } charPath.transform(AffineTransform.getTranslateInstance(accumulatedX, 0)); accumulatedX += charPath.getBounds2D().getWidth(); stringPath.append(charPath, false); // we now have small chars starting from (0,0) index++; } if(layerFlip) { stringPath.transform(AffineTransform.getScaleInstance(new Float(sizeMultiplier).doubleValue(), new Float(sizeMultiplier).doubleValue())); // now have big chars starting from (0,0) & vertical-flipped to match -ve Y coords if(stringRotation>>4 == 1) { stringPath.transform(AffineTransform.getScaleInstance(1,-1)); stringRotation -= 16; } stringPath.transform(AffineTransform.getRotateInstance((Math.PI/2.0) * stringRotation)); // now have big chars starting from (0,0) rotated 90 deg * stringRotation } else { stringPath.transform(AffineTransform.getScaleInstance(new Float(sizeMultiplier).doubleValue(), new Float(-sizeMultiplier).doubleValue())); // now have big chars starting from (0,0) & vertical-flipped to match -ve Y coords if(stringRotation>>4 == 1) { stringPath.transform(AffineTransform.getScaleInstance(1,-1)); stringRotation -= 16; } stringPath.transform(AffineTransform.getRotateInstance((Math.PI/2.0) * (-stringRotation))); // now have big chars starting from (0,0) rotated 90 deg * stringRotation } stringPath.transform(AffineTransform.getTranslateInstance(currentPoint.getX(),currentPoint.getY())); // should have big chars translated to absolute starting pnt return stringPath; } public GeneralPath doUpperCaseCharPlot(char charToPlot) { GeneralPath charPath = new GeneralPath(); charPath.reset(); charPath.moveTo(0f,0f); // do this regardless switch(charToPlot) { case 'A': charPath.lineTo(0f,2f); charPath.lineTo(2f,6f); charPath.lineTo(4f,2f); charPath.lineTo(0f,2f); charPath.moveTo(4f,2f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'B': charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,2f); charPath.lineTo(3f,3f); charPath.lineTo(4f,4f); charPath.lineTo(4f,5f); charPath.lineTo(3f,6f); charPath.lineTo(0f,6f); charPath.moveTo(1f,6f); charPath.lineTo(1f,0f); charPath.moveTo(1f,3f); charPath.lineTo(3f,3f); charPath.moveTo(6f,0f); break; case 'C': charPath.moveTo(4f,5f); charPath.lineTo(3f,6f); charPath.lineTo(1f,6f); charPath.lineTo(0f,5f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.moveTo(6f,0f); break; case 'D': charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,5f); charPath.lineTo(3f,6f); charPath.lineTo(0f,6f); charPath.moveTo(1f,6f); charPath.lineTo(1f,0f); charPath.moveTo(6f,0f); break; case 'E': charPath.moveTo(4f,6f); charPath.lineTo(0f,6f); charPath.lineTo(0f,0f); charPath.lineTo(4f,0f); charPath.moveTo(0f,3f); charPath.lineTo(2f,3f); charPath.moveTo(6f,0f); break; case 'F': charPath.lineTo(0f,6f); charPath.lineTo(4f,6f); charPath.moveTo(0f,3f); charPath.lineTo(2f,3f); charPath.moveTo(6f,0f); break; case 'G': charPath.moveTo(4f,6f); charPath.lineTo(1f,6f); charPath.lineTo(0f,5f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(4f,0f); charPath.lineTo(4f,3f); charPath.lineTo(3f,3f); charPath.moveTo(6f,0f); break; case 'H': charPath.lineTo(0f,6f); charPath.moveTo(0f,3f); charPath.lineTo(4f,3f); charPath.moveTo(4f,6f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'I': charPath.lineTo(2f,0f); charPath.moveTo(1f,0f); charPath.lineTo(1f,6f); charPath.moveTo(0f,6f); charPath.lineTo(2f,6f); charPath.moveTo(4f,0f); break; case 'J': charPath.moveTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,6f); charPath.moveTo(6f,0f); break; case 'K': charPath.lineTo(0f,6f); charPath.moveTo(0f,3f); charPath.lineTo(1f,3f); charPath.lineTo(4f,6f); charPath.moveTo(1f,3f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'L': charPath.moveTo(0f,6f); charPath.lineTo(0f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'M': charPath.lineTo(0f,6f); charPath.lineTo(2f,2f); charPath.lineTo(4f,6f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'N': charPath.lineTo(0f,6f); charPath.lineTo(4f,2f); charPath.moveTo(4f,6f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'O': charPath.lineTo(0f,6f); charPath.lineTo(4f,6f); charPath.lineTo(4f,0f); charPath.lineTo(0f,0f); charPath.moveTo(6f,0f); break; case 'P': charPath.lineTo(0f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,4f); charPath.lineTo(3f,3f); charPath.lineTo(0f,3f); charPath.moveTo(6f,0f); break; case 'Q': charPath.moveTo(0f,1f); charPath.lineTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,2f); charPath.lineTo(2f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.moveTo(2f,2f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'R': charPath.lineTo(0f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,4f); charPath.lineTo(3f,3f); charPath.lineTo(0f,3f); charPath.moveTo(1f,3f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'S': charPath.moveTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.moveTo(6f,0f); break; case 'T': charPath.moveTo(0f,6f); charPath.lineTo(4f,6f); charPath.moveTo(2f,6f); charPath.lineTo(2f,0f); charPath.moveTo(6f,0f); break; case 'U': charPath.moveTo(0f,6f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,6f); charPath.moveTo(6f,0f); break; case 'V': charPath.moveTo(0f,6f); charPath.lineTo(3f,0f); charPath.lineTo(6f,6f); charPath.moveTo(8f,0f); break; case 'W': charPath.moveTo(0f,6f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,2f); charPath.lineTo(3f,3f); charPath.moveTo(3f,2f); charPath.lineTo(5f,0f); charPath.lineTo(6f,1f); charPath.lineTo(6f,6f); charPath.moveTo(8f,0f); break; case 'X': charPath.lineTo(0f,1f); charPath.lineTo(4f,5f); charPath.lineTo(4f,6f); charPath.moveTo(0f,6f); charPath.lineTo(0f,5f); charPath.lineTo(4f,1f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'Y': charPath.moveTo(0f,6f); charPath.lineTo(0f,5f); charPath.lineTo(2f,3f); charPath.lineTo(4f,5f); charPath.lineTo(4f,6f); charPath.moveTo(2f,3f); charPath.lineTo(2f,0f); charPath.moveTo(6f,0f); break; case 'Z': charPath.moveTo(0f,6f); charPath.lineTo(4f,6f); charPath.lineTo(4f,5f); charPath.lineTo(0f,1f); charPath.lineTo(0f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; default: charPath.moveTo(0,0); // try this break; } return charPath; } public GeneralPath doLowerCaseCharPlot(char charToPlot) { GeneralPath charPath = new GeneralPath(); charPath.reset(); charPath.moveTo(0f,0f); // do this regardless switch(charToPlot) { case 'a': charPath.moveTo(3f,1f); charPath.lineTo(2f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(2f,4f); charPath.lineTo(3f,3f); charPath.lineTo(3f,1f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'b': charPath.lineTo(0f,6f); charPath.moveTo(0f,2f); charPath.lineTo(2f,4f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.lineTo(4f,1f); charPath.lineTo(3f,0f); charPath.lineTo(2f,0f); charPath.lineTo(0f,2f); charPath.moveTo(6f,0f); break; case 'c': charPath.moveTo(4f,4f); charPath.lineTo(1f,4f); charPath.lineTo(0f,3f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'd': charPath.moveTo(0f,1f); charPath.lineTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(2f,4f); charPath.lineTo(4f,2f); charPath.lineTo(2f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.moveTo(4f,6f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'e': charPath.moveTo(0f,2f); charPath.lineTo(3f,2f); charPath.lineTo(4f,3f); charPath.lineTo(3f,4f); charPath.lineTo(1f,4f); charPath.lineTo(0f,3f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.moveTo(6f,0f); break; case 'f': charPath.moveTo(1f,0f); charPath.lineTo(1f,5f); charPath.lineTo(2f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.moveTo(0f,3f); charPath.lineTo(3f,3f); charPath.moveTo(6f,0f); break; case 'g': charPath.moveTo(0f,-1f); charPath.lineTo(1f,-2f); charPath.lineTo(3f,-2f); charPath.lineTo(4f,-1f); charPath.lineTo(4f,3f); charPath.lineTo(3f,4f); charPath.lineTo(1f,4f); charPath.lineTo(0f,3f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'h': charPath.lineTo(0f,6f); charPath.moveTo(0f,2f); charPath.lineTo(2f,4f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'i': charPath.lineTo(0f,3f); charPath.moveTo(0f,4f); charPath.lineTo(0f,5f); charPath.moveTo(2f,0f); break; case 'j': charPath.moveTo(0f,-1f); charPath.lineTo(1f,-2f); charPath.lineTo(2f,-2f); charPath.lineTo(3f,-1f); charPath.lineTo(3f,3f); charPath.moveTo(3f,4f); charPath.lineTo(3f,5f); charPath.moveTo(5f,0f); break; case 'k': charPath.lineTo(0f,6f); charPath.moveTo(0f,2f); charPath.lineTo(2f,2f); charPath.lineTo(4f,4f); charPath.moveTo(2f,2f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'l': charPath.moveTo(0f,6f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.moveTo(3f,0f); break; case 'm': charPath.lineTo(0f,4f); charPath.moveTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(2f,3f); charPath.lineTo(2f,2f); charPath.moveTo(2f,3f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'n': charPath.lineTo(0f,4f); charPath.moveTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(2f,4f); charPath.lineTo(3f,3f); charPath.lineTo(3f,0f); charPath.moveTo(5f,0f); break; case 'o': charPath.moveTo(0f,1f); charPath.lineTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.lineTo(4f,1f); charPath.lineTo(3f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.moveTo(6f,0f); break; case 'p': charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,3f); charPath.lineTo(3f,4f); charPath.lineTo(1f,4f); charPath.lineTo(0f,3f); charPath.moveTo(0f,4f); charPath.lineTo(0f,-2f); charPath.moveTo(6f,0f); break; case 'q': charPath.moveTo(4f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.moveTo(4f,4f); charPath.lineTo(4f,-2f); charPath.moveTo(6f,0f); break; case 'r': charPath.lineTo(0f,4f); charPath.moveTo(0f,2f); charPath.lineTo(2f,4f); charPath.lineTo(3f,4f); charPath.lineTo(4f,3f); charPath.moveTo(6f,0f); break; case 's': charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(3f,2f); charPath.lineTo(1f,2f); charPath.lineTo(0f,3f); charPath.lineTo(1f,4f); charPath.lineTo(4f,4f); charPath.moveTo(6f,0f); break; case 't': charPath.moveTo(2f,6f); charPath.lineTo(2f,1f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.moveTo(0f,4f); charPath.lineTo(4f,4f); charPath.moveTo(6f,0f); break; case 'u': charPath.moveTo(0f,4f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(2f,0f); charPath.lineTo(4f,2f); charPath.moveTo(4f,4f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'v': charPath.moveTo(0f,4f); charPath.lineTo(2f,0f); charPath.lineTo(4f,4f); charPath.moveTo(6f,0f); break; case 'w': charPath.moveTo(0f,4f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(2f,1f); charPath.lineTo(2f,2f); charPath.moveTo(2f,1f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,4f); charPath.moveTo(6f,0f); break; case 'x': charPath.lineTo(4f,4f); charPath.moveTo(0f,4f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case 'y': charPath.moveTo(0f,4f); charPath.lineTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(2f,0f); charPath.lineTo(4f,2f); charPath.moveTo(4f,4f); charPath.lineTo(4f,-1f); charPath.lineTo(3f,-2f); charPath.lineTo(1f,-2f); charPath.moveTo(6f,0f); break; case 'z': charPath.moveTo(0f,4f); charPath.lineTo(4f,4f); charPath.lineTo(0f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; default: charPath.moveTo(0,0); // try this break; } return charPath; } public GeneralPath doDigitCharPlot(char charToPlot) { GeneralPath charPath = new GeneralPath(); charPath.reset(); charPath.moveTo(0f,0f); // do this regardless switch(charToPlot) { case '0': charPath.moveTo(0f,1f); charPath.lineTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(2f,6f); charPath.lineTo(3f,5f); charPath.lineTo(3f,1f); charPath.lineTo(2f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.moveTo(5f,0f); break; case '1': charPath.lineTo(2f,0f); charPath.moveTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(1f,0f); charPath.moveTo(4f,0f); break; case '2': charPath.moveTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,4f); charPath.lineTo(3f,3f); charPath.lineTo(1f,3f); charPath.lineTo(0f,2f); charPath.lineTo(0f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case '3': charPath.moveTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,2f); charPath.lineTo(3f,3f); charPath.lineTo(2f,3f); charPath.moveTo(3f,3f); charPath.lineTo(4f,4f); charPath.lineTo(4f,5f); charPath.lineTo(3f,6f); charPath.lineTo(1f,6f); charPath.lineTo(0f,5f); charPath.moveTo(6f,0f); break; case '4': charPath.moveTo(3f,0f); charPath.lineTo(3f,6f); charPath.lineTo(0f,3f); charPath.lineTo(0f,2f); charPath.lineTo(4f,2f); charPath.moveTo(6f,0f); break; case '5': charPath.moveTo(0f,1f); charPath.lineTo(1f,0f); charPath.lineTo(3f,0f); charPath.lineTo(4f,1f); charPath.lineTo(4f,3f); charPath.lineTo(3f,4f); charPath.lineTo(0f,4f); charPath.lineTo(0f,6f); charPath.lineTo(4f,6f); charPath.moveTo(6f,0f); break; case '6': charPath.moveTo(0f,3f); charPath.lineTo(3f,3f); charPath.lineTo(4f,2f); charPath.lineTo(4f,1f); charPath.lineTo(3f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,4f); charPath.lineTo(2f,6f); charPath.lineTo(3f,6f); charPath.moveTo(6f,0f); break; case '7': charPath.lineTo(0f,1f); charPath.lineTo(4f,5f); charPath.lineTo(4f,6f); charPath.lineTo(0f,6f); charPath.moveTo(6f,0f); break; case '8': charPath.moveTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,2f); charPath.lineTo(1f,3f); charPath.lineTo(0f,4f); charPath.lineTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,4f); charPath.lineTo(3f,3f); charPath.lineTo(4f,2f); charPath.lineTo(4f,1f); charPath.lineTo(3f,0f); charPath.lineTo(1f,0f); charPath.moveTo(1f,3f); charPath.lineTo(3f,3f); charPath.moveTo(6f,0f); break; case '9': charPath.moveTo(1f,0f); charPath.lineTo(2f,0f); charPath.lineTo(4f,2f); charPath.lineTo(4f,5f); charPath.lineTo(3f,6f); charPath.lineTo(1f,6f); charPath.lineTo(0f,5f); charPath.lineTo(0f,4f); charPath.lineTo(1f,3f); charPath.lineTo(4f,3f); charPath.moveTo(6f,0f); break; default: break; } return charPath; } public GeneralPath doOtherCharPlot(char charToPlot) { GeneralPath charPath = new GeneralPath(); charPath.reset(); charPath.moveTo(0f,0f); // do this regardless switch(charToPlot) { case '/': charPath.lineTo(0f,1f); charPath.lineTo(4f,5f); charPath.lineTo(4f,6f); charPath.moveTo(6f,0f); break; case '?': charPath.moveTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(2f,6f); charPath.lineTo(3f,5f); charPath.lineTo(3f,4f); charPath.lineTo(2f,3f); charPath.lineTo(2f,2f); charPath.moveTo(2f,1f); charPath.lineTo(2f,0f); charPath.moveTo(5f,0f); break; case ';': charPath.moveTo(-1f,-1f); charPath.lineTo(0f,0f); charPath.lineTo(0f,2f); charPath.moveTo(0f,3f); charPath.lineTo(0f,4f); charPath.moveTo(2f,0f); break; case ':': charPath.moveTo(0f,1f); charPath.lineTo(0f,2f); charPath.moveTo(0f,3f); charPath.lineTo(0f,4f); charPath.moveTo(2f,0f); break; case '\'': charPath.moveTo(0f,4f); charPath.lineTo(0f,6f); charPath.moveTo(2f,0f); break; case '"': charPath.moveTo(0f,4f); charPath.lineTo(0f,6f); charPath.moveTo(1f,6f); charPath.lineTo(1f,4f); charPath.moveTo(3f,0f); break; case '[': charPath.moveTo(2f,6f); charPath.lineTo(0f,6f); charPath.lineTo(0f,0f); charPath.lineTo(2f,0f); charPath.moveTo(4f,0f); break; case '{': charPath.moveTo(2f,6f); charPath.lineTo(1f,5f); charPath.lineTo(1f,4f); charPath.lineTo(0f,3f); charPath.lineTo(1f,2f); charPath.lineTo(1f,1f); charPath.lineTo(2f,0f); charPath.moveTo(4f,0f); break; case ']': charPath.lineTo(2f,0f); charPath.lineTo(2f,6f); charPath.lineTo(0f,6f); charPath.moveTo(4f,0f); break; case '}': charPath.lineTo(1f,1f); charPath.lineTo(1f,2f); charPath.lineTo(2f,3f); charPath.lineTo(1f,4f); charPath.lineTo(1f,5f); charPath.lineTo(0f,6f); charPath.moveTo(4f,0f); break; case '\\': charPath.moveTo(0f,6f); charPath.lineTo(0f,5f); charPath.lineTo(4f,1f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case '|': charPath.lineTo(0f,6f); charPath.moveTo(2f,0f); break; case '-': charPath.moveTo(0f,3f); charPath.lineTo(4f,3f); charPath.moveTo(6f,0f); break; case '_': charPath.moveTo(0f,-1f); charPath.lineTo(4f,-1f); charPath.moveTo(6f,0f); break; case '=': charPath.moveTo(0f,2f); charPath.lineTo(4f,2f); charPath.moveTo(4f,3f); charPath.lineTo(0f,3f); charPath.moveTo(6f,0f); break; case '+': charPath.moveTo(0f,3f); charPath.lineTo(4f,3f); charPath.moveTo(2f,5f); charPath.lineTo(2f,1f); charPath.moveTo(6f,0f); break; case '`': charPath.moveTo(0f,6f); charPath.lineTo(2f,4f); charPath.moveTo(4f,0f); break; case '~': charPath.moveTo(0f,1f); charPath.lineTo(1f,2f); charPath.lineTo(3f,2f); charPath.lineTo(4f,3f); charPath.moveTo(6f,0f); break; case '!': charPath.lineTo(0f,1f); charPath.moveTo(0f,2f); charPath.lineTo(0f,6f); charPath.moveTo(2f,0f); break; case '@': charPath.moveTo(0f,5f); charPath.lineTo(1f,6f); charPath.lineTo(3f,6f); charPath.lineTo(4f,5f); charPath.lineTo(4f,1f); charPath.lineTo(3f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,2f); charPath.lineTo(1f,3f); charPath.lineTo(2f,2f); charPath.lineTo(2f,1f); charPath.moveTo(6f,0f); break; case '#': charPath.moveTo(0f,2f); charPath.lineTo(4f,2f); charPath.moveTo(4f,4f); charPath.lineTo(0f,4f); charPath.moveTo(1f,6f); charPath.lineTo(1f,0f); charPath.moveTo(3f,0f); charPath.lineTo(3f,6f); charPath.moveTo(6f,0f); break; case '$': charPath.moveTo(0f,1f); charPath.lineTo(3f,1f); charPath.lineTo(4f,2f); charPath.lineTo(3f,3f); charPath.lineTo(1f,3f); charPath.lineTo(0f,4f); charPath.lineTo(1f,5f); charPath.lineTo(4f,5f); charPath.moveTo(2f,6f); charPath.lineTo(2f,0f); charPath.moveTo(6f,0f); break; case '%': charPath.lineTo(0f,1f); charPath.lineTo(4f,5f); charPath.lineTo(4f,6f); charPath.moveTo(1f,6f); charPath.lineTo(0f,6f); charPath.lineTo(0f,5f); charPath.lineTo(1f,5f); charPath.lineTo(1f,6f); charPath.moveTo(4f,0f); charPath.lineTo(4f,1f); charPath.lineTo(3f,1f); charPath.lineTo(3f,0f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case '^': charPath.moveTo(0f,4f); charPath.lineTo(2f,6f); charPath.lineTo(4f,4f); charPath.moveTo(2f,6f); charPath.lineTo(2f,0f); charPath.moveTo(6f,0f); break; case '&': charPath.moveTo(4f,2f); charPath.lineTo(2f,0f); charPath.lineTo(1f,0f); charPath.lineTo(0f,1f); charPath.lineTo(0f,2f); charPath.lineTo(2f,4f); charPath.lineTo(2f,5f); charPath.lineTo(1f,6f); charPath.lineTo(0f,5f); charPath.lineTo(0f,4f); charPath.lineTo(4f,0f); charPath.moveTo(6f,0f); break; case '*': charPath.moveTo(0f,1f); charPath.lineTo(4f,5f); charPath.moveTo(2f,5f); charPath.lineTo(2f,1f); charPath.moveTo(4f,3f); charPath.lineTo(0f,3f); charPath.moveTo(0f,5f); charPath.lineTo(4f,1f); charPath.moveTo(6f,0f); break; case '(': charPath.moveTo(2f,6f); charPath.lineTo(0f,4f); charPath.lineTo(0f,2f); charPath.lineTo(2f,0f); charPath.moveTo(4f,0f); break; case ')': charPath.lineTo(2f,2f); charPath.lineTo(2f,4f); charPath.lineTo(0f,6f); charPath.moveTo(4f,0f); break; case ',': charPath.moveTo(-1f,-1f); charPath.lineTo(0f,0f); charPath.lineTo(0f,1f); charPath.moveTo(2f,0f); break; case '.': charPath.lineTo(0f,1f); charPath.moveTo(2f,0f); break; case '<': charPath.moveTo(2f,6f); charPath.lineTo(-1f,3f); charPath.lineTo(2f,0f); charPath.moveTo(4f,0f); break; case '>': charPath.lineTo(3f,3f); charPath.lineTo(0f,6f); charPath.moveTo(5f,0f); break; default: charPath.moveTo(0,0); // try this break; } return charPath; } }