From: <doc...@us...> - 2007-05-23 04:27:20
|
Revision: 73 http://openpcl.svn.sourceforge.net/openpcl/?rev=73&view=rev Author: documentsystems Date: 2007-05-22 21:27:08 -0700 (Tue, 22 May 2007) Log Message: ----------- A start at implementing OpenPCL SourceForge bug 1723909 "Implement Secondary Fonts independently of Primary Fonts". Added variables and methods and method calls to save the Secondary Font independent of the Primary Font, and to set whether the currently selected font mode is the Primary Font or the Secondary Font. Modified Paths: -------------- openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java Modified: openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java 2007-05-18 01:55:15 UTC (rev 72) +++ openpcl/src/com/openpcl/pclrenderimage/PclRenderImage.java 2007-05-23 04:27:08 UTC (rev 73) @@ -496,6 +496,12 @@ 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;} + mPriDrawText.drawBufferedUpCharsAs1String(); + mIsSoftFontMode = false; + mPriFonts.setFontIsSecondary(); + mPriFonts.setJavaBuiltInFont(cmdValueInt); } } } @@ -514,10 +520,11 @@ if (mParsePclIs1stPass || mIsStateBuildingPclPages || mIsRecordingAMacro) {return;} mPriDrawText.drawBufferedUpCharsAs1String(); mPriFonts.setFontItalicOrCondensedStyle(cmdValueInt); - } else if (cmdCharArray[3] == 'T') { // (s,T + } 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;} Modified: openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java =================================================================== --- openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java 2007-05-18 01:55:15 UTC (rev 72) +++ openpcl/src/com/openpcl/pclrenderimage/render/PriFonts.java 2007-05-23 04:27:08 UTC (rev 73) @@ -54,6 +54,12 @@ protected final static float sFontToPclUnitsConversion = 300.0F / 72.0F; + // PCL commands might define a Secondary Font, then flip to the Secondary Font using 15 shift out, + // then might flip to the Primary Font using 14 which is shift in. + public static final int sFontIsPrimary = 1; + public static final int sFontIsSecondary = 2; + protected int mFontIsPrimaryOrSecondary = sFontIsPrimary; + // (taken from Jim Gabriel's DocMaster Pascal source code) protected static final int[][] sFontSubstitutionArray = new int[][] { {0, sFontIsMonospaced}, // LinePrinter @@ -460,6 +466,20 @@ makeFontCurrent(); } + /** + * Set the font is the Primary Font + */ + public void setFontIsPrimary() { + mFontIsPrimaryOrSecondary = sFontIsPrimary; + } + + /** + * Set the font is the Secondary Font + */ + public void setFontIsSecondary() { + mFontIsPrimaryOrSecondary = sFontIsSecondary; + } + /** Pick which Java built in font from the font number read from the original PCL bytes * @param pFontTypefaceNumberFromPclFile */ @@ -557,6 +577,7 @@ public void setPrimaryFont(Font pPrimaryFont) { if (pPrimaryFont != null) { mPrimaryFont = pPrimaryFont; + mFontIsPrimaryOrSecondary = sFontIsPrimary; if (mGraphics2D != null) { mGraphics2D.setFont(mPrimaryFont); mFontRenderContext = mGraphics2D.getFontRenderContext(); @@ -570,5 +591,14 @@ } /** Set the secondary font */ - public void setSecondaryFont(Font pSecondaryFont) { mSecondaryFont = pSecondaryFont; } + public void setSecondaryFont(Font pSecondaryFont) { + if (pSecondaryFont != null) { + mSecondaryFont = pSecondaryFont; + mFontIsPrimaryOrSecondary = sFontIsSecondary; + if (mGraphics2D != null) { + mGraphics2D.setFont(mPrimaryFont); + mFontRenderContext = mGraphics2D.getFontRenderContext(); + } + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |