You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2017/10/16 18:09:15 UTC

[2/8] pdfbox-jbig2 git commit: initial commit of the JBig2 ImageIO plugin

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderDemo.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderDemo.java b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderDemo.java
new file mode 100644
index 0000000..bb253cc
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderDemo.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2;
+
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+
+import javax.imageio.ImageReadParam;
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.Bitmap;
+import org.apache.pdfbox.jbig2.JBIG2Document;
+import org.apache.pdfbox.jbig2.JBIG2ImageReader;
+import org.apache.pdfbox.jbig2.JBIG2ImageReaderSpi;
+import org.apache.pdfbox.jbig2.TestImage;
+import org.apache.pdfbox.jbig2.err.JBIG2Exception;
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.image.FilterType;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+
+public class JBIG2ImageReaderDemo {
+
+  private String filepath;
+  private int imageIndex;
+
+  public JBIG2ImageReaderDemo(String filepath, int imageIndex) {
+    this.filepath = filepath;
+    this.imageIndex = imageIndex;
+  }
+
+  public void show() throws IOException, JBIG2Exception {
+    InputStream inputStream = new FileInputStream(new File(filepath));
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+
+    imageReader.setInput(imageInputStream);
+    ImageReadParam param = new PreconfiguredImageReadParam(new Rectangle(100, 100, 500, 500));
+
+    long timeStamp = System.currentTimeMillis();
+
+    final JBIG2Document doc = new JBIG2Document(imageInputStream);
+    final Bitmap bitmap = doc.getPage(imageIndex).getBitmap();
+    final BufferedImage bufferedImage = Bitmaps.asBufferedImage(bitmap, param, FilterType.Lanczos);
+    long duration = System.currentTimeMillis() - timeStamp;
+    System.out.println(filepath + " decoding took " + duration + " ms");
+
+    new TestImage(bufferedImage);
+  }
+
+  public static void main(String[] args) throws InterruptedException, InvocationTargetException, IOException,
+      JBIG2Exception {
+    URL imageUrl = JBIG2ImageReaderDemo.class.getResource("/images/042_1.jb2");
+    new JBIG2ImageReaderDemo(imageUrl.getPath(), 1).show();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderTest.java b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderTest.java
new file mode 100644
index 0000000..9da7b08
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/JBIG2ImageReaderTest.java
@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.Raster;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.JBIG2ImageReader;
+import org.apache.pdfbox.jbig2.JBIG2ImageReaderSpi;
+import org.apache.pdfbox.jbig2.err.IntegerMaxValueException;
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.junit.Test;
+
+public class JBIG2ImageReaderTest {
+
+  @Test
+  public void testGetDefaultReadParams() throws Exception {
+    ImageReader reader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    ImageReadParam param = reader.getDefaultReadParam();
+    Assert.assertNotNull(param);
+
+    Assert.assertNull(param.getSourceRegion());
+    Assert.assertNull(param.getSourceRenderSize());
+
+    Assert.assertEquals(1, param.getSourceXSubsampling());
+    Assert.assertEquals(1, param.getSourceYSubsampling());
+    Assert.assertEquals(0, param.getSubsamplingXOffset());
+    Assert.assertEquals(0, param.getSubsamplingYOffset());
+  }
+
+  @Test
+  public void testRead() throws IOException, InvalidHeaderValueException, IntegerMaxValueException {
+    String filepath = "/images/042_1.jb2";
+    int imageIndex = 0;
+
+    InputStream inputStream = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    imageReader.setInput(imageInputStream);
+
+    // long timeStamp = System.currentTimeMillis();
+    BufferedImage bufferedImage = imageReader.read(imageIndex, imageReader.getDefaultReadParam());
+    // long duration = System.currentTimeMillis() - timeStamp;
+    // System.out.println(filepath + " decoding took " + duration + " ms");
+
+    Assert.assertNotNull(bufferedImage);
+  }
+
+  @Test
+  public void testReadRaster() throws IOException, InvalidHeaderValueException, IntegerMaxValueException {
+    String filepath = "/images/042_1.jb2";
+    int imageIndex = 0;
+
+    InputStream inputStream = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    imageReader.setInput(imageInputStream);
+    Raster raster = imageReader.readRaster(imageIndex, imageReader.getDefaultReadParam());
+
+    Assert.assertNotNull(raster);
+  }
+
+  @Test
+  public void testReadImageReadParamNull() throws IOException, InvalidHeaderValueException, IntegerMaxValueException {
+    String filepath = "/images/042_1.jb2";
+    int imageIndex = 0;
+
+    InputStream inputStream = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    imageReader.setInput(imageInputStream);
+    BufferedImage bufferedImage = imageReader.read(imageIndex, null);
+
+    Assert.assertNotNull(bufferedImage);
+  }
+
+  @Test
+  public void testReadRasterImageReadParamNull() throws IOException, InvalidHeaderValueException,
+      IntegerMaxValueException {
+    String filepath = "/images/042_1.jb2";
+    int imageIndex = 0;
+
+    InputStream inputStream = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    imageReader.setInput(imageInputStream);
+    Raster raster = imageReader.readRaster(imageIndex, null);
+
+    Assert.assertNotNull(raster);
+  }
+
+  @Test
+  public void testGetNumImages() throws IOException, InvalidHeaderValueException, IntegerMaxValueException {
+    String filepath = "/images/002.jb2";
+
+    InputStream inputStream = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream imageInputStream = disf.getInputStream(inputStream);
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    imageReader.setInput(imageInputStream);
+    int numImages = imageReader.getNumImages(true);
+    Assert.assertEquals(17, numImages);
+  }
+
+  @Test
+  public void testCanReadRaster() throws IOException {
+    JBIG2ImageReader imageReader = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    Assert.assertTrue(imageReader.canReadRaster());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/JBIG2PageTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/JBIG2PageTest.java b/src/test/java/org/apache/pdfbox/jbig2/JBIG2PageTest.java
new file mode 100644
index 0000000..1fb6ae5
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/JBIG2PageTest.java
@@ -0,0 +1,121 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2;
+
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.Bitmap;
+import org.apache.pdfbox.jbig2.JBIG2Document;
+import org.apache.pdfbox.jbig2.JBIG2ReadParam;
+import org.apache.pdfbox.jbig2.TestImage;
+import org.apache.pdfbox.jbig2.err.JBIG2Exception;
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.image.FilterType;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class JBIG2PageTest {
+
+  // TESTS WITH TESTOUTPUT
+  // Ignore in build process
+
+  @Ignore
+  @Test
+  public void composeDisplayTest() throws IOException, JBIG2Exception {
+
+    String filepath = "/images/amb_1.jb2";
+    int pageNumber = 1;
+
+    InputStream is = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    JBIG2Document doc = new JBIG2Document(iis);
+
+    Bitmap pageBitmap = doc.getPage(pageNumber).getBitmap();
+    BufferedImage b = Bitmaps.asBufferedImage(pageBitmap, new JBIG2ReadParam(1, 1, 0, 0, new Rectangle(166, 333, 555,
+        444), null), FilterType.Gaussian);
+    new TestImage(b);
+  }
+
+  @Ignore
+  @Test
+  public void composeTestWithDurationCalc() throws IOException, JBIG2Exception {
+    int runs = 40;
+    long avg = 0;
+
+    String path = "/images/042_8.jb2";
+    int pageNumber = 1;
+
+    System.out.println("File: " + path);
+
+    InputStream is = getClass().getResourceAsStream(path);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+
+    for (int i = 0; i < runs; i++) {
+
+      long time = System.currentTimeMillis();
+      JBIG2Document doc = new JBIG2Document(iis);
+      Bitmap pageBitmap = doc.getPage(pageNumber).getBitmap();
+      Bitmaps.asBufferedImage(pageBitmap);
+      long duration = System.currentTimeMillis() - time;
+
+      System.out.println((i + 1) + ": " + duration + " ms");
+      avg += duration;
+    }
+    System.out.println("Average: " + avg / runs);
+  }
+
+  @Ignore
+  @Test
+  public void composeTestWithDurationCalcAggregate() throws IOException, JBIG2Exception {
+    int runs = 40;
+    long avg = 0;
+    String path = "/images/002.jb2";
+    int pages = 17;
+
+    System.out.println("File: " + path);
+
+    InputStream is = getClass().getResourceAsStream(path);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+
+    for (int j = 1; j <= pages; j++) {
+      avg = 0;
+
+      for (int i = 0; i < runs; i++) {
+        long time = System.currentTimeMillis();
+        JBIG2Document doc = new JBIG2Document(iis);
+        Bitmap pageBitmap = doc.getPage(j).getBitmap();
+        Bitmaps.asBufferedImage(pageBitmap);
+        long duration = System.currentTimeMillis() - time;
+        System.out.print((i + 1) + ": " + duration + " ms ");
+        avg += duration;
+      }
+      System.out.println();
+      System.out.println("Page " + j + " Average: " + avg / runs);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/PreconfiguredImageReadParam.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/PreconfiguredImageReadParam.java b/src/test/java/org/apache/pdfbox/jbig2/PreconfiguredImageReadParam.java
new file mode 100644
index 0000000..b8f58c0
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/PreconfiguredImageReadParam.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2;
+
+import java.awt.Dimension;
+import java.awt.Rectangle;
+
+import javax.imageio.ImageReadParam;
+
+public class PreconfiguredImageReadParam extends ImageReadParam {
+  public PreconfiguredImageReadParam(Rectangle sourceRegion) {
+    this.sourceRegion = sourceRegion;
+  }
+
+  public PreconfiguredImageReadParam(Dimension sourceRenderSize) {
+    this.sourceRenderSize = sourceRenderSize;
+  }
+
+  public PreconfiguredImageReadParam(int sourceXSubsampling, int sourceYSubsampling, int subsamplingXOffset,
+      int subsamplingYOffset) {
+    this.sourceXSubsampling = sourceXSubsampling;
+    this.sourceYSubsampling = sourceYSubsampling;
+    this.subsamplingXOffset = subsamplingXOffset;
+    this.subsamplingYOffset = subsamplingYOffset;
+  }
+
+  public PreconfiguredImageReadParam(Rectangle sourceRegion, Dimension sourceRenderSize) {
+    this.sourceRegion = sourceRegion;
+    this.sourceRenderSize = sourceRenderSize;
+  }
+
+  public PreconfiguredImageReadParam(Rectangle sourceRegion, Dimension sourceRenderSize, int sourceXSubsampling,
+      int sourceYSubsampling, int subsamplingXOffset, int subsamplingYOffset) {
+    this.sourceRegion = sourceRegion;
+    this.sourceRenderSize = sourceRenderSize;
+    this.sourceXSubsampling = sourceXSubsampling;
+    this.sourceYSubsampling = sourceYSubsampling;
+    this.subsamplingXOffset = subsamplingXOffset;
+    this.subsamplingYOffset = subsamplingYOffset;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoderTest.java b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoderTest.java
new file mode 100644
index 0000000..b29d03c
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoderTest.java
@@ -0,0 +1,577 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.decoder.arithmetic;
+
+import java.io.InputStream;
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.decoder.arithmetic.ArithmeticDecoder;
+import org.apache.pdfbox.jbig2.decoder.arithmetic.CX;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.junit.*;
+
+public class ArithmeticDecoderTest {
+
+  long[][] tracedata = { //
+      {
+          0L, 0x8000L, 0x42638000L, 0x3D9C0000L
+      }, {
+          0L, 0xAC02L, 0x84C70000L, 0x273A0000L
+      }, {
+          0L, 0xF002L, 0xA18C7600L, 0x4E758800L
+      }, {
+          0L, 0xD801L, 0x898B7600L, 0x4E758800L
+      }, {
+          0L, 0xC000L, 0x718A7600L, 0x4E758800L
+      }, {
+          0L, 0xA7FFL, 0x59897600L, 0x4E758800L
+      }, {
+          0L, 0x8FFEL, 0x41887600L, 0x4E758800L
+      }, {
+          0L, 0xEFFAL, 0x530EEC00L, 0x9CEB1000L
+      }, {
+          0L, 0xE539L, 0x484DEC00L, 0x9CEB1000L
+      }, {
+          0L, 0xDA78L, 0x3D8CEC00L, 0x9CEB1000L
+      }, {
+          0L, 0xCFB7L, 0x32CBEC00L, 0x9CEB1000L
+      }, {
+          0L, 0xC4F6L, 0x280AEC00L, 0x9CEB1000L
+      }, {
+          0L, 0xBA35L, 0x1D49EC00L, 0x9CEB1000L
+      }, {
+          0L, 0xAF74L, 0x1288EC00L, 0x9CEB1000L
+      }, {
+          1L, 0xA4B3L, 0x07C7EC00L, 0x9CEB1000L
+      }, {
+          0L, 0xAC10L, 0x7C7EC000L, 0x2F910000L
+      }, {
+          0L, 0x900FL, 0x607DC000L, 0x2F910000L
+      }, {
+          0L, 0xE81CL, 0x88F98000L, 0x5F220000L
+      }, {
+          0L, 0xD21BL, 0x72F88000L, 0x5F220000L
+      }, {
+          0L, 0xBC1AL, 0x5CF78000L, 0x5F220000L
+      }, {
+          0L, 0xA619L, 0x46F68000L, 0x5F220000L
+      }, {
+          0L, 0x9018L, 0x30F58000L, 0x5F220000L
+      }, {
+          0L, 0xF42EL, 0x35E90000L, 0xBE440000L
+      }, {
+          0L, 0xE32DL, 0x24E80000L, 0xBE440000L
+      }, {
+          0L, 0xD22CL, 0x13E70000L, 0xBE440000L
+      }, {
+          1L, 0xC12BL, 0x02E60000L, 0xBE440000L
+      }, {
+          0L, 0x8808L, 0x1737E000L, 0x70D01800L
+      }, {
+          1L, 0xE80EL, 0x066DC000L, 0xE1A03000L
+      }, {
+          0L, 0x9008L, 0x336E0000L, 0x5C998000L
+      }, {
+          0L, 0xF40EL, 0x3ADA0000L, 0xB9330000L
+      }, {
+          0L, 0xE00DL, 0x26D90000L, 0xB9330000L
+      }, {
+          1L, 0xCC0CL, 0x12D80000L, 0xB9330000L
+      }, {
+          0L, 0xA008L, 0x96C70800L, 0x0940F000L
+      }, {
+          0L, 0x8807L, 0x7EC60800L, 0x0940F000L
+      }, {
+          0L, 0xE00CL, 0xCD8A1000L, 0x1281E000L
+      }, {
+          0L, 0xCA0BL, 0xB7891000L, 0x1281E000L
+      }, {
+          0L, 0xB40AL, 0xA1881000L, 0x1281E000L
+      }, {
+          0L, 0x9E09L, 0x8B871000L, 0x1281E000L
+      }, {
+          0L, 0x8808L, 0x75861000L, 0x1281E000L
+      }, {
+          0L, 0xE40EL, 0xBF0A2000L, 0x2503C000L
+      }, {
+          0L, 0xD00DL, 0xAB092000L, 0x2503C000L
+      }, {
+          0L, 0xBC0CL, 0x97082000L, 0x2503C000L
+      }, {
+          0L, 0xA80BL, 0x83072000L, 0x2503C000L
+      }, {
+          0L, 0x940AL, 0x6F062000L, 0x2503C000L
+      }, {
+          0L, 0x8009L, 0x5B052000L, 0x2503C000L
+      }, {
+          0L, 0xD810L, 0x8E084000L, 0x4A078000L
+      }, {
+          0L, 0xC60FL, 0x7C074000L, 0x4A078000L
+      }, {
+          0L, 0xB40EL, 0x6A064000L, 0x4A078000L
+      }, {
+          0L, 0xA20DL, 0x58054000L, 0x4A078000L
+      }, {
+          0L, 0x900CL, 0x46044000L, 0x4A078000L
+      }, {
+          0L, 0xFC16L, 0x68068000L, 0x940F0000L
+      }, {
+          0L, 0xEB15L, 0x57058000L, 0x940F0000L
+      }, {
+          0L, 0xDA14L, 0x46048000L, 0x940F0000L
+      }, {
+          0L, 0xC913L, 0x35038000L, 0x940F0000L
+      }, {
+          0L, 0xB812L, 0x24028000L, 0x940F0000L
+      }, {
+          0L, 0xA711L, 0x13018000L, 0x940F0000L
+      }, {
+          1L, 0x9610L, 0x02008000L, 0x940F0000L
+      }, {
+          1L, 0x8808L, 0x10068400L, 0x78017800L
+      }, {
+          0L, 0xA008L, 0x80342000L, 0x1FD3C000L
+      }, {
+          0L, 0x8807L, 0x68332000L, 0x1FD3C000L
+      }, {
+          0L, 0xE00CL, 0xA0644000L, 0x3FA78000L
+      }, {
+          0L, 0xCA0BL, 0x8A634000L, 0x3FA78000L
+      }, {
+          0L, 0xB40AL, 0x74624000L, 0x3FA78000L
+      }, {
+          0L, 0x9E09L, 0x5E614000L, 0x3FA78000L
+      }, {
+          0L, 0x8808L, 0x48604000L, 0x3FA78000L
+      }, {
+          0L, 0xE40EL, 0x64BE8000L, 0x7F4F0000L
+      }, {
+          0L, 0xD00DL, 0x50BD8000L, 0x7F4F0000L
+      }, {
+          0L, 0xBC0CL, 0x3CBC8000L, 0x7F4F0000L
+      }, {
+          0L, 0xA80BL, 0x28BB8000L, 0x7F4F0000L
+      }, {
+          0L, 0x940AL, 0x14BA8000L, 0x7F4F0000L
+      }, {
+          1L, 0x8009L, 0x00B98000L, 0x7F4F0000L
+      }, {
+          1L, 0xA008L, 0x05CD0C00L, 0x9A3AF000L
+      }, {
+          0L, 0xC008L, 0x2E686000L, 0x919F8000L
+      }, {
+          1L, 0x9E07L, 0x0C676000L, 0x919F8000L
+      }, {
+          0L, 0x8804L, 0x319D8000L, 0x56660000L
+      }, {
+          1L, 0xC006L, 0x13390000L, 0xACCC0000L
+      }, {
+          0L, 0x9004L, 0x4CE41000L, 0x431FEC00L
+      }, {
+          0L, 0xC006L, 0x39C62000L, 0x863FD800L
+      }, {
+          1L, 0x9805L, 0x11C52000L, 0x863FD800L
+      }, {
+          0L, 0xA004L, 0x47148000L, 0x58EF6000L
+      }, {
+          1L, 0xD806L, 0x26270000L, 0xB1DEC000L
+      }, {
+          0L, 0xC004L, 0x989C0000L, 0x27670000L
+      }, {
+          0L, 0x8C03L, 0x649B0000L, 0x27670000L
+      }, {
+          0L, 0xB004L, 0x61340400L, 0x4ECFFA00L
+      }, {
+          0L, 0x8003L, 0x31330400L, 0x4ECFFA00L
+      }, {
+          1L, 0xA004L, 0x02640800L, 0x9D9FF400L
+      }, {
+          1L, 0xA004L, 0x09902000L, 0x9673D000L
+      }, {
+          1L, 0xD004L, 0x26408000L, 0xA9C34000L
+      }, {
+          0L, 0xE004L, 0x99020000L, 0x47010000L
+      }, {
+          0L, 0x9803L, 0x51010000L, 0x47010000L
+      }, {
+          1L, 0xA004L, 0x12004000L, 0x8E03BE00L
+      }, {
+          0L, 0xE004L, 0x48010000L, 0x9802F800L
+      }, {
+          1L, 0x9803L, 0x00000000L, 0x9802F800L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001F000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201E000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001C000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA2018000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x90010000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201FE00L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001FC00L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201F800L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001F000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201E000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001C000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA2018000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x90010000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201FE00L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001FC00L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201F800L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001F000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA201E000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x9001C000L
+      }, {
+          1L, 0xA202L, 0x00000000L, 0xA2018000L
+      }, {
+          0L, 0x9002L, 0x00000000L, 0x90010000L
+      }, {
+          1L, 0xA202L, 0x00008200L, 0xA2017C00L
+      }, {
+          0L, 0x9002L, 0x00010400L, 0x9000F800L
+      }, {
+          1L, 0xA202L, 0x00020800L, 0xA1FFF000L
+      }, {
+          0L, 0x9002L, 0x00041000L, 0x8FFDE000L
+      }, {
+          1L, 0xA202L, 0x00082000L, 0xA1F9C000L
+      }, {
+          0L, 0x9002L, 0x00104000L, 0x8FF18000L
+      }, {
+          1L, 0xA202L, 0x00208000L, 0xA1E10000L
+      }, {
+          0L, 0x9002L, 0x00410000L, 0x8FC00000L
+      }, {
+          1L, 0xA202L, 0x00821A00L, 0xA17FE400L
+      }, {
+          0L, 0x9002L, 0x01043400L, 0x8EFDC800L
+      }, {
+          1L, 0xA202L, 0x02086800L, 0x9FF99000L
+      }, {
+          0L, 0x9002L, 0x0410D000L, 0x8BF12000L
+      }, {
+          1L, 0xA202L, 0x0821A000L, 0x99E04000L
+      }, {
+          0L, 0x9002L, 0x10434000L, 0x7FBE8000L
+      }, {
+          1L, 0xA202L, 0x20868000L, 0x817B0000L
+      }, {
+          0L, 0x9002L, 0x410D0000L, 0x4EF40000L
+      }, {
+          0L, 0xA202L, 0x821B7600L, 0x1FE68800L
+      }, {
+          0L, 0xB402L, 0x7434EC00L, 0x3FCD1000L
+      }, {
+          0L, 0xF802L, 0x7867D800L, 0x7F9A2000L
+      }, {
+          0L, 0xC401L, 0x4466D800L, 0x7F9A2000L
+      }, {
+          1L, 0x9000L, 0x1065D800L, 0x7F9A2000L
+      }, {
+          0L, 0xD004L, 0x41976000L, 0x8E6C8000L
+      }, {
+          1L, 0x9803L, 0x09966000L, 0x8E6C8000L
+      }, {
+          1L, 0xE004L, 0x26598000L, 0xB9AA0000L
+      }, {
+          0L, 0x9002L, 0x4CB30000L, 0x434E0000L
+      }, {
+          0L, 0xA202L, 0x99670C00L, 0x089AF200L
+      }, {
+          0L, 0xB402L, 0xA2CC1800L, 0x1135E400L
+      }, {
+          0L, 0xF802L, 0xD5963000L, 0x226BC800L
+      }, {
+          0L, 0xC401L, 0xA1953000L, 0x226BC800L
+      }, {
+          0L, 0x9000L, 0x6D943000L, 0x226BC800L
+      }, {
+          0L, 0xB7FEL, 0x73266000L, 0x44D79000L
+      }, {
+          0L, 0x87FDL, 0x43256000L, 0x44D79000L
+      }, {
+          1L, 0xAFF8L, 0x2648C000L, 0x89AF2000L
+      }, {
+          0L, 0xA004L, 0x99230000L, 0x06E08000L
+      }, {
+          0L, 0xD806L, 0xCA440000L, 0x0DC10000L
+      }, {
+          0L, 0xA805L, 0x9A430000L, 0x0DC10000L
+      }, {
+          0L, 0xF008L, 0xD485E800L, 0x1B821600L
+      }, {
+          0L, 0xC807L, 0xAC84E800L, 0x1B821600L
+      }, {
+          0L, 0xA006L, 0x8483E800L, 0x1B821600L
+      }, {
+          0L, 0xF00AL, 0xB905D000L, 0x37042C00L
+      }, {
+          0L, 0xCC09L, 0x9504D000L, 0x37042C00L
+      }, {
+          0L, 0xA808L, 0x7103D000L, 0x37042C00L
+      }, {
+          0L, 0x8407L, 0x4D02D000L, 0x37042C00L
+      }, {
+          0L, 0xC00CL, 0x5203A000L, 0x6E085800L
+      }, {
+          0L, 0x9E0BL, 0x3002A000L, 0x6E085800L
+      }, {
+          0L, 0xF814L, 0x1C034000L, 0xDC10B000L
+      }, {
+          1L, 0xDC13L, 0x00024000L, 0xDC10B000L
+      }, {
+          1L, 0xE008L, 0x00120000L, 0xDFF58000L
+      }, {
+          1L, 0x9004L, 0x00486200L, 0x8FBB9C00L
+      }, {
+          1L, 0xC004L, 0x01218800L, 0xBEE27000L
+      }, {
+          1L, 0xD004L, 0x04862000L, 0xCB7DC000L
+      }, {
+          1L, 0xE004L, 0x12188000L, 0xCDEB0000L
+      }, {
+          0L, 0x9002L, 0x24310000L, 0x6BD00000L
+      }, {
+          0L, 0xA202L, 0x4862FE00L, 0x599F0000L
+      }, {
+          1L, 0xB402L, 0x00C3FC00L, 0xB33E0000L
+      }, {
+          1L, 0xE004L, 0x030FF000L, 0xDCF40000L
+      }, {
+          0L, 0x9002L, 0x061FE000L, 0x89E20000L
+      }, {
+          1L, 0xA202L, 0x0C3FC000L, 0x95C20000L
+      }, {
+          0L, 0x9002L, 0x187F8000L, 0x77820000L
+      }, {
+          1L, 0xA202L, 0x30FF0000L, 0x71020000L
+      }, {
+          1L, 0x9002L, 0x61FFFE00L, 0x2E020000L
+      }, {
+          1L, 0xFC04L, 0x43FBF800L, 0xB8080000L
+      }, {
+          1L, 0xA802L, 0x87F7F000L, 0x200A0000L
+      }, {
+          0L, 0xA402L, 0x63EDE000L, 0x40140000L
+      }, {
+          0L, 0x9C02L, 0x1BD9C000L, 0x80280000L
+      }, {
+          1L, 0xAC02L, 0x37B38000L, 0x744E0000L
+      }, {
+          1L, 0xA802L, 0x6F670000L, 0x389A0000L
+      }, {
+          1L, 0xA402L, 0x32CE2000L, 0x7133DC00L
+      }, {
+          1L, 0xAC02L, 0x659C4000L, 0x4665B800L
+      }, {
+          0L, 0xB002L, 0x23368000L, 0x8CCB7000L
+      }, {
+          1L, 0xA202L, 0x466D0000L, 0x5B94E000L
+      }, {
+          1L, 0xA802L, 0x8CDA0000L, 0x1B27C000L
+      }, {
+          1L, 0xAE02L, 0x77B20000L, 0x364F8000L
+      }, {
+          1L, 0xCC02L, 0x5F620000L, 0x6C9F0000L
+      }, {
+          0L, 0x9401L, 0x27610000L, 0x6C9F0000L
+      }, {
+          1L, 0xE004L, 0x9D87FC00L, 0x427C0000L
+      }, {
+          1L, 0x9803L, 0x5586FC00L, 0x427C0000L
+      }, {
+          0L, 0xA004L, 0x1B0BF800L, 0x84F80000L
+      }, {
+          1L, 0xE004L, 0x6C2FE000L, 0x73D40000L
+      }, {
+          0L, 0x9803L, 0x242EE000L, 0x73D40000L
+      }, {
+          1L, 0x9002L, 0x485DC000L, 0x47A40000L
+      }, {
+          1L, 0xA202L, 0x90BB8000L, 0x11460000L
+      }, {
+          1L, 0xB402L, 0x91750000L, 0x228C0000L
+      }, {
+          1L, 0xF802L, 0xB2E8DC00L, 0x45192000L
+      }, {
+          1L, 0xC401L, 0x7EE7DC00L, 0x45192000L
+      }, {
+          1L, 0x9000L, 0x4AE6DC00L, 0x45192000L
+      }, {
+          0L, 0xB7FEL, 0x2DCBB800L, 0x8A324000L
+      }, {
+          1L, 0xC004L, 0xB72EE000L, 0x08D50000L
+      }, {
+          1L, 0x8C03L, 0x832DE000L, 0x08D50000L
+      }, {
+          1L, 0xB004L, 0x9E59C000L, 0x11AA0000L
+      }, {
+          1L, 0x8003L, 0x6E58C000L, 0x11AA0000L
+      }, {
+          1L, 0xA004L, 0x7CAF8000L, 0x23540000L
+      }, {
+          1L, 0xF006L, 0xA95D0000L, 0x46A80000L
+      }, {
+          1L, 0xCC05L, 0x855C0000L, 0x46A80000L
+      }, {
+          1L, 0xA804L, 0x615B0000L, 0x46A80000L
+      }, {
+          1L, 0x8403L, 0x3D5A0000L, 0x46A80000L
+      }, {
+          1L, 0xC004L, 0x32B28E00L, 0x8D517000L
+      }, {
+          0L, 0x9E03L, 0x10B18E00L, 0x8D517000L
+      }, {
+          1L, 0x8804L, 0x42C63800L, 0x453DC000L
+      }, {
+          1L, 0xC006L, 0x358A7000L, 0x8A7B8000L
+      }, {
+          0L, 0x9C05L, 0x11897000L, 0x8A7B8000L
+      }, {
+          1L, 0x9004L, 0x4625C000L, 0x49DE0000L
+      }, {
+          1L, 0xC006L, 0x2C498000L, 0x93BC0000L
+      }, {
+          0L, 0x9805L, 0x04488000L, 0x93BC0000L
+      }, {
+          0L, 0xA004L, 0x11223400L, 0x8EE1CA00L
+      }, {
+          1L, 0xD004L, 0x4488D000L, 0x8B7B2800L
+      }, {
+          0L, 0x9803L, 0x0C87D000L, 0x8B7B2800L
+      }, {
+          0L, 0xE004L, 0x321F4000L, 0xADE4A000L
+      }, {
+          0L, 0x9002L, 0x643E8000L, 0x2BC34000L
+      }, {
+          0L, 0xFC04L, 0x4CF60000L, 0xAF0D0000L
+      }, {
+          0L, 0xA802L, 0x99EDB600L, 0x0E144800L
+      }, {
+          1L, 0xA402L, 0x87D96C00L, 0x1C289000L
+      }, {
+          0L, 0x9C02L, 0x63B0D800L, 0x38512000L
+      }, {
+          0L, 0x8C02L, 0x1B5FB000L, 0x70A24000L
+      }, {
+          1L, 0xAC02L, 0x36BF6000L, 0x75428000L
+      }, {
+          1L, 0xA802L, 0x6D7EC000L, 0x3A830000L
+      }, {
+          1L, 0xA402L, 0x2EFB8000L, 0x75060000L
+      }, {
+          1L, 0xAC02L, 0x5DF70000L, 0x4E0A0000L
+      }, {
+          0L, 0xB002L, 0x13ECD400L, 0x9C152A00L
+      }, {
+          1L, 0xA202L, 0x27D9A800L, 0x7A285400L
+      }, {
+          0L, 0xA802L, 0x4FB35000L, 0x584EA800L
+      }, {
+          0L, 0xA202L, 0x9F66A000L, 0x029B5000L
+      }, {
+          0L, 0x9C02L, 0x96CB4000L, 0x0536A000L
+      }, {
+          1L, 0x8C02L, 0x81948000L, 0x0A6D4000L
+      }, {
+          1L, 0xD804L, 0xAE4E0000L, 0x29B50000L
+      }, {
+          0L, 0x8203L, 0x584D0000L, 0x29B50000L
+      }, {
+          1L, 0xB008L, 0x09337C00L, 0xA6D48000L
+      }, {
+          0L, 0xAC02L, 0x1266F800L, 0x999B0000L
+      }, {
+          1L, 0xAC02L, 0x24CDF000L, 0x87340000L
+      }, {
+          0L, 0xAC02L, 0x499BE000L, 0x62660000L
+      }, {
+          0L, 0xAC02L, 0x9337C000L, 0x18CA0000L
+      }, {
+          0L, 0xAC02L, 0x7A6D8000L, 0x31940000L
+      }, {
+          1L, 0xB002L, 0x4CD90000L, 0x63280000L
+      }, {
+          1L, 0xA202L, 0x99B3FE00L, 0x084E0000L
+      }, {
+          1L, 0x9C02L, 0x8B65FC00L, 0x109C0000L
+      }, {
+          0L, 0x8C02L, 0x6AC9F800L, 0x21380000L
+      }, {
+          1L, 0xD804L, 0x5323E000L, 0x84E00000L
+      }, {
+          1L, 0xAC02L, 0xA647C000L, 0x05BA0000L
+      }, {
+          1L, 0xAC02L, 0xA08D8000L, 0x0B740000L
+      }, {
+          1L, 0xB002L, 0x99190000L, 0x16E80000L
+      }, {
+          1L, 0xBE02L, 0x9031FE00L, 0x2DD00000L
+      }, {
+          1L, 0xEC02L, 0x9061FC00L, 0x5BA00000L
+      },
+  };
+
+  @Test
+  public void decodeTest() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/arith/encoded testsequence");
+    DefaultInputStreamFactory factory = new DefaultInputStreamFactory();
+    ImageInputStream iis = factory.getInputStream(is);
+
+    ArithmeticDecoder decoder = new ArithmeticDecoder(iis);
+
+    CX cx = new CX(1, 0);
+    for (int i = 0; i < 257; i++) {
+      decoder.decode(cx);
+    }
+
+  }
+
+  @Test
+  public void decodeTestWithTracadataComparison() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/arith/encoded testsequence");
+    DefaultInputStreamFactory factory = new DefaultInputStreamFactory();
+    ImageInputStream iis = factory.getInputStream(is);
+
+    ArithmeticDecoder decoder = new ArithmeticDecoder(iis);
+    CX cx = new CX(1, 0);
+
+    for (int i = 0; i < 255; i++) {
+      Assert.assertEquals(tracedata[i][0], decoder.decode(cx));
+      Assert.assertEquals(tracedata[i + 1][1], (long) decoder.getA());
+      Assert.assertEquals(tracedata[i + 1][2], decoder.getC());
+
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoderTest.java b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoderTest.java
new file mode 100644
index 0000000..a17b8c6
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoderTest.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.decoder.arithmetic;
+
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.decoder.arithmetic.ArithmeticDecoder;
+import org.apache.pdfbox.jbig2.decoder.arithmetic.ArithmeticIntegerDecoder;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.junit.Test;
+
+public class ArithmeticIntegerDecoderTest {
+
+  @Test
+  public void decodeTest() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/arith/encoded testsequence");
+    DefaultInputStreamFactory isFactory = new DefaultInputStreamFactory();
+    ImageInputStream iis = isFactory.getInputStream(is);
+
+    ArithmeticDecoder ad = new ArithmeticDecoder(iis);
+    ArithmeticIntegerDecoder aid = new ArithmeticIntegerDecoder(ad);
+
+    long result = aid.decode(null);
+
+    Assert.assertEquals(1, result);
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/decoder/mmr/MMRDecompressorTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/decoder/mmr/MMRDecompressorTest.java b/src/test/java/org/apache/pdfbox/jbig2/decoder/mmr/MMRDecompressorTest.java
new file mode 100644
index 0000000..9b3baba
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/decoder/mmr/MMRDecompressorTest.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.decoder.mmr;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.Bitmap;
+import org.apache.pdfbox.jbig2.decoder.mmr.MMRDecompressor;
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.io.SubInputStream;
+import org.junit.Test;
+
+public class MMRDecompressorTest {
+
+  @Test
+  public void mmrDecodingTest() throws IOException, InvalidHeaderValueException {
+    final byte[] expected = new byte[]{
+        0, 0, 2, 34, 38, 102, -17, -1, 2, 102, 102, //
+        -18, -18, -17, -1, -1, 0, 2, 102, 102, 127, //
+        -1, -1, -1, 0, 0, 0, 4, 68, 102, 102, 127
+    };
+
+    final InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    final DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    final ImageInputStream iis = disf.getInputStream(is);
+
+    // Sixth Segment (number 5)
+    final SubInputStream sis = new SubInputStream(iis, 252, 38);
+
+    final MMRDecompressor mmrd = new MMRDecompressor(16 * 4, 4, sis);
+
+    final Bitmap b = mmrd.uncompress();
+    final byte[] actual = b.getByteArray();
+
+    assertArrayEquals(expected, actual);
+
+    // new TestImage(b.getByteArray(), (int) b.getWidth(), (int) b.getHeight(), b.getRowStride());
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsBlitTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsBlitTest.java b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsBlitTest.java
new file mode 100644
index 0000000..eb3f095
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsBlitTest.java
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.image;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import java.awt.Rectangle;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.Bitmap;
+import org.apache.pdfbox.jbig2.JBIG2DocumentFacade;
+import org.apache.pdfbox.jbig2.err.JBIG2Exception;
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Test;
+
+public class BitmapsBlitTest {
+
+  @Test
+  public void testCompleteBitmapTransfer() throws IOException, JBIG2Exception {
+    final InputStream inputStream = getClass().getResourceAsStream("/images/042_1.jb2");
+    final DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    final ImageInputStream iis = disf.getInputStream(inputStream);
+
+    final JBIG2DocumentFacade doc = new JBIG2DocumentFacade(iis);
+
+    final Bitmap src = doc.getPageBitmap(1);
+    final Bitmap dst = new Bitmap(src.getWidth(), src.getHeight());
+    Bitmaps.blit(src, dst, 0, 0, CombinationOperator.REPLACE);
+
+    final byte[] srcData = src.getByteArray();
+    final byte[] dstData = dst.getByteArray();
+
+    assertArrayEquals(srcData, dstData);
+  }
+
+  @Test
+  public void test() throws IOException, JBIG2Exception {
+    final InputStream inputStream = getClass().getResourceAsStream("/images/042_1.jb2");
+    final DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    final ImageInputStream iis = disf.getInputStream(inputStream);
+
+    final JBIG2DocumentFacade doc = new JBIG2DocumentFacade(iis);
+
+    final Bitmap dst = doc.getPageBitmap(1);
+
+    final Rectangle roi = new Rectangle(100, 100, 100, 100);
+    final Bitmap src = new Bitmap(roi.width, roi.height);
+    Bitmaps.blit(src, dst, roi.x, roi.y, CombinationOperator.REPLACE);
+
+    final Bitmap dstRegionBitmap = Bitmaps.extract(roi, dst);
+
+    final byte[] srcData = src.getByteArray();
+    final byte[] dstRegionData = dstRegionBitmap.getByteArray();
+
+    assertArrayEquals(srcData, dstRegionData);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsByteCombinationTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsByteCombinationTest.java b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsByteCombinationTest.java
new file mode 100644
index 0000000..b1baed5
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsByteCombinationTest.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.image;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class BitmapsByteCombinationTest {
+
+  private static final byte value1 = 0xA;
+  private static final byte value2 = 0xD;
+
+  private final int expected;
+  private final CombinationOperator operator;
+
+  @Parameters
+  public static Collection<Object[]> data() {
+    return Arrays.asList(new Object[][]{
+        {
+            0xF, CombinationOperator.OR
+        }, {
+            0x8, CombinationOperator.AND
+        }, {
+            0x7, CombinationOperator.XOR
+        }, {
+            -8, CombinationOperator.XNOR
+        }, {
+            value2, CombinationOperator.REPLACE
+        }
+    });
+  }
+
+  public BitmapsByteCombinationTest(final int expected, final CombinationOperator operator) {
+    this.expected = expected;
+    this.operator = operator;
+  }
+
+
+  @Test
+  public void test() {
+    assertEquals(expected, Bitmaps.combineBytes(value1, value2, operator));
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsChecksumTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsChecksumTest.java b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsChecksumTest.java
new file mode 100644
index 0000000..8c8ccf8
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/image/BitmapsChecksumTest.java
@@ -0,0 +1,177 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.image;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.image.DataBufferByte;
+import java.awt.image.WritableRaster;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.imageio.ImageReadParam;
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.Bitmap;
+import org.apache.pdfbox.jbig2.JBIG2DocumentFacade;
+import org.apache.pdfbox.jbig2.JBIG2ImageReaderDemo;
+import org.apache.pdfbox.jbig2.PreconfiguredImageReadParam;
+import org.apache.pdfbox.jbig2.err.JBIG2Exception;
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.image.FilterType;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.io.InputStreamFactory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+
+@RunWith(Parameterized.class)
+public class BitmapsChecksumTest {
+
+  private String resourcePath;
+  private ImageReadParam param;
+  private FilterType filterType;
+  private String checksum;
+  private int pageNumber;
+
+  @Parameters
+  public static Collection<Object[]> data() {
+    return Arrays.asList(new Object[][]{
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Dimension(500, 500)), FilterType.Bessel,
+            "101-6467-126-3534108-8927-58-26-37248672"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Dimension(500, 800)), FilterType.Box,
+            "-748135-126-6412111-11925-1038826-95-32-6-104"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Dimension(4000, 5500)), FilterType.Box,
+            "-646510160-466410970-77-1031184396-8-23-18"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Dimension(600, 300)), FilterType.Bessel,
+            "-69-11478-721003586-100-72-85-1559101-118-24-94"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(2, 2, 0, 0), FilterType.Bessel,
+            "-4979-94-68-125645751-2111712617-59-295"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(2, 2, 0, 0), FilterType.Lanczos,
+            "-4979-94-68-125645751-2111712617-59-295"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(3, 3, 1, 1), FilterType.Lanczos,
+            "84-1069410599-9575-7934-1279-80-85127-18-128"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Rectangle(100, 100, 500, 500)),
+            FilterType.Lanczos, "1245-23-127954634-1232173-109-5739-303-48"
+        },
+        {
+            "/images/042_1.jb2", 1, new PreconfiguredImageReadParam(new Rectangle(500, 500, 2000, 2000)),
+            FilterType.Lanczos, "-60-45-117-90-6596-11556-47-30-112-741138412082"
+        },
+        {
+            "/images/042_1.jb2", 1,
+            new PreconfiguredImageReadParam(new Rectangle(500, 500, 2000, 2000), new Dimension(678, 931)),
+            FilterType.Lanczos, "-17-95-5543-12062-625054-94-88-31-4-120-1971"
+        },
+        {
+            "/images/042_1.jb2", 1,
+            new PreconfiguredImageReadParam(new Rectangle(500, 500, 2000, 2000), new Dimension(678, 931), 3, 3, 1, 1),
+            FilterType.Lanczos, "-109-60118-41999255-94113-5019-2818-10-39-71"
+        }
+    });
+  }
+
+  public BitmapsChecksumTest(String resourcePath, int pageNumber, ImageReadParam param, FilterType filterType,
+      String checksum) {
+    this.resourcePath = resourcePath;
+    this.pageNumber = pageNumber;
+    this.param = param;
+    this.filterType = filterType;
+    this.checksum = checksum;
+  }
+
+  @Test
+  public void test() throws IOException, JBIG2Exception, NoSuchAlgorithmException {
+    final InputStream inputStream = JBIG2ImageReaderDemo.class.getResourceAsStream(resourcePath);
+    final InputStreamFactory disf = new DefaultInputStreamFactory();
+    final ImageInputStream iis = disf.getInputStream(inputStream);
+
+    final JBIG2DocumentFacade doc = new JBIG2DocumentFacade(iis);
+    final Bitmap b = doc.getPageBitmap(pageNumber);
+    final WritableRaster raster = Bitmaps.asRaster(b, param, filterType);
+
+    final DataBufferByte dataBufferByte = (DataBufferByte) raster.getDataBuffer();
+    final byte[] bytes = dataBufferByte.getData();
+
+    final MessageDigest md = MessageDigest.getInstance("MD5");
+
+    final byte[] digest = md.digest(bytes);
+    final StringBuilder sb = new StringBuilder();
+    for (byte toAppend : digest) {
+      sb.append(toAppend);
+    }
+
+    assertArrayEquals(checksum.getBytes(), sb.toString().getBytes());
+  }
+
+  static class RasterChecksumCalculator {
+    public static void main(String[] args) throws IOException, JBIG2Exception, NoSuchAlgorithmException {
+      final String resourcePath = "/images/042_1.jb2";
+
+      final int pageNumber = 1;
+
+      final URL imageUrl = JBIG2ImageReaderDemo.class.getResource(resourcePath);
+
+      final InputStream inputStream = new FileInputStream(new File(imageUrl.getPath()));
+      final InputStreamFactory disf = new DefaultInputStreamFactory();
+      final ImageInputStream iis = disf.getInputStream(inputStream);
+
+      final JBIG2DocumentFacade doc = new JBIG2DocumentFacade(iis);
+      final Bitmap b = doc.getPageBitmap(pageNumber);
+
+      final ImageReadParam param = new PreconfiguredImageReadParam(new Rectangle(100, 100, 500, 500));
+
+      final WritableRaster raster = Bitmaps.asRaster(b, param, FilterType.Lanczos);
+      final DataBufferByte dataBufferByte = (DataBufferByte) raster.getDataBuffer();
+      final byte[] bytes = dataBufferByte.getData();
+
+      final MessageDigest md = MessageDigest.getInstance("MD5");
+
+      final byte[] digest = md.digest(bytes);
+      for (byte d : digest) {
+        System.out.print(d);
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/GenericRegionTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/GenericRegionTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/GenericRegionTest.java
new file mode 100644
index 0000000..8692c6c
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/GenericRegionTest.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.TestImage;
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.image.Bitmaps;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.io.SubInputStream;
+import org.apache.pdfbox.jbig2.segments.GenericRegion;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class GenericRegionTest {
+
+  @Test
+  public void parseHeaderTest() throws IOException, InvalidHeaderValueException {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+
+    // Twelfth Segment (number 11)
+    SubInputStream sis = new SubInputStream(iis, 523, 35);
+    GenericRegion gr = new GenericRegion();
+    gr.init(null, sis);
+
+    Assert.assertEquals(54, gr.getRegionInfo().getBitmapWidth());
+    Assert.assertEquals(44, gr.getRegionInfo().getBitmapHeight());
+    Assert.assertEquals(4, gr.getRegionInfo().getXLocation());
+    Assert.assertEquals(11, gr.getRegionInfo().getYLocation());
+    Assert.assertEquals(CombinationOperator.OR, gr.getRegionInfo().getCombinationOperator());
+
+    Assert.assertFalse(gr.useExtTemplates());
+    Assert.assertFalse(gr.isMMREncoded());
+    Assert.assertEquals(0, gr.getGbTemplate());
+    Assert.assertTrue(gr.isTPGDon());
+
+    short[] gbAtX = gr.getGbAtX();
+    short[] gbAtY = gr.getGbAtY();
+    Assert.assertEquals(3, gbAtX[0]);
+    Assert.assertEquals(-1, gbAtY[0]);
+    Assert.assertEquals(-3, gbAtX[1]);
+    Assert.assertEquals(-1, gbAtY[1]);
+    Assert.assertEquals(2, gbAtX[2]);
+    Assert.assertEquals(-2, gbAtY[2]);
+    Assert.assertEquals(-2, gbAtX[3]);
+    Assert.assertEquals(-2, gbAtY[3]);
+  }
+
+  // TESTS WITH TESTOUTPUT
+  // Ignore in build process
+
+  @Ignore
+  @Test
+  public void decodeTemplate0Test() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Twelfth Segment (number 11)
+    SubInputStream sis = new SubInputStream(iis, 523, 35);
+    GenericRegion gr = new GenericRegion();
+
+    gr.init(null, sis);
+    new TestImage(Bitmaps.asBufferedImage(gr.getRegionBitmap()));
+  }
+
+  @Ignore
+  @Test
+  public void decodeWithArithmetichCoding() throws Throwable {
+
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Twelfth Segment (number 11)
+    SubInputStream sis = new SubInputStream(iis, 523, 35);
+    GenericRegion gr = new GenericRegion(sis);
+
+    gr.init(null, sis);
+    new TestImage(Bitmaps.asBufferedImage(gr.getRegionBitmap()));
+  }
+
+  @Ignore
+  @Test
+  public void decodeWithMMR() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Fifth Segment (number 4)
+    SubInputStream sis = new SubInputStream(iis, 190, 59);
+    GenericRegion gr = new GenericRegion(sis);
+    gr.init(null, sis);
+    new TestImage(Bitmaps.asBufferedImage(gr.getRegionBitmap()));
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/HalftoneRegionTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/HalftoneRegionTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/HalftoneRegionTest.java
new file mode 100644
index 0000000..64eae08
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/HalftoneRegionTest.java
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.io.SubInputStream;
+import org.apache.pdfbox.jbig2.segments.HalftoneRegion;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Test;
+
+public class HalftoneRegionTest {
+
+  @Test
+  public void parseHeaderTest() throws IOException, InvalidHeaderValueException {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Seventh Segment (number 6)
+    SubInputStream sis = new SubInputStream(iis, 302, 87);
+    HalftoneRegion hr = new HalftoneRegion(sis);
+    hr.init(null, sis);
+
+    Assert.assertEquals(true, hr.isMMREncoded());
+    Assert.assertEquals(0, hr.getHTemplate());
+    Assert.assertEquals(false, hr.isHSkipEnabled());
+    Assert.assertEquals(CombinationOperator.OR, hr.getCombinationOperator());
+    Assert.assertEquals(0, hr.getHDefaultPixel());
+
+    Assert.assertEquals(8, hr.getHGridWidth());
+    Assert.assertEquals(9, hr.getHGridHeight());
+    Assert.assertEquals(0, hr.getHGridX());
+    Assert.assertEquals(0, hr.getHGridY());
+    Assert.assertEquals(1024, hr.getHRegionX());
+    Assert.assertEquals(0, hr.getHRegionY());
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/PageInformationTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/PageInformationTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/PageInformationTest.java
new file mode 100644
index 0000000..2ef2cc2
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/PageInformationTest.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.*;
+import org.apache.pdfbox.jbig2.segments.PageInformation;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class PageInformationTest {
+
+	@Test
+	public void parseHeaderCompleteTest() throws IOException,
+			InvalidHeaderValueException {
+		InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+		DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+		ImageInputStream iis = disf.getInputStream(is);
+		// Second Segment (number 1)
+		SubInputStream sis = new SubInputStream(iis, 59, 19);
+		PageInformation pi = new PageInformation();
+		pi.init(null, sis);
+		Assert.assertEquals(64, pi.getBitmapWidth());
+		Assert.assertEquals(56, pi.getBitmapHeight());
+		Assert.assertEquals(0, pi.getResolutionX());
+		Assert.assertEquals(0, pi.getResolutionY());
+		Assert.assertEquals(true, pi.isLossless());
+		Assert.assertEquals(false, pi.mightContainRefinements());
+		Assert.assertEquals(0, pi.getDefaultPixelValue());
+		Assert.assertEquals(CombinationOperator.OR, pi.getCombinationOperator());
+		Assert.assertEquals(false, pi.isAuxiliaryBufferRequired());
+		Assert.assertEquals(false, pi.isCombinationOperatorOverrideAllowed());
+		Assert.assertEquals(false, pi.isStriped());
+		Assert.assertEquals(0, pi.getMaxStripeSize());
+	}
+
+	@Ignore
+	@Test
+	public void parseHeaderXOROperatorTest() throws IOException,
+			InvalidHeaderValueException {
+		InputStream is = getClass().getResourceAsStream(
+				"/sampledata_pageinformation_with_xor-opartor.jb2");
+		DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+		ImageInputStream iis = disf.getInputStream(is);
+		// Second Segment (number 1)
+		SubInputStream sis = new SubInputStream(iis, 59, 19);
+		PageInformation pi = new PageInformation();
+		pi.init(null, sis);
+		// XOR (2) als Operator erwartet
+		Assert.assertEquals(2, pi.getCombinationOperator());
+	}
+
+	@Ignore
+	@Test
+	public void parseHeaderANDOperatorTest() throws IOException,
+			InvalidHeaderValueException {
+		InputStream is = getClass().getResourceAsStream(
+				"/sampledata_pageinformation_with_and-opartor.jb2");
+		DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+		ImageInputStream iis = disf.getInputStream(is);
+		// Second Segment (number 1)
+		SubInputStream sis = new SubInputStream(iis, 59, 19);
+		PageInformation pi = new PageInformation();
+		pi.init(null, sis);
+		Assert.assertEquals(true, pi.isLossless());
+		// AND (1) als Operator erwartet
+		Assert.assertEquals(1, pi.getCombinationOperator());
+	}
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/PatternDictionaryTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/PatternDictionaryTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/PatternDictionaryTest.java
new file mode 100644
index 0000000..0f32f0a
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/PatternDictionaryTest.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.*;
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.*;
+import org.apache.pdfbox.jbig2.segments.*;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class PatternDictionaryTest {
+  @Test
+  public void parseHeaderTest() throws IOException, InvalidHeaderValueException {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Sixth Segment (number 5)
+    SubInputStream sis = new SubInputStream(iis, 245, 45);
+    PatternDictionary pd = new PatternDictionary();
+    pd.init(null, sis);
+    Assert.assertEquals(true, pd.isMMREncoded());
+    Assert.assertEquals(0, pd.getHdTemplate());
+    Assert.assertEquals(4, pd.getHdpWidth());
+    Assert.assertEquals(4, pd.getHdpHeight());
+    Assert.assertEquals(15, pd.getGrayMax());
+  }
+
+  // TESTS WITH TESTOUTPUT
+  // Ignore in build process
+
+  @Ignore
+  @Test
+  public void decodeTestWithOutput() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Sixth Segment (number 5)
+    SubInputStream sis = new SubInputStream(iis, 245, 45);
+
+    PatternDictionary pd = new PatternDictionary();
+    pd.init(null, sis);
+
+    ArrayList<Bitmap> b = pd.getDictionary();
+
+    int i = 5;
+    // for (int i = 0; i < 8; i++) {
+    new TestImage(b.get(i).getByteArray(), (int) b.get(i).getWidth(), (int) b.get(i).getHeight(),
+        b.get(i).getRowStride());
+    // }
+  }
+
+  @Ignore
+  @Test
+  public void decodeTestWithOutput2() throws Throwable {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    // Twelfth Segment (number 12)
+    SubInputStream sis = new SubInputStream(iis, 569, 28);
+
+    PatternDictionary pd = new PatternDictionary();
+    pd.init(null, sis);
+
+    ArrayList<Bitmap> b = pd.getDictionary();
+
+    int i = 2;
+    // for (int i = 0; i < 8; i++) {
+    new TestImage(b.get(i).getByteArray(), (int) b.get(i).getWidth(), (int) b.get(i).getHeight(),
+        b.get(i).getRowStride());
+    // }
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/RegionSegmentInformationTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/RegionSegmentInformationTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/RegionSegmentInformationTest.java
new file mode 100644
index 0000000..84b555a
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/RegionSegmentInformationTest.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import junit.framework.Assert;
+
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.apache.pdfbox.jbig2.io.SubInputStream;
+import org.apache.pdfbox.jbig2.segments.RegionSegmentInformation;
+import org.apache.pdfbox.jbig2.util.CombinationOperator;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class RegionSegmentInformationTest {
+
+  @Test
+  public void parseHeaderTest() throws IOException {
+    InputStream is = getClass().getResourceAsStream("/images/sampledata.jb2");
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    SubInputStream sis = new SubInputStream(iis, 130, 49);
+    RegionSegmentInformation rsi = new RegionSegmentInformation(sis);
+    rsi.parseHeader();
+    Assert.assertEquals(37, rsi.getBitmapWidth());
+    Assert.assertEquals(8, rsi.getBitmapHeight());
+    Assert.assertEquals(4, rsi.getXLocation());
+    Assert.assertEquals(1, rsi.getYLocation());
+    Assert.assertEquals(CombinationOperator.OR, rsi.getCombinationOperator());
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/SymbolDictionaryTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/SymbolDictionaryTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/SymbolDictionaryTest.java
new file mode 100644
index 0000000..8babe4b
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/SymbolDictionaryTest.java
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import org.junit.Ignore;
+
+@Ignore
+public class SymbolDictionaryTest {
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/segments/TextRegionTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/segments/TextRegionTest.java b/src/test/java/org/apache/pdfbox/jbig2/segments/TextRegionTest.java
new file mode 100644
index 0000000..da6f961
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/segments/TextRegionTest.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.segments;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.stream.ImageInputStream;
+
+import org.apache.pdfbox.jbig2.JBIG2ImageReader;
+import org.apache.pdfbox.jbig2.JBIG2ImageReaderSpi;
+import org.apache.pdfbox.jbig2.TestImage;
+import org.apache.pdfbox.jbig2.err.IntegerMaxValueException;
+import org.apache.pdfbox.jbig2.err.InvalidHeaderValueException;
+import org.apache.pdfbox.jbig2.io.DefaultInputStreamFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class TextRegionTest {
+
+  // TESTS WITH TESTOUTPUT
+  // Ignore for in build process
+
+  @Ignore
+  @Test
+  public void textRegionWith() throws IOException, InvalidHeaderValueException, IntegerMaxValueException {
+    String filepath = "/images/042_11.jb2";
+    int pageNumber = 1;
+
+    InputStream is = getClass().getResourceAsStream(filepath);
+    DefaultInputStreamFactory disf = new DefaultInputStreamFactory();
+    ImageInputStream iis = disf.getInputStream(is);
+    JBIG2ImageReader jb2 = new JBIG2ImageReader(new JBIG2ImageReaderSpi());
+    jb2.setInput(iis);
+    BufferedImage b = jb2.read(pageNumber);
+    new TestImage(b);
+  }
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/util/CacheFactoryTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/util/CacheFactoryTest.java b/src/test/java/org/apache/pdfbox/jbig2/util/CacheFactoryTest.java
new file mode 100644
index 0000000..0f15338
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/util/CacheFactoryTest.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.util;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.pdfbox.jbig2.util.cache.CacheBridge;
+import org.apache.pdfbox.jbig2.util.cache.CacheFactory;
+import org.junit.Test;
+
+public class CacheFactoryTest {
+
+  @Test
+  public void testWithDefaultClassLoader() {
+    CacheFactory.setClassLoader(CacheBridge.class.getClassLoader());
+    assertNotNull(CacheFactory.getCache());
+  }
+
+  @Test
+  public void testWithContextClassLoader() {
+    CacheFactory.setClassLoader(Thread.currentThread().getContextClassLoader());
+    assertNotNull(CacheFactory.getCache());
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/util/LoggerFactoryTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/util/LoggerFactoryTest.java b/src/test/java/org/apache/pdfbox/jbig2/util/LoggerFactoryTest.java
new file mode 100644
index 0000000..0fc89b6
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/util/LoggerFactoryTest.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.util;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.pdfbox.jbig2.util.log.LoggerBridge;
+import org.apache.pdfbox.jbig2.util.log.LoggerFactory;
+import org.junit.Test;
+
+public class LoggerFactoryTest {
+
+  @Test
+  public void testWithDefaultClassLoader() {
+    LoggerFactory.setClassLoader(LoggerBridge.class.getClassLoader());
+    assertNotNull(LoggerFactory.getLogger(LoggerFactoryTest.class));
+  }
+  
+  @Test
+  public void testWithContextClassLoader() {
+    LoggerFactory.setClassLoader(Thread.currentThread().getContextClassLoader());
+    assertNotNull(LoggerFactory.getLogger(LoggerFactoryTest.class));
+  }
+  
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/util/ServiceLookupTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/util/ServiceLookupTest.java b/src/test/java/org/apache/pdfbox/jbig2/util/ServiceLookupTest.java
new file mode 100644
index 0000000..72c86ef
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/util/ServiceLookupTest.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+
+import org.apache.pdfbox.jbig2.util.ServiceLookup;
+import org.junit.Test;
+
+public class ServiceLookupTest {
+
+  @Test
+  public void withDefaultClassLoader() {
+    runTest(null);
+  }
+
+  @Test
+  public void withContextClassLoader() {
+    runTest(Thread.currentThread().getContextClassLoader());
+  }
+
+  @Test
+  public void withClassLoaderFromClass() {
+    runTest(TestService.class.getClassLoader());
+  }
+  
+  private void runTest(ClassLoader clsLoader) {
+    ServiceLookup<TestService> serviceLookup = new ServiceLookup<TestService>();
+
+    Iterator<TestService> services = clsLoader != null
+        ? serviceLookup.getServices(TestService.class, clsLoader)
+        : serviceLookup.getServices(TestService.class);
+
+    assertTrue(services.hasNext());
+    assertEquals(TestServiceImpl.class, services.next().getClass());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/util/TestService.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/util/TestService.java b/src/test/java/org/apache/pdfbox/jbig2/util/TestService.java
new file mode 100644
index 0000000..1bb8b13
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/util/TestService.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.util;
+
+public interface TestService {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/java/org/apache/pdfbox/jbig2/util/TestServiceImpl.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/pdfbox/jbig2/util/TestServiceImpl.java b/src/test/java/org/apache/pdfbox/jbig2/util/TestServiceImpl.java
new file mode 100644
index 0000000..da1f608
--- /dev/null
+++ b/src/test/java/org/apache/pdfbox/jbig2/util/TestServiceImpl.java
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.jbig2.util;
+
+public class TestServiceImpl implements TestService {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/resources/META-INF/services/org.apache.pdfbox.jbig2.util.TestService
----------------------------------------------------------------------
diff --git a/src/test/resources/META-INF/services/org.apache.pdfbox.jbig2.util.TestService b/src/test/resources/META-INF/services/org.apache.pdfbox.jbig2.util.TestService
new file mode 100644
index 0000000..c916bc9
--- /dev/null
+++ b/src/test/resources/META-INF/services/org.apache.pdfbox.jbig2.util.TestService
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.pdfbox.jbig2.util.TestServiceImpl
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/resources/com/levigo/jbig2/github/21.glob
----------------------------------------------------------------------
diff --git a/src/test/resources/com/levigo/jbig2/github/21.glob b/src/test/resources/com/levigo/jbig2/github/21.glob
new file mode 100644
index 0000000..2261edf
Binary files /dev/null and b/src/test/resources/com/levigo/jbig2/github/21.glob differ

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/resources/com/levigo/jbig2/github/21.jb2
----------------------------------------------------------------------
diff --git a/src/test/resources/com/levigo/jbig2/github/21.jb2 b/src/test/resources/com/levigo/jbig2/github/21.jb2
new file mode 100644
index 0000000..25f8f05
Binary files /dev/null and b/src/test/resources/com/levigo/jbig2/github/21.jb2 differ

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/4619d28b/src/test/resources/images/001.jb2
----------------------------------------------------------------------
diff --git a/src/test/resources/images/001.jb2 b/src/test/resources/images/001.jb2
new file mode 100644
index 0000000..aad904f
Binary files /dev/null and b/src/test/resources/images/001.jb2 differ