private ScanState scanState = ScanState.GROUND;
/**
- * Parameter characters being collected.
+ * Parameters being collected.
*/
- private ArrayList<Integer> colorParams;
+ private int [] params = new int[5];
+
+ /**
+ * Current parameter being collected.
+ */
+ private int paramsI = 0;
/**
* The sixel palette colors specified.
*/
private int x = 0;
+ /**
+ * The maximum y drawn to. This will set the final image height.
+ */
+ private int y = 0;
+
/**
* The current drawing color.
*/
*/
public Sixel(final String buffer) {
this.buffer = buffer;
- colorParams = new ArrayList<Integer>();
palette = new HashMap<Integer, Color>();
image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB);
for (int i = 0; i < buffer.length(); i++) {
*/
public BufferedImage getImage() {
if ((width > 0) && (height > 0)) {
- return image.getSubimage(0, 0, width, height + 6);
+ return image.getSubimage(0, 0, width, y + 1);
}
return null;
}
BufferedImage newImage = new BufferedImage(newWidth, newHeight,
BufferedImage.TYPE_INT_ARGB);
+ if (DEBUG) {
+ System.err.println("resizeImage(); old " + image.getWidth() + "x" +
+ image.getHeight() + " new " + newWidth + "x" + newHeight);
+ }
+
Graphics2D gr = newImage.createGraphics();
gr.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
gr.dispose();
* Clear the parameters and flags.
*/
private void toGround() {
- colorParams.clear();
+ paramsI = 0;
+ for (int i = 0; i < params.length; i++) {
+ params[i] = 0;
+ }
scanState = ScanState.GROUND;
repeatCount = -1;
}
- /**
- * Save a byte into the color parameters buffer.
- *
- * @param ch byte to save
- */
- private void param(final byte ch) {
- if (colorParams.size() == 0) {
- colorParams.add(Integer.valueOf(0));
- }
- Integer n = colorParams.get(colorParams.size() - 1);
- if ((ch >= '0') && (ch <= '9')) {
- n *= 10;
- n += (ch - '0');
- colorParams.set(colorParams.size() - 1, n);
- }
-
- if ((ch == ';') && (colorParams.size() < 16)) {
- colorParams.add(Integer.valueOf(0));
- }
- }
-
/**
* Get a color parameter value, with a default.
*
* @return parameter value
*/
private int getColorParam(final int position, final int defaultValue) {
- if (colorParams.size() < position + 1) {
+ if (position > paramsI) {
return defaultValue;
}
- return colorParams.get(position).intValue();
+ return params[position];
}
/**
return;
}
+ int dy = 0;
for (int i = 0; i < rep; i++) {
if ((n & 0x01) != 0) {
- image.setRGB(x, height + 0, rgb);
+ dy = 0;
+ image.setRGB(x, height + dy, rgb);
}
if ((n & 0x02) != 0) {
- image.setRGB(x, height + 1, rgb);
+ dy = 1;
+ image.setRGB(x, height + dy, rgb);
}
if ((n & 0x04) != 0) {
- image.setRGB(x, height + 2, rgb);
+ dy = 2;
+ image.setRGB(x, height + dy, rgb);
}
if ((n & 0x08) != 0) {
- image.setRGB(x, height + 3, rgb);
+ dy = 3;
+ image.setRGB(x, height + dy, rgb);
}
if ((n & 0x10) != 0) {
- image.setRGB(x, height + 4, rgb);
+ dy = 4;
+ image.setRGB(x, height + dy, rgb);
}
if ((n & 0x20) != 0) {
- image.setRGB(x, height + 5, rgb);
+ dy = 5;
+ image.setRGB(x, height + dy, rgb);
}
- x++;
- if (x > width) {
- width++;
- assert (x == width);
+ if (height + dy > y) {
+ y = height + dy;
}
+ x++;
+ }
+ if (x > width) {
+ width = x;
}
}
private void setPalette() {
int idx = getColorParam(0, 0);
- if (colorParams.size() == 1) {
+ if (paramsI == 0) {
Color newColor = palette.get(idx);
if (newColor != null) {
color = newColor;
if ((ch >= 63) && (ch < 127)) {
if (scanState == ScanState.COLOR) {
setPalette();
- toGround();
}
addSixel(ch);
toGround();
toGround();
}
- if (height + 6 < image.getHeight()) {
+ height += 6;
+ x = 0;
+
+ if (height + 6 > image.getHeight()) {
// Resize the image, give us another HEIGHT_INCREASE
// pixels of vertical length.
resizeImage(image.getWidth(),
image.getHeight() + HEIGHT_INCREASE);
}
- height += 6;
- x = 0;
return;
}
case COLOR:
// 30-39, 3B --> param
if ((ch >= '0') && (ch <= '9')) {
- param((byte) ch);
+ params[paramsI] *= 10;
+ params[paramsI] += (ch - '0');
}
if (ch == ';') {
- param((byte) ch);
+ if (paramsI < params.length - 1) {
+ paramsI++;
+ }
}
return;