public boolean consume(CodeReader code, OUTPUT output) { int nextChar = code.peek(); while (nextChar != -1) { boolean characterConsumed = false; for (Channel<OUTPUT> channel : channels) { if (channel.consume(code, output)) { characterConsumed = true; break; } } if (!characterConsumed) { if (LOG.isDebugEnabled() || failIfNoChannelToConsumeOneCharacter) { String message = "None of the channel has been able to handle character '" + (char) code.peek() + "' (decimal value " + code.peek() + ") at line " + code.getLinePosition() + ", column " + code.getColumnPosition(); if (failIfNoChannelToConsumeOneCharacter) { throw new IllegalStateException(message); } LOG.debug(message); } code.pop(); } nextChar = code.peek(); } return true; }
public byte[] lzwUncompress(byte[] input, int rowNumPixels) { if (input == null || input.length == 0) return input; byte[][] symbolTable = new byte[4096][1]; int bitsToRead = 9; // default int nextSymbol = 258; int code; int oldCode = -1; ByteBuffer out = java.nio.ByteBuffer.allocate(rowNumPixels); CodeReader bb = new CodeReader(input); while (true) { code = bb.getCode(bitsToRead); if (code == EOI_CODE || code == -1) break; if (code == CLEAR_CODE) { // initialize symbol table for (int i = 0; i < 256; i++) { symbolTable[i][0] = (byte) i; } nextSymbol = 258; bitsToRead = 9; code = bb.getCode(bitsToRead); if (code == EOI_CODE || code == -1) break; out.put(symbolTable[code]); oldCode = code; } else { if (code < nextSymbol) { out.put(symbolTable[code]); ByteBuffer symbol = java.nio.ByteBuffer.allocate((symbolTable[oldCode].length + 1)); symbol.put(symbolTable[oldCode]); symbol.put(symbolTable[code][0]); symbolTable[nextSymbol] = symbol.array(); oldCode = code; nextSymbol++; } else { int size = symbolTable[oldCode].length + 1; ByteBuffer symbol = java.nio.ByteBuffer.allocate(size); symbol.put(symbolTable[oldCode]); symbol.put(symbolTable[oldCode][0]); byte[] outString = symbol.array(); out.put(outString); symbolTable[nextSymbol] = outString; oldCode = code; nextSymbol++; } if (nextSymbol == 511) { bitsToRead = 10; } if (nextSymbol == 1023) { bitsToRead = 11; } if (nextSymbol == 2047) { bitsToRead = 12; } } } return out.array(); }
@Override public boolean consume(CodeReader code, StringBuilder output) { output.append((char) code.pop()); return true; }