jbig2dec

Ralph Giles <[email protected]> Mon, 24 Jun 2002 08:52:00 -0700
Newsgroups gmane.comp.printing.ghostscript.jbig2dec.cvs
Message-ID <[email protected]>
Update of /cvsroot/jbig2dec/jbig2dec
In directory usw-pr-cvs1:/tmp/cvs-serv10229

Modified Files:
	jbig2_generic.c jbig2_image.c jbig2_priv.h jbig2_symbol_dict.c 
	jbig2_text.c 
Log Message:
checkpointing work on text region decoder.


Index: jbig2_generic.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_generic.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- jbig2_generic.c	22 Jun 2002 16:05:45 -0000	1.8
+++ jbig2_generic.c	24 Jun 2002 15:51:57 -0000	1.9
@@ -437,7 +437,8 @@
 
   /* todo: free ws, as */
   
-  jbig2_image_compose(ctx, ctx->pages[ctx->current_page].image, image, rsi.x, rsi.y);
+  jbig2_image_compose(ctx, ctx->pages[ctx->current_page].image, image,
+			rsi.x, rsi.y, JBIG2_COMPOSE_OR);
   jbig2_image_free(ctx, image);
   
   jbig2_free(ctx->allocator, GB_stats);

Index: jbig2_image.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_image.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- jbig2_image.c	21 Jun 2002 19:10:02 -0000	1.6
+++ jbig2_image.c	24 Jun 2002 15:51:57 -0000	1.7
@@ -58,8 +58,8 @@
 }
 
 /* composite one jbig2_image onto another */
-// FIXME: need to add a drawing mode argument
-int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y)
+int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, 
+			int x, int y, Jbig2ComposeOp op)
 {
     /* special case complete replacement */
     if ((x == 0) && (y == 0) && (src->width == dst->width) && (src->height == dst->height)) {

Index: jbig2_priv.h
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_priv.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- jbig2_priv.h	22 Jun 2002 16:05:45 -0000	1.8
+++ jbig2_priv.h	24 Jun 2002 15:51:57 -0000	1.9
@@ -109,7 +109,14 @@
 int jbig2_read_page_info (Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);
 int jbig2_complete_page (Jbig2Ctx *ctx, Jbig2Segment *segment, const byte *segment_data);
 
-int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y);
+typedef enum {
+    JBIG2_COMPOSE_OR,
+    JBIG2_COMPOSE_AND,
+    JBIG2_COMPOSE_XOR,
+    JBIG2_COMPOSE_XNOR
+} Jbig2ComposeOp;
+
+int jbig2_image_compose(Jbig2Ctx *ctx, Jbig2Image *dst, Jbig2Image *src, int x, int y, Jbig2ComposeOp op);
 
 /* region segment info */
 

Index: jbig2_symbol_dict.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_symbol_dict.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- jbig2_symbol_dict.c	22 Jun 2002 21:20:38 -0000	1.11
+++ jbig2_symbol_dict.c	24 Jun 2002 15:51:57 -0000	1.12
@@ -290,7 +290,7 @@
 				  segment->data_length - offset,
 				  GB_stats);
 #ifdef HAVE_LIBPNG
-  jbig2_dump_symbol_dict(segment->result);
+//  jbig2_dump_symbol_dict(segment->result);
 #endif
 
   return 0;

Index: jbig2_text.c
===================================================================
RCS file: /cvsroot/jbig2dec/jbig2dec/jbig2_text.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- jbig2_text.c	22 Jun 2002 16:05:45 -0000	1.2
+++ jbig2_text.c	24 Jun 2002 15:51:57 -0000	1.3
@@ -21,6 +21,49 @@
 #include "jbig2_generic.h"
 #include "jbig2_symbol_dict.h"
 
+typedef enum {
+    JBIG2_CORNER_BOTTOMLEFT = 0,
+    JBIG2_CORNER_TOPLEFT = 1,
+    JBIG2_CORNER_BOTTOMRIGHT = 2,
+    JBIG2_CORNER_TOPRIGHT = 3
+} Jbig2RefCorner;
+
+typedef struct {
+    bool SBHUFF;
+    bool SBREFINE;
+    bool SBDEFPIXEL;
+    Jbig2ComposeOp SBCOMBOP;
+    bool TRANSPOSED;
+    Jbig2RefCorner REFCORNER;
+    int SBDOFFSET;
+    /* SBW */
+    /* SBH */
+    uint32_t SBNUMINSTANCES;
+    int SBSTRIPS;
+    /* SBNUMSYMS */
+    int *SBSYMCODES;
+    /* SBSYMCODELEN */
+    /* SBSYMS */
+    int SBHUFFFS;
+    int SBHUFFDS;
+    int SBHUFFDT;
+    int SBHUFFRDW;
+    int SBHUFFRDH;
+    int SBHUFFRDX;
+    int SBHUFFRDY;
+    bool SBHUFFRSIZE;
+    bool SBRTEMPLATE;
+    int8_t sbrat[4];
+} Jbig2TextRegionParams;
+
+int jbig2_decode_text_region(Jbig2Ctx *ctx, Jbig2Segment *segment,
+                             const Jbig2TextRegionParams *params,
+                             const Jbig2RegionSegmentInfo *info,
+                             Jbig2Image *image,
+                             const byte *data, size_t size)
+{
+}
+
 /**
  * jbig2_read_text_info: read a text region segment header
  **/
@@ -29,12 +72,17 @@
 {
     int offset = 0;
     Jbig2RegionSegmentInfo region_info;
+    Jbig2TextRegionParams params;
+    Jbig2Image *image, *page_image;
+    int code;
     uint32_t num_instances;
     uint16_t segment_flags;
     uint16_t huffman_flags;
-    int8_t sbrat[4];	/* FIXME: needs to be explicitly signed? */
+    int8_t sbrat[4];
     
     /* 7.4.1 */
+    if (segment->data_length < 17)
+        goto too_short;
     jbig2_get_region_segment_info(&region_info, segment_data);
     offset += 17;
     
@@ -42,7 +90,7 @@
     segment_flags = jbig2_get_int16(segment_data + offset);
     offset += 2;
     
-    if (segment_flags & 1)	/* Huffman coding */
+    if (segment_flags & 0x01)	/* Huffman coding */
       {
         /* 7.4.3.1.2 */
         huffman_flags = jbig2_get_int16(segment_data + offset);
@@ -75,4 +123,24 @@
         region_info.width, region_info.height,
         region_info.x, region_info.y, num_instances);
     }
+    
+    page_image = ctx->pages[ctx->current_page].image;
+    image = jbig2_image_new(ctx, region_info.width, region_info.height);
+
+    code = jbig2_decode_text_region(ctx, segment, &params,
+                &region_info, image,
+                segment_data + offset, segment->data_length - offset);
+
+    /* todo: check errors */
+
+    jbig2_image_compose(ctx, page_image, image, region_info.x, region_info.y, JBIG2_COMPOSE_OR);
+    if (image != page_image)
+        jbig2_image_free(ctx, image);
+
+    /* success */            
+    return 0;
+    
+    too_short:
+        return jbig2_error(ctx, JBIG2_SEVERITY_FATAL, segment->number,
+                    "Segment too short");
 }