shithub: jbig2

Download patch

ref: bcc1da0257a3f721a4ca95421a996969b8bfb2f6
parent: 848fce58b72d73a7345e713f26591674bd019c78
author: tor <tor@ded80894-8fb9-0310-811b-c03f3676ab4d>
date: Mon Sep 29 11:33:48 EDT 2003

Bounds checking and fixed bug with a0 and black background

git-svn-id: http://svn.ghostscript.com/jbig2dec/trunk@275 ded80894-8fb9-0310-811b-c03f3676ab4d

--- a/jbig2_mmr.c
+++ b/jbig2_mmr.c
@@ -1,23 +1,19 @@
 /*
-    jbig2dec
-    
-    Copyright (C) 2001-2003 artofcode LLC.
-    
-    This software is distributed under license and may not
-    be copied, modified or distributed except as expressly
-    authorized under the terms of the license contained in
-    the file LICENSE in this distribution.
-    
-    For information on commercial licensing, go to
-    http://www.artifex.com/licensing/ or contact
-    Artifex Software, Inc.,  101 Lucas Valley Road #110,
-    San Rafael, CA  94903, U.S.A., +1(415)492-9861.
+jbig2dec
 
-    $Id: jbig2_mmr.c,v 1.12 2003/02/05 15:27:42 giles Exp $
+Copyright (C) 2001-2002 artofcode LLC.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+$Id$
 */
 
-/* An implementation of MMR decoding. This is based on the implementation
-   in Ghostscript.
+/*
+An implementation of MMR decoding. This is based on the implementation
+in Fitz, which in turn is based on the one in Ghostscript.
 */
 
 #ifdef HAVE_CONFIG_H
@@ -35,47 +31,45 @@
 #include "jbig2_mmr.h"
 
 typedef struct {
-  int width;
-  int height;
-  const byte *data;
-  size_t size;
-  int data_index;
-  int bit_index;
-  uint32_t word;
+	int width;
+	int height;
+	const byte *data;
+	size_t size;
+	int data_index;
+	int bit_index;
+	uint32_t word;
 } Jbig2MmrCtx;
 
 
 static void
