X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Ftterminal%2FSixel.java;h=b91e77a98beebc8cdfc726426654fd07c1b43967;hb=505be508ae7d3fb48122be548b310a238cfb91eb;hp=8e363ef125c6830f2ad759aefff42a4a56179db2;hpb=8dd530ffad462c13126f82465c6fd2928e310b78;p=fanfix.git diff --git a/src/jexer/tterminal/Sixel.java b/src/jexer/tterminal/Sixel.java index 8e363ef..b91e77a 100644 --- a/src/jexer/tterminal/Sixel.java +++ b/src/jexer/tterminal/Sixel.java @@ -31,7 +31,6 @@ package jexer.tterminal; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.util.ArrayList; import java.util.HashMap; /** @@ -72,6 +71,16 @@ public class Sixel { */ private static int HEIGHT_INCREASE = 400; + /** + * Maximum width in pixels. + */ + private static int MAX_WIDTH = 1000; + + /** + * Maximum height in pixels. + */ + private static int MAX_HEIGHT = 1000; + /** * Current scanning state. */ @@ -142,6 +151,11 @@ public class Sixel { */ private Color color = Color.BLACK; + /** + * If set, abort processing this image. + */ + private boolean abort = false; + // ------------------------------------------------------------------------ // Constructors ----------------------------------------------------------- // ------------------------------------------------------------------------ @@ -150,12 +164,14 @@ public class Sixel { * Public constructor. * * @param buffer the sixel data to parse + * @param palette palette to use, or null for a private palette */ - public Sixel(final String buffer) { + public Sixel(final String buffer, final HashMap palette) { this.buffer = buffer; - palette = new HashMap(); - for (int i = 0; i < buffer.length(); i++) { - consume(buffer.charAt(i)); + if (palette == null) { + this.palette = new HashMap(); + } else { + this.palette = palette; } } @@ -169,6 +185,16 @@ public class Sixel { * @return the sixel data as an image. */ public BufferedImage getImage() { + if (buffer != null) { + for (int i = 0; (i < buffer.length()) && (abort == false); i++) { + consume(buffer.charAt(i)); + } + buffer = null; + } + if (abort == true) { + return null; + } + if ((width > 0) && (height > 0) && (image != null)) { /* System.err.println(String.format("%d %d %d %d", width, y + 1, @@ -300,6 +326,9 @@ public class Sixel { if (x > width) { width = x; } + if (width > MAX_WIDTH) { + abort = true; + } return; } @@ -337,6 +366,12 @@ public class Sixel { if (x > width) { width = x; } + if (width > MAX_WIDTH) { + abort = true; + } + if (y + 1 > MAX_HEIGHT) { + abort = true; + } } /** @@ -393,7 +428,13 @@ public class Sixel { if ((pan == pad) && (pah > 0) && (pav > 0)) { rasterWidth = pah; rasterHeight = pav; - resizeImage(rasterWidth, rasterHeight); + if ((rasterWidth <= MAX_WIDTH) && (rasterHeight <= MAX_HEIGHT)) { + resizeImage(rasterWidth, rasterHeight); + } else { + abort = true; + } + } else { + abort = true; } } @@ -532,10 +573,10 @@ public class Sixel { case REPEAT: if ((ch >= '0') && (ch <= '9')) { if (repeatCount == -1) { - repeatCount = (int) (ch - '0'); + repeatCount = (ch - '0'); } else { repeatCount *= 10; - repeatCount += (int) (ch - '0'); + repeatCount += (ch - '0'); } } return;