rev 463 - trunk

[email protected] Fri, 9 May 2008 06:41:01 -0700 (PDT)
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Author: giles
Date: 2008-05-09 06:41:01 -0700 (Fri, 09 May 2008)
New Revision: 463

Modified:
   trunk/jbig2_refinement.c
   trunk/jbig2_symbol_dict.c
   trunk/jbig2_text.c
   trunk/jbig2_text.h
Log:
Support for aggregate symbol coding, patch from Ghostscript trunk.


Modified: trunk/jbig2_refinement.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/jbig2_refinement.c	2008-05-09 13:38:29 UTC (rev 462)
+++ trunk/jbig2_refinement.c	2008-05-09 13:41:01 UTC (rev 463)
@@ -91,7 +91,7 @@
       jbig2_image_set_pixel(image, x, y, bit);
     }
   }
-#ifdef JBIG2_DEBUG_REFINEMENT
+#ifdef JBIG2_DEBUG
   {
     static count =3D 0;
     char name[32];
@@ -267,10 +267,6 @@
   {
     jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
       "decoding generic refinement region with offset %d,%x,\n"
-      "  GRTEMPLATE=3D%d, TPGRON=3D%d\n",
-      params->DX, params->DY, params->GRTEMPLATE, params->TPGRON);
-    jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
-      "decoding generic refinement region with offset %d,%x,\n"
       "  GRTEMPLATE=3D%d, TPGRON=3D%d, RA1=3D(%d,%d) RA2=3D(%d,%d)\n",
       params->DX, params->DY, params->GRTEMPLATE, params->TPGRON,
       params->grat[0], params->grat[1], params->grat[2], params->grat[3]=
);

Modified: trunk/jbig2_symbol_dict.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/jbig2_symbol_dict.c	2008-05-09 13:38:29 UTC (rev 462)
+++ trunk/jbig2_symbol_dict.c	2008-05-09 13:41:01 UTC (rev 463)
@@ -237,7 +237,11 @@
   Jbig2ArithIntCtx *IARDX =3D NULL;
   Jbig2ArithIntCtx *IARDY =3D NULL;
   int code =3D 0;
+  Jbig2SymbolDict **refagg_dicts;
+  int n_refagg_dicts =3D 1;
=20
+  Jbig2TextRegionParams *tparams =3D NULL;
+
   /* 6.5.5 (3) */
   HCHEIGHT =3D 0;
   NSYMSDECODED =3D 0;
@@ -392,68 +396,100 @@
 		    "aggregate symbol coding (%d instances)", REFAGGNINST);
=20
 		  if (REFAGGNINST > 1) {
-		      /* multiple symbols are embedded text regions */=20
-		      Jbig2TextRegionParams rparams;
-		      Jbig2SymbolDict *SBSYMS[2];
 		      Jbig2Image *image;
+		      int i;
=20
-		      rparams.SBHUFF =3D params->SDHUFF;
-		      rparams.SBREFINE =3D 1;
-		      rparams.SBDEFPIXEL =3D 0;
-		      rparams.SBCOMBOP =3D JBIG2_COMPOSE_OR;
-		      rparams.TRANSPOSED =3D 0;
-		      rparams.REFCORNER =3D JBIG2_CORNER_TOPLEFT;
-		      rparams.SBDSOFFSET =3D 0;
-		      rparams.SBNUMINSTANCES =3D REFAGGNINST;
-		      rparams.LOGSBSTRIPS =3D 0;
-		      rparams.SBSTRIPS =3D 1;
-		      if (rparams.SBHUFF) {
-			rparams.SBHUFFFS =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_F);
-			rparams.SBHUFFDS =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_H);
-			rparams.SBHUFFDT =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_K);
-			rparams.SBHUFFRDW =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_O);
-			rparams.SBHUFFRDH =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_O);
-			rparams.SBHUFFRDX =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_O);
-			rparams.SBHUFFRDY =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_O);
-			rparams.SBHUFFRSIZE =3D jbig2_build_huffman_table(ctx,
-				&jbig2_huffman_params_A);
+		      if (tparams =3D=3D NULL)=20
+		      {
+			  /* First time through, we need to initialise the */
+			  /* various tables for Huffman or adaptive encoding */
+			  /* as well as the text region parameters structure */
+			  refagg_dicts =3D jbig2_alloc(ctx->allocator, sizeof(Jbig2SymbolDict=
 *) * n_refagg_dicts);
+		          if (refagg_dicts =3D=3D NULL) {
+			      code =3D jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number=
,
+			       "Out of memory allocating dictionary array");
+		              return NULL;
+		          }
+		          refagg_dicts[0] =3D jbig2_sd_new(ctx, params->SDNUMINSYMS + =
params->SDNUMNEWSYMS);
+		          if (refagg_dicts[0] =3D=3D NULL) {
+			      code =3D jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number=
,
+			       "Out of memory allocating symbol dictionary");
+		              jbig2_free(ctx->allocator, refagg_dicts);
+		              return NULL;
+		          }
+		          refagg_dicts[0]->n_symbols =3D params->SDNUMINSYMS + params-=
>SDNUMNEWSYMS;
+		          for (i=3D0;i < params->SDNUMINSYMS;i++)
+		          {
+			      refagg_dicts[0]->glyphs[i] =3D jbig2_image_clone(ctx, params->S=
DINSYMS->glyphs[i]);
+		          }
+
+			  tparams =3D jbig2_alloc(ctx->allocator, sizeof(Jbig2TextRegionParam=
s));
+			  if (tparams =3D=3D NULL) {
+			      code =3D jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number=
,
+			      "Out of memory creating text region params");
+			      jbig2_sd_release(ctx, refagg_dicts[0]);
+			      jbig2_free(ctx->allocator, refagg_dicts);
+			      return NULL;
+			  }
+    		          if (!params->SDHUFF) {
+			      /* Values from Table 17, section 6.5.8.2 (2) */
+			      tparams->IADT =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IAFS =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IADS =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IAIT =3D jbig2_arith_int_ctx_new(ctx);
+			      /* Table 31 */
+			      for (SBSYMCODELEN =3D 0; (1 << SBSYMCODELEN) <=20
+				  (int)(params->SDNUMINSYMS + params->SDNUMNEWSYMS); SBSYMCODELEN++)=
;
+			      tparams->IAID =3D jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
+			      tparams->IARI =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IARDW =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IARDH =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IARDX =3D jbig2_arith_int_ctx_new(ctx);
+			      tparams->IARDY =3D jbig2_arith_int_ctx_new(ctx);
+			  } else {
+			      tparams->SBHUFFFS =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_F);   /* Table B.6 */
+			      tparams->SBHUFFDS =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_H);  /* Table B.8 */
+			      tparams->SBHUFFDT =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_K);  /* Table B.11 */
+			      tparams->SBHUFFRDW =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_O); /* Table B.15 */
+			      tparams->SBHUFFRDH =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_O); /* Table B.15 */
+			      tparams->SBHUFFRDX =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_O); /* Table B.15 */
+			      tparams->SBHUFFRDY =3D jbig2_build_huffman_table(ctx,
+				&jbig2_huffman_params_O); /* Table B.15 */
+			  }
+			  tparams->SBHUFF =3D params->SDHUFF;
+			  tparams->SBREFINE =3D 1;
+			  tparams->SBSTRIPS =3D 1;
+			  tparams->SBDEFPIXEL =3D 0;
+			  tparams->SBCOMBOP =3D JBIG2_COMPOSE_OR;
+			  tparams->TRANSPOSED =3D 0;
+			  tparams->REFCORNER =3D JBIG2_CORNER_TOPLEFT;
+			  tparams->SBDSOFFSET =3D 0;
+			  tparams->SBRTEMPLATE =3D params->SDRTEMPLATE;
 		      }
-		      rparams.SBRTEMPLATE =3D params->SDRTEMPLATE;
-		      rparams.sbrat[0] =3D params->sdrat[0];
-		      rparams.sbrat[1] =3D params->sdrat[1];
-		      rparams.sbrat[2] =3D params->sdrat[2];
-		      rparams.sbrat[3] =3D params->sdrat[3];
+		      tparams->SBNUMINSTANCES =3D REFAGGNINST;
=20
-		      SBSYMS[0] =3D params->SDINSYMS;
-		      SBSYMS[1] =3D SDNEWSYMS;
-		      image =3D jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);
-		      code =3D jbig2_decode_text_region(ctx, segment, &rparams,
-			(const Jbig2SymbolDict * const *)SBSYMS, 2,=20
-			image, data, size, NULL);
-		      jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
-			"text region decode returned %d", code);
+      		      image =3D jbig2_image_new(ctx, SYMWIDTH, HCHEIGHT);
+		      if (image =3D=3D NULL) {
+			  code =3D jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
+			   "Out of memory creating symbol image");
+		          jbig2_free(ctx->allocator, tparams);
+			  jbig2_sd_release(ctx, refagg_dicts[0]);
+		          jbig2_free(ctx->allocator, refagg_dicts);
+		          return NULL;
+		      }
=20
-		      if (rparams.SBHUFF) {
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFFS);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFDS);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFDT);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFRDW);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFRDH);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFRDX);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFRDY);
-			jbig2_release_huffman_table(ctx, rparams.SBHUFFRSIZE);=09
-		      }
-	=09
-		      code =3D jbig2_error(ctx, JBIG2_SEVERITY_WARNING, segment->numbe=
r,
-			"NYI aggregate coding with REFAGGNINST=3D%d", REFAGGNINST);
-		      return NULL;
+		      /* multiple symbols are handled as a text region */
+		      jbig2_decode_text_region(ctx, segment, tparams, (const Jbig2Symb=
olDict * const *)refagg_dicts,=20
+			  n_refagg_dicts, image, data, size, GR_stats, as, (Jbig2WordStream *=
)NULL);
+
+		      SDNEWSYMS->glyphs[NSYMSDECODED] =3D image;
+		      refagg_dicts[0]->glyphs[params->SDNUMINSYMS + NSYMSDECODED] =3D =
jbig2_image_clone(ctx, SDNEWSYMS->glyphs[NSYMSDECODED]);
 		  } else {
 		      /* 6.5.8.2.2 */
 		      /* bool SBHUFF =3D params->SDHUFF; */
@@ -612,6 +648,37 @@
=20
   } /* end of symbol decode loop */
=20
+  if (tparams !=3D NULL)=20
+  {
+      if (!params->SDHUFF)
+      {
+          jbig2_arith_int_ctx_free(ctx, tparams->IADT);
+          jbig2_arith_int_ctx_free(ctx, tparams->IAFS);
+          jbig2_arith_int_ctx_free(ctx, tparams->IADS);
+          jbig2_arith_int_ctx_free(ctx, tparams->IAIT);
+          jbig2_arith_iaid_ctx_free(ctx, tparams->IAID);
+          jbig2_arith_int_ctx_free(ctx, tparams->IARI);
+          jbig2_arith_int_ctx_free(ctx, tparams->IARDW);
+          jbig2_arith_int_ctx_free(ctx, tparams->IARDH);
+          jbig2_arith_int_ctx_free(ctx, tparams->IARDX);
+          jbig2_arith_int_ctx_free(ctx, tparams->IARDY);
+      }
+      else
+      {
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFFS);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFDS);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFDT);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFRDX);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFRDY);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFRDW);
+          jbig2_release_huffman_table(ctx, tparams->SBHUFFRDH);
+      }
+      jbig2_free(ctx->allocator, tparams);
+      tparams =3D NULL;
+      jbig2_sd_release(ctx, refagg_dicts[0]);
+      jbig2_free(ctx->allocator, refagg_dicts);
+  }
+
   jbig2_free(ctx->allocator, GB_stats);
  =20
   /* 6.5.10 */

Modified: trunk/jbig2_text.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/jbig2_text.c	2008-05-09 13:38:29 UTC (rev 462)
+++ trunk/jbig2_text.c	2008-05-09 13:41:01 UTC (rev 463)
@@ -1,7 +1,7 @@
 /*
     jbig2dec
    =20
-    Copyright (C) 2002-2006 Artifex Software, Inc.
+    Copyright (C) 2002-2008 Artifex Software, Inc.
    =20
     This software is distributed under license and may not
     be copied, modified or distributed except as expressly
@@ -34,6 +34,7 @@
 #include "jbig2_symbol_dict.h"
 #include "jbig2_text.h"
=20
+
 /**
  * jbig2_decode_text_region: decode a text region segment
  *
@@ -57,7 +58,7 @@
                              const Jbig2SymbolDict * const *dicts, const=
 int n_dicts,
                              Jbig2Image *image,
                              const byte *data, const size_t size,
-			     Jbig2ArithCx *GR_stats)
+			     Jbig2ArithCx *GR_stats, Jbig2ArithState *as, Jbig2WordStream *ws=
)
 {
     /* relevent bits of 6.4.4 */
     uint32_t NINSTANCES;
@@ -74,20 +75,8 @@
     bool first_symbol;
     uint32_t index, SBNUMSYMS;
     Jbig2Image *IB;
-    Jbig2WordStream *ws =3D NULL;
     Jbig2HuffmanState *hs =3D NULL;
     Jbig2HuffmanTable *SBSYMCODES =3D NULL;
-    Jbig2ArithState *as =3D NULL;
-    Jbig2ArithIntCtx *IADT =3D NULL;
-    Jbig2ArithIntCtx *IAFS =3D NULL;
-    Jbig2ArithIntCtx *IADS =3D NULL;
-    Jbig2ArithIntCtx *IAIT =3D NULL;
-    Jbig2ArithIaidCtx *IAID =3D NULL;
-    Jbig2ArithIntCtx *IARI =3D NULL;
-    Jbig2ArithIntCtx *IARDW =3D NULL;
-    Jbig2ArithIntCtx *IARDH =3D NULL;
-    Jbig2ArithIntCtx *IARDX =3D NULL;
-    Jbig2ArithIntCtx *IARDY =3D NULL;
     int code =3D 0;
     int RI;
    =20
@@ -98,24 +87,7 @@
     jbig2_error(ctx, JBIG2_SEVERITY_DEBUG, segment->number,
         "symbol list contains %d glyphs in %d dictionaries", SBNUMSYMS, =
n_dicts);
    =20
-    ws =3D jbig2_word_stream_buf_new(ctx, data, size);
-    if (!params->SBHUFF) {
-	int SBSYMCODELEN;
-
-        as =3D jbig2_arith_new(ctx, ws);
-        IADT =3D jbig2_arith_int_ctx_new(ctx);
-        IAFS =3D jbig2_arith_int_ctx_new(ctx);
-        IADS =3D jbig2_arith_int_ctx_new(ctx);
-        IAIT =3D jbig2_arith_int_ctx_new(ctx);
-	/* Table 31 */
-	for (SBSYMCODELEN =3D 0; (1 << SBSYMCODELEN) < SBNUMSYMS; SBSYMCODELEN+=
+);
-        IAID =3D jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
-	IARI =3D jbig2_arith_int_ctx_new(ctx);
-	IARDW =3D jbig2_arith_int_ctx_new(ctx);
-	IARDH =3D jbig2_arith_int_ctx_new(ctx);
-	IARDX =3D jbig2_arith_int_ctx_new(ctx);
-	IARDY =3D jbig2_arith_int_ctx_new(ctx);
-    } else {
+    if (params->SBHUFF) {
 	Jbig2HuffmanTable *runcodes;
 	Jbig2HuffmanParams runcodeparams;
 	Jbig2HuffmanLine runcodelengths[35];
@@ -176,7 +148,7 @@
 	      return -1;
 	    }
 	    len =3D symcodelengths[index-1].PREFLEN;
-	    if (code =3D=3D 32) range =3D jbig2_huffman_get_bits(hs, 2) + 2;
+	    if (code =3D=3D 32) range =3D jbig2_huffman_get_bits(hs, 2) + 3;
 	    else if (code =3D=3D 33) range =3D jbig2_huffman_get_bits(hs, 3) + =
3;
 	    else if (code =3D=3D 34) range =3D jbig2_huffman_get_bits(hs, 7) + =
11;
 	  }
@@ -227,7 +199,7 @@
     if (params->SBHUFF) {
         STRIPT =3D jbig2_huffman_get(hs, params->SBHUFFDT, &code);
     } else {
-        code =3D jbig2_arith_int_decode(IADT, as, &STRIPT);
+        code =3D jbig2_arith_int_decode(params->IADT, as, &STRIPT);
     }
=20
     /* 6.4.5 (2) */
@@ -241,7 +213,7 @@
         if (params->SBHUFF) {
             DT =3D jbig2_huffman_get(hs, params->SBHUFFDT, &code);
         } else {
-            code =3D jbig2_arith_int_decode(IADT, as, &DT);
+            code =3D jbig2_arith_int_decode(params->IADT, as, &DT);
         }
         DT *=3D params->SBSTRIPS;
         STRIPT +=3D DT;
@@ -255,7 +227,7 @@
 		if (params->SBHUFF) {
 		    DFS =3D jbig2_huffman_get(hs, params->SBHUFFFS, &code);
 		} else {
-		    code =3D jbig2_arith_int_decode(IAFS, as, &DFS);
+		    code =3D jbig2_arith_int_decode(params->IAFS, as, &DFS);
 		}
 		FIRSTS +=3D DFS;
 		CURS =3D FIRSTS;
@@ -266,7 +238,7 @@
 		if (params->SBHUFF) {
 		    IDS =3D jbig2_huffman_get(hs, params->SBHUFFDS, &code);
 		} else {
-		    code =3D jbig2_arith_int_decode(IADS, as, &IDS);
+		    code =3D jbig2_arith_int_decode(params->IADS, as, &IDS);
 		}
 		if (code) {
 		    break;
@@ -280,7 +252,7 @@
 	    } else if (params->SBHUFF) {
 		CURT =3D jbig2_huffman_get_bits(hs, params->LOGSBSTRIPS);
 	    } else {
-		code =3D jbig2_arith_int_decode(IAIT, as, &CURT);
+		code =3D jbig2_arith_int_decode(params->IAIT, as, &CURT);
 	    }
 	    T =3D STRIPT + CURT;
=20
@@ -288,7 +260,7 @@
 	    if (params->SBHUFF) {
 		ID =3D jbig2_huffman_get(hs, SBSYMCODES, &code);
 	    } else {
-		code =3D jbig2_arith_iaid_decode(IAID, as, (int *)&ID);
+		code =3D jbig2_arith_iaid_decode(params->IAID, as, (int *)&ID);
 	    }
 	    if (ID >=3D SBNUMSYMS) {
 		return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
@@ -308,7 +280,7 @@
 	      if (params->SBHUFF) {
 		RI =3D jbig2_huffman_get_bits(hs, 1);
 	      } else {
-		code =3D jbig2_arith_int_decode(IARI, as, &RI);
+		code =3D jbig2_arith_int_decode(params->IARI, as, &RI);
 	      }
 	    } else {
 		RI =3D 0;
@@ -322,10 +294,10 @@
=20
 		/* 6.4.11 (1, 2, 3, 4) */
 		if (!params->SBHUFF) {
-		  code =3D jbig2_arith_int_decode(IARDW, as, &RDW);
-		  code =3D jbig2_arith_int_decode(IARDH, as, &RDH);
-		  code =3D jbig2_arith_int_decode(IARDX, as, &RDX);
-		  code =3D jbig2_arith_int_decode(IARDY, as, &RDY);
+		  code =3D jbig2_arith_int_decode(params->IARDW, as, &RDW);
+		  code =3D jbig2_arith_int_decode(params->IARDH, as, &RDH);
+		  code =3D jbig2_arith_int_decode(params->IARDX, as, &RDX);
+		  code =3D jbig2_arith_int_decode(params->IARDY, as, &RDY);
 		} else {
 		  RDW =3D jbig2_huffman_get(hs, params->SBHUFFRDW, &code);
 		  RDH =3D jbig2_huffman_get(hs, params->SBHUFFRDH, &code);
@@ -414,20 +386,7 @@
=20
     if (params->SBHUFF) {
       jbig2_release_huffman_table(ctx, SBSYMCODES);
-    } else {
-	jbig2_arith_int_ctx_free(ctx, IADT);
-	jbig2_arith_int_ctx_free(ctx, IAFS);
-	jbig2_arith_int_ctx_free(ctx, IADS);
-	jbig2_arith_int_ctx_free(ctx, IAIT);
-	jbig2_arith_iaid_ctx_free(ctx, IAID);
-	jbig2_arith_int_ctx_free(ctx, IARI);
-	jbig2_arith_int_ctx_free(ctx, IARDW);
-	jbig2_arith_int_ctx_free(ctx, IARDH);
-	jbig2_arith_int_ctx_free(ctx, IARDX);
-	jbig2_arith_int_ctx_free(ctx, IARDY);
-	jbig2_free(ctx->allocator, as);
-	jbig2_word_stream_buf_free(ctx, ws);
-    }
+    }=20
    =20
     return 0;
 }
@@ -448,6 +407,8 @@
     uint16_t huffman_flags =3D 0;
     Jbig2ArithCx *GR_stats =3D NULL;
     int code =3D 0;
+    Jbig2WordStream *ws =3D NULL;=20
+    Jbig2ArithState *as =3D NULL;=20
    =20
     /* 7.4.1 */
     if (segment->data_length < 17)
@@ -712,10 +673,35 @@
=20
     image =3D jbig2_image_new(ctx, region_info.width, region_info.height=
);
=20
+    ws =3D jbig2_word_stream_buf_new(ctx, segment_data + offset, segment=
->data_length - offset);
+    if (!params.SBHUFF) {
+	int SBSYMCODELEN, index;
+        int SBNUMSYMS =3D 0;
+	for (index =3D 0; index < n_dicts; index++) {
+	    SBNUMSYMS +=3D dicts[index]->n_symbols;
+	}
+
+	as =3D jbig2_arith_new(ctx, ws);
+	ws =3D 0;
+
+        params.IADT =3D jbig2_arith_int_ctx_new(ctx);
+        params.IAFS =3D jbig2_arith_int_ctx_new(ctx);
+        params.IADS =3D jbig2_arith_int_ctx_new(ctx);
+        params.IAIT =3D jbig2_arith_int_ctx_new(ctx);
+	/* Table 31 */
+	for (SBSYMCODELEN =3D 0; (1 << SBSYMCODELEN) < SBNUMSYMS; SBSYMCODELEN+=
+);
+        params.IAID =3D jbig2_arith_iaid_ctx_new(ctx, SBSYMCODELEN);
+	params.IARI =3D jbig2_arith_int_ctx_new(ctx);
+	params.IARDW =3D jbig2_arith_int_ctx_new(ctx);
+	params.IARDH =3D jbig2_arith_int_ctx_new(ctx);
+	params.IARDX =3D jbig2_arith_int_ctx_new(ctx);
+	params.IARDY =3D jbig2_arith_int_ctx_new(ctx);
+    }
+
     code =3D jbig2_decode_text_region(ctx, segment, &params,
                 (const Jbig2SymbolDict * const *)dicts, n_dicts, image,
                 segment_data + offset, segment->data_length - offset,
-		GR_stats);
+		GR_stats, as, ws);
=20
     if (!params.SBHUFF && params.SBREFINE) {
 	jbig2_free(ctx->allocator, GR_stats);
@@ -731,6 +717,20 @@
       jbig2_release_huffman_table(ctx, params.SBHUFFRDH);
       jbig2_release_huffman_table(ctx, params.SBHUFFRSIZE);
     }
+    else {
+	jbig2_arith_int_ctx_free(ctx, params.IADT);
+	jbig2_arith_int_ctx_free(ctx, params.IAFS);
+	jbig2_arith_int_ctx_free(ctx, params.IADS);
+	jbig2_arith_int_ctx_free(ctx, params.IAIT);
+	jbig2_arith_iaid_ctx_free(ctx, params.IAID);
+	jbig2_arith_int_ctx_free(ctx, params.IARI);
+	jbig2_arith_int_ctx_free(ctx, params.IARDW);
+	jbig2_arith_int_ctx_free(ctx, params.IARDH);
+	jbig2_arith_int_ctx_free(ctx, params.IARDX);
+	jbig2_arith_int_ctx_free(ctx, params.IARDY);
+	jbig2_free(ctx->allocator, as);
+	jbig2_word_stream_buf_free(ctx, ws);
+    }
=20
     jbig2_free(ctx->allocator, dicts);
=20

Modified: trunk/jbig2_text.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/jbig2_text.h	2008-05-09 13:38:29 UTC (rev 462)
+++ trunk/jbig2_text.h	2008-05-09 13:41:01 UTC (rev 463)
@@ -1,7 +1,7 @@
 /*
     jbig2dec
    =20
-    Copyright (C) 2002-2006 Artifex Software, Inc.
+    Copyright (C) 2002-2004 Artifex Software, Inc.
    =20
     This software is distributed under license and may not
     be copied, modified or distributed except as expressly
@@ -13,12 +13,12 @@
     Artifex Software, Inc.,  101 Lucas Valley Road #110,
     San Rafael, CA  94903, U.S.A., +1(415)492-9861.
        =20
-    $Id: jbig2_priv.h 420 2005-07-27 23:55:54Z giles $
-   =20
-    text region header
+    $Id: jbig2_text.h 8022 2007-06-05 22:23:38Z giles $
 */
=20
-/* jbig2_symbol_dict.h must be included first */
+/**
+ * Headers for Text region handling
+ **/
=20
 typedef enum {
     JBIG2_CORNER_BOTTOMLEFT =3D 0,
@@ -35,12 +35,12 @@
     bool TRANSPOSED;
     Jbig2RefCorner REFCORNER;
     int SBDSOFFSET;
-    /* SBW */
-    /* SBH */
+    /* int SBW; */
+    /* int SBH; */
     uint32_t SBNUMINSTANCES;
     int LOGSBSTRIPS;
     int SBSTRIPS;
-    /* SBNUMSYMS */
+    /* int SBNUMSYMS; */
     /* SBSYMCODES */
     /* SBSYMCODELEN */
     /* SBSYMS */
@@ -52,14 +52,25 @@
     Jbig2HuffmanTable *SBHUFFRDX;
     Jbig2HuffmanTable *SBHUFFRDY;
     Jbig2HuffmanTable *SBHUFFRSIZE;
+    Jbig2ArithIntCtx *IADT;
+    Jbig2ArithIntCtx *IAFS;
+    Jbig2ArithIntCtx *IADS;
+    Jbig2ArithIntCtx *IAIT;
+    Jbig2ArithIaidCtx *IAID;
+    Jbig2ArithIntCtx *IARI;
+    Jbig2ArithIntCtx *IARDW;
+    Jbig2ArithIntCtx *IARDH;
+    Jbig2ArithIntCtx *IARDX;
+    Jbig2ArithIntCtx *IARDY;
     bool SBRTEMPLATE;
     int8_t sbrat[4];
 } Jbig2TextRegionParams;
=20
 int
 jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
-			     const Jbig2TextRegionParams *params,
-			     const Jbig2SymbolDict * const *dicts, const int n_dicts,
-			     Jbig2Image *image,
-			     const byte *data, const size_t size,
-			     Jbig2ArithCx *GR_stats);
+                             const Jbig2TextRegionParams *params,
+                             const Jbig2SymbolDict * const *dicts, const=
 int n_dicts,
+                             Jbig2Image *image,
+                             const byte *data, const size_t size,
+			     Jbig2ArithCx *GR_stats,
+			     Jbig2ArithState *as, Jbig2WordStream *ws);