From: <doc...@us...> - 2008-02-19 18:42:06
|
Revision: 215 http://openpcl.svn.sourceforge.net/openpcl/?rev=215&view=rev Author: documentsystems Date: 2008-02-19 10:42:03 -0800 (Tue, 19 Feb 2008) Log Message: ----------- Eliminated second parse of PCL for a consistent performance. Limited the number of objects created to improve performance by eliminating excessive garbage collection. Modified Paths: -------------- openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java openpcl/src/com/openpcl/pclrenderimage/macro/PriParseMacroBytes.java openpcl/src/com/openpcl/pclrenderimage/render/PriDecompressPclBytes.java openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java openpcl/src/com/openpcl/pclrenderimage/tools/PclCommandEvent.java openpcl/src/com/openpcl/pclrenderimage/tools/PclParser.java openpcl/src/com/openpcl/pclrenderimage/util/PriModifyPclBytes.java Modified: openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java 2008-02-19 18:42:03 UTC (rev 215) @@ -25,8 +25,8 @@ import com.openpcl.pclrenderimage.tools.PclCommandEvent; import com.openpcl.pclrenderimage.tools.PclParser; -//import com.openpcl.pclrenderimage.util.PriDebug; + /** * PclRenderImage may be used with or without the openpcl.jar file. If you embed the OpenPCLViewer JPanel * in your app, then you need the openpcljar file. But if your app has all the UI code you need, and all you @@ -52,8 +52,38 @@ * @author DocMagic, Document Systems Inc, Howard Hoagland. Rendering code written May 16 2006 to July 20 2006. */ public class PclRenderImage implements IPclRenderImage, PclCommandEvent { - protected PclParser mPclParser = null; // PclParser in RmsTools + private static final String PCL_RESET = "E"; +private static final String PCL_PRIMARY_FONT = "("; + +private static final String PCL_SOFT_FONT = "(s"; + +private static final String PCL_SECONDARY_FONT = ")s"; + +private static final String PCL_UNIT = "&u"; + +private static final String PCL_MISC_K = "&k"; + +private static final String PCL_EXECUTE = "&f"; + +private static final String PCL_MISC_L = "&l"; + +private static final String PCL_MISC_A = "&a"; + +private static final String PCL_DRAW_RASTER_MISC = "*t"; + +private static final String PCL_SHADING_TRANSPARENCY = "*v"; + +private static final String PCL_DRAW_RASTER = "*r"; + +private static final String PCL_DRAW_RASTER_CONFIG = "*b"; + +private static final String PCL_DRAW = "*c"; + +private static final String PCL_POSITION = "*p"; + +protected PclParser mPclParser = null; // PclParser in RmsTools + // Each open view on the screen will have it's own BufferedImage and mPagesArrayList protected BufferedImage mBufferedImageToDrawOn = null; protected Graphics2D mGraphics2D = null; @@ -89,7 +119,6 @@ protected long mThreadIdCounter = 0; protected long mCurrentThreadId = 0; protected boolean mIsSoftFontMode = false; - protected boolean mParsePclIs1stPass = false; protected boolean mIsRecordingAMacro = false; protected boolean mIsExecutingAMacro = false; protected boolean mIsDrawingForPrinting = false; @@ -142,7 +171,6 @@ public int getMultipleOpenId() { return mMultipleOpenId; } public double getCurrentZoomFactor() { return mCurrentZoomFactor; } public boolean getIsSoftFontMode() { return mIsSoftFontMode; } - public boolean getParsePclIs1stPass() { return mParsePclIs1stPass; } public boolean getIsDrawingForPrinting() { return mIsDrawingForPrinting; } public boolean getIsStateBuildingPclPages() { return mIsStateBuildingPclPages; } public boolean getWantToCenterCharInCharCellBox() { return mWantToCenterCharInCharCellBox; } @@ -152,7 +180,6 @@ // Setters public void setCurrentClickedPagePclBytes(byte[] pByteArray) { mCurrentClickedPagePclBytes = pByteArray; } - public void setParsePclIs1stPass(boolean pParsePclIs1stPass) { mParsePclIs1stPass = pParsePclIs1stPass; } public void setIsDrawingForPrinting(boolean pIsDrawingForPrinting) { mIsDrawingForPrinting = pIsDrawingForPrinting; } public void setWantToCenterCharInCharCellBox(boolean pWantToCenterCharInCharCellBox) { @@ -162,11 +189,6 @@ public void setCurrentZoomFactor(double pCurrentZoomFactor) { mCurrentZoomFactor = pCurrentZoomFactor; } protected void handleFormFeedFound(int pBufferPos) { - - // Return if this is parse pass 1 because only rectangle drawing is done on pass 1, and form feeds will be handled - // during parse pass 2. - if (mParsePclIs1stPass) {return;} - // Return if the Pcl bytes have already been split into separate PriPclPage objects // Now if there's still a Form Feed in each Page's PCL then ignore the Form Feed, so return here if ( !mIsStateBuildingPclPages) { return; } @@ -195,9 +217,6 @@ } public void charFoundEvent(char nextChar, int pBufferPos) { - // Debug window info line - //System.out.println("char: " + nextChar + " at " + pBufferPos); - if (nextChar == scFF) { // form feed mPriDrawText.drawBufferedUpCharsAs1String(); handleFormFeedFound(pBufferPos); @@ -215,8 +234,6 @@ mPriCursorPos.relativeYPosition(mPriPageSettings.getNumPixelsPerLine()); } - // Only rectangle drawing is done on pass 1 - if (mParsePclIs1stPass) {return;} // Skip bytes when the start macro command has been encountered and didn't get stop macro yet if (mIsRecordingAMacro) { return; } @@ -238,7 +255,7 @@ } public void commandFoundEvent( - String cmdLeadin, String cmdValue, String cmdTerminator, byte[] cmdData, int pBufferPos) { + String cmdLeadin, String cmdValue, char cmdTerminator, byte[] cmdData, int pBufferPos) { // If another zoom has started while drawing, then abort this zoom if (mCurrentThreadId < mThreadIdCounter) { return; } @@ -246,231 +263,264 @@ // Debug window info line //System.out.println("cmd: " + cmdLeadin + cmdValue + cmdTerminator + " at " + pBufferPos); - String pclCmd = cmdLeadin + "," + cmdTerminator; int cmdValueInt = 0; float cmdValueFloat = 0.0f; - try { - // Use Float.parseFloat() then Math.round() because when cmdValue is "10.00", - // Interger.parseInt() returns 0 instead of 10 - cmdValueFloat = Float.parseFloat(cmdValue); - cmdValueInt = Math.round(cmdValueFloat); - } catch (NumberFormatException e) { + /* + * 13.Feb.2008 DocMagic, Document Systems Inc, Jay Peterson: + * cmdValue now null tolerant, caused excessive object creation which forced GC + */ + try { + // The command value is null for some commands, a parseFloat will throw an exception under this condition + if(cmdValue != null){ + // Use Float.parseFloat() then Math.round() because when cmdValue is "10.00", + // Interger.parseInt() returns 0 instead of 10 + cmdValueFloat = Float.parseFloat(cmdValue); + cmdValueInt = Math.round(cmdValueFloat); + } + } catch (NumberFormatException e) { + } + // The "if else" is nested for parse speed instead of a 1 level long string compare chain. + // The most frequently used commands should be nearer the top. + if(cmdLeadin.equals(PCL_POSITION)){ // Position command + processPositionCommand(cmdValue, cmdTerminator); + } else if(cmdLeadin.equals(PCL_DRAW)){ // Draw command + processDrawCommand(cmdTerminator, cmdValueInt); + } else if(cmdLeadin.equals(PCL_DRAW_RASTER_CONFIG)) { // Raster draw command + processDrawRasterConfigCommand(cmdTerminator, cmdData, cmdValueInt); + } else if(cmdLeadin.equals(PCL_DRAW_RASTER)){ + processDrawRasterCommand(cmdTerminator, cmdValueInt); + } else if(cmdLeadin.equals(PCL_SHADING_TRANSPARENCY)){ + processShadeTransparencyCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_DRAW_RASTER_MISC)) { + processDrawRasterMiscCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_MISC_A)) { + processMiscACommand(cmdValue, cmdTerminator); + } else if (cmdLeadin.equals(PCL_MISC_L)) { + processMiscLCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_EXECUTE)) { + processExecuteCommand(cmdTerminator, pBufferPos, cmdValueInt); + } else if (cmdLeadin.equals(PCL_MISC_K)) { + processMiscKCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_UNIT)) { + processUnitCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_SECONDARY_FONT)) { + processSecondaryFontCommand(cmdTerminator, cmdData, cmdValueInt); + } else if (cmdLeadin.equals(PCL_SOFT_FONT)) { + processSoftFontCommand(cmdValue, cmdTerminator, cmdData, cmdValueInt, cmdValueFloat); + } else if (cmdLeadin.equals(PCL_PRIMARY_FONT)) { + processPrimaryFontCommand(cmdTerminator, cmdValueInt); + } else if (cmdLeadin.equals(PCL_RESET)) { + processResetCommand(); + } + } + +private void processResetCommand() { + // Skip bytes when the start macro command has been encountered and didn't get stop macro yet + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriDrawText.drawBufferedUpCharsAs1String(); +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processPrimaryFontCommand(char cmdTerminator, int cmdValueInt) { + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + switch(cmdTerminator){ + case 'U': // (,U + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriFonts.setSymbolSetGroupU(cmdValueInt); + break; + case 'X': // (,X + mPriDrawText.drawBufferedUpCharsAs1String(); + mIsSoftFontMode = true; + // Select the specified soft font as the current primary font + mPriParseSoftFontBytes.selectSoftFontById(cmdValueInt); + break; + // (,<AllUnsuportedSymbolSets> + case 'D': + case 'E': + case 'F': + case 'G': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'S': + case 'T': + mPriFonts.setSymbolSetIsUnsupported(cmdValueInt, cmdTerminator); + break; + default: // only for syntax completeness + break; } - - // Put into char array to not do a lot of String.substring() commands later - char[] cmdCharArray = pclCmd.toCharArray(); - - // The "if else" is nested for parse speed instead of a 1 level long string compare chain. - // The most frequently used commands should be nearer the top. - if (cmdCharArray[0] == '*') { // * - if (cmdCharArray[1] == 'p') { // *p - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'X') { // *p,X - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriCursorPos.xPositionCommand(cmdValue); // Set the X - } else if (cmdCharArray[3] == 'Y') { // *p,Y - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriCursorPos.yPositionCommand(cmdValue); // Set the Y +} + +/** + * @param cmdValue + * @param cmdTerminator + * @param cmdData + * @param cmdValueInt + * @param cmdValueFloat + */ +private void processSoftFontCommand(String cmdValue, char cmdTerminator, byte[] cmdData, int cmdValueInt, float cmdValueFloat) { + switch(cmdTerminator){ + case 'B': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriFonts.setFontStrokeWeight(cmdValueInt); + break; + case 'H': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriFonts.setFontHorizontalPitch(cmdValueInt); + break; + case 'S': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriFonts.setFontItalicOrCondensedStyle(cmdValueInt); + break; + case 'T': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mIsSoftFontMode = false; + mPriFonts.setFontIsPrimary(); + mPriFonts.setJavaBuiltInFont(cmdValueInt); + break; + case 'V': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriFonts.setFontHeight(cmdValueFloat); // Pass the float instead of the int because some PCL has for example 7.5 + break; + case 'W': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + // Transfer soft font per character data bytes + mPriParseSoftFontBytes.transferSoftFontPerCharacterData(cmdValueInt, cmdData); + break; + case 'Z': + if (mIsRecordingAMacro) { return; } + // Call the below to see if this is a signature block for both mIsStateBuildingPclPages is true or false + // because the called method finds out if this Z command is a signature block or not + // and returns true if a signature block was drawn, and if so, then only if building Pcl pages bump its + // counter + if (mPriRectDrawing.dsiZcommand(cmdValue)) { + if (mIsStateBuildingPclPages) { + mPriPclPage.getPriRenderCounters().bumpNumSignatureBlocksDrawn(); } } - } else if (cmdCharArray[1] == 'c') { // *c - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'A') { // *c,A - // Set width in Pcl Units for future rectangle draw (don't draw rectangle yet) + break; + } +} + +/** + * @param cmdTerminator + * @param cmdData + * @param cmdValueInt + */ +private void processSecondaryFontCommand(char cmdTerminator, byte[] cmdData, int cmdValueInt) { + switch(cmdTerminator){ + case 'W': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriDrawText.drawBufferedUpCharsAs1String(); + // Transfer soft font header data bytes + mPriParseSoftFontBytes.transferSoftFontHeaderData(cmdValueInt, cmdData); + break; + case 'T': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mIsSoftFontMode = false; + mPriFonts.setFontIsSecondary(); + mPriFonts.setJavaBuiltInFont(cmdValueInt); + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processUnitCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'D': if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriRectDrawing.setPclUnitsWidth(cmdValueInt); - } else if (cmdCharArray[3] == 'B') { // *c,B - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - // Set height in Pcl Units for future rectangle draw (don't draw rectangle yet) - mPriRectDrawing.setPclUnitsHeight(cmdValueInt); - } else if (cmdCharArray[3] == 'D') { // *c,D - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriParseSoftFontBytes.assignSoftFontId(cmdValueInt); // Assign soft font Id - } else if (cmdCharArray[3] == 'E') { // *c,E - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - // Soft font character code for next char download - mPriParseSoftFontBytes.setCharCodeForNextCharDownload(cmdValueInt); - } else if (cmdCharArray[3] == 'F') { // *c,F - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriParseSoftFontBytes.fontControlForSoftFonts(cmdValueInt); // Font Control (values are 0 thru 6) - } else if (cmdCharArray[3] == 'G') { // *c,G - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - if (mParsePclIs1stPass) { - mPriRectDrawing.setPatternIdAreaFill(cmdValueInt); // Pattern Id rectangle draw - } - } else if (cmdCharArray[3] == 'H') { // *c,H - // TODO Horizontal rectangle size in Decipoints - } else if (cmdCharArray[3] == 'P') { // *c,P - if (mParsePclIs1stPass) { - if (mIsStateBuildingPclPages) { - mPriPclPage.getPriRenderCounters().bumpNumRectanglesDrawn(); - } else { - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriRectDrawing.drawRectangleCommand(cmdValueInt); - } - } // Draw rectangle - } else if (cmdCharArray[3] == 'V') { // *c,V - // TODO Vertical rectangle size in Decipoints - } - } - } else if (cmdCharArray[1] == 'b') { // *b - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'M') { // *b,M - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setRasterCompressionMethod(cmdValueInt); // Raster compression mode - } else if (cmdCharArray[3] == 'W') { // *b,W - if (mParsePclIs1stPass || mIsRecordingAMacro) {return;} - if (mIsStateBuildingPclPages) { - mPriPclPage.getPriRenderCounters().bumpNumRasterRowsDrawn(); - } else { - mPriRasterDrawing.transferRasterData(cmdValueInt, cmdData); // Transfer raster data - } - } else if (cmdCharArray[3] == 'Y') { // *b,Y - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setRasterYoffset(cmdValueInt); // Raster Y Offset - } - } - } else if (cmdCharArray[1] == 'r') { // *r - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'A') { // *r,A - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); - mPriRasterDrawing.setStartRasterGraphics(cmdValueInt); // Start raster graphics. Values 0 and 1 only - } else if (cmdCharArray[3] == 'B') { // *r,B - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setEndRasterGraphics(); // End raster graphics is supported by HPLaserJetIII. - } else if (cmdCharArray[3] == 'C') { // *r,C - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setEndRasterGraphics(); // End raster graphics not supported by HPLaserJetIII. - } else if (cmdCharArray[3] == 'F' ) { // *r,F - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - // Presentation Mode Direction. Values 0 and 3 only - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriRasterDrawing.setPresentationModeDirection(cmdValueInt); - } else if (cmdCharArray[3] == 'S' ) { // *r,S - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setRasterWidth(cmdValueInt); // Raster Width - } else if (cmdCharArray[3] == 'T' ) { // *r,T - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setRasterHeight(cmdValueInt); // Raster Height - } - } - } else if (cmdCharArray[1] == 'v') { // *v - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'T') { // *v,T - mPriDrawText.drawBufferedUpCharsAs1String(); - // Set current Pattern. 0=black, 1=white. White text is put on top of rectangle draws sometimes - mPriPageSettings.setPrintPattern(cmdValueInt); - } else if (cmdCharArray[3] == 'N') { // *v,N - // TODO Source Transparency Mode - } else if (cmdCharArray[3] == 'O') { // *v,O - // TODO Pattern Transparency Mode - } - } - } else if (cmdCharArray[1] == 't') { // *t - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'R') { // *t,R - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriRasterDrawing.setRasterGraphicsResolution(cmdValueInt); // Set Raster Graphics Resolution - } - } + mPriPageSettings.setUnitOfMeasure(cmdValueInt); + break; } - } else if (cmdCharArray[0] =='&') { // & - if (cmdCharArray[1] == 'a') { // &a - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'R') { //&a,R +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processMiscKCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'H': if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } mPriDrawText.drawBufferedUpCharsAs1String(); - // Relative Y positioning by number of rows (+ or - or no sign) - mPriCursorPos.relativeYByNumberOfRows(cmdValue); - } - } - } else if (cmdCharArray[1] == 'l') { // &l - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'A') { //&l,A + mPriFonts.setHorizontalMotionIndexHMI(cmdValueInt); + break; + } +} + +/** + * @param cmdTerminator + * @param pBufferPos + * @param cmdValueInt + */ +private void processExecuteCommand(char cmdTerminator, int pBufferPos, int cmdValueInt) { + switch(cmdTerminator){ + case 'Y': + if (mIsStateBuildingPclPages) { return; } mPriDrawText.drawBufferedUpCharsAs1String(); - mPriPageSettings.setPaperSize(cmdValueInt); // Paper Size 1=Executive, 2=Letter, 3=Legal, 6=Ledger, 26=A4, 27=A3 - } else if (cmdCharArray[3] == 'C') { //&l,C - if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriPageSettings.setVerticalMotionIndex(cmdValueInt); // LPI Vertical Motion Index is 48 / # - } else if (cmdCharArray[3] == 'D') { //&l,D - if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriDrawText.drawBufferedUpCharsAs1String(); - // LPI Line Spacing is thisValue VMI which is the number of vertical lines for 1 inch - mPriPageSettings.setLineSpacing(cmdValueInt); - } else if (cmdCharArray[3] == 'E') { //&l,E - if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriDrawText.drawBufferedUpCharsAs1String(); - // Top Margin adjustment is (dpi / VMI) * thisValue - mPriPageSettings.setTopMarginAdjustment(cmdValueInt); - } else if (cmdCharArray[3] == 'H') { //&l,H - // TODO Paper Source - } else if (cmdCharArray[3] == 'L') { //&l,L - // TODO Perforation skip - } else if (cmdCharArray[3] == 'O') { //&l,O - // TODO Page orientation Portrait or Landscape - } else if (cmdCharArray[3] == 'S') { //&l,S - // Duplex mode. 0=off (simplex), 1=Duplex on Long Edge of page, 2=Duplex on Short Edge of page - mPriPageSettings.setDuplexMode(cmdValueInt); - } else if (cmdCharArray[3] == 'X') { //&l,X - // TODO Number of Copies - } - } - } else if (cmdCharArray[1] == 'f') { //&f - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'Y') { //&f,Y - if (mParsePclIs1stPass || mIsStateBuildingPclPages) { return; } - mPriDrawText.drawBufferedUpCharsAs1String(); mPriParseMacroBytes.setCurrentMacroId(cmdValueInt); // Set Macro ID for later definition or execution - } else if (cmdCharArray[3] == 'X') { //&f,X - if (mParsePclIs1stPass) { return; } + break; + case 'X': switch (cmdValueInt) { - case 0: // &f0X - if (mIsStateBuildingPclPages) { return; } - mIsRecordingAMacro = true; - mPriParseMacroBytes.startMacroDefinition(pBufferPos); - break; - case 1: // &f1X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.stopMacroDefinition(pBufferPos, mCurrentClickedPagePclBytes); - mIsRecordingAMacro = false; - break; - case 2: // &f2X - if (mIsStateBuildingPclPages) { - mPriPclPage.getPriRenderCounters().bumpNumMacrosExecuted(); - } else { - mIsExecutingAMacro = true; - mPriParseMacroBytes.executeMacro(); - mIsExecutingAMacro = false; + case 0: // &f0X + if (mIsStateBuildingPclPages) { return; } + mIsRecordingAMacro = true; + mPriParseMacroBytes.startMacroDefinition(pBufferPos); + break; + case 1: // &f1X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.stopMacroDefinition(pBufferPos, mCurrentClickedPagePclBytes); mIsRecordingAMacro = false; - } - break; - case 3: // &f3X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.saveFullStateThenCallMacro(); - mIsRecordingAMacro = false; - break; - case 4: // &f4X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.saveFullStateThenOverlayMacro(); - mIsRecordingAMacro = false; - break; - case 5: // &f5X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.disableAutomaticOverlay(); - break; - case 6: // &f6X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.deleteAllMacros(); - break; - case 7: // &f7X - if (mIsStateBuildingPclPages) { return; } - mPriParseMacroBytes.deleteAllTemporaryMacros(); - break; + break; + case 2: // &f2X + if (mIsStateBuildingPclPages) { + mPriPclPage.getPriRenderCounters().bumpNumMacrosExecuted(); + } else { + mIsExecutingAMacro = true; + mPriParseMacroBytes.executeMacro(); + mIsExecutingAMacro = false; + mIsRecordingAMacro = false; + } + break; + case 3: // &f3X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.saveFullStateThenCallMacro(); + mIsRecordingAMacro = false; + break; + case 4: // &f4X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.saveFullStateThenOverlayMacro(); + mIsRecordingAMacro = false; + break; + case 5: // &f5X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.disableAutomaticOverlay(); + break; + case 6: // &f6X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.deleteAllMacros(); + break; + case 7: // &f7X + if (mIsStateBuildingPclPages) { return; } + mPriParseMacroBytes.deleteAllTemporaryMacros(); + break; case 8: // &f8X if (mIsStateBuildingPclPages) { return; } mPriParseMacroBytes.deleteLastIdMacro(); @@ -484,128 +534,234 @@ mPriParseMacroBytes.makeMacroPermanent(); break; } - } - } - } else if (cmdCharArray[1] == 'k') { //&k - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'H') { //&k,H - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processMiscLCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'A': mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setHorizontalMotionIndexHMI(cmdValueInt); - } - } - } else if (cmdCharArray[1] == 'u') { //&u - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'D') { //&u,D - if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriPageSettings.setPaperSize(cmdValueInt); // Paper Size 1=Executive, 2=Letter, 3=Legal, 6=Ledger, 26=A4, 27=A3 + break; + case 'C': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); - mPriPageSettings.setUnitOfMeasure(cmdValueInt); - } - } - } - } else if (cmdCharArray[0] == ')') { // ) - if (cmdCharArray[1] == 's') { // )s - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'W') { // )s,W - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriPageSettings.setVerticalMotionIndex(cmdValueInt); // LPI Vertical Motion Index is 48 / # + break; + case 'D': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); - // Transfer soft font header data bytes - mPriParseSoftFontBytes.transferSoftFontHeaderData(cmdValueInt, cmdData); - } else if (cmdCharArray[3] == 'T') { // )s,T Set Secondary Font typeface - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + // LPI Line Spacing is thisValue VMI which is the number of vertical lines for 1 inch + mPriPageSettings.setLineSpacing(cmdValueInt); + break; + case 'E': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); - mIsSoftFontMode = false; - mPriFonts.setFontIsSecondary(); - mPriFonts.setJavaBuiltInFont(cmdValueInt); - } - } + // Top Margin adjustment is (dpi / VMI) * thisValue + mPriPageSettings.setTopMarginAdjustment(cmdValueInt); + break; + case 'H': + // TODO Paper Source + break; + case 'L': + // TODO Perforation skip + break; + case 'O': + // TODO Page orientation Portrait or Landscape + break; + case 'S': + // Duplex mode. 0=off (simplex), 1=Duplex on Long Edge of page, 2=Duplex on Short Edge of page + mPriPageSettings.setDuplexMode(cmdValueInt); + break; + case 'X': + // TODO Number of Copies + break; } - } else if (cmdCharArray[0] == '(') { // ( - if (cmdCharArray[1] == 's') { // (s - if (cmdCharArray[2] == ',') { - if (cmdCharArray[3] == 'B') { // (s,B - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} +} + +/** + * @param cmdValue + * @param cmdTerminator + */ +private void processMiscACommand(String cmdValue, char cmdTerminator) { + switch(cmdTerminator){ + case 'R': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriDrawText.drawBufferedUpCharsAs1String(); + // Relative Y positioning by number of rows (+ or - or no sign) + mPriCursorPos.relativeYByNumberOfRows(cmdValue); + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processDrawRasterMiscCommand(char cmdTerminator, int cmdValueInt) { + switch (cmdTerminator) { + case 'R': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriRasterDrawing.setRasterGraphicsResolution(cmdValueInt); // Set Raster Graphics Resolution + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processShadeTransparencyCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'T': mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setFontStrokeWeight(cmdValueInt); - } else if (cmdCharArray[3] == 'H') { // (s,H - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + // Set current Pattern. 0=black, 1=white. White text is put on top of rectangle draws sometimes + mPriPageSettings.setPrintPattern(cmdValueInt); + break; + case 'N': + // TODO Source Transparency Mode + break; + case 'O': + // TODO Pattern Transparency Mode + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processDrawRasterCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'A': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setFontHorizontalPitch(cmdValueInt); - } else if (cmdCharArray[3] == 'S') { // (s,S - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setStartRasterGraphics(cmdValueInt); // Start raster graphics. Values 0 and 1 only + break; + case 'B': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setEndRasterGraphics(); // End raster graphics is supported by HPLaserJetIII. + break; + case 'C': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setEndRasterGraphics(); // End raster graphics not supported by HPLaserJetIII. + break; + case 'F': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + // Presentation Mode Direction. Values 0 and 3 only mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setFontItalicOrCondensedStyle(cmdValueInt); - } else if (cmdCharArray[3] == 'T') { // (s,T Set Primary Font typeface - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriDrawText.drawBufferedUpCharsAs1String(); - mIsSoftFontMode = false; - mPriFonts.setFontIsPrimary(); - mPriFonts.setJavaBuiltInFont(cmdValueInt); - } else if (cmdCharArray[3] == 'V') { // (s,V - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setFontHeight(cmdValueFloat); // Pass the float instead of the int because some PCL has for example 7.5 - } else if (cmdCharArray[3] == 'W') { // (s,W - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} - // Transfer soft font per character data bytes - mPriParseSoftFontBytes.transferSoftFontPerCharacterData(cmdValueInt, cmdData); - } else if (cmdCharArray[3] == 'Z') { // (s,Z - if (mIsRecordingAMacro) { return; } - // Show the below signature block on the image in Parse pass 1 - if (mParsePclIs1stPass) { - // Call the below to see if this is a signature block for both mIsStateBuildingPclPages is true or false - // because the called method finds out if this Z command is a signature block or not - // and returns true if a signature block was drawn, and if so, then only if building Pcl pages bump its - // counter - if (mPriRectDrawing.dsiZcommand(cmdValue)) { - if (mIsStateBuildingPclPages) { - mPriPclPage.getPriRenderCounters().bumpNumSignatureBlocksDrawn(); - } - } - } - } + mPriRasterDrawing.setPresentationModeDirection(cmdValueInt); + break; + case 'S': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setRasterWidth(cmdValueInt); // Raster Width + break; + case 'T': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setRasterHeight(cmdValueInt); // Raster Height + break; } - } else if (cmdCharArray[1] == ',') { // (, - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - switch (cmdCharArray[2]) { - case 'U': // (,U - mPriDrawText.drawBufferedUpCharsAs1String(); - mPriFonts.setSymbolSetGroupU(cmdValueInt); +} + +/** + * @param cmdTerminator + * @param cmdData + * @param cmdValueInt + */ +private void processDrawRasterConfigCommand(char cmdTerminator, byte[] cmdData, int cmdValueInt) { + switch(cmdTerminator){ + case 'M': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setRasterCompressionMethod(cmdValueInt); // Raster compression mode break; - case 'X': // (,X - mPriDrawText.drawBufferedUpCharsAs1String(); - mIsSoftFontMode = true; - // Select the specified soft font as the current primary font - mPriParseSoftFontBytes.selectSoftFontById(cmdValueInt); + case 'W': + if (mIsRecordingAMacro) {return;} + if (mIsStateBuildingPclPages) { + mPriPclPage.getPriRenderCounters().bumpNumRasterRowsDrawn(); + } else { + mPriRasterDrawing.transferRasterData(cmdValueInt, cmdData); // Transfer raster data + } break; - // (,<AllUnsuportedSymbolSets> + case 'Y': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} + mPriRasterDrawing.setRasterYoffset(cmdValueInt); // Raster Y Offset + break; + } +} + +/** + * @param cmdTerminator + * @param cmdValueInt + */ +private void processDrawCommand(char cmdTerminator, int cmdValueInt) { + switch(cmdTerminator){ + case 'A': + // Set width in Pcl Units for future rectangle draw (don't draw rectangle yet) + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriRectDrawing.setPclUnitsWidth(cmdValueInt); + break; + case 'B': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + // Set height in Pcl Units for future rectangle draw (don't draw rectangle yet) + mPriRectDrawing.setPclUnitsHeight(cmdValueInt); + break; case 'D': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriParseSoftFontBytes.assignSoftFontId(cmdValueInt); // Assign soft font Id + break; case 'E': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + // Soft font character code for next char download + mPriParseSoftFontBytes.setCharCodeForNextCharDownload(cmdValueInt); + break; case 'F': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriParseSoftFontBytes.fontControlForSoftFonts(cmdValueInt); // Font Control (values are 0 thru 6) + break; case 'G': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'S': - case 'T': - mPriFonts.setSymbolSetIsUnsupported(cmdValueInt, cmdTerminator); + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriRectDrawing.setPatternIdAreaFill(cmdValueInt); // Pattern Id rectangle draw break; - default: // only for syntax completeness + case 'H': + // TODO Horizontal rectangle size in Decipoints// TODO Horizontal rectangle size in Decipoints break; - } + + case 'P': + if (mIsStateBuildingPclPages) { + mPriPclPage.getPriRenderCounters().bumpNumRectanglesDrawn(); + } else { + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriRectDrawing.drawRectangleCommand(cmdValueInt); + } + break; + case 'V': + // TODO Vertical rectangle size in Decipoints + break; } - } else if (cmdCharArray[0] == 'E') { // E - // Skip bytes when the start macro command has been encountered and didn't get stop macro yet - if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } - mPriDrawText.drawBufferedUpCharsAs1String(); - if (cmdCharArray[1] == ',') { // E, Note - the ',' is there at [1], and there is no cmdValue or cmdTerminator - // TODO Reset Command +} + +private void processPositionCommand(String cmdValue, char cmdTerminator) { + switch(cmdTerminator) + { + case 'X': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriCursorPos.xPositionCommand(cmdValue); // Set the X + break; +// } else if (cmdCharArray[3] == 'Y') { // *p,Y +// } else if (cmdTerminator.equals("Y")) { // *p,Y + case 'Y': + if (mIsStateBuildingPclPages || mIsRecordingAMacro) { return; } + mPriDrawText.drawBufferedUpCharsAs1String(); + mPriCursorPos.yPositionCommand(cmdValue); // Set the Y + break; } - } - } +} /** * Create a new BufferredImage all ready to draw on @@ -747,7 +903,6 @@ // Initialize mode booleans and variables mIsSoftFontMode = false; - mParsePclIs1stPass = false; mIsRecordingAMacro = false; mIsExecutingAMacro = false; @@ -760,33 +915,9 @@ mPriFonts.setJavaBuiltInFont(4099); mPriPageSettings.setToInitialValues(); - //********************************************************************************************* - // Parse pass 1. Draw only rectangles in Pass #1 because if drawn in PCL byte order, rectangles cover up text - //********************************************************************************************* - mParsePclIs1stPass = true; mPclParser = new PclParser(mCurrentClickedPagePclBytes, this); // Parse the PCL bytes from the RmsTools PclParser - -// PriDebug.infoln("PclRenderImage> parseAndRender(). Before pass1"); - mPclParser.ParsePCL(); // does callbacks to the 2 interface methods below as necessary (making the BufferedImage) -// PriDebug.infoln("PclRenderImage> parseAndRender(). After pass1"); - - /* Default to Courier and set to default paper size and 6 lines per vertical inch and offset top margin by 3 print lines - * for those Pcl files that were dieted/scrubbed and have those commands taken out. - * Also some Blockument pages start with Fill instead of non fill text don't specifiy a font or LPI or top margin */ - mPriFonts.setJavaBuiltInFont(4099); - mPriPageSettings.setToInitialValues(); - - //********************************************************************************************* - // Parse pass 2. Only rectangles were drawn in Pass #1. Now draw everything else in Pass #2 - //********************************************************************************************* - mParsePclIs1stPass = false; - mPclParser = new PclParser(mCurrentClickedPagePclBytes, this); // Parse the PCL bytes from the RmsTools PclParser - -// PriDebug.infoln("PclRenderImage> parseAndRender(). Before pass2"); - - mPclParser.ParsePCL(); // does callbacks to the 2 interface methods below as necessary (making the BufferedImage) mPriDrawText.drawBufferedUpCharsAs1String(); // If any text chars were at the very end of the input PCL file // PriDebug.infoln("PclRenderImage> parseAndRender(). After pass2"); Modified: openpcl/src/com/openpcl/pclrenderimage/macro/PriParseMacroBytes.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/macro/PriParseMacroBytes.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/macro/PriParseMacroBytes.java 2008-02-19 18:42:03 UTC (rev 215) @@ -143,25 +143,13 @@ mPclRenderImage.getPriPageSettings().setLineSpacing(6); // 6 lines per inch vertical mPclRenderImage.getPriPageSettings().setTopMarginAdjustment(3); // All (x,y) are transformed 3 lines down mPclParser = new PclParser(htPclByteArray, mPclRenderImage); // Parse and render on current image - mPclRenderImage.setParsePclIs1stPass(true); // Important: Run the first pass mPclParser.ParsePCL(); // callbacks to the 2 interface methods to render on the current image - - mPclRenderImage.getPriFonts().setJavaBuiltInFont(4099); // 4099 is Courier - mPclRenderImage.getPriPageSettings().setLineSpacing(6); // 6 lines per inch vertical - mPclRenderImage.getPriPageSettings().setTopMarginAdjustment(3); // All (x,y) are transformed 3 lines down - mPclParser = new PclParser(htPclByteArray, mPclRenderImage); // Parse and render on current image - mPclRenderImage.setParsePclIs1stPass(false); // Important: Run the second pass - mPclParser.ParsePCL(); // callbacks to the 2 interface methods to render on the current image - -// PriDebug.releaseln(PriDebug.spacesForPclParseMsgs + "Executed Macro ID " + mCurrentMacroId + " (" + -// htPclByteArray.length + " PCL bytes)."); } /** Save full state then call macro (different from execute macro) */ public void saveFullStateThenCallMacro() { // Dont' save full state like "Call Macro" should do. Just execute the macro. Then don't restore full state either. executeMacro(); -// PriDebug.infoln(PriDebug.spacesForPclParseMsgs + "Call Macro ID " + mCurrentMacroId); } /** Save full state then call macro (different from execute macro) */ Modified: openpcl/src/com/openpcl/pclrenderimage/render/PriDecompressPclBytes.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/render/PriDecompressPclBytes.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/render/PriDecompressPclBytes.java 2008-02-19 18:42:03 UTC (rev 215) @@ -57,8 +57,10 @@ dataCount -= cnt; // dataStartOffset += cnt; - if (cnt > width - numberOfDecompressedBytes) + if (cnt > (width - numberOfDecompressedBytes)){ cnt = width - numberOfDecompressedBytes; + } + while (cnt-- > 0) decompressed.add(numberOfDecompressedBytes++, new Byte(data[dataStartOffset++])); @@ -78,12 +80,12 @@ } /** - * Returns decompressed Run Lenght data. - * @param data data to decompress + * Returns uncompressed Run Length data. + * @param data data to uncompressed * @param startOffset data start offset * @param width data width * @param count data element count - * @return Decompressed data. + * @return uncompressed data. */ public byte[] decompressRL(byte[] data, int startOffset, int width, int count) { /*type 1 compression*/ @@ -107,7 +109,7 @@ } /** - * Returns decompressed Delra Row data. + * Returns decompressed Delta Row data. * @param data data to decompress * @param startOffset data start offset * @param width data width Modified: openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java 2008-02-19 18:42:03 UTC (rev 215) @@ -393,7 +393,7 @@ // PriDebug.infoln(PriDebug.spacesForPclParseMsgs + "PriFonts set Symbol Set to PC8"); break; default: // (<other>U - setSymbolSetIsUnsupported( pSymbolSetInGroupU, "U"); + setSymbolSetIsUnsupported( pSymbolSetInGroupU, 'U'); break; } makeFontCurrent(); @@ -407,7 +407,7 @@ * @param pSymbolSetIsUnsupported * @param pCmdTerminator */ - public void setSymbolSetIsUnsupported(int pSymbolSetIsUnsupported, String pCmdTerminator) { + public void setSymbolSetIsUnsupported(int pSymbolSetIsUnsupported, char pCmdTerminator) { mCurrentSymbolSet = sFontSymbolSetIsOther; // PriDebug.infoln(PriDebug.spacesForPclParseMsgs + // "Error> PCL source file has unsupported Symbol Set \"" + pSymbolSetIsUnsupported + pCmdTerminator + Modified: openpcl/src/com/openpcl/pclrenderimage/tools/PclCommandEvent.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/tools/PclCommandEvent.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/tools/PclCommandEvent.java 2008-02-19 18:42:03 UTC (rev 215) @@ -7,7 +7,7 @@ */ public interface PclCommandEvent { - public void commandFoundEvent(String cmdLeadin, String cmdValue, String cmdTerminator, byte[] cmdData, int bufferPos); + public void commandFoundEvent(String cmdLeadin, String cmdValue, char cmdTerminator, byte[] cmdData, int bufferPos); public void charFoundEvent( char nextChar, int bufferPos ); Modified: openpcl/src/com/openpcl/pclrenderimage/tools/PclParser.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/tools/PclParser.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/tools/PclParser.java 2008-02-19 18:42:03 UTC (rev 215) @@ -45,12 +45,12 @@ public class PclParser { private int pclState = 1; - private String cmdPrefix; - private String cmdGroup; + private char cmdPrefix; + private char cmdGroup; private String cmdLeadin; // Command Prefix + command Group private String cmdValue; // The parameter value may be multiple digits (or empty) - private String cmdTerminator; // This may be "" (empty) (on 2-char commands) + private char cmdTerminator; // This may be "" (empty) (on 2-char commands) private byte[] cmdData; // This will be "" (empty) except special cases private int bufferPos = -1; // Position of current character. @@ -114,37 +114,36 @@ * There should be a term coming up (Esc or term waiting) */ public int getOneCommand() throws ParseException, IOException { - cmdValue = ""; + cmdValue = null; if (pclState==2) { // we've seen an escape so start a command: cmdPrefix = GetCharFromBuffer(); // The 2-char commands are hardcoded, but we could just check Upper Case? : - if ( isUpperCase(cmdPrefix) || ("=9EYZ".indexOf(cmdPrefix) > -1) ) { - cmdGroup = ""; - cmdValue = ""; - cmdTerminator = ""; + if ( Character.isUpperCase(cmdPrefix) || ("=9EYZ".indexOf(cmdPrefix) > -1) ) { + cmdGroup = ' '; + cmdTerminator = ' '; pclState = 3; // Upper case on first character = 2 Char command } else { pclState = 6; // first term or 3 char command waiting - cmdPrefix = cmdPrefix.toUpperCase(); + cmdPrefix = Character.toUpperCase(cmdPrefix); cmdValue = GetNumFromBuffer(); // only sees a number on 3 char command (ex: '^(0U') cmdGroup = GetCharFromBuffer(); - if ( isUpperCase(cmdGroup) ) { + if ( Character.isUpperCase(cmdGroup) ) { cmdTerminator = cmdGroup; - cmdGroup = ""; + cmdGroup = ' '; pclState = 4; // We're done with this command } // Why is this only done if there's a cmdValue ? - if ( cmdValue.length() > 0) cmdTerminator = cmdTerminator.toUpperCase(); + if ( cmdValue.length() > 0) cmdTerminator = Character.toUpperCase(cmdTerminator); } } - if ((pclState==6 || pclState==7) && (cmdValue.length() == 0)) { //term waiting + if ((pclState==6 || pclState==7) && (cmdValue == null || cmdValue.length() == 0)) { //term waiting cmdValue = GetNumFromBuffer(); cmdTerminator = GetCharFromBuffer(); // (char)buffer.read(); - if ( isUpperCase( cmdTerminator ) || cmdTerminator.equals("@") ) { // This is the last term: + if ( Character.isUpperCase( cmdTerminator ) || cmdTerminator == '@' ) { // This is the last term: pclState = pclState - 2; // State 6 -> 4, 7 -> 5 } else { - cmdTerminator = cmdTerminator.toUpperCase(); // Make lookups easier (but state shows we have more) + cmdTerminator = Character.toUpperCase(cmdTerminator); // Make lookups easier (but state shows we have more) } } @@ -152,15 +151,22 @@ * Commands that ends with 'W' have data following them * ex: Soft font header: ')sxxW'; Transfer Raster: '*b,W'; etc. */ - if ((pclState==4 || pclState==6 || pclState==7) && cmdTerminator.equals("W") ) { + if ((pclState==4 || pclState==6 || pclState==7) && cmdTerminator == 'W' ) { int numChars = Integer.parseInt( cmdValue ); // BOA ERROR: Throwing 'NumberFormatException' ? (Blank string) cmdData = GetBytesFromBuffer( numChars ); pclState = Math.min(pclState + 1, 7 ); // 4 becomes 5, 6 becomes 7 ?? } else { cmdData = null; } + StringBuffer cmdLeadinBuilder =new StringBuffer(); + if(cmdPrefix != ' '){ + cmdLeadinBuilder.append(cmdPrefix); + } + if(cmdGroup != ' '){ + cmdLeadinBuilder.append(cmdGroup); + } // Put the command back together for table lookup, etc - cmdLeadin = "" + cmdPrefix + cmdGroup; + cmdLeadin = cmdLeadinBuilder.toString(); if (pclState == 3 || pclState==4 || pclState==5) { pclState = 1; // We are DONE with this command, back to parsing chars... @@ -168,10 +174,10 @@ return pclState; } - public String GetCharFromBuffer() throws IOException { + public char GetCharFromBuffer() throws IOException { char c = (char)buffer.read(); bufferPos++; - return ( String.valueOf(c) ); // will this work ? + return c; } public byte[] GetBytesFromBuffer( int numChars ) throws IOException { @@ -182,22 +188,25 @@ } public String GetNumFromBuffer() throws ParseException, IOException { - String number = ""; + StringBuffer numberBuffer = new StringBuffer(); int ch; while ( (ch = buffer.read()) != -1) { bufferPos++; char c = (char)ch; if ( Character.isDigit(c) || c=='.' || c=='+' || c=='-' ) { - number += c; + numberBuffer.append(c); } else { buffer.unread(c); // Back into the PushbackReader bufferPos--; break; } } - if ((ch == -1) && number.equals("")) + String response = numberBuffer.toString(); + if ((ch == -1) && response.equals("")){ throw new ParseException("Expecting a Number", bufferPos); // IOException(); - return number; + } + + return response; } /** Modified: openpcl/src/com/openpcl/pclrenderimage/util/PriModifyPclBytes.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/util/PriModifyPclBytes.java 2007-12-07 23:12:58 UTC (rev 214) +++ openpcl/src/com/openpcl/pclrenderimage/util/PriModifyPclBytes.java 2008-02-19 18:42:03 UTC (rev 215) @@ -51,7 +51,7 @@ } public void commandFoundEvent( - String pCmdLeadin, String pCmdValue, String pCmdTerminator, byte[] pCmdData, int pBufferPos) { + String pCmdLeadin, String pCmdValue, char pCmdTerminator, byte[] pCmdData, int pBufferPos) { String pclCmd = pCmdLeadin + "," + pCmdTerminator; // Put into char array to not do a lot of String.substring() commands later @@ -97,8 +97,8 @@ } // Write the terminating char - if (pCmdTerminator != null && pCmdTerminator.length() > 0) { - mByteArrayOutputStream.write(pCmdTerminator.getBytes()); + if (pCmdTerminator > 0) { + mByteArrayOutputStream.write(pCmdTerminator); } // Write the raster data or soft font data bytes This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |