예제 #1
0
 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;
 }
예제 #2
0
  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();
  }
예제 #3
0
 @Override
 public boolean consume(CodeReader code, StringBuilder output) {
   output.append((char) code.pop());
   return true;
 }