-jbig2_decode_mmr_init(Jbig2MmrCtx *mmr, int width, int height,
-		      const byte *data, size_t size)
+jbig2_decode_mmr_init(Jbig2MmrCtx *mmr, int width, int height, const byte *data, size_t size)
 {
-  int i;
-  uint32_t word = 0;
+	int i;
+	uint32_t word = 0;
 
-  mmr->width = width;
-  mmr->height = height;
-  mmr->data = data;
-  mmr->size = size;
+	mmr->width = width;
+	mmr->height = height;
+	mmr->data = data;
+	mmr->size = size;
+	mmr->data_index = 0;
+	mmr->bit_index = 0;
 
-  mmr->data_index = 0;
-  mmr->bit_index = 0;
-  for (i = 0; i < size && i < 4; i++)
-    word |= (data[i] << ((3 - i) << 3));
-  mmr->word = word;
+	for (i = 0; i < size && i < 4; i++)
+		word |= (data[i] << ((3 - i) << 3));
+	mmr->word = word;
 }
 
 static void
 jbig2_decode_mmr_consume(Jbig2MmrCtx *mmr, int n_bits)
 {
-  mmr->word <<= n_bits;
-  mmr->bit_index += n_bits;
-  while (mmr->bit_index >= 8)
-    {
-      mmr->bit_index -= 8;
-      if (mmr->data_index + 4 < mmr->size)
-	mmr->word |= (mmr->data[mmr->data_index + 4] << mmr->bit_index);
-      mmr->data_index++;
-    }
+	mmr->word <<= n_bits;
+	mmr->bit_index += n_bits;
+	while (mmr->bit_index >= 8) {
+		mmr->bit_index -= 8;
+		if (mmr->data_index + 4 < mmr->size)
+			mmr->word |= (mmr->data[mmr->data_index + 4] << mmr->bit_index);
+		mmr->data_index++;
+	}
 }
 
 /*
@@ -93,640 +87,640 @@
 */
 
 typedef struct {
-  short val;
-  short n_bits;
+	short val;
+	short n_bits;
 } mmr_table_node;
 
 /* white decode table (runlength huffman codes) */
 const mmr_table_node jbig2_mmr_white_decode[] = {
-	{ 256, 12 },
-	{ 272, 12 },
-	{ 29, 8 },
-	{ 30, 8 },
-	{ 45, 8 },
-	{ 46, 8 },
-	{ 22, 7 },
-	{ 22, 7 },
-	{ 23, 7 },
-	{ 23, 7 },
-	{ 47, 8 },
-	{ 48, 8 },
-	{ 13, 6 },
-	{ 13, 6 },
-	{ 13, 6 },
-	{ 13, 6 },
-	{ 20, 7 },
-	{ 20, 7 },
-	{ 33, 8 },
-	{ 34, 8 },
-	{ 35, 8 },
-	{ 36, 8 },
-	{ 37, 8 },
-	{ 38, 8 },
-	{ 19, 7 },
-	{ 19, 7 },
-	{ 31, 8 },
-	{ 32, 8 },
-	{ 1, 6 },
-	{ 1, 6 },
-	{ 1, 6 },
-	{ 1, 6 },
-	{ 12, 6 },
-	{ 12, 6 },
-	{ 12, 6 },
-	{ 12, 6 },
-	{ 53, 8 },
-	{ 54, 8 },
-	{ 26, 7 },
-	{ 26, 7 },
-	{ 39, 8 },
-	{ 40, 8 },
-	{ 41, 8 },
-	{ 42, 8 },
-	{ 43, 8 },
-	{ 44, 8 },
-	{ 21, 7 },
-	{ 21, 7 },
-	{ 28, 7 },
-	{ 28, 7 },
-	{ 61, 8 },
-	{ 62, 8 },
-	{ 63, 8 },
-	{ 0, 8 },
-	{ 320, 8 },
-	{ 384, 8 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 10, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 11, 5 },
-	{ 27, 7 },
-	{ 27, 7 },
-	{ 59, 8 },
-	{ 60, 8 },
-	{ 288, 9 },
-	{ 290, 9 },
-	{ 18, 7 },
-	{ 18, 7 },
-	{ 24, 7 },
-	{ 24, 7 },
-	{ 49, 8 },
-	{ 50, 8 },
-	{ 51, 8 },
-	{ 52, 8 },
-	{ 25, 7 },
-	{ 25, 7 },
-	{ 55, 8 },
-	{ 56, 8 },
-	{ 57, 8 },
-	{ 58, 8 },
-	{ 192, 6 },
-	{ 192, 6 },
-	{ 192, 6 },
-	{ 192, 6 },
-	{ 1664, 6 },
-	{ 1664, 6 },
-	{ 1664, 6 },
-	{ 1664, 6 },
-	{ 448, 8 },
-	{ 512, 8 },
-	{ 292, 9 },
-	{ 640, 8 },
-	{ 576, 8 },
-	{ 294, 9 },
-	{ 296, 9 },
-	{ 298, 9 },
-	{ 300, 9 },
-	{ 302, 9 },
-	{ 256, 7 },
-	{ 256, 7 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 2, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 3, 4 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 128, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 8, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 9, 5 },
-	{ 16, 6 },
-	{ 16, 6 },
-	{ 16, 6 },
-	{ 16, 6 },
-	{ 17, 6 },
-	{ 17, 6 },
-	{ 17, 6 },
-	{ 17, 6 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 4, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 14, 6 },
-	{ 14, 6 },
-	{ 14, 6 },
-	{ 14, 6 },
-	{ 15, 6 },
-	{ 15, 6 },
-	{ 15, 6 },
-	{ 15, 6 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 64, 5 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ 7, 4 },
-	{ -2, 3 },
-	{ -2, 3 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -3, 4 },
-	{ 1792, 3 },
-	{ 1792, 3 },
-	{ 1984, 4 },
-	{ 2048, 4 },
-	{ 2112, 4 },
-	{ 2176, 4 },
-	{ 2240, 4 },
-	{ 2304, 4 },
-	{ 1856, 3 },
-	{ 1856, 3 },
-	{ 1920, 3 },
-	{ 1920, 3 },
-	{ 2368, 4 },
-	{ 2432, 4 },
-	{ 2496, 4 },
-	{ 2560, 4 },
-	{ 1472, 1 },
-	{ 1536, 1 },
-	{ 1600, 1 },
-	{ 1728, 1 },
-	{ 704, 1 },
-	{ 768, 1 },
-	{ 832, 1 },
-	{ 896, 1 },
-	{ 960, 1 },
-	{ 1024, 1 },
-	{ 1088, 1 },
-	{ 1152, 1 },
-	{ 1216, 1 },
-	{ 1280, 1 },
-	{ 1344, 1 },
-	{ 1408, 1 }
+{ 256, 12 },
+{ 272, 12 },
+{ 29, 8 },
+{ 30, 8 },
+{ 45, 8 },
+{ 46, 8 },
+{ 22, 7 },
+{ 22, 7 },
+{ 23, 7 },
+{ 23, 7 },
+{ 47, 8 },
+{ 48, 8 },
+{ 13, 6 },
+{ 13, 6 },
+{ 13, 6 },
+{ 13, 6 },
+{ 20, 7 },
+{ 20, 7 },
+{ 33, 8 },
+{ 34, 8 },
+{ 35, 8 },
+{ 36, 8 },
+{ 37, 8 },
+{ 38, 8 },
+{ 19, 7 },
+{ 19, 7 },
+{ 31, 8 },
+{ 32, 8 },
+{ 1, 6 },
+{ 1, 6 },
+{ 1, 6 },
+{ 1, 6 },
+{ 12, 6 },
+{ 12, 6 },
+{ 12, 6 },
+{ 12, 6 },
+{ 53, 8 },
+{ 54, 8 },
+{ 26, 7 },
+{ 26, 7 },
+{ 39, 8 },
+{ 40, 8 },
+{ 41, 8 },
+{ 42, 8 },
+{ 43, 8 },
+{ 44, 8 },
+{ 21, 7 },
+{ 21, 7 },
+{ 28, 7 },
+{ 28, 7 },
+{ 61, 8 },
+{ 62, 8 },
+{ 63, 8 },
+{ 0, 8 },
+{ 320, 8 },
+{ 384, 8 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 10, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 11, 5 },
+{ 27, 7 },
+{ 27, 7 },
+{ 59, 8 },
+{ 60, 8 },
+{ 288, 9 },
+{ 290, 9 },
+{ 18, 7 },
+{ 18, 7 },
+{ 24, 7 },
+{ 24, 7 },
+{ 49, 8 },
+{ 50, 8 },
+{ 51, 8 },
+{ 52, 8 },
+{ 25, 7 },
+{ 25, 7 },
+{ 55, 8 },
+{ 56, 8 },
+{ 57, 8 },
+{ 58, 8 },
+{ 192, 6 },
+{ 192, 6 },
+{ 192, 6 },
+{ 192, 6 },
+{ 1664, 6 },
+{ 1664, 6 },
+{ 1664, 6 },
+{ 1664, 6 },
+{ 448, 8 },
+{ 512, 8 },
+{ 292, 9 },
+{ 640, 8 },
+{ 576, 8 },
+{ 294, 9 },
+{ 296, 9 },
+{ 298, 9 },
+{ 300, 9 },
+{ 302, 9 },
+{ 256, 7 },
+{ 256, 7 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 2, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 3, 4 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 128, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 8, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 9, 5 },
+{ 16, 6 },
+{ 16, 6 },
+{ 16, 6 },
+{ 16, 6 },
+{ 17, 6 },
+{ 17, 6 },
+{ 17, 6 },
+{ 17, 6 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 4, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 14, 6 },
+{ 14, 6 },
+{ 14, 6 },
+{ 14, 6 },
+{ 15, 6 },
+{ 15, 6 },
+{ 15, 6 },
+{ 15, 6 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 64, 5 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ 7, 4 },
+{ -2, 3 },
+{ -2, 3 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -3, 4 },
+{ 1792, 3 },
+{ 1792, 3 },
+{ 1984, 4 },
+{ 2048, 4 },
+{ 2112, 4 },
+{ 2176, 4 },
+{ 2240, 4 },
+{ 2304, 4 },
+{ 1856, 3 },
+{ 1856, 3 },
+{ 1920, 3 },
+{ 1920, 3 },
+{ 2368, 4 },
+{ 2432, 4 },
+{ 2496, 4 },
+{ 2560, 4 },
+{ 1472, 1 },
+{ 1536, 1 },
+{ 1600, 1 },
+{ 1728, 1 },
+{ 704, 1 },
+{ 768, 1 },
+{ 832, 1 },
+{ 896, 1 },
+{ 960, 1 },
+{ 1024, 1 },
+{ 1088, 1 },
+{ 1152, 1 },
+{ 1216, 1 },
+{ 1280, 1 },
+{ 1344, 1 },
+{ 1408, 1 }
 };
 
 /* black decode table (runlength huffman codes) */
 const mmr_table_node jbig2_mmr_black_decode[] = {
-	{ 128, 12 },
-	{ 160, 13 },
-	{ 224, 12 },
-	{ 256, 12 },
-	{ 10, 7 },
-	{ 11, 7 },
-	{ 288, 12 },
-	{ 12, 7 },
-	{ 9, 6 },
-	{ 9, 6 },
-	{ 8, 6 },
-	{ 8, 6 },
-	{ 7, 5 },
-	{ 7, 5 },
-	{ 7, 5 },
-	{ 7, 5 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 6, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 5, 4 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 1, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 4, 3 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 3, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ 2, 2 },
-	{ -2, 4 },
-	{ -2, 4 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -1, 0 },
-	{ -3, 5 },
-	{ 1792, 4 },
-	{ 1792, 4 },
-	{ 1984, 5 },
-	{ 2048, 5 },
-	{ 2112, 5 },
-	{ 2176, 5 },
-	{ 2240, 5 },
-	{ 2304, 5 },
-	{ 1856, 4 },
-	{ 1856, 4 },
-	{ 1920, 4 },
-	{ 1920, 4 },
-	{ 2368, 5 },
-	{ 2432, 5 },
-	{ 2496, 5 },
-	{ 2560, 5 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 18, 3 },
-	{ 52, 5 },
-	{ 52, 5 },
-	{ 640, 6 },
-	{ 704, 6 },
-	{ 768, 6 },
-	{ 832, 6 },
-	{ 55, 5 },
-	{ 55, 5 },
-	{ 56, 5 },
-	{ 56, 5 },
-	{ 1280, 6 },
-	{ 1344, 6 },
-	{ 1408, 6 },
-	{ 1472, 6 },
-	{ 59, 5 },
-	{ 59, 5 },
-	{ 60, 5 },
-	{ 60, 5 },
-	{ 1536, 6 },
-	{ 1600, 6 },
-	{ 24, 4 },
-	{ 24, 4 },
-	{ 24, 4 },
-	{ 24, 4 },
-	{ 25, 4 },
-	{ 25, 4 },
-	{ 25, 4 },
-	{ 25, 4 },
-	{ 1664, 6 },
-	{ 1728, 6 },
-	{ 320, 5 },
-	{ 320, 5 },
-	{ 384, 5 },
-	{ 384, 5 },
-	{ 448, 5 },
-	{ 448, 5 },
-	{ 512, 6 },
-	{ 576, 6 },
-	{ 53, 5 },
-	{ 53, 5 },
-	{ 54, 5 },
-	{ 54, 5 },
-	{ 896, 6 },
-	{ 960, 6 },
-	{ 1024, 6 },
-	{ 1088, 6 },
-	{ 1152, 6 },
-	{ 1216, 6 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 64, 3 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 13, 1 },
-	{ 23, 4 },
-	{ 23, 4 },
-	{ 50, 5 },
-	{ 51, 5 },
-	{ 44, 5 },
-	{ 45, 5 },
-	{ 46, 5 },
-	{ 47, 5 },
-	{ 57, 5 },
-	{ 58, 5 },
-	{ 61, 5 },
-	{ 256, 5 },
-	{ 16, 3 },
-	{ 16, 3 },
-	{ 16, 3 },
-	{ 16, 3 },
-	{ 17, 3 },
-	{ 17, 3 },
-	{ 17, 3 },
-	{ 17, 3 },
-	{ 48, 5 },
-	{ 49, 5 },
-	{ 62, 5 },
-	{ 63, 5 },
-	{ 30, 5 },
-	{ 31, 5 },
-	{ 32, 5 },
-	{ 33, 5 },
-	{ 40, 5 },
-	{ 41, 5 },
-	{ 22, 4 },
-	{ 22, 4 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 14, 1 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 15, 2 },
-	{ 128, 5 },
-	{ 192, 5 },
-	{ 26, 5 },
-	{ 27, 5 },
-	{ 28, 5 },
-	{ 29, 5 },
-	{ 19, 4 },
-	{ 19, 4 },
-	{ 20, 4 },
-	{ 20, 4 },
-	{ 34, 5 },
-	{ 35, 5 },
-	{ 36, 5 },
-	{ 37, 5 },
-	{ 38, 5 },
-	{ 39, 5 },
-	{ 21, 4 },
-	{ 21, 4 },
-	{ 42, 5 },
-	{ 43, 5 },
-	{ 0, 3 },
-	{ 0, 3 },
-	{ 0, 3 },
-	{ 0, 3 }
+{ 128, 12 },
+{ 160, 13 },
+{ 224, 12 },
+{ 256, 12 },
+{ 10, 7 },
+{ 11, 7 },
+{ 288, 12 },
+{ 12, 7 },
+{ 9, 6 },
+{ 9, 6 },
+{ 8, 6 },
+{ 8, 6 },
+{ 7, 5 },
+{ 7, 5 },
+{ 7, 5 },
+{ 7, 5 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 6, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 5, 4 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 1, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 4, 3 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 3, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ 2, 2 },
+{ -2, 4 },
+{ -2, 4 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -1, 0 },
+{ -3, 5 },
+{ 1792, 4 },
+{ 1792, 4 },
+{ 1984, 5 },
+{ 2048, 5 },
+{ 2112, 5 },
+{ 2176, 5 },
+{ 2240, 5 },
+{ 2304, 5 },
+{ 1856, 4 },
+{ 1856, 4 },
+{ 1920, 4 },
+{ 1920, 4 },
+{ 2368, 5 },
+{ 2432, 5 },
+{ 2496, 5 },
+{ 2560, 5 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 18, 3 },
+{ 52, 5 },
+{ 52, 5 },
+{ 640, 6 },
+{ 704, 6 },
+{ 768, 6 },
+{ 832, 6 },
+{ 55, 5 },
+{ 55, 5 },
+{ 56, 5 },
+{ 56, 5 },
+{ 1280, 6 },
+{ 1344, 6 },
+{ 1408, 6 },
+{ 1472, 6 },
+{ 59, 5 },
+{ 59, 5 },
+{ 60, 5 },
+{ 60, 5 },
+{ 1536, 6 },
+{ 1600, 6 },
+{ 24, 4 },
+{ 24, 4 },
+{ 24, 4 },
+{ 24, 4 },
+{ 25, 4 },
+{ 25, 4 },
+{ 25, 4 },
+{ 25, 4 },
+{ 1664, 6 },
+{ 1728, 6 },
+{ 320, 5 },
+{ 320, 5 },
+{ 384, 5 },
+{ 384, 5 },
+{ 448, 5 },
+{ 448, 5 },
+{ 512, 6 },
+{ 576, 6 },
+{ 53, 5 },
+{ 53, 5 },
+{ 54, 5 },
+{ 54, 5 },
+{ 896, 6 },
+{ 960, 6 },
+{ 1024, 6 },
+{ 1088, 6 },
+{ 1152, 6 },
+{ 1216, 6 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 64, 3 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 13, 1 },
+{ 23, 4 },
+{ 23, 4 },
+{ 50, 5 },
+{ 51, 5 },
+{ 44, 5 },
+{ 45, 5 },
+{ 46, 5 },
+{ 47, 5 },
+{ 57, 5 },
+{ 58, 5 },
+{ 61, 5 },
+{ 256, 5 },
+{ 16, 3 },
+{ 16, 3 },
+{ 16, 3 },
+{ 16, 3 },
+{ 17, 3 },
+{ 17, 3 },
+{ 17, 3 },
+{ 17, 3 },
+{ 48, 5 },
+{ 49, 5 },
+{ 62, 5 },
+{ 63, 5 },
+{ 30, 5 },
+{ 31, 5 },
+{ 32, 5 },
+{ 33, 5 },
+{ 40, 5 },
+{ 41, 5 },
+{ 22, 4 },
+{ 22, 4 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 14, 1 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 15, 2 },
+{ 128, 5 },
+{ 192, 5 },
+{ 26, 5 },
+{ 27, 5 },
+{ 28, 5 },
+{ 29, 5 },
+{ 19, 4 },
+{ 19, 4 },
+{ 20, 4 },
+{ 20, 4 },
+{ 34, 5 },
+{ 35, 5 },
+{ 36, 5 },
+{ 37, 5 },
+{ 38, 5 },
+{ 39, 5 },
+{ 21, 4 },
+{ 21, 4 },
+{ 42, 5 },
+{ 43, 5 },
+{ 0, 3 },
+{ 0, 3 },
+{ 0, 3 },
+{ 0, 3 }
 };
 
 #define getbit(buf, x) ( ( buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 )
@@ -734,41 +728,39 @@
 static int
 jbig2_find_changing_element(const byte *line, int x, int w)
 {
-  int a, b;
+	int a, b;
 
-  if (line == 0)
-    return w;
+	if (line == 0)
+		return w;
 
-  if (x == 0)
-    {
-      a = 0;
-    }
-  else
-    {
-      a = getbit(line, x);
-      x ++;
-    }
+	if (x == -1) {
+		a = 0;
+		x = 0;
+	}
+	else {
+		a = getbit(line, x);
+		x ++;
+	}
 
-  while (x < w)
-    {
-      b = getbit(line, x);
-      if (a != b)
-	break;
-      x++;
-    }
+	while (x < w) {
+		b = getbit(line, x);
+		if (a != b)
+			break;
+		x++;
+	}
 
-  return x;
+	return x;
 }
 
 static int
 jbig2_find_changing_element_of_color(const byte *line, int x, int w, int color)
 {
-  if (line == 0)
-    return w;
-  x = jbig2_find_changing_element(line, x, w);
-  if (x < w && getbit(line, x) != color)
-    x = jbig2_find_changing_element(line, x, w);
-  return x;
+	if (line == 0)
+		return w;
+	x = jbig2_find_changing_element(line, x, w);
+	if (x < w && getbit(line, x) != color)
+		x = jbig2_find_changing_element(line, x, w);
+	return x;
 }
 
 static const byte lm[8] = { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };
@@ -777,206 +769,224 @@
 static void
 jbig2_set_bits(byte *line, int x0, int x1)
 {
-  int a0, a1, b0, b1, a;
+	int a0, a1, b0, b1, a;
 
-  a0 = x0 >> 3;
-  a1 = x1 >> 3;
+	a0 = x0 >> 3;
+	a1 = x1 >> 3;
 
-  b0 = x0 & 7;
-  b1 = x1 & 7;
+	b0 = x0 & 7;
+	b1 = x1 & 7;
 
-  if (a0 == a1)
-    {
-      line[a0] |= lm[b0] & rm[b1];
-    }
-  else
-    {
-      line[a0] |= lm[b0];
-      for (a = a0 + 1; a < a1; a++)
-        line[a] = 0xFF;
-      line[a1] |= rm[b1];
-    }
+	if (a0 == a1) {
+		line[a0] |= lm[b0] & rm[b1];
+	}
+	else {
+		line[a0] |= lm[b0];
+		for (a = a0 + 1; a < a1; a++)
+			line[a] = 0xFF;
+		line[a1] |= rm[b1];
+	}
 }
 
+
 static int
 jbig2_decode_get_code(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)
 {
-  uint32_t word = mmr->word;
-  int table_ix = word >> (32 - initial_bits);
-  int val = table[table_ix].val;
-  int n_bits = table[table_ix].n_bits;
+	uint32_t word = mmr->word;
+	int table_ix = word >> (32 - initial_bits);
+	int val = table[table_ix].val;
+	int n_bits = table[table_ix].n_bits;
 
-  if (n_bits > initial_bits)
-    {
-      int mask = (1 << (32 - initial_bits)) - 1;
-      table_ix = val + ((word & mask) >> (32 - n_bits));
-      val = table[table_ix].val;
-      n_bits = initial_bits + table[table_ix].n_bits;
-    }
+	if (n_bits > initial_bits) {
+		int mask = (1 << (32 - initial_bits)) - 1;
+		table_ix = val + ((word & mask) >> (32 - n_bits));
+		val = table[table_ix].val;
+		n_bits = initial_bits + table[table_ix].n_bits;
+	}
 
-  jbig2_decode_mmr_consume(mmr, n_bits);
-  return val;
+	jbig2_decode_mmr_consume(mmr, n_bits);
+
+	return val;
 }
 
 static int
 jbig2_decode_get_run(Jbig2MmrCtx *mmr, const mmr_table_node *table, int initial_bits)
 {
-  int result = 0;
-  int val;
+	int result = 0;
+	int val;
 
-  do
-    {
-      val = jbig2_decode_get_code(mmr, table, initial_bits);
-      result += val;
-    }
-  while (val >= 64);
-  return result;
+	do {
+		val = jbig2_decode_get_code(mmr, table, initial_bits);
+		result += val;
+	} while (val >= 64);
+
+	return result;
 }
 
 static void
 jbig2_decode_mmr_line(Jbig2MmrCtx *mmr, const byte *ref, byte *dst)
 {
-  int a0, a1, a2, b1, b2;
-  int c;
+	int a0, a1, a2, b1, b2;
+	int c;
 
-  a0 = 0;
-  c = 0; /* 0 is white, black is 1 */
+	a0 = -1;
+	c = 0;		/* 0 is white, black is 1 */
 
-  while (1)
-    {
-      uint32_t word = mmr->word;
+	while (1)
+	{
+		uint32_t word = mmr->word;
+		/* printf ("%08x\n", word); */
 
-      if (a0 >= mmr->width)
-	break;
+		if (a0 >= mmr->width)
+			break;
 
-      if ((word >> (32 - 3)) == 1)
-	{
-	  int white_run, black_run;
+		if ((word >> (32 - 3)) == 1)
+		{
+			int white_run, black_run;
 
-	  jbig2_decode_mmr_consume(mmr, 3);
+			jbig2_decode_mmr_consume(mmr, 3);
 
-	  if (c == 0)
-	    {
-	      white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
-	      black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
-	      a1 = a0 + white_run;
-	      a2 = a1 + black_run;
-	      jbig2_set_bits(dst, a1, a2);
-	      a0 = a2;
-	      /* printf ("H %d %d\n", white_run, black_run); */
-	    }
-	  else
-	    {
-	      black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
-	      white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
-	      a1 = a0 + black_run;
-	      a2 = a1 + white_run;
-	      jbig2_set_bits(dst, a0, a1);
-	      a0 = a2;
-	      /* printf ("H %d %d\n", black_run, white_run); */
-	    }
-	}
+			if (a0 == -1)
+				a0 = 0;
 
-      else if ((word >> (32 - 4)) == 1)
-	{
-	  /* printf ("P\n"); */
-	  jbig2_decode_mmr_consume(mmr, 4);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  b2 = jbig2_find_changing_element(ref, b1, mmr->width);
-	  if (c) jbig2_set_bits(dst, a0, b2);
-	  a0 = b2;
-	}
+			if (c == 0) {
+				white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
+				black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
+				a1 = a0 + white_run;
+				a2 = a1 + black_run;
+				if (a1 > mmr->width) a1 = mmr->width;
+				if (a2 > mmr->width) a2 = mmr->width;
+				jbig2_set_bits(dst, a1, a2);
+				a0 = a2;
+				/* printf ("H %d %d\n", white_run, black_run); */
+			}
+			else
+			{
+				black_run = jbig2_decode_get_run(mmr, jbig2_mmr_black_decode, 7);
+				white_run = jbig2_decode_get_run(mmr, jbig2_mmr_white_decode, 8);
+				a1 = a0 + black_run;
+				a2 = a1 + white_run;
+				if (a1 > mmr->width) a1 = mmr->width;
+				if (a2 > mmr->width) a2 = mmr->width;
+				jbig2_set_bits(dst, a0, a1);
+				a0 = a2;
+				/* printf ("H %d %d\n", black_run, white_run); */
+			}
+		}
 
-      else if ((word >> (32 - 1)) == 1)
-	{
-	  /* printf ("V(0)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 1);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1);
-	  a0 = b1;
-	  c = !c;
+		else if ((word >> (32 - 4)) == 1)
+		{
+			/* printf ("P\n"); */
+			jbig2_decode_mmr_consume(mmr, 4);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			b2 = jbig2_find_changing_element(ref, b1, mmr->width);
+			if (c) jbig2_set_bits(dst, a0, b2);
+			a0 = b2;
+		}
+
+		else if ((word >> (32 - 1)) == 1)
+		{
+			/* printf ("V(0)\n"); */
+			jbig2_decode_mmr_consume(mmr, 1);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (c) jbig2_set_bits(dst, a0, b1);
+			a0 = b1;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 3)) == 3)
+		{
+			/* printf ("VR(1)\n"); */
+			jbig2_decode_mmr_consume(mmr, 3);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 + 1 > mmr->width) break;
+			if (c) jbig2_set_bits(dst, a0, b1 + 1);
+			a0 = b1 + 1;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 6)) == 3)
+		{
+			/* printf ("VR(2)\n"); */
+			jbig2_decode_mmr_consume(mmr, 6);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 + 2 > mmr->width) break;
+			if (c) jbig2_set_bits(dst, a0, b1 + 2);
+			a0 = b1 + 2;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 7)) == 3)
+		{
+			/* printf ("VR(3)\n"); */
+			jbig2_decode_mmr_consume(mmr, 7);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 + 3 > mmr->width) break;
+			if (c) jbig2_set_bits(dst, a0, b1 + 3);
+			a0 = b1 + 3;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 3)) == 2)
+		{
+			/* printf ("VL(1)\n"); */
+			jbig2_decode_mmr_consume(mmr, 3);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 - 1 < 0) break;
+			if (c) jbig2_set_bits(dst, a0, b1 - 1);
+			a0 = b1 - 1;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 6)) == 2)
+		{
+			/* printf ("VL(2)\n"); */
+			jbig2_decode_mmr_consume(mmr, 6);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 - 2 < 0) break;
+			if (c) jbig2_set_bits(dst, a0, b1 - 2);
+			a0 = b1 - 2;
+			c = !c;
+		}
+
+		else if ((word >> (32 - 7)) == 2)
+		{
+			/* printf ("VL(3)\n"); */
+			jbig2_decode_mmr_consume(mmr, 7);
+			b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
+			if (b1 - 3 < 0) break;
+			if (c) jbig2_set_bits(dst, a0, b1 - 3);
+			a0 = b1 - 3;
+			c = !c;
+		}
+
+		else
+			break;
 	}
-      else if ((word >> (32 - 3)) == 3)
-	{
-	  /* printf ("VR(1)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 3);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 + 1);
-	  a0 = b1 + 1;
-	  c = !c;
-	}
-      else if ((word >> (32 - 6)) == 3)
-	{
-	  /* printf ("VR(2)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 6);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 + 2);
-	  a0 = b1 + 2;
-	  c = !c;
-	}
-      else if ((word >> (32 - 7)) == 3)
-	{
-	  /* printf ("VR(3)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 7);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 + 3);
-	  a0 = b1 + 3;
-	  c = !c;
-	}
-      else if ((word >> (32 - 3)) == 2)
-	{
-	  /* printf ("VL(1)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 3);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 - 1);
-	  a0 = b1 - 1;
-	  c = !c;
-	}
-      else if ((word >> (32 - 6)) == 2)
-	{
-	  /* printf ("VL(2)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 6);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 - 2);
-	  a0 = b1 - 2;
-	  c = !c;
-	}
-      else if ((word >> (32 - 7)) == 2)
-	{
-	  /* printf ("VL(3)\n"); */
-	  jbig2_decode_mmr_consume(mmr, 7);
-	  b1 = jbig2_find_changing_element_of_color(ref, a0, mmr->width, !c);
-	  if (c) jbig2_set_bits(dst, a0, b1 - 3);
-	  a0 = b1 - 3;
-	  c = !c;
-	}
-      else
-	break;
-    }
 }
 
 int
 jbig2_decode_generic_mmr(Jbig2Ctx *ctx,
-			 Jbig2Segment *segment,
-			 const Jbig2GenericRegionParams *params,
-			 const byte *data, size_t size,
-			 Jbig2Image *image)
+	Jbig2Segment *segment,
+	const Jbig2GenericRegionParams *params,
+	const byte *data, size_t size,
+	Jbig2Image *image)
 {
-  Jbig2MmrCtx mmr;
-  const int rowstride = image->stride;
-  byte *dst = image->data;
-  byte *ref = NULL;
-  int y;
+	Jbig2MmrCtx mmr;
+	const int rowstride = image->stride;
+	byte *dst = image->data;
+	byte *ref = NULL;
+	int y;
 
-  jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size);
+	jbig2_decode_mmr_init(&mmr, image->width, image->height, data, size);
 
-  for (y = 0; y < image->height; y++)
-    {
-      memset(dst, 0, rowstride);
-      jbig2_decode_mmr_line(&mmr, ref, dst);
-      ref = dst;
-      dst += rowstride;
-    }
-    
-  return 0;
+	for (y = 0; y < image->height; y++) {
+		memset(dst, 0, rowstride);
+		jbig2_decode_mmr_line(&mmr, ref, dst);
+		ref = dst;
+		dst += rowstride;
+	}
+
+	return 0;
 }
+