Author: damjan
Date: Sat Jan 28 15:45:05 2017
New Revision: 1780709
URL: http://svn.apache.org/viewvc?rev=1780709&view=rev
Log:
XBM values can span multiple pixels, but do not span multiple image rows.
Patch by: me
Modified:
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
Modified:
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
URL:
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java?rev=1780709&r1=1780708&r2=1780709&view=diff
==============================================================================
---
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
(original)
+++
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/xbm/XbmImageParser.java
Sat Jan 28 15:45:05 2017
@@ -244,32 +244,41 @@ public class XbmImageParser extends Imag
final int rowLength = (xbmHeader.width + 7) / 8;
final byte[] imageData = new byte[rowLength * xbmHeader.height];
- for (int i = 0; i < imageData.length; ) {
- token = cParser.nextToken();
- if (token == null || !token.startsWith("0x")) {
- throw new ImageReadException("Parsing XBM file failed, "
- + "hex value missing");
- }
- if (token.length() > hexWidth) {
- throw new ImageReadException("Parsing XBM file failed, "
- + "hex value too long");
- }
- final int value = Integer.parseInt(token.substring(2), 16);
- final int flipped = Integer.reverse(value) >>> (32 - inputWidth);
- if (inputWidth == 16 && i < imageData.length) {
- imageData[i++] = (byte) (flipped >>> 8);
- }
- imageData[i++] = (byte) flipped;
+ int i = 0;
+ for (int y = 0; y < xbmHeader.height; y++) {
+ for (int x = 0; x < xbmHeader.width; x += inputWidth) {
+ token = cParser.nextToken();
+ if (token == null || !token.startsWith("0x")) {
+ throw new ImageReadException("Parsing XBM file failed, "
+ + "hex value missing");
+ }
+ if (token.length() > hexWidth) {
+ throw new ImageReadException("Parsing XBM file failed, "
+ + "hex value too long");
+ }
+ final int value = Integer.parseInt(token.substring(2), 16);
+ final int flipped = Integer.reverse(value) >>> (32 -
inputWidth);
+ if (inputWidth == 16) {
+ if ((x + 8) < xbmHeader.width) {
+ imageData[i++] = (byte) (flipped >>> 8);
+ imageData[i++] = (byte) flipped;
+ } else {
+ imageData[i++] = (byte) flipped;
+ }
+ } else {
+ imageData[i++] = (byte) flipped;
+ }
- token = cParser.nextToken();
- if (token == null) {
- throw new ImageReadException("Parsing XBM file failed, "
- + "premature end of file");
- }
- if (!",".equals(token)
- && ((i < imageData.length) || !"}".equals(token))) {
- throw new ImageReadException("Parsing XBM file failed, "
- + "punctuation error");
+ token = cParser.nextToken();
+ if (token == null) {
+ throw new ImageReadException("Parsing XBM file failed, "
+ + "premature end of file");
+ }
+ if (!",".equals(token)
+ && ((i < imageData.length) || !"}".equals(token))) {
+ throw new ImageReadException("Parsing XBM file failed, "
+ + "punctuation error");
+ }
}
}