|
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.
|