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 2018/02/09 17:06:27 UTC

[12/14] pdfbox-jbig2 git commit: PDFBOX-4098: reformat the source code, introduce an eclipse formatter definition

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/JBIG2Page.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/JBIG2Page.java b/src/main/java/org/apache/pdfbox/jbig2/JBIG2Page.java
index 566cdf7..8f48fc2 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/JBIG2Page.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/JBIG2Page.java
@@ -38,339 +38,401 @@ import org.apache.pdfbox.jbig2.util.log.LoggerFactory;
 /**
  * This class represents a JBIG2 page.
  */
-class JBIG2Page {
+class JBIG2Page
+{
 
-  private static final Logger log = LoggerFactory.getLogger(JBIG2Page.class);
+    private static final Logger log = LoggerFactory.getLogger(JBIG2Page.class);
 
-  /**
-   * This list contains all segments of this page, sorted by segment number in ascending order.
-   */
-  private final Map<Integer, SegmentHeader> segments = new TreeMap<Integer, SegmentHeader>();
+    /**
+     * This list contains all segments of this page, sorted by segment number in ascending order.
+     */
+    private final Map<Integer, SegmentHeader> segments = new TreeMap<Integer, SegmentHeader>();
 
-  /** NOTE: page number != segmentList index */
-  private final int pageNumber;
+    /** NOTE: page number != segmentList index */
+    private final int pageNumber;
 
-  /** The page bitmap that represents the page buffer */
-  private Bitmap pageBitmap;
+    /** The page bitmap that represents the page buffer */
+    private Bitmap pageBitmap;
 
-  private int finalHeight;
-  private int finalWidth;
-  private int resolutionX;
-  private int resolutionY;
+    private int finalHeight;
+    private int finalWidth;
+    private int resolutionX;
+    private int resolutionY;
 
-  private final JBIG2Document document;
+    private final JBIG2Document document;
 
-  protected JBIG2Page(JBIG2Document document, int pageNumber) {
-    this.document = document;
-    this.pageNumber = pageNumber;
-  }
-
-  /**
-   * This method searches for a segment specified by its number.
-   * 
-   * @param number - Segment number of the segment to search.
-   * 
-   * @return The retrieved {@link SegmentHeader} or {@code null} if not available.
-   */
-  public SegmentHeader getSegment(int number) {
-    SegmentHeader s = segments.get(number);
-
-    if (null != s) {
-      return s;
+    protected JBIG2Page(JBIG2Document document, int pageNumber)
+    {
+        this.document = document;
+        this.pageNumber = pageNumber;
     }
 
-    if (null != document) {
-      return document.getGlobalSegment(number);
+    /**
+     * This method searches for a segment specified by its number.
+     * 
+     * @param number - Segment number of the segment to search.
+     * 
+     * @return The retrieved {@link SegmentHeader} or {@code null} if not available.
+     */
+    public SegmentHeader getSegment(int number)
+    {
+        SegmentHeader s = segments.get(number);
+
+        if (null != s)
+        {
+            return s;
+        }
+
+        if (null != document)
+        {
+            return document.getGlobalSegment(number);
+        }
+
+        log.info("Segment not found, returning null.");
+        return null;
     }
 
-    log.info("Segment not found, returning null.");
-    return null;
-  }
-
-  /**
-   * Returns the associated page information segment.
-   * 
-   * @return The associated {@link PageInformation} segment or {@code null} if not available.
-   */
-  protected SegmentHeader getPageInformationSegment() {
-    for (SegmentHeader s : segments.values()) {
-      if (s.getSegmentType() == 48) {
-        return s;
-      }
+    /**
+     * Returns the associated page information segment.
+     * 
+     * @return The associated {@link PageInformation} segment or {@code null} if not available.
+     */
+    protected SegmentHeader getPageInformationSegment()
+    {
+        for (SegmentHeader s : segments.values())
+        {
+            if (s.getSegmentType() == 48)
+            {
+                return s;
+            }
+        }
+
+        log.info("Page information segment not found.");
+        return null;
     }
 
-    log.info("Page information segment not found.");
-    return null;
-  }
-
-  /**
-   * This method returns the decoded bitmap if present. Otherwise the page bitmap will be composed
-   * before returning the result.
-   * 
-   * @return pageBitmap - The result of decoding a page
-   * @throws JBIG2Exception
-   * @throws IOException
-   */
-  protected Bitmap getBitmap() throws JBIG2Exception, IOException {
-    long timestamp;
-
-    if (JBIG2ImageReader.PERFORMANCE_TEST) {
-      timestamp = System.currentTimeMillis();
+    /**
+     * This method returns the decoded bitmap if present. Otherwise the page bitmap will be composed before returning
+     * the result.
+     * 
+     * @return pageBitmap - The result of decoding a page
+     * @throws JBIG2Exception
+     * @throws IOException
+     */
+    protected Bitmap getBitmap() throws JBIG2Exception, IOException
+    {
+        long timestamp;
+
+        if (JBIG2ImageReader.PERFORMANCE_TEST)
+        {
+            timestamp = System.currentTimeMillis();
+        }
+
+        if (null == pageBitmap)
+        {
+            composePageBitmap();
+        }
+
+        if (JBIG2ImageReader.PERFORMANCE_TEST)
+        {
+            log.info("PAGE DECODING: " + (System.currentTimeMillis() - timestamp) + " ms");
+        }
+
+        return pageBitmap;
     }
 
-    if (null == pageBitmap) {
-      composePageBitmap();
+    /**
+     * This method composes the segments' bitmaps to a page and stores the page as a {@link Bitmap}
+     * 
+     * @throws IOException
+     * @throws JBIG2Exception
+     */
+    private void composePageBitmap() throws IOException, JBIG2Exception
+    {
+        if (pageNumber > 0)
+        {
+            // Page 79, 1) Decoding the page information segment
+            PageInformation pageInformation = (PageInformation) getPageInformationSegment()
+                    .getSegmentData();
+            createPage(pageInformation);
+            clearSegmentData();
+        }
     }
 
-    if (JBIG2ImageReader.PERFORMANCE_TEST) {
-      log.info("PAGE DECODING: " + (System.currentTimeMillis() - timestamp) + " ms");
+    private void createPage(PageInformation pageInformation)
+            throws IOException, IntegerMaxValueException, InvalidHeaderValueException
+    {
+        if (!pageInformation.isStriped() || pageInformation.getHeight() != -1)
+        {
+            // Page 79, 4)
+            createNormalPage(pageInformation);
+        }
+        else
+        {
+            createStripedPage(pageInformation);
+        }
     }
 
-    return pageBitmap;
-  }
-
-  /**
-   * This method composes the segments' bitmaps to a page and stores the page as a {@link Bitmap}
-   * 
-   * @throws IOException
-   * @throws JBIG2Exception
-   */
-  private void composePageBitmap() throws IOException, JBIG2Exception {
-    if (pageNumber > 0) {
-      // Page 79, 1) Decoding the page information segment
-      PageInformation pageInformation = (PageInformation) getPageInformationSegment().getSegmentData();
-      createPage(pageInformation);
-      clearSegmentData();
-    }
-  }
-
-  private void createPage(PageInformation pageInformation) throws IOException, IntegerMaxValueException,
-      InvalidHeaderValueException {
-    if (!pageInformation.isStriped() || pageInformation.getHeight() != -1) {
-      // Page 79, 4)
-      createNormalPage(pageInformation);
-    } else {
-      createStripedPage(pageInformation);
+    private void createNormalPage(PageInformation pageInformation)
+            throws IOException, IntegerMaxValueException, InvalidHeaderValueException
+    {
+
+        pageBitmap = new Bitmap(pageInformation.getWidth(), pageInformation.getHeight());
+
+        // Page 79, 3)
+        // If default pixel value is not 0, byte will be filled with 0xff
+        if (pageInformation.getDefaultPixelValue() != 0)
+        {
+            Arrays.fill(pageBitmap.getByteArray(), (byte) 0xff);
+        }
+
+        for (SegmentHeader s : segments.values())
+        {
+            // Page 79, 5)
+            switch (s.getSegmentType())
+            {
+            case 6: // Immediate text region
+            case 7: // Immediate lossless text region
+            case 22: // Immediate halftone region
+            case 23: // Immediate lossless halftone region
+            case 38: // Immediate generic region
+            case 39: // Immediate lossless generic region
+            case 42: // Immediate generic refinement region
+            case 43: // Immediate lossless generic refinement region
+                final Region r = (Region) s.getSegmentData();
+
+                final Bitmap regionBitmap = r.getRegionBitmap();
+
+                if (fitsPage(pageInformation, regionBitmap))
+                {
+                    pageBitmap = regionBitmap;
+                }
+                else
+                {
+                    final RegionSegmentInformation regionInfo = r.getRegionInfo();
+                    final CombinationOperator op = getCombinationOperator(pageInformation,
+                            regionInfo.getCombinationOperator());
+                    Bitmaps.blit(regionBitmap, pageBitmap, regionInfo.getXLocation(),
+                            regionInfo.getYLocation(), op);
+                }
+
+                break;
+            }
+        }
     }
-  }
 
-  private void createNormalPage(PageInformation pageInformation) throws IOException, IntegerMaxValueException,
-      InvalidHeaderValueException {
-
-    pageBitmap = new Bitmap(pageInformation.getWidth(), pageInformation.getHeight());
+    /**
+     * Check if we have only one region that forms the complete page. If the dimension equals the page's dimension set
+     * the region's bitmap as the page's bitmap. Otherwise we have to blit the smaller region's bitmap into the page's
+     * bitmap (see Issue 6).
+     * 
+     * @param pageInformation
+     * @param regionBitmap
+     * @return
+     */
+    private boolean fitsPage(PageInformation pageInformation, final Bitmap regionBitmap)
+    {
+        return countRegions() == 1 && pageInformation.getDefaultPixelValue() == 0
+                && pageInformation.getWidth() == regionBitmap.getWidth()
+                && pageInformation.getHeight() == regionBitmap.getHeight();
+    }
 
-    // Page 79, 3)
-    // If default pixel value is not 0, byte will be filled with 0xff
-    if (pageInformation.getDefaultPixelValue() != 0) {
-      Arrays.fill(pageBitmap.getByteArray(), (byte) 0xff);
+    private void createStripedPage(PageInformation pageInformation)
+            throws IOException, IntegerMaxValueException, InvalidHeaderValueException
+    {
+        final ArrayList<SegmentData> pageStripes = collectPageStripes();
+
+        pageBitmap = new Bitmap(pageInformation.getWidth(), finalHeight);
+
+        int startLine = 0;
+        for (SegmentData sd : pageStripes)
+        {
+            if (sd instanceof EndOfStripe)
+            {
+                startLine = ((EndOfStripe) sd).getLineNumber() + 1;
+            }
+            else
+            {
+                final Region r = (Region) sd;
+                final RegionSegmentInformation regionInfo = r.getRegionInfo();
+                final CombinationOperator op = getCombinationOperator(pageInformation,
+                        regionInfo.getCombinationOperator());
+                Bitmaps.blit(r.getRegionBitmap(), pageBitmap, regionInfo.getXLocation(), startLine,
+                        op);
+            }
+        }
     }
 
-    for (SegmentHeader s : segments.values()) {
-      // Page 79, 5)
-      switch (s.getSegmentType()){
-        case 6 : // Immediate text region
-        case 7 : // Immediate lossless text region
-        case 22 : // Immediate halftone region
-        case 23 : // Immediate lossless halftone region
-        case 38 : // Immediate generic region
-        case 39 : // Immediate lossless generic region
-        case 42 : // Immediate generic refinement region
-        case 43 : // Immediate lossless generic refinement region
-          final Region r = (Region) s.getSegmentData();
-
-          final Bitmap regionBitmap = r.getRegionBitmap();
-
-          if (fitsPage(pageInformation, regionBitmap)) {
-            pageBitmap = regionBitmap;
-          } else {
-            final RegionSegmentInformation regionInfo = r.getRegionInfo();
-            final CombinationOperator op = getCombinationOperator(pageInformation,
-                regionInfo.getCombinationOperator());
-            Bitmaps.blit(regionBitmap, pageBitmap, regionInfo.getXLocation(), regionInfo.getYLocation(), op);
-          }
-
-          break;
-      }
+    private ArrayList<SegmentData> collectPageStripes()
+    {
+        final ArrayList<SegmentData> pageStripes = new ArrayList<SegmentData>();
+        for (SegmentHeader s : segments.values())
+        {
+            // Page 79, 5)
+            switch (s.getSegmentType())
+            {
+            case 6: // Immediate text region
+            case 7: // Immediate lossless text region
+            case 22: // Immediate halftone region
+            case 23: // Immediate lossless halftone region
+            case 38: // Immediate generic region
+            case 39: // Immediate lossless generic region
+            case 42: // Immediate generic refinement region
+            case 43: // Immediate lossless generic refinement region
+                Region r = (Region) s.getSegmentData();
+                pageStripes.add(r);
+                break;
+
+            case 50: // End of stripe
+                EndOfStripe eos = (EndOfStripe) s.getSegmentData();
+                pageStripes.add(eos);
+                finalHeight = eos.getLineNumber() + 1;
+                break;
+            }
+        }
+
+        return pageStripes;
     }
-  }
-
-  /**
-   * Check if we have only one region that forms the complete page. If the dimension equals the
-   * page's dimension set the region's bitmap as the page's bitmap. Otherwise we have to blit the
-   * smaller region's bitmap into the page's bitmap (see Issue 6).
-   * 
-   * @param pageInformation
-   * @param regionBitmap
-   * @return
-   */
-  private boolean fitsPage(PageInformation pageInformation, final Bitmap regionBitmap) {
-    return countRegions() == 1 && pageInformation.getDefaultPixelValue() == 0
-        && pageInformation.getWidth() == regionBitmap.getWidth()
-        && pageInformation.getHeight() == regionBitmap.getHeight();
-  }
-
-  private void createStripedPage(PageInformation pageInformation) throws IOException, IntegerMaxValueException,
-      InvalidHeaderValueException {
-    final ArrayList<SegmentData> pageStripes = collectPageStripes();
-
-    pageBitmap = new Bitmap(pageInformation.getWidth(), finalHeight);
-
-    int startLine = 0;
-    for (SegmentData sd : pageStripes) {
-      if (sd instanceof EndOfStripe) {
-        startLine = ((EndOfStripe) sd).getLineNumber() + 1;
-      } else {
-        final Region r = (Region) sd;
-        final RegionSegmentInformation regionInfo = r.getRegionInfo();
-        final CombinationOperator op = getCombinationOperator(pageInformation, regionInfo.getCombinationOperator());
-        Bitmaps.blit(r.getRegionBitmap(), pageBitmap, regionInfo.getXLocation(), startLine, op);
-      }
+
+    /**
+     * This method counts the regions segments. If there is only one region, the bitmap of this segment is equal to the
+     * page bitmap and blitting is not necessary.
+     * 
+     * @return Amount of regions.
+     */
+    private int countRegions()
+    {
+        int regionCount = 0;
+
+        for (SegmentHeader s : segments.values())
+        {
+            switch (s.getSegmentType())
+            {
+            case 6: // Immediate text region
+            case 7: // Immediate lossless text region
+            case 22: // Immediate halftone region
+            case 23: // Immediate lossless halftone region
+            case 38: // Immediate generic region
+            case 39: // Immediate lossless generic region
+            case 42: // Immediate generic refinement region
+            case 43: // Immediate lossless generic refinement region
+                regionCount++;
+            }
+        }
+
+        return regionCount;
     }
-  }
-
-  private ArrayList<SegmentData> collectPageStripes() {
-    final ArrayList<SegmentData> pageStripes = new ArrayList<SegmentData>();
-    for (SegmentHeader s : segments.values()) {
-      // Page 79, 5)
-      switch (s.getSegmentType()){
-        case 6 : // Immediate text region
-        case 7 : // Immediate lossless text region
-        case 22 : // Immediate halftone region
-        case 23 : // Immediate lossless halftone region
-        case 38 : // Immediate generic region
-        case 39 : // Immediate lossless generic region
-        case 42 : // Immediate generic refinement region
-        case 43 : // Immediate lossless generic refinement region
-          Region r = (Region) s.getSegmentData();
-          pageStripes.add(r);
-          break;
-
-        case 50 : // End of stripe
-          EndOfStripe eos = (EndOfStripe) s.getSegmentData();
-          pageStripes.add(eos);
-          finalHeight = eos.getLineNumber() + 1;
-          break;
-      }
+
+    /**
+     * This method checks and sets, which combination operator shall be used.
+     * 
+     * @param pi - <code>PageInformation</code> object
+     * @param newOperator - The combination operator, specified by actual segment
+     * @return the new combination operator
+     */
+    private CombinationOperator getCombinationOperator(PageInformation pi,
+            CombinationOperator newOperator)
+    {
+        if (pi.isCombinationOperatorOverrideAllowed())
+        {
+            return newOperator;
+        }
+        else
+        {
+            return pi.getCombinationOperator();
+        }
     }
 
-    return pageStripes;
-  }
-
-  /**
-   * This method counts the regions segments. If there is only one region, the bitmap of this
-   * segment is equal to the page bitmap and blitting is not necessary.
-   * 
-   * @return Amount of regions.
-   */
-  private int countRegions() {
-    int regionCount = 0;
-
-    for (SegmentHeader s : segments.values()) {
-      switch (s.getSegmentType()){
-        case 6 : // Immediate text region
-        case 7 : // Immediate lossless text region
-        case 22 : // Immediate halftone region
-        case 23 : // Immediate lossless halftone region
-        case 38 : // Immediate generic region
-        case 39 : // Immediate lossless generic region
-        case 42 : // Immediate generic refinement region
-        case 43 : // Immediate lossless generic refinement region
-          regionCount++;
-      }
+    /**
+     * Adds a {@link SegmentHeader} into the page's segments map.
+     * 
+     * @param segment - The segment to be added.
+     */
+    protected void add(SegmentHeader segment)
+    {
+
+        segments.put(segment.getSegmentNr(), segment);
     }
 
-    return regionCount;
-  }
-
-  /**
-   * This method checks and sets, which combination operator shall be used.
-   * 
-   * @param pi - <code>PageInformation</code> object
-   * @param newOperator - The combination operator, specified by actual segment
-   * @return the new combination operator
-   */
-  private CombinationOperator getCombinationOperator(PageInformation pi, CombinationOperator newOperator) {
-    if (pi.isCombinationOperatorOverrideAllowed()) {
-      return newOperator;
-    } else {
-      return pi.getCombinationOperator();
+    /**
+     * Resets the memory-critical segments to force on-demand-decoding and to avoid holding the segments' bitmap too
+     * long.
+     */
+    private void clearSegmentData()
+    {
+        Set<Integer> keySet = segments.keySet();
+
+        for (Integer key : keySet)
+        {
+            segments.get(key).cleanSegmentData();
+        }
     }
-  }
-
-  /**
-   * Adds a {@link SegmentHeader} into the page's segments map.
-   * 
-   * @param segment - The segment to be added.
-   */
-  protected void add(SegmentHeader segment) {
-
-    segments.put(segment.getSegmentNr(), segment);
-  }
-
-  /**
-   * Resets the memory-critical segments to force on-demand-decoding and to avoid holding the
-   * segments' bitmap too long.
-   */
-  private void clearSegmentData() {
-    Set<Integer> keySet = segments.keySet();
-
-    for (Integer key : keySet) {
-      segments.get(key).cleanSegmentData();
+
+    /**
+     * Reset memory-critical parts of page.
+     */
+    protected void clearPageData()
+    {
+        pageBitmap = null;
     }
-  }
-
-  /**
-   * Reset memory-critical parts of page.
-   */
-  protected void clearPageData() {
-    pageBitmap = null;
-  }
-
-  /**
-   * Returns the final height of the page.
-   * 
-   * @return The final height of the page.
-   * @throws IOException
-   * @throws JBIG2Exception
-   */
-  protected int getHeight() throws IOException, JBIG2Exception {
-    if (finalHeight == 0) {
-      PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
-      if (pi.getHeight() == 0xffffffff) {
-        getBitmap();
-      } else {
-        finalHeight = pi.getHeight();
-      }
+
+    /**
+     * Returns the final height of the page.
+     * 
+     * @return The final height of the page.
+     * @throws IOException
+     * @throws JBIG2Exception
+     */
+    protected int getHeight() throws IOException, JBIG2Exception
+    {
+        if (finalHeight == 0)
+        {
+            PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
+            if (pi.getHeight() == 0xffffffff)
+            {
+                getBitmap();
+            }
+            else
+            {
+                finalHeight = pi.getHeight();
+            }
+        }
+        return finalHeight;
     }
-    return finalHeight;
-  }
 
-  protected int getWidth() {
-    if (finalWidth == 0) {
-      PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
-      finalWidth = pi.getWidth();
+    protected int getWidth()
+    {
+        if (finalWidth == 0)
+        {
+            PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
+            finalWidth = pi.getWidth();
+        }
+        return finalWidth;
     }
-    return finalWidth;
-  }
 
-  protected int getResolutionX() {
-    if (resolutionX == 0) {
-      PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
-      resolutionX = pi.getResolutionX();
+    protected int getResolutionX()
+    {
+        if (resolutionX == 0)
+        {
+            PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
+            resolutionX = pi.getResolutionX();
+        }
+        return resolutionX;
     }
-    return resolutionX;
-  }
 
-  protected int getResolutionY() {
-    if (resolutionY == 0) {
-      PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
-      resolutionY = pi.getResolutionY();
+    protected int getResolutionY()
+    {
+        if (resolutionY == 0)
+        {
+            PageInformation pi = (PageInformation) getPageInformationSegment().getSegmentData();
+            resolutionY = pi.getResolutionY();
+        }
+        return resolutionY;
     }
-    return resolutionY;
-  }
 
-  @Override
-  public String toString() {
-    return getClass().getSimpleName() + " (Page number: " + pageNumber + ")";
-  }
+    @Override
+    public String toString()
+    {
+        return getClass().getSimpleName() + " (Page number: " + pageNumber + ")";
+    }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/JBIG2ReadParam.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/JBIG2ReadParam.java b/src/main/java/org/apache/pdfbox/jbig2/JBIG2ReadParam.java
index 7554df2..b8fa158 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/JBIG2ReadParam.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/JBIG2ReadParam.java
@@ -23,26 +23,33 @@ import java.awt.Rectangle;
 import javax.imageio.ImageReadParam;
 
 /**
- * This class extends {@code ImageReadParam} and contains region of interest and scale / subsampling
- * functionality
+ * This class extends {@code ImageReadParam} and contains region of interest and scale / subsampling functionality
  */
-public class JBIG2ReadParam extends ImageReadParam {
+public class JBIG2ReadParam extends ImageReadParam
+{
 
-  public JBIG2ReadParam() {
-    this(1, 1, 0, 0, null, null);
-  }
-
-  public JBIG2ReadParam(final int sourceXSubsampling, final int sourceYSubsampling, final int subsamplingXOffset,
-      final int subsamplingYOffset, final Rectangle sourceRegion, final Dimension sourceRenderSize) {
-    this.canSetSourceRenderSize = true;
-    this.sourceRegion = sourceRegion;
-    this.sourceRenderSize = sourceRenderSize;
-
-    if (sourceXSubsampling < 1 || sourceYSubsampling < 1) {
-      throw new IllegalArgumentException("Illegal subsampling factor: shall be 1 or greater; but was "
-          + " sourceXSubsampling=" + sourceXSubsampling + ", sourceYSubsampling=" + sourceYSubsampling);
+    public JBIG2ReadParam()
+    {
+        this(1, 1, 0, 0, null, null);
     }
 
-    setSourceSubsampling(sourceXSubsampling, sourceYSubsampling, subsamplingXOffset, subsamplingYOffset);
-  }
+    public JBIG2ReadParam(final int sourceXSubsampling, final int sourceYSubsampling,
+            final int subsamplingXOffset, final int subsamplingYOffset,
+            final Rectangle sourceRegion, final Dimension sourceRenderSize)
+    {
+        this.canSetSourceRenderSize = true;
+        this.sourceRegion = sourceRegion;
+        this.sourceRenderSize = sourceRenderSize;
+
+        if (sourceXSubsampling < 1 || sourceYSubsampling < 1)
+        {
+            throw new IllegalArgumentException(
+                    "Illegal subsampling factor: shall be 1 or greater; but was "
+                            + " sourceXSubsampling=" + sourceXSubsampling + ", sourceYSubsampling="
+                            + sourceYSubsampling);
+        }
+
+        setSourceSubsampling(sourceXSubsampling, sourceYSubsampling, subsamplingXOffset,
+                subsamplingYOffset);
+    }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/Region.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/Region.java b/src/main/java/org/apache/pdfbox/jbig2/Region.java
index 87f431a..15366eb 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/Region.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/Region.java
@@ -26,23 +26,25 @@ import org.apache.pdfbox.jbig2.segments.RegionSegmentInformation;
 /**
  * Interface for all JBIG2 region segments.
  */
-public interface Region extends SegmentData {
+public interface Region extends SegmentData
+{
 
-  /**
-   * Decodes and returns a regions content.
-   * 
-   * @return The decoded region as {@link Bitmap}.
-   * 
-   * @throws IOException if an underlying IO operation fails
-   * @throws IntegerMaxValueException if the maximum value limit of an integer is exceeded
-   * @throws InvalidHeaderValueException if the segment header value is invalid
-   */
-  public Bitmap getRegionBitmap() throws IOException, IntegerMaxValueException, InvalidHeaderValueException;
+    /**
+     * Decodes and returns a regions content.
+     * 
+     * @return The decoded region as {@link Bitmap}.
+     * 
+     * @throws IOException if an underlying IO operation fails
+     * @throws IntegerMaxValueException if the maximum value limit of an integer is exceeded
+     * @throws InvalidHeaderValueException if the segment header value is invalid
+     */
+    public Bitmap getRegionBitmap()
+            throws IOException, IntegerMaxValueException, InvalidHeaderValueException;
 
-  /**
-   * Simply returns the {@link RegionSegmentInformation}.
-   * 
-   * @return The {@link RegionSegmentInformation}.
-   */
-  public RegionSegmentInformation getRegionInfo();
+    /**
+     * Simply returns the {@link RegionSegmentInformation}.
+     * 
+     * @return The {@link RegionSegmentInformation}.
+     */
+    public RegionSegmentInformation getRegionInfo();
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/SegmentData.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/SegmentData.java b/src/main/java/org/apache/pdfbox/jbig2/SegmentData.java
index d2aaef5..c5af68a 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/SegmentData.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/SegmentData.java
@@ -26,18 +26,19 @@ import org.apache.pdfbox.jbig2.io.SubInputStream;
 /**
  * Interface for all data parts of segments.
  */
-public interface SegmentData {
+public interface SegmentData
+{
 
-  /**
-   * Parse the stream and read information of header.
-   * 
-   * @param header - The segments' header (to make referred-to segments available in data part).
-   * @param sis - Wrapped {@code ImageInputStream} into {@code SubInputStream}.
-   * 
-   * @throws InvalidHeaderValueException if the segment header value is invalid
-   * @throws IntegerMaxValueException if the maximum value limit of an integer is exceeded
-   * @throws IOException if an underlying IO operation fails
-   */
-  public void init(SegmentHeader header, SubInputStream sis) throws InvalidHeaderValueException, IntegerMaxValueException,
-      IOException;
+    /**
+     * Parse the stream and read information of header.
+     * 
+     * @param header - The segments' header (to make referred-to segments available in data part).
+     * @param sis - Wrapped {@code ImageInputStream} into {@code SubInputStream}.
+     * 
+     * @throws InvalidHeaderValueException if the segment header value is invalid
+     * @throws IntegerMaxValueException if the maximum value limit of an integer is exceeded
+     * @throws IOException if an underlying IO operation fails
+     */
+    public void init(SegmentHeader header, SubInputStream sis)
+            throws InvalidHeaderValueException, IntegerMaxValueException, IOException;
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/SegmentHeader.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/SegmentHeader.java b/src/main/java/org/apache/pdfbox/jbig2/SegmentHeader.java
index c4e9cea..2cffbc7 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/SegmentHeader.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/SegmentHeader.java
@@ -43,390 +43,415 @@ import org.apache.pdfbox.jbig2.util.log.LoggerFactory;
  * The basic class for all JBIG2 segments.
  */
 @SuppressWarnings("unchecked")
-public class SegmentHeader {
-  private static final Logger log = LoggerFactory.getLogger(SegmentHeader.class);
+public class SegmentHeader
+{
+    private static final Logger log = LoggerFactory.getLogger(SegmentHeader.class);
+
+    private static final Map<Integer, Class<? extends SegmentData>> SEGMENT_TYPE_MAP = new HashMap<Integer, Class<? extends SegmentData>>();
+
+    static
+    {
+        Object SEGMENT_TYPES[][] = { { 0, SymbolDictionary.class }, { 4, TextRegion.class },
+                { 6, TextRegion.class }, { 7, TextRegion.class }, { 16, PatternDictionary.class },
+                { 20, HalftoneRegion.class }, { 22, HalftoneRegion.class },
+                { 23, HalftoneRegion.class }, { 36, GenericRegion.class },
+                { 38, GenericRegion.class }, { 39, GenericRegion.class },
+                { 40, GenericRefinementRegion.class }, { 42, GenericRefinementRegion.class },
+                { 43, GenericRefinementRegion.class }, { 48, PageInformation.class },
+                { 50, EndOfStripe.class }, { 52, Profiles.class }, { 53, Table.class }, };
+
+        for (int i = 0; i < SEGMENT_TYPES.length; i++)
+        {
+            Object[] objects = SEGMENT_TYPES[i];
+            SEGMENT_TYPE_MAP.put((Integer) objects[0], (Class<? extends SegmentData>) objects[1]);
+        }
+    }
+
+    private int segmentNr;
+    private int segmentType;
+    private byte retainFlag;
+    private int pageAssociation;
+    private byte pageAssociationFieldSize;
+    private SegmentHeader[] rtSegments;
+    private long segmentHeaderLength;
+    private long segmentDataLength;
+    private long segmentDataStartOffset;
+    private final SubInputStream subInputStream;
+
+    private Reference<SegmentData> segmentData;
+
+    public SegmentHeader(JBIG2Document document, SubInputStream sis, long offset,
+            int organisationType) throws IOException
+    {
+        this.subInputStream = sis;
+        parse(document, sis, offset, organisationType);
+    }
+
+    /**
+     * 
+     * 
+     * @param document
+     * @param subInputStream
+     * @param organisationType
+     * @param offset - The offset where the segment header starts
+     * @throws IOException
+     */
+    private void parse(JBIG2Document document, ImageInputStream subInputStream, long offset,
+            int organisationType) throws IOException
+    {
+
+        printDebugMessage("\n########################");
+        printDebugMessage("Segment parsing started.");
+
+        subInputStream.seek(offset);
+        printDebugMessage("|-Seeked to offset: " + offset);
+
+        /* 7.2.2 Segment number */
+        readSegmentNumber(subInputStream);
+
+        /* 7.2.3 Segment header flags */
+        readSegmentHeaderFlag(subInputStream);
 
-  private static final Map<Integer, Class<? extends SegmentData>> SEGMENT_TYPE_MAP = new HashMap<Integer, Class<? extends SegmentData>>();
+        /* 7.2.4 Amount of referred-to segments */
+        int countOfRTS = readAmountOfReferredToSegments(subInputStream);
+
+        /* 7.2.5 Referred-to segments numbers */
+        int[] rtsNumbers = readReferredToSegmentsNumbers(subInputStream, countOfRTS);
+
+        /* 7.2.6 Segment page association (Checks how big the page association field is.) */
+        readSegmentPageAssociation(document, subInputStream, countOfRTS, rtsNumbers);
+
+        /* 7.2.7 Segment data length (Contains the length of the data part (in bytes).) */
+        readSegmentDataLength(subInputStream);
+
+        readDataStartOffset(subInputStream, organisationType);
+        readSegmentHeaderLength(subInputStream, offset);
+        printDebugMessage("########################\n");
+    }
+
+    /**
+     * 7.2.2 Segment number
+     * 
+     * @param subInputStream
+     * @throws IOException
+     */
+    private void readSegmentNumber(ImageInputStream subInputStream) throws IOException
+    {
+        segmentNr = (int) (subInputStream.readBits(32) & 0xffffffff);
+        printDebugMessage("|-Segment Nr: " + segmentNr);
+    }
+
+    /**
+     * 7.2.3 Segment header flags
+     * 
+     * @param subInputStream
+     * @throws IOException
+     */
+    private void readSegmentHeaderFlag(ImageInputStream subInputStream) throws IOException
+    {
+        // Bit 7: Retain Flag, if 1, this segment is flagged as retained;
+        retainFlag = (byte) subInputStream.readBit();
+        printDebugMessage("|-Retain flag: " + retainFlag);
+
+        // Bit 6: Size of the page association field. One byte if 0, four bytes if 1;
+        pageAssociationFieldSize = (byte) subInputStream.readBit();
+        printDebugMessage("|-Page association field size=" + pageAssociationFieldSize);
+
+        // Bit 5-0: Contains the values (between 0 and 62 with gaps) for segment types, specified in 7.3
+        segmentType = (int) (subInputStream.readBits(6) & 0xff);
+        printDebugMessage("|-Segment type=" + segmentType);
+    }
 
-  static {
-    Object SEGMENT_TYPES[][] = {
+    /**
+     * 7.2.4 Amount of referred-to segments
+     * 
+     * @param subInputStream
+     * @return The amount of referred-to segments.
+     * @throws IOException
+     */
+    private int readAmountOfReferredToSegments(ImageInputStream subInputStream) throws IOException
+    {
+        int countOfRTS = (int) (subInputStream.readBits(3) & 0xf);
+        printDebugMessage("|-RTS count: " + countOfRTS);
+
+        byte[] retainBit;
+
+        printDebugMessage("  |-Stream position before RTS: " + subInputStream.getStreamPosition());
+
+        if (countOfRTS <= 4)
+        {
+            /* short format */
+            retainBit = new byte[5];
+            for (int i = 0; i <= 4; i++)
+            {
+                retainBit[i] = (byte) subInputStream.readBit();
+            }
+        }
+        else
         {
-            0, SymbolDictionary.class
-        }, {
-            4, TextRegion.class
-        }, {
-            6, TextRegion.class
-        }, {
-            7, TextRegion.class
-        }, {
-            16, PatternDictionary.class
-        }, {
-            20, HalftoneRegion.class
-        }, {
-            22, HalftoneRegion.class
-        }, {
-            23, HalftoneRegion.class
-        }, {
-            36, GenericRegion.class
-        }, {
-            38, GenericRegion.class
-        }, {
-            39, GenericRegion.class
-        }, {
-            40, GenericRefinementRegion.class
-        }, {
-            42, GenericRefinementRegion.class
-        }, {
-            43, GenericRefinementRegion.class
-        }, {
-            48, PageInformation.class
-        }, {
-            50, EndOfStripe.class
-        }, {
-            52, Profiles.class
-        }, {
-            53, Table.class
-        },
-    };
-
-    for (int i = 0; i < SEGMENT_TYPES.length; i++) {
-      Object[] objects = SEGMENT_TYPES[i];
-      SEGMENT_TYPE_MAP.put((Integer) objects[0], (Class<? extends SegmentData>) objects[1]);
+            /* long format */
+            countOfRTS = (int) (subInputStream.readBits(29) & 0xffffffff);
+
+            int arrayLength = (countOfRTS + 8) >> 3;
+            retainBit = new byte[arrayLength <<= 3];
+
+            for (int i = 0; i < arrayLength; i++)
+            {
+                retainBit[i] = (byte) subInputStream.readBit();
+            }
+        }
+
+        printDebugMessage("  |-Stream position after RTS: " + subInputStream.getStreamPosition());
+
+        return countOfRTS;
     }
-  }
-
-  private int segmentNr;
-  private int segmentType;
-  private byte retainFlag;
-  private int pageAssociation;
-  private byte pageAssociationFieldSize;
-  private SegmentHeader[] rtSegments;
-  private long segmentHeaderLength;
-  private long segmentDataLength;
-  private long segmentDataStartOffset;
-  private final SubInputStream subInputStream;
-
-  private Reference<SegmentData> segmentData;
-
-
-  public SegmentHeader(JBIG2Document document, SubInputStream sis, long offset, int organisationType)
-      throws IOException {
-    this.subInputStream = sis;
-    parse(document, sis, offset, organisationType);
-  }
-
-  /**
-   * 
-   * 
-   * @param document
-   * @param subInputStream
-   * @param organisationType
-   * @param offset - The offset where the segment header starts
-   * @throws IOException
-   */
-  private void parse(JBIG2Document document, ImageInputStream subInputStream, long offset, int organisationType)
-      throws IOException {
-
-    printDebugMessage("\n########################");
-    printDebugMessage("Segment parsing started.");
-
-    subInputStream.seek(offset);
-    printDebugMessage("|-Seeked to offset: " + offset);
-
-    /* 7.2.2 Segment number */
-    readSegmentNumber(subInputStream);
-
-    /* 7.2.3 Segment header flags */
-    readSegmentHeaderFlag(subInputStream);
-
-    /* 7.2.4 Amount of referred-to segments */
-    int countOfRTS = readAmountOfReferredToSegments(subInputStream);
-
-    /* 7.2.5 Referred-to segments numbers */
-    int[] rtsNumbers = readReferredToSegmentsNumbers(subInputStream, countOfRTS);
-
-    /* 7.2.6 Segment page association (Checks how big the page association field is.) */
-    readSegmentPageAssociation(document, subInputStream, countOfRTS, rtsNumbers);
-
-    /* 7.2.7 Segment data length (Contains the length of the data part (in bytes).) */
-    readSegmentDataLength(subInputStream);
-
-    readDataStartOffset(subInputStream, organisationType);
-    readSegmentHeaderLength(subInputStream, offset);
-    printDebugMessage("########################\n");
-  }
-
-  /**
-   * 7.2.2 Segment number
-   * 
-   * @param subInputStream
-   * @throws IOException
-   */
-  private void readSegmentNumber(ImageInputStream subInputStream) throws IOException {
-    segmentNr = (int) (subInputStream.readBits(32) & 0xffffffff);
-    printDebugMessage("|-Segment Nr: " + segmentNr);
-  }
-
-  /**
-   * 7.2.3 Segment header flags
-   * 
-   * @param subInputStream
-   * @throws IOException
-   */
-  private void readSegmentHeaderFlag(ImageInputStream subInputStream) throws IOException {
-    // Bit 7: Retain Flag, if 1, this segment is flagged as retained;
-    retainFlag = (byte) subInputStream.readBit();
-    printDebugMessage("|-Retain flag: " + retainFlag);
-
-    // Bit 6: Size of the page association field. One byte if 0, four bytes if 1;
-    pageAssociationFieldSize = (byte) subInputStream.readBit();
-    printDebugMessage("|-Page association field size=" + pageAssociationFieldSize);
-
-    // Bit 5-0: Contains the values (between 0 and 62 with gaps) for segment types, specified in 7.3
-    segmentType = (int) (subInputStream.readBits(6) & 0xff);
-    printDebugMessage("|-Segment type=" + segmentType);
-  }
-
-  /**
-   * 7.2.4 Amount of referred-to segments
-   * 
-   * @param subInputStream
-   * @return The amount of referred-to segments.
-   * @throws IOException
-   */
-  private int readAmountOfReferredToSegments(ImageInputStream subInputStream) throws IOException {
-    int countOfRTS = (int) (subInputStream.readBits(3) & 0xf);
-    printDebugMessage("|-RTS count: " + countOfRTS);
-
-    byte[] retainBit;
-
-    printDebugMessage("  |-Stream position before RTS: " + subInputStream.getStreamPosition());
-
-    if (countOfRTS <= 4) {
-      /* short format */
-      retainBit = new byte[5];
-      for (int i = 0; i <= 4; i++) {
-        retainBit[i] = (byte) subInputStream.readBit();
-      }
-    } else {
-      /* long format */
-      countOfRTS = (int) (subInputStream.readBits(29) & 0xffffffff);
-
-      int arrayLength = (countOfRTS + 8) >> 3;
-      retainBit = new byte[arrayLength <<= 3];
-
-      for (int i = 0; i < arrayLength; i++) {
-        retainBit[i] = (byte) subInputStream.readBit();
-      }
+
+    /**
+     * 7.2.5 Referred-to segments numbers
+     * <p>
+     * Gathers all segment numbers of referred-to segments. The segments itself are stored in the {@link #rtSegments}
+     * array.
+     * 
+     * @param subInputStream - Wrapped source data input stream.
+     * @param countOfRTS - The amount of referred-to segments.
+     * 
+     * @return An array with the segment number of all referred-to segments.
+     * 
+     * @throws IOException
+     */
+    private int[] readReferredToSegmentsNumbers(ImageInputStream subInputStream, int countOfRTS)
+            throws IOException
+    {
+        int[] rtsNumbers = new int[countOfRTS];
+
+        if (countOfRTS > 0)
+        {
+            short rtsSize = 1;
+            if (segmentNr > 256)
+            {
+                rtsSize = 2;
+                if (segmentNr > 65536)
+                {
+                    rtsSize = 4;
+                }
+            }
+
+            rtSegments = new SegmentHeader[countOfRTS];
+
+            printDebugMessage("|-Length of RT segments list: " + rtSegments.length);
+
+            for (int i = 0; i < countOfRTS; i++)
+            {
+                rtsNumbers[i] = (int) (subInputStream.readBits(rtsSize << 3) & 0xffffffff);
+            }
+        }
+
+        return rtsNumbers;
     }
 
-    printDebugMessage("  |-Stream position after RTS: " + subInputStream.getStreamPosition());
-
-    return countOfRTS;
-  }
-
-  /**
-   * 7.2.5 Referred-to segments numbers
-   * <p>
-   * Gathers all segment numbers of referred-to segments. The segments itself are stored in the
-   * {@link #rtSegments} array.
-   * 
-   * @param subInputStream - Wrapped source data input stream.
-   * @param countOfRTS - The amount of referred-to segments.
-   * 
-   * @return An array with the segment number of all referred-to segments.
-   * 
-   * @throws IOException
-   */
-  private int[] readReferredToSegmentsNumbers(ImageInputStream subInputStream, int countOfRTS) throws IOException {
-    int[] rtsNumbers = new int[countOfRTS];
-
-    if (countOfRTS > 0) {
-      short rtsSize = 1;
-      if (segmentNr > 256) {
-        rtsSize = 2;
-        if (segmentNr > 65536) {
-          rtsSize = 4;
+    /**
+     * 7.2.6 Segment page association
+     * 
+     * @param document
+     * @param subInputStream
+     * @param countOfRTS
+     * @param rtsNumbers
+     * @throws IOException
+     */
+    private void readSegmentPageAssociation(JBIG2Document document, ImageInputStream subInputStream,
+            int countOfRTS, int[] rtsNumbers) throws IOException
+    {
+        if (pageAssociationFieldSize == 0)
+        {
+            // Short format
+            pageAssociation = (short) (subInputStream.readBits(8) & 0xff);
+        }
+        else
+        {
+            // Long format
+            pageAssociation = (int) (subInputStream.readBits(32) & 0xffffffff);
         }
-      }
 
-      rtSegments = new SegmentHeader[countOfRTS];
+        if (countOfRTS > 0)
+        {
+            final JBIG2Page page = document.getPage(pageAssociation);
+            for (int i = 0; i < countOfRTS; i++)
+            {
+                rtSegments[i] = (null != page ? page.getSegment(rtsNumbers[i])
+                        : document.getGlobalSegment(rtsNumbers[i]));
+            }
+        }
+    }
 
-      printDebugMessage("|-Length of RT segments list: " + rtSegments.length);
+    /**
+     * 7.2.7 Segment data length
+     * <p>
+     * Contains the length of the data part in bytes.
+     * 
+     * @param subInputStream
+     * @throws IOException
+     */
+    private void readSegmentDataLength(ImageInputStream subInputStream) throws IOException
+    {
+        segmentDataLength = (subInputStream.readBits(32) & 0xffffffff);
+        printDebugMessage("|-Data length: " + segmentDataLength);
+    }
 
-      for (int i = 0; i < countOfRTS; i++) {
-        rtsNumbers[i] = (int) (subInputStream.readBits(rtsSize << 3) & 0xffffffff);
-      }
+    /**
+     * Sets the offset only if organization type is SEQUENTIAL. If random, data starts after segment headers and can be
+     * determined when all segment headers are parsed and allocated.
+     * 
+     * @param subInputStream
+     * @param organisationType
+     * @throws IOException
+     */
+    private void readDataStartOffset(ImageInputStream subInputStream, int organisationType)
+            throws IOException
+    {
+        if (organisationType == JBIG2Document.SEQUENTIAL)
+        {
+            printDebugMessage("|-Organization is sequential.");
+            segmentDataStartOffset = subInputStream.getStreamPosition();
+        }
     }
 
-    return rtsNumbers;
-  }
-
-  /**
-   * 7.2.6 Segment page association
-   * 
-   * @param document
-   * @param subInputStream
-   * @param countOfRTS
-   * @param rtsNumbers
-   * @throws IOException
-   */
-  private void readSegmentPageAssociation(JBIG2Document document, ImageInputStream subInputStream, int countOfRTS,
-      int[] rtsNumbers) throws IOException {
-    if (pageAssociationFieldSize == 0) {
-      // Short format
-      pageAssociation = (short) (subInputStream.readBits(8) & 0xff);
-    } else {
-      // Long format
-      pageAssociation = (int) (subInputStream.readBits(32) & 0xffffffff);
+    private void readSegmentHeaderLength(ImageInputStream subInputStream, long offset)
+            throws IOException
+    {
+        segmentHeaderLength = subInputStream.getStreamPosition() - offset;
+        printDebugMessage("|-Segment header length: " + segmentHeaderLength);
     }
 
-    if (countOfRTS > 0) {
-      final JBIG2Page page = document.getPage(pageAssociation);
-      for (int i = 0; i < countOfRTS; i++) {
-        rtSegments[i] = (null != page ? page.getSegment(rtsNumbers[i]) : document.getGlobalSegment(rtsNumbers[i]));
-      }
+    private void printDebugMessage(String message)
+    {
+        log.debug(message);
     }
-  }
-
-  /**
-   * 7.2.7 Segment data length
-   * <p>
-   * Contains the length of the data part in bytes.
-   * 
-   * @param subInputStream
-   * @throws IOException
-   */
-  private void readSegmentDataLength(ImageInputStream subInputStream) throws IOException {
-    segmentDataLength = (subInputStream.readBits(32) & 0xffffffff);
-    printDebugMessage("|-Data length: " + segmentDataLength);
-  }
-
-  /**
-   * Sets the offset only if organization type is SEQUENTIAL. If random, data starts after segment
-   * headers and can be determined when all segment headers are parsed and allocated.
-   * 
-   * @param subInputStream
-   * @param organisationType
-   * @throws IOException
-   */
-  private void readDataStartOffset(ImageInputStream subInputStream, int organisationType) throws IOException {
-    if (organisationType == JBIG2Document.SEQUENTIAL) {
-      printDebugMessage("|-Organization is sequential.");
-      segmentDataStartOffset = subInputStream.getStreamPosition();
+
+    public int getSegmentNr()
+    {
+        return segmentNr;
     }
-  }
-
-  private void readSegmentHeaderLength(ImageInputStream subInputStream, long offset) throws IOException {
-    segmentHeaderLength = subInputStream.getStreamPosition() - offset;
-    printDebugMessage("|-Segment header length: " + segmentHeaderLength);
-  }
-
-  private void printDebugMessage(String message) {
-    log.debug(message);
-  }
-
-  public int getSegmentNr() {
-    return segmentNr;
-  }
-
-  public int getSegmentType() {
-    return segmentType;
-  }
-
-  public long getSegmentHeaderLength() {
-    return segmentHeaderLength;
-  }
-
-  public long getSegmentDataLength() {
-    return segmentDataLength;
-  }
-
-  public long getSegmentDataStartOffset() {
-    return segmentDataStartOffset;
-  }
-
-  public void setSegmentDataStartOffset(long segmentDataStartOffset) {
-    this.segmentDataStartOffset = segmentDataStartOffset;
-  }
-
-  public SegmentHeader[] getRtSegments() {
-    return rtSegments;
-  }
-
-  public int getPageAssociation() {
-    return pageAssociation;
-  }
-
-  public short getRetainFlag() {
-    return retainFlag;
-  }
-
-  /**
-   * Creates and returns a new {@link SubInputStream} that provides the data part of this segment.
-   * It is a clipped view of the source input stream.
-   * 
-   * @return The {@link SubInputStream} that represents the data part of the segment.
-   */
-  public SubInputStream getDataInputStream() {
-    return new SubInputStream(subInputStream, segmentDataStartOffset, segmentDataLength);
-  }
-
-  /**
-   * Retrieves the segments' data part.
-   * 
-   * @return Retrieved {@link SegmentData} instance.
-   */
-  public SegmentData getSegmentData() {
-    SegmentData segmentDataPart = null;
-
-    if (null != segmentData) {
-      segmentDataPart = segmentData.get();
+
+    public int getSegmentType()
+    {
+        return segmentType;
     }
 
-    if (null == segmentDataPart) {
-      try {
+    public long getSegmentHeaderLength()
+    {
+        return segmentHeaderLength;
+    }
 
-        Class<? extends SegmentData> segmentClass = SEGMENT_TYPE_MAP.get(segmentType);
+    public long getSegmentDataLength()
+    {
+        return segmentDataLength;
+    }
 
-        if (null == segmentClass) {
-          throw new IllegalArgumentException("No segment class for type " + segmentType);
-        }
+    public long getSegmentDataStartOffset()
+    {
+        return segmentDataStartOffset;
+    }
 
-        segmentDataPart = segmentClass.newInstance();
-        segmentDataPart.init(this, getDataInputStream());
+    public void setSegmentDataStartOffset(long segmentDataStartOffset)
+    {
+        this.segmentDataStartOffset = segmentDataStartOffset;
+    }
 
-        segmentData = new SoftReference<SegmentData>(segmentDataPart);
+    public SegmentHeader[] getRtSegments()
+    {
+        return rtSegments;
+    }
 
-      } catch (Exception e) {
-        throw new RuntimeException("Can't instantiate segment class", e);
-      }
+    public int getPageAssociation()
+    {
+        return pageAssociation;
     }
 
-    return segmentDataPart;
-  }
+    public short getRetainFlag()
+    {
+        return retainFlag;
+    }
 
-  public void cleanSegmentData() {
-    if (segmentData != null) {
-      segmentData = null;
+    /**
+     * Creates and returns a new {@link SubInputStream} that provides the data part of this segment. It is a clipped
+     * view of the source input stream.
+     * 
+     * @return The {@link SubInputStream} that represents the data part of the segment.
+     */
+    public SubInputStream getDataInputStream()
+    {
+        return new SubInputStream(subInputStream, segmentDataStartOffset, segmentDataLength);
     }
-  }
 
-  public String toString() {
-    StringBuilder stringBuilder = new StringBuilder();
+    /**
+     * Retrieves the segments' data part.
+     * 
+     * @return Retrieved {@link SegmentData} instance.
+     */
+    public SegmentData getSegmentData()
+    {
+        SegmentData segmentDataPart = null;
+
+        if (null != segmentData)
+        {
+            segmentDataPart = segmentData.get();
+        }
+
+        if (null == segmentDataPart)
+        {
+            try
+            {
+
+                Class<? extends SegmentData> segmentClass = SEGMENT_TYPE_MAP.get(segmentType);
+
+                if (null == segmentClass)
+                {
+                    throw new IllegalArgumentException("No segment class for type " + segmentType);
+                }
+
+                segmentDataPart = segmentClass.newInstance();
+                segmentDataPart.init(this, getDataInputStream());
+
+                segmentData = new SoftReference<SegmentData>(segmentDataPart);
+
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException("Can't instantiate segment class", e);
+            }
+        }
+
+        return segmentDataPart;
+    }
 
-    if (rtSegments != null) {
-      for (SegmentHeader s : rtSegments) {
-        stringBuilder.append(s.segmentNr + " ");
-      }
-    } else {
-      stringBuilder.append("none");
+    public void cleanSegmentData()
+    {
+        if (segmentData != null)
+        {
+            segmentData = null;
+        }
     }
 
-    return "\n#SegmentNr: " + segmentNr //
-        + "\n SegmentType: " + segmentType //
-        + "\n PageAssociation: " + pageAssociation //
-        + "\n Referred-to segments: " + stringBuilder.toString() //
-        + "\n"; //
-  }
+    public String toString()
+    {
+        StringBuilder stringBuilder = new StringBuilder();
+
+        if (rtSegments != null)
+        {
+            for (SegmentHeader s : rtSegments)
+            {
+                stringBuilder.append(s.segmentNr + " ");
+            }
+        }
+        else
+        {
+            stringBuilder.append("none");
+        }
+
+        return "\n#SegmentNr: " + segmentNr //
+                + "\n SegmentType: " + segmentType //
+                + "\n PageAssociation: " + pageAssociation //
+                + "\n Referred-to segments: " + stringBuilder.toString() //
+                + "\n"; //
+    }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/TestImage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/TestImage.java b/src/main/java/org/apache/pdfbox/jbig2/TestImage.java
index 10bb9c7..17b9d0d 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/TestImage.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/TestImage.java
@@ -42,201 +42,224 @@ import javax.swing.JScrollPane;
 /**
  * This is a utility class. It can be used to show intermediary results.
  */
-public class TestImage extends JFrame {
-  private static final long serialVersionUID = 7353175320371957550L;
-
-  public static void main(String[] args) {
-    int w = 250;
-    int h = 250;
-
-    // (w+7) / 8 entspricht Aufrundung!
-    int scanlineStride = (w + 7) / 8;
-
-    // hier sind die Daten
-    byte data[] = new byte[h * scanlineStride];
-
-    // dummy-Daten erzeugen
-    for (int i = 0; i < data.length; i++)
-      data[i] = (byte) i;
-
-    new TestImage(data, w, h, scanlineStride);
-  }
-
-  static class ImageComponent extends JComponent {
-    private static final long serialVersionUID = -5921296548288376287L;
-    Image myImage;
-    int imgWidth = -1;
-    int imgHeight = -1;
-    Dimension prefSize = null;
-    private int scale = 1;
-
-    /**
-     * Constructor for ImageComponent.
-     */
-    protected ImageComponent() {
-      super();
-    }
+public class TestImage extends JFrame
+{
+    private static final long serialVersionUID = 7353175320371957550L;
 
-    /**
-     * Constructor for ImageComponent.
-     */
-    public ImageComponent(Image image) {
-      super();
-      setImage(image);
-    }
+    public static void main(String[] args)
+    {
+        int w = 250;
+        int h = 250;
 
-    /**
-     * Gets the preffered Size of the Component
-     * 
-     * @param image java.awt.Image
-     */
-    public Dimension getPreferredSize() {
-      if (prefSize != null)
-        return this.prefSize;
-      else
-        return super.getPreferredSize();
-    }
+        // (w+7) / 8 entspricht Aufrundung!
+        int scanlineStride = (w + 7) / 8;
 
-    /**
-     * Gets the minimum Size of the Component
-     * 
-     * @param image java.awt.Image
-     */
-    public Dimension getMinimumSize() {
-      if (prefSize != null)
-        return prefSize;
-      else
-        return super.getMinimumSize();
-    }
+        // hier sind die Daten
+        byte data[] = new byte[h * scanlineStride];
 
-    /**
-     * Sets an image to be shown
-     * 
-     * @param image java.awt.Image
-     */
-    public void setImage(Image image) {
-      if (myImage != null) {
-        myImage.flush();
-      }
+        // dummy-Daten erzeugen
+        for (int i = 0; i < data.length; i++)
+            data[i] = (byte) i;
 
-      myImage = image;
+        new TestImage(data, w, h, scanlineStride);
+    }
 
-      if (myImage != null) {
-        MediaTracker mt = new MediaTracker(this);
+    static class ImageComponent extends JComponent
+    {
+        private static final long serialVersionUID = -5921296548288376287L;
+        Image myImage;
+        int imgWidth = -1;
+        int imgHeight = -1;
+        Dimension prefSize = null;
+        private int scale = 1;
+
+        /**
+         * Constructor for ImageComponent.
+         */
+        protected ImageComponent()
+        {
+            super();
+        }
 
-        mt.addImage(myImage, 0);
+        /**
+         * Constructor for ImageComponent.
+         */
+        public ImageComponent(Image image)
+        {
+            super();
+            setImage(image);
+        }
 
-        try {
-          mt.waitForAll();
-        } catch (Exception ex) {
+        /**
+         * Gets the preffered Size of the Component
+         * 
+         * @param image java.awt.Image
+         */
+        public Dimension getPreferredSize()
+        {
+            if (prefSize != null)
+                return this.prefSize;
+            else
+                return super.getPreferredSize();
         }
 
-        imgWidth = myImage.getWidth(this);
-        imgHeight = myImage.getHeight(this);
+        /**
+         * Gets the minimum Size of the Component
+         * 
+         * @param image java.awt.Image
+         */
+        public Dimension getMinimumSize()
+        {
+            if (prefSize != null)
+                return prefSize;
+            else
+                return super.getMinimumSize();
+        }
 
-        setSize(imgWidth * scale, imgHeight * scale);
-        prefSize = getSize();
-        invalidate();
-        validate();
-        repaint();
-      }
-    }
+        /**
+         * Sets an image to be shown
+         * 
+         * @param image java.awt.Image
+         */
+        public void setImage(Image image)
+        {
+            if (myImage != null)
+            {
+                myImage.flush();
+            }
+
+            myImage = image;
+
+            if (myImage != null)
+            {
+                MediaTracker mt = new MediaTracker(this);
+
+                mt.addImage(myImage, 0);
+
+                try
+                {
+                    mt.waitForAll();
+                }
+                catch (Exception ex)
+                {
+                }
+
+                imgWidth = myImage.getWidth(this);
+                imgHeight = myImage.getHeight(this);
+
+                setSize(imgWidth * scale, imgHeight * scale);
+                prefSize = getSize();
+                invalidate();
+                validate();
+                repaint();
+            }
+        }
 
-    /**
-     * Get the Insets fo the Component
-     * 
-     * @return Insets the Insets of the Component
-     */
-    public Insets getInsets() {
-      return new Insets(1, 1, 1, 1);
-    }
+        /**
+         * Get the Insets fo the Component
+         * 
+         * @return Insets the Insets of the Component
+         */
+        public Insets getInsets()
+        {
+            return new Insets(1, 1, 1, 1);
+        }
 
-    /**
-     * Paints the component
-     * 
-     * @param g java.awt.Graphics
-     */
-    protected void paintComponent(Graphics g) {
-      Graphics2D g2 = (Graphics2D) g;
-      if (myImage != null) {
-        g2.scale(scale, scale);
-        g2.drawImage(myImage, 1, 1, imgWidth, imgHeight, this);
-      }
-    }
+        /**
+         * Paints the component
+         * 
+         * @param g java.awt.Graphics
+         */
+        protected void paintComponent(Graphics g)
+        {
+            Graphics2D g2 = (Graphics2D) g;
+            if (myImage != null)
+            {
+                g2.scale(scale, scale);
+                g2.drawImage(myImage, 1, 1, imgWidth, imgHeight, this);
+            }
+        }
 
-    public void setScale(int scale) {
-      this.scale = scale;
+        public void setScale(int scale)
+        {
+            this.scale = scale;
 
-      setSize(imgWidth * scale, imgHeight * scale);
-      prefSize = getSize();
+            setSize(imgWidth * scale, imgHeight * scale);
+            prefSize = getSize();
 
-      revalidate();
-      repaint();
-    }
+            revalidate();
+            repaint();
+        }
 
-    public int getScale() {
-      return scale;
+        public int getScale()
+        {
+            return scale;
+        }
     }
-  }
 
-  public TestImage(byte data[], int w, int h, int scanlineStride) {
-    super("Demobild");
+    public TestImage(byte data[], int w, int h, int scanlineStride)
+    {
+        super("Demobild");
 
-    // Color-Model sagt: bit = 0 -> schwarz, bit = 1 -> weiss. Ggf. umdrehen.
-    ColorModel colorModel = new IndexColorModel(1, 2, new byte[]{
-        (byte) 0xff, 0x00
-    }, new byte[]{
-        (byte) 0xff, 0x00
-    }, new byte[]{
-        (byte) 0xff, 0x00
-    });
+        // Color-Model sagt: bit = 0 -> schwarz, bit = 1 -> weiss. Ggf. umdrehen.
+        ColorModel colorModel = new IndexColorModel(1, 2, new byte[] { (byte) 0xff, 0x00 },
+                new byte[] { (byte) 0xff, 0x00 }, new byte[] { (byte) 0xff, 0x00 });
 
-    DataBuffer dataBuffer = new DataBufferByte(data, data.length);
-    SampleModel sampleModel = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE, w, h, 1, scanlineStride, 0);
-    WritableRaster writableRaster = Raster.createWritableRaster(sampleModel, dataBuffer, new Point(0, 0));
+        DataBuffer dataBuffer = new DataBufferByte(data, data.length);
+        SampleModel sampleModel = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE, w, h, 1,
+                scanlineStride, 0);
+        WritableRaster writableRaster = Raster.createWritableRaster(sampleModel, dataBuffer,
+                new Point(0, 0));
 
-    BufferedImage image = new BufferedImage(colorModel, writableRaster, false, null);
+        BufferedImage image = new BufferedImage(colorModel, writableRaster, false, null);
 
-    ImageComponent imageComponent = new ImageComponent(image);
-    // imageComponent.setScale(4);
+        ImageComponent imageComponent = new ImageComponent(image);
+        // imageComponent.setScale(4);
 
-    JScrollPane sp = new JScrollPane(imageComponent);
+        JScrollPane sp = new JScrollPane(imageComponent);
 
-    setContentPane(sp);
+        setContentPane(sp);
 
-    pack();
-    setSize(new Dimension(1600, 900));
-    setVisible(true);
+        pack();
+        setSize(new Dimension(1600, 900));
+        setVisible(true);
 
-    try {
-      System.in.read();
-    } catch (IOException e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
+        try
+        {
+            System.in.read();
+        }
+        catch (IOException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
     }
-  }
 
-  public TestImage(BufferedImage bufferedImage) {
-    super("Demobild");
+    public TestImage(BufferedImage bufferedImage)
+    {
+        super("Demobild");
 
-    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
-    ImageComponent imageComponent = new ImageComponent(bufferedImage);
-    imageComponent.setScale(1);
+        ImageComponent imageComponent = new ImageComponent(bufferedImage);
+        imageComponent.setScale(1);
 
-    JScrollPane sp = new JScrollPane(imageComponent);
+        JScrollPane sp = new JScrollPane(imageComponent);
 
-    setContentPane(sp);
+        setContentPane(sp);
 
-    pack();
-    setSize(new Dimension(1600, 900));
-    setVisible(true);
+        pack();
+        setSize(new Dimension(1600, 900));
+        setVisible(true);
 
-    try {
-      System.in.read();
-    } catch (IOException e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
+        try
+        {
+            System.in.read();
+        }
+        catch (IOException e)
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
     }
-  }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoder.java b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoder.java
index b380afd..a520bd9 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoder.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticDecoder.java
@@ -24,239 +24,191 @@ import javax.imageio.stream.ImageInputStream;
 /**
  * This class represents the arithmetic decoder, described in ISO/IEC 14492:2001 in E.3
  */
-public class ArithmeticDecoder {
-
-  private static final int QE[][] = {
-      {
-          0x5601, 1, 1, 1
-      }, {
-          0x3401, 2, 6, 0
-      }, {
-          0x1801, 3, 9, 0
-      }, {
-          0x0AC1, 4, 12, 0
-      }, {
-          0x0521, 5, 29, 0
-      }, {
-          0x0221, 38, 33, 0
-      }, {
-          0x5601, 7, 6, 1
-      }, {
-          0x5401, 8, 14, 0
-      }, {
-          0x4801, 9, 14, 0
-      }, {
-          0x3801, 10, 14, 0
-      }, {
-          0x3001, 11, 17, 0
-      }, {
-          0x2401, 12, 18, 0
-      }, {
-          0x1C01, 13, 20, 0
-      }, {
-          0x1601, 29, 21, 0
-      }, {
-          0x5601, 15, 14, 1
-      }, {
-          0x5401, 16, 14, 0
-      }, {
-          0x5101, 17, 15, 0
-      }, {
-          0x4801, 18, 16, 0
-      }, {
-          0x3801, 19, 17, 0
-      }, {
-          0x3401, 20, 18, 0
-      }, {
-          0x3001, 21, 19, 0
-      }, {
-          0x2801, 22, 19, 0
-      }, {
-          0x2401, 23, 20, 0
-      }, {
-          0x2201, 24, 21, 0
-      }, {
-          0x1C01, 25, 22, 0
-      }, {
-          0x1801, 26, 23, 0
-      }, {
-          0x1601, 27, 24, 0
-      }, {
-          0x1401, 28, 25, 0
-      }, {
-          0x1201, 29, 26, 0
-      }, {
-          0x1101, 30, 27, 0
-      }, {
-          0x0AC1, 31, 28, 0
-      }, {
-          0x09C1, 32, 29, 0
-      }, {
-          0x08A1, 33, 30, 0
-      }, {
-          0x0521, 34, 31, 0
-      }, {
-          0x0441, 35, 32, 0
-      }, {
-          0x02A1, 36, 33, 0
-      }, {
-          0x0221, 37, 34, 0
-      }, {
-          0x0141, 38, 35, 0
-      }, {
-          0x0111, 39, 36, 0
-      }, {
-          0x0085, 40, 37, 0
-      }, {
-          0x0049, 41, 38, 0
-      }, {
-          0x0025, 42, 39, 0
-      }, {
-          0x0015, 43, 40, 0
-      }, {
-          0x0009, 44, 41, 0
-      }, {
-          0x0005, 45, 42, 0
-      }, {
-          0x0001, 45, 43, 0
-      }, {
-          0x5601, 46, 46, 0
-      }
-  };
-
-  private int a;
-  private long c;
-  private int ct;
-
-  private int b;
-
-  private long streamPos0;
-
-  private final ImageInputStream iis;
-
-  public ArithmeticDecoder(ImageInputStream iis) throws IOException {
-    this.iis = iis;
-    init();
-  }
-
-  private void init() throws IOException {
-    this.streamPos0 = iis.getStreamPosition();
-    b = this.iis.read();
-
-    c = b << 16;
-
-    byteIn();
-
-    c <<= 7;
-    ct -= 7;
-    a = 0x8000;
-  }
-
-  public int decode(CX cx) throws IOException {
-    int d;
-    final int qeValue = QE[cx.cx()][0];
-    final int icx = cx.cx();
-
-    a -= qeValue;
-
-    if ((c >> 16) < qeValue) {
-      d = lpsExchange(cx, icx, qeValue);
-      renormalize();
-    } else {
-      c -= (qeValue << 16);
-      if ((a & 0x8000) == 0) {
-        d = mpsExchange(cx, icx);
-        renormalize();
-      } else {
-        return cx.mps();
-      }
+public class ArithmeticDecoder
+{
+
+    private static final int QE[][] = { { 0x5601, 1, 1, 1 }, { 0x3401, 2, 6, 0 },
+            { 0x1801, 3, 9, 0 }, { 0x0AC1, 4, 12, 0 }, { 0x0521, 5, 29, 0 }, { 0x0221, 38, 33, 0 },
+            { 0x5601, 7, 6, 1 }, { 0x5401, 8, 14, 0 }, { 0x4801, 9, 14, 0 }, { 0x3801, 10, 14, 0 },
+            { 0x3001, 11, 17, 0 }, { 0x2401, 12, 18, 0 }, { 0x1C01, 13, 20, 0 },
+            { 0x1601, 29, 21, 0 }, { 0x5601, 15, 14, 1 }, { 0x5401, 16, 14, 0 },
+            { 0x5101, 17, 15, 0 }, { 0x4801, 18, 16, 0 }, { 0x3801, 19, 17, 0 },
+            { 0x3401, 20, 18, 0 }, { 0x3001, 21, 19, 0 }, { 0x2801, 22, 19, 0 },
+            { 0x2401, 23, 20, 0 }, { 0x2201, 24, 21, 0 }, { 0x1C01, 25, 22, 0 },
+            { 0x1801, 26, 23, 0 }, { 0x1601, 27, 24, 0 }, { 0x1401, 28, 25, 0 },
+            { 0x1201, 29, 26, 0 }, { 0x1101, 30, 27, 0 }, { 0x0AC1, 31, 28, 0 },
+            { 0x09C1, 32, 29, 0 }, { 0x08A1, 33, 30, 0 }, { 0x0521, 34, 31, 0 },
+            { 0x0441, 35, 32, 0 }, { 0x02A1, 36, 33, 0 }, { 0x0221, 37, 34, 0 },
+            { 0x0141, 38, 35, 0 }, { 0x0111, 39, 36, 0 }, { 0x0085, 40, 37, 0 },
+            { 0x0049, 41, 38, 0 }, { 0x0025, 42, 39, 0 }, { 0x0015, 43, 40, 0 },
+            { 0x0009, 44, 41, 0 }, { 0x0005, 45, 42, 0 }, { 0x0001, 45, 43, 0 },
+            { 0x5601, 46, 46, 0 } };
+
+    private int a;
+    private long c;
+    private int ct;
+
+    private int b;
+
+    private long streamPos0;
+
+    private final ImageInputStream iis;
+
+    public ArithmeticDecoder(ImageInputStream iis) throws IOException
+    {
+        this.iis = iis;
+        init();
     }
 
-    return d;
-  }
+    private void init() throws IOException
+    {
+        this.streamPos0 = iis.getStreamPosition();
+        b = this.iis.read();
 
-  private void byteIn() throws IOException {
-    if (iis.getStreamPosition() > streamPos0) {
-      iis.seek(iis.getStreamPosition() - 1);
-    }
-
-    b = iis.read();
-
-    if (b == 0xFF) {
-      final int b1 = iis.read();
-      if (b1 > 0x8f) {
-        c += 0xff00;
-        ct = 8;
-        iis.seek(iis.getStreamPosition() - 2);
-      } else {
-        c += b1 << 9;
-        ct = 7;
-      }
-    } else {
-      b = iis.read();
-      c += b << 8;
-      ct = 8;
-    }
+        c = b << 16;
 
-    c &= 0xffffffffL;
-  }
-
-  private void renormalize() throws IOException {
-    do {
-      if (ct == 0) {
         byteIn();
-      }
 
-      a <<= 1;
-      c <<= 1;
-      ct--;
+        c <<= 7;
+        ct -= 7;
+        a = 0x8000;
+    }
 
-    } while ((a & 0x8000) == 0);
+    public int decode(CX cx) throws IOException
+    {
+        int d;
+        final int qeValue = QE[cx.cx()][0];
+        final int icx = cx.cx();
+
+        a -= qeValue;
+
+        if ((c >> 16) < qeValue)
+        {
+            d = lpsExchange(cx, icx, qeValue);
+            renormalize();
+        }
+        else
+        {
+            c -= (qeValue << 16);
+            if ((a & 0x8000) == 0)
+            {
+                d = mpsExchange(cx, icx);
+                renormalize();
+            }
+            else
+            {
+                return cx.mps();
+            }
+        }
+
+        return d;
+    }
 
-    c &= 0xffffffffL;
-  }
+    private void byteIn() throws IOException
+    {
+        if (iis.getStreamPosition() > streamPos0)
+        {
+            iis.seek(iis.getStreamPosition() - 1);
+        }
+
+        b = iis.read();
+
+        if (b == 0xFF)
+        {
+            final int b1 = iis.read();
+            if (b1 > 0x8f)
+            {
+                c += 0xff00;
+                ct = 8;
+                iis.seek(iis.getStreamPosition() - 2);
+            }
+            else
+            {
+                c += b1 << 9;
+                ct = 7;
+            }
+        }
+        else
+        {
+            b = iis.read();
+            c += b << 8;
+            ct = 8;
+        }
+
+        c &= 0xffffffffL;
+    }
 
-  private int mpsExchange(CX cx, int icx) {
-    final int mps = cx.mps();
+    private void renormalize() throws IOException
+    {
+        do
+        {
+            if (ct == 0)
+            {
+                byteIn();
+            }
 
-    if (a < QE[icx][0]) {
+            a <<= 1;
+            c <<= 1;
+            ct--;
 
-      if (QE[icx][3] == 1) {
-        cx.toggleMps();
-      }
+        } while ((a & 0x8000) == 0);
 
-      cx.setCx(QE[icx][2]);
-      return 1 - mps;
-    } else {
-      cx.setCx(QE[icx][1]);
-      return mps;
+        c &= 0xffffffffL;
     }
-  }
-
-  private int lpsExchange(CX cx, int icx, int qeValue) {
-    final int mps = cx.mps();
-
-    if (a < qeValue) {
-      cx.setCx(QE[icx][1]);
-      a = qeValue;
 
-      return mps;
-    } else {
-      if (QE[icx][3] == 1) {
-        cx.toggleMps();
-      }
+    private int mpsExchange(CX cx, int icx)
+    {
+        final int mps = cx.mps();
+
+        if (a < QE[icx][0])
+        {
+
+            if (QE[icx][3] == 1)
+            {
+                cx.toggleMps();
+            }
+
+            cx.setCx(QE[icx][2]);
+            return 1 - mps;
+        }
+        else
+        {
+            cx.setCx(QE[icx][1]);
+            return mps;
+        }
+    }
 
-      cx.setCx(QE[icx][2]);
-      a = qeValue;
-      return 1 - mps;
+    private int lpsExchange(CX cx, int icx, int qeValue)
+    {
+        final int mps = cx.mps();
+
+        if (a < qeValue)
+        {
+            cx.setCx(QE[icx][1]);
+            a = qeValue;
+
+            return mps;
+        }
+        else
+        {
+            if (QE[icx][3] == 1)
+            {
+                cx.toggleMps();
+            }
+
+            cx.setCx(QE[icx][2]);
+            a = qeValue;
+            return 1 - mps;
+        }
     }
-  }
 
-  int getA() {
-    return a;
-  }
+    int getA()
+    {
+        return a;
+    }
 
-  long getC() {
-    return c;
-  }
+    long getC()
+    {
+        return c;
+    }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoder.java b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoder.java
index d4f1c99..8ef9b56 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoder.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/ArithmeticIntegerDecoder.java
@@ -22,135 +22,164 @@ import java.io.IOException;
 /**
  * This class represents the arithmetic integer decoder, described in ISO/IEC 14492:2001 (Annex A).
  */
-public class ArithmeticIntegerDecoder {
+public class ArithmeticIntegerDecoder
+{
 
-  private final ArithmeticDecoder decoder;
+    private final ArithmeticDecoder decoder;
 
-  private int prev;
+    private int prev;
 
-  public ArithmeticIntegerDecoder(ArithmeticDecoder decoder) {
-    this.decoder = decoder;
-  }
-
-  /**
-   * Arithmetic Integer Decoding Procedure, Annex A.2.
-   * 
-   * @param cxIAx to be decoded value
-   * @return Decoded value.
-   * @throws IOException if an underlying IO operation fails
-   */
-  public long decode(CX cxIAx) throws IOException {
-    int v = 0;
-    int d, s;
-
-    int bitsToRead;
-    int offset;
-
-    if (cxIAx == null) {
-      cxIAx = new CX(512, 1);
+    public ArithmeticIntegerDecoder(ArithmeticDecoder decoder)
+    {
+        this.decoder = decoder;
     }
 
-    prev = 1;
-
-    cxIAx.setIndex(prev);
-    s = decoder.decode(cxIAx);
-    setPrev(s);
+    /**
+     * Arithmetic Integer Decoding Procedure, Annex A.2.
+     * 
+     * @param cxIAx to be decoded value
+     * @return Decoded value.
+     * @throws IOException if an underlying IO operation fails
+     */
+    public long decode(CX cxIAx) throws IOException
+    {
+        int v = 0;
+        int d, s;
+
+        int bitsToRead;
+        int offset;
+
+        if (cxIAx == null)
+        {
+            cxIAx = new CX(512, 1);
+        }
 
-    cxIAx.setIndex(prev);
-    d = decoder.decode(cxIAx);
-    setPrev(d);
+        prev = 1;
 
-    if (d == 1) {
-      cxIAx.setIndex(prev);
-      d = decoder.decode(cxIAx);
-      setPrev(d);
+        cxIAx.setIndex(prev);
+        s = decoder.decode(cxIAx);
+        setPrev(s);
 
-      if (d == 1) {
         cxIAx.setIndex(prev);
         d = decoder.decode(cxIAx);
         setPrev(d);
 
-        if (d == 1) {
-          cxIAx.setIndex(prev);
-          d = decoder.decode(cxIAx);
-          setPrev(d);
-
-          if (d == 1) {
+        if (d == 1)
+        {
             cxIAx.setIndex(prev);
             d = decoder.decode(cxIAx);
             setPrev(d);
 
-            if (d == 1) {
-              bitsToRead = 32;
-              offset = 4436;
-            } else {
-              bitsToRead = 12;
-              offset = 340;
+            if (d == 1)
+            {
+                cxIAx.setIndex(prev);
+                d = decoder.decode(cxIAx);
+                setPrev(d);
+
+                if (d == 1)
+                {
+                    cxIAx.setIndex(prev);
+                    d = decoder.decode(cxIAx);
+                    setPrev(d);
+
+                    if (d == 1)
+                    {
+                        cxIAx.setIndex(prev);
+                        d = decoder.decode(cxIAx);
+                        setPrev(d);
+
+                        if (d == 1)
+                        {
+                            bitsToRead = 32;
+                            offset = 4436;
+                        }
+                        else
+                        {
+                            bitsToRead = 12;
+                            offset = 340;
+                        }
+                    }
+                    else
+                    {
+                        bitsToRead = 8;
+                        offset = 84;
+                    }
+                }
+                else
+                {
+                    bitsToRead = 6;
+                    offset = 20;
+                }
+            }
+            else
+            {
+                bitsToRead = 4;
+                offset = 4;
             }
-          } else {
-            bitsToRead = 8;
-            offset = 84;
-          }
-        } else {
-          bitsToRead = 6;
-          offset = 20;
         }
-      } else {
-        bitsToRead = 4;
-        offset = 4;
-      }
-    } else {
-      bitsToRead = 2;
-      offset = 0;
-    }
-
-    for (int i = 0; i < bitsToRead; i++) {
-      cxIAx.setIndex(prev);
-      d = decoder.decode(cxIAx);
-      setPrev(d);
-      v = (v << 1) | d;
-    }
+        else
+        {
+            bitsToRead = 2;
+            offset = 0;
+        }
 
-    v += offset;
+        for (int i = 0; i < bitsToRead; i++)
+        {
+            cxIAx.setIndex(prev);
+            d = decoder.decode(cxIAx);
+            setPrev(d);
+            v = (v << 1) | d;
+        }
 
-    if (s == 0) {
-      return v;
-    } else if (s == 1 && v > 0) {
-      return -v;
-    }
+        v += offset;
 
-    return Long.MAX_VALUE;
-  }
+        if (s == 0)
+        {
+            return v;
+        }
+        else if (s == 1 && v > 0)
+        {
+            return -v;
+        }
 
-  private void setPrev(int bit) {
-    if (prev < 256) {
-      prev = ((prev << 1) | bit) & 0x1ff;
-    } else {
-      prev = ((((prev << 1) | bit) & 511) | 256) & 0x1ff;
+        return Long.MAX_VALUE;
     }
-  }
-
-  /**
-   * The IAID decoding procedure, Annex A.3.
-   * 
-   * @param cxIAID - The contexts and statistics for decoding procedure.
-   * @param symCodeLen - Symbol code length.
-   * 
-   * @return The decoded value.
-   * 
-   * @throws IOException if an underlying IO operation fails
-   */
-  public int decodeIAID(CX cxIAID, long symCodeLen) throws IOException {
-    // A.3 1)
-    prev = 1;
-
-    // A.3 2)
-    for (int i = 0; i < symCodeLen; i++) {
-      cxIAID.setIndex(prev);
-      prev = (prev << 1) | decoder.decode(cxIAID);
+
+    private void setPrev(int bit)
+    {
+        if (prev < 256)
+        {
+            prev = ((prev << 1) | bit) & 0x1ff;
+        }
+        else
+        {
+            prev = ((((prev << 1) | bit) & 511) | 256) & 0x1ff;
+        }
     }
 
-    // A.3 3) & 4)
-    return (prev - (1 << symCodeLen));
-  }
+    /**
+     * The IAID decoding procedure, Annex A.3.
+     * 
+     * @param cxIAID - The contexts and statistics for decoding procedure.
+     * @param symCodeLen - Symbol code length.
+     * 
+     * @return The decoded value.
+     * 
+     * @throws IOException if an underlying IO operation fails
+     */
+    public int decodeIAID(CX cxIAID, long symCodeLen) throws IOException
+    {
+        // A.3 1)
+        prev = 1;
+
+        // A.3 2)
+        for (int i = 0; i < symCodeLen; i++)
+        {
+            cxIAID.setIndex(prev);
+            prev = (prev << 1) | decoder.decode(cxIAID);
+        }
+
+        // A.3 3) & 4)
+        return (prev - (1 << symCodeLen));
+    }
 }

http://git-wip-us.apache.org/repos/asf/pdfbox-jbig2/blob/30839c32/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/CX.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/CX.java b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/CX.java
index 6d03f58..adc5e60 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/CX.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/decoder/arithmetic/CX.java
@@ -18,52 +18,60 @@
 package org.apache.pdfbox.jbig2.decoder.arithmetic;
 
 /**
- * CX represents the context used by arithmetic decoding and arithmetic integer decoding. It selects
- * the probability estimate and statistics used during decoding procedure.
+ * CX represents the context used by arithmetic decoding and arithmetic integer decoding. It selects the probability
+ * estimate and statistics used during decoding procedure.
  */
-public final class CX {
-  private int index;
+public final class CX
+{
+    private int index;
 
-  private final byte cx[];
-  private final byte mps[];
+    private final byte cx[];
+    private final byte mps[];
 
-  /**
-   * @param size - Amount of context values.
-   * @param index - Start index.
-   */
-  public CX(int size, int index) {
-    this.index = index;
-    cx = new byte[size];
-    mps = new byte[size];
-  }
+    /**
+     * @param size - Amount of context values.
+     * @param index - Start index.
+     */
+    public CX(int size, int index)
+    {
+        this.index = index;
+        cx = new byte[size];
+        mps = new byte[size];
+    }
 
-  protected int cx() {
-    return cx[index] & 0x7f;
-  }
+    protected int cx()
+    {
+        return cx[index] & 0x7f;
+    }
 
-  protected void setCx(int value) {
-    cx[index] = (byte) (value & 0x7f);
-  }
+    protected void setCx(int value)
+    {
+        cx[index] = (byte) (value & 0x7f);
+    }
 
-  /**
-   * @return The decision. Possible values are {@code 0} or {@code 1}.
-   */
-  protected byte mps() {
-    return mps[index];
-  }
+    /**
+     * @return The decision. Possible values are {@code 0} or {@code 1}.
+     */
+    protected byte mps()
+    {
+        return mps[index];
+    }
 
-  /**
-   * Flips the bit in actual "more predictable symbol" array element.
-   */
-  protected void toggleMps() {
-    mps[index] ^= 1;
-  }
+    /**
+     * Flips the bit in actual "more predictable symbol" array element.
+     */
+    protected void toggleMps()
+    {
+        mps[index] ^= 1;
+    }
 
-  protected int getIndex() {
-    return index;
-  }
+    protected int getIndex()
+    {
+        return index;
+    }
 
-  public void setIndex(int index) {
-    this.index = index;
-  }
+    public void setIndex(int index)
+    {
+        this.index = index;
+    }
 }