[glabels] Minor refactoring of glBarcode structure.



commit 30d4df7681459d895ef5c09e2e43ba88c0e72785
Author: Jim Evins <evins snaught com>
Date:   Sat May 22 19:02:23 2010 -0400

    Minor refactoring of glBarcode structure.
    
    Minor refactoring of glBarcode structure in preparation of support for
    more exotic barcode shapes.

 src/bc-gnubarcode.c |   30 ++++++++--------
 src/bc-iec16022.c   |   12 +++---
 src/bc-iec18004.c   |   12 +++---
 src/bc-postnet.c    |   14 +++----
 src/bc-zint.c       |   14 ++++----
 src/bc.c            |   53 +++++++++++++++++++++++-----
 src/bc.h            |   92 ++++++++++++++++++++++++++++++++++++++++++++++----
 src/label-barcode.c |   93 +++++++++++++++++++++++++++++---------------------
 8 files changed, 222 insertions(+), 98 deletions(-)
---
diff --git a/src/bc-gnubarcode.c b/src/bc-gnubarcode.c
index 3e0ba43..11f132a 100644
--- a/src/bc-gnubarcode.c
+++ b/src/bc-gnubarcode.c
@@ -215,17 +215,17 @@ static glBarcode *
 render_pass1 (struct Barcode_Item *bci,
 	      gint                 flags)
 {
-	gint           validbits = BARCODE_NO_ASCII;
-	glBarcode     *gbc;
-	glBarcodeLine *line;
-	glBarcodeChar *bchar;
-	gdouble        scalef = 1.0;
-	gdouble        x;
-	gint           i, j, barlen;
-	gdouble        f1, f2;
-	gint           mode = '-'; /* text below bars */
-	gdouble        x0, y0, yr;
-	gchar         *p, c;
+	gint                 validbits = BARCODE_NO_ASCII;
+	glBarcode           *gbc;
+	glBarcodeShapeLine  *line;
+	glBarcodeShapeAlpha *bchar;
+	gdouble              scalef = 1.0;
+	gdouble              x;
+	gint                 i, j, barlen;
+	gdouble              f1, f2;
+	gint                 mode = '-'; /* text below bars */
+	gdouble              x0, y0, yr;
+	gchar               *p, c;
 
 	if (bci->width > (2*bci->margin)) {
 		bci->width -= 2*bci->margin;
@@ -315,12 +315,12 @@ render_pass1 (struct Barcode_Item *bci,
 					yr -= (isdigit (*p) ? 20 : 10) * scalef;
 				}
 			}
-			line = g_new0 (glBarcodeLine, 1);
+                        line = gl_barcode_shape_line_new ();
 			line->x = x0;
 			line->y = y0;
 			line->length = yr;
 			line->width = (j * scalef) - SHRINK_AMOUNT;
-			gbc->lines = g_list_append (gbc->lines, line);
+                        gl_barcode_add_shape (gbc, (glBarcodeShape *)line);
 		}
 		x += j * scalef;
 
@@ -342,7 +342,7 @@ render_pass1 (struct Barcode_Item *bci,
 				g_message ("impossible data: %s", p);
 				continue;
 			}
-			bchar = g_new0 (glBarcodeChar, 1);
+                        bchar = gl_barcode_shape_alpha_new ();
 			bchar->x = f1 * scalef + bci->margin;
 			if (mode == '-') {
 				bchar->y =
@@ -352,7 +352,7 @@ render_pass1 (struct Barcode_Item *bci,
 			}
 			bchar->fsize = f2 * FONT_SCALE * scalef;
 			bchar->c = c;
-			gbc->chars = g_list_append (gbc->chars, bchar);
+                        gl_barcode_add_shape (gbc, (glBarcodeShape *)bchar);
 		}
 	}
 
diff --git a/src/bc-iec16022.c b/src/bc-iec16022.c
index ebaa4e6..834e9f9 100644
--- a/src/bc-iec16022.c
+++ b/src/bc-iec16022.c
@@ -95,10 +95,10 @@ render_iec16022 (const gchar *grid,
                  gdouble      w,
                  gdouble      h)
 {
-        glBarcode     *gbc;
-        glBarcodeLine *line;
-        gint           x, y;
-        gdouble        aspect_ratio, pixel_size;
+        glBarcode          *gbc;
+        glBarcodeShapeLine *line;
+        gint                x, y;
+        gdouble             aspect_ratio, pixel_size;
 
 	/* Treat requested size as a bounding box, scale to maintain aspect
 	 * ratio while fitting it in this bounding box. */
@@ -127,12 +127,12 @@ render_iec16022 (const gchar *grid,
 
                         if (*grid++)
                         {
-                                line = g_new0 (glBarcodeLine, 1);
+                                line = gl_barcode_shape_line_new ();
                                 line->x      = x*pixel_size + pixel_size/2.0;
                                 line->y      = y*pixel_size;
                                 line->length = pixel_size;
                                 line->width  = pixel_size;
-                                gbc->lines = g_list_append (gbc->lines, line);
+                                gl_barcode_add_shape (gbc, (glBarcodeShape *)line);
                         }
 
                 }
diff --git a/src/bc-iec18004.c b/src/bc-iec18004.c
index 7070fca..f5f1ada 100644
--- a/src/bc-iec18004.c
+++ b/src/bc-iec18004.c
@@ -100,10 +100,10 @@ render_iec18004 (const gchar *grid,
                  gdouble      w,
                  gdouble      h)
 {
-        glBarcode     *gbc;
-        glBarcodeLine *line;
-        gint           x, y;
-        gdouble        aspect_ratio, pixel_size;
+        glBarcode          *gbc;
+        glBarcodeShapeLine *line;
+        gint                x, y;
+        gdouble             aspect_ratio, pixel_size;
 
 	/* Treat requested size as a bounding box, scale to maintain aspect
 	 * ratio while fitting it in this bounding box. */
@@ -136,12 +136,12 @@ render_iec18004 (const gchar *grid,
                          * bits are meaningless for us. */
                         if ((*grid++) & 1)
                         {
-                                line = g_new0 (glBarcodeLine, 1);
+                                line = gl_barcode_shape_line_new ();
                                 line->x      = x*pixel_size + pixel_size/2.0;
                                 line->y      = y*pixel_size;
                                 line->length = pixel_size;
                                 line->width  = pixel_size;
-                                gbc->lines = g_list_append (gbc->lines, line);
+                                gl_barcode_add_shape (gbc, (glBarcodeShape *)line);
                         }
 
                 }
diff --git a/src/bc-postnet.c b/src/bc-postnet.c
index 52c07db..9a3ba32 100644
--- a/src/bc-postnet.c
+++ b/src/bc-postnet.c
@@ -83,10 +83,10 @@ gl_barcode_postnet_new (const gchar    *id,
 			gdouble         h,
 			const gchar    *digits)
 {
-	gchar         *code, *p;
-	glBarcode     *gbc;
-	glBarcodeLine *line;
-	gdouble        x;
+        gchar              *code, *p;
+        glBarcode          *gbc;
+        glBarcodeShapeLine *line;
+        gdouble             x;
 
 	/* Validate code length for all subtypes. */
 	if ( (g_ascii_strcasecmp (id, "POSTNET") == 0) ) {
@@ -128,7 +128,7 @@ gl_barcode_postnet_new (const gchar    *id,
 	/* Now traverse the code string and create a list of lines */
 	x = POSTNET_HORIZ_MARGIN;
 	for (p = code; *p != 0; p++) {
-		line = g_new0 (glBarcodeLine, 1);
+                line = gl_barcode_shape_line_new ();
 		line->x = x;
 		line->y = POSTNET_VERT_MARGIN;
 		if (*p == '0') {
@@ -140,7 +140,7 @@ gl_barcode_postnet_new (const gchar    *id,
 		}
 		line->width = POSTNET_BAR_WIDTH;
 
-		gbc->lines = g_list_append (gbc->lines, line);
+                gl_barcode_add_shape (gbc, (glBarcodeShape *)line);
 
 		x += POSTNET_BAR_PITCH;
 	}
@@ -150,8 +150,6 @@ gl_barcode_postnet_new (const gchar    *id,
 	gbc->width = x + POSTNET_HORIZ_MARGIN;
 	gbc->height = POSTNET_FULLBAR_HEIGHT + 2 * POSTNET_VERT_MARGIN;
 
-	gbc->chars = NULL;
-
 	return gbc;
 }
 
diff --git a/src/bc-zint.c b/src/bc-zint.c
index 5c8502c..0ad8086 100644
--- a/src/bc-zint.c
+++ b/src/bc-zint.c
@@ -122,9 +122,9 @@ gl_barcode_zint_new (const gchar          *id,
  *--------------------------------------------------------------------------*/
 static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag) {
 
-	glBarcode     *gbc;
-	glBarcodeLine *line;
-	glBarcodeChar *bchar;
+        glBarcode           *gbc;
+        glBarcodeShapeLine  *line;
+        glBarcodeShapeAlpha *bchar;
 	
 	gint i, r, block_width, latch, this_row;
 	gfloat textpos, large_bar_height, preset_height, row_height, row_posn = 0.0;
@@ -226,7 +226,7 @@ static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag) {
 				} 
 				if(latch == 1) {
 					/* a bar */
-                                        line = g_new0 (glBarcodeLine, 1);
+                                        line = gl_barcode_shape_line_new ();
 
 					line->width = block_width * scaler;
 					/* glBarcodeLine centers based on width, counter-act!!! */
@@ -241,7 +241,7 @@ static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag) {
 					}
 					latch = 0;
 					// g_message ("Zint Adding Line at: %f x %f dim: %f x %f", line->x, line->y, line->width, line->length);
-					gbc->lines = g_list_append (gbc->lines, line);
+                                        gl_barcode_add_shape (gbc, (glBarcodeShape *)line);
 				} else {
 					/* a space */
 					latch = 1;
@@ -267,12 +267,12 @@ static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag) {
 
 		for (p = symbol->text; *p != 0; p++) {
 			if (p != (gchar *)symbol->text && *p == '(') xoffset += 3.0;
-			bchar = g_new0 (glBarcodeChar, 1);
+                        bchar = gl_barcode_shape_alpha_new ();
 			bchar->x = (textpos + xoffset) * scaler;
 			bchar->y = default_text_posn;
 			bchar->fsize = 8.0 * scaler;
 			bchar->c = (gchar) *p;
-			gbc->chars = g_list_append (gbc->chars, bchar);
+                        gl_barcode_add_shape (gbc, (glBarcodeShape *)bchar);
 			// Poor mans kerning
 			if (*p == '(') {
 				xoffset += 3.0;
diff --git a/src/bc.c b/src/bc.c
index 3c3d1dc..0761f6e 100644
--- a/src/bc.c
+++ b/src/bc.c
@@ -233,6 +233,32 @@ name_to_index (const gchar *name)
 
 
 /*****************************************************************************/
+/* Allocate new Line shape.                                                  */
+/*****************************************************************************/
+glBarcodeShapeLine *
+gl_barcode_shape_line_new (void)
+{
+        glBarcodeShapeLine *line_shape = g_new0 (glBarcodeShapeLine, 1);
+        line_shape->type = GL_BARCODE_SHAPE_LINE;
+
+        return line_shape;
+}
+
+
+/*****************************************************************************/
+/* Allocate new Alpha shape.                                                 */
+/*****************************************************************************/
+glBarcodeShapeAlpha *
+gl_barcode_shape_alpha_new (void)
+{
+        glBarcodeShapeAlpha *alpha_shape = g_new0 (glBarcodeShapeAlpha, 1);
+        alpha_shape->type = GL_BARCODE_SHAPE_ALPHA;
+
+        return alpha_shape;
+}
+
+
+/*****************************************************************************/
 /* Call appropriate barcode backend to create barcode in intermediate format.*/
 /*****************************************************************************/
 glBarcode *
@@ -270,19 +296,12 @@ gl_barcode_free (glBarcode **gbc)
 
 	if (*gbc != NULL) {
 
-		for (p = (*gbc)->lines; p != NULL; p = p->next) {
+		for (p = (*gbc)->shapes; p != NULL; p = p->next) {
 			g_free (p->data);
 			p->data = NULL;
 		}
-		g_list_free ((*gbc)->lines);
-		(*gbc)->lines = NULL;
-
-		for (p = (*gbc)->chars; p != NULL; p = p->next) {
-			g_free (p->data);
-			p->data = NULL;
-		}
-		g_list_free ((*gbc)->chars);
-		(*gbc)->chars = NULL;
+		g_list_free ((*gbc)->shapes);
+		(*gbc)->shapes = NULL;
 
 		g_free (*gbc);
 		*gbc = NULL;
@@ -291,6 +310,20 @@ gl_barcode_free (glBarcode **gbc)
 
 
 /*****************************************************************************/
+/* Add shape to barcode.                                                     */
+/*****************************************************************************/
+void
+gl_barcode_add_shape (glBarcode      *bc,
+                      glBarcodeShape *shape)
+{
+	g_return_if_fail (bc);
+	g_return_if_fail (shape);
+
+        bc->shapes = g_list_append (bc->shapes, shape);
+}
+
+
+/*****************************************************************************/
 /* Get a list of names for valid barcode styles.                             */
 /*****************************************************************************/
 GList *
diff --git a/src/bc.h b/src/bc.h
index 1e62a6f..909f74f 100644
--- a/src/bc.h
+++ b/src/bc.h
@@ -26,19 +26,91 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+        GL_BARCODE_SHAPE_LINE,
+        GL_BARCODE_SHAPE_ALPHA,
+} glBarcodeShapeType;
+
 typedef struct {
-	gdouble x, y, length, width;
-} glBarcodeLine;
 
+        /* Begin Common Fields */
+        glBarcodeShapeType  type;
+        gdouble             x;
+        gdouble             y;
+        /* End Common Fields */
+
+} glBarcodeShapeAny;
+
+/*
+ * glBarcodeShapeLine:
+ *
+ * @ =  origin (x,y) from top left corner of barcode
+ *
+ *              +-- --+
+ *              |     |
+ *              |     |
+ *              |     |
+ *              |     | length
+ *              |     |
+ *              |     |
+ *              |     |
+ *              +-----+
+ *               width
+ */
 typedef struct {
-	gdouble x, y, fsize;
-	gchar c;
-} glBarcodeChar;
+
+        /* Begin Common Fields */
+        glBarcodeShapeType  type; /* Always GL_BARCODE_SHAPE_LINE. */
+        gdouble             x;
+        gdouble             y;
+        /* End Common Fields */
+
+        gdouble             length;
+        gdouble             width;
+
+} glBarcodeShapeLine;
+
+/*
+ * glBarcodeShapeAlpha:
+ *
+ * @ =  origin (x,y) from top left corner of barcode
+ *
+ *              ____ ------------
+ *             /    \           ^
+ *            /  /\  \          |
+ *           /  /__\  \         |
+ *          /  ______  \        | ~fsize
+ *         /  /      \  \       |
+ *        /__/        \__\      |
+ *                              v
+ *       @ ----------------------
+ */
+typedef struct {
+
+        /* Begin Common Fields */
+        glBarcodeShapeType  type; /* Always GL_BARCODE_SHAPE_ALPHA. */
+        gdouble             x;
+        gdouble             y;
+        /* End Common Fields */
+
+        gdouble             fsize;
+        gchar               c;
+
+} glBarcodeShapeAlpha;
+
+typedef union {
+
+        glBarcodeShapeType    type;
+        glBarcodeShapeAny     any;
+
+        glBarcodeShapeLine    line;
+        glBarcodeShapeAlpha   alpha;
+
+} glBarcodeShape;
 
 typedef struct {
 	gdouble width, height;
-	GList *lines;		/* List of glBarcodeLine */
-	GList *chars;		/* List of glBarcodeChar */
+	GList *shapes;		/* List of glBarcodeShape */
 } glBarcode;
 
 typedef glBarcode *(*glBarcodeNewFunc) (const gchar    *id,
@@ -53,6 +125,9 @@ typedef glBarcode *(*glBarcodeNewFunc) (const gchar    *id,
 #define GL_BARCODE_FONT_WEIGHT      PANGO_WEIGHT_NORMAL
 
 
+glBarcodeShapeLine  *gl_barcode_shape_line_new  (void);
+glBarcodeShapeAlpha *gl_barcode_shape_alpha_new (void);
+
 glBarcode       *gl_barcode_new              (const gchar    *id,
 					      gboolean        text_flag,
 					      gboolean        checksum_flag,
@@ -62,6 +137,9 @@ glBarcode       *gl_barcode_new              (const gchar    *id,
 
 void             gl_barcode_free             (glBarcode     **bc);
 
+void             gl_barcode_add_shape        (glBarcode      *bc,
+                                              glBarcodeShape *shape);
+
 GList           *gl_barcode_get_styles_list  (void);
 void             gl_barcode_free_styles_list (GList          *styles_list);
 
diff --git a/src/label-barcode.c b/src/label-barcode.c
index 710ceae..0e12b3d 100644
--- a/src/label-barcode.c
+++ b/src/label-barcode.c
@@ -419,24 +419,25 @@ draw_object (glLabelObject *object,
              gboolean       screen_flag,
              glMergeRecord *record)
 {
-        gdouble             x0, y0;
-        cairo_matrix_t      matrix;
-	glBarcode          *gbc;
-	glBarcodeLine      *line;
-	glBarcodeChar      *bchar;
-	GList              *li;
-	gdouble             y_offset;
-        PangoLayout        *layout;
+        gdouble               x0, y0;
+        cairo_matrix_t        matrix;
+        glBarcode            *gbc;
+        glBarcodeShape       *shape;
+        glBarcodeShapeLine   *line;
+        glBarcodeShapeAlpha  *bchar;
+        GList                *p;
+        gdouble               y_offset;
+        PangoLayout          *layout;
         PangoFontDescription *desc;
-	gchar              *text, *cstring;
-	glTextNode         *text_node;
-	gchar              *id;
-	gboolean            text_flag;
-	gboolean            checksum_flag;
-	guint               color;
-	glColorNode        *color_node;
-	guint               format_digits;
-	gdouble             w, h;
+        gchar                *text, *cstring;
+        glTextNode           *text_node;
+        gchar                *id;
+        gboolean              text_flag;
+        gboolean              checksum_flag;
+        guint                 color;
+        glColorNode          *color_node;
+        guint                 format_digits;
+        gdouble               w, h;
 
 	gl_debug (DEBUG_LABEL, "START");
 
@@ -493,36 +494,50 @@ draw_object (glLabelObject *object,
 
 	} else {
 
-		for (li = gbc->lines; li != NULL; li = li->next) {
-			line = (glBarcodeLine *) li->data;
+		for (p = gbc->shapes; p != NULL; p = p->next) {
+                        shape = (glBarcodeShape *)p->data;
+                        switch (shape->type)
+                        {
 
-			cairo_move_to (cr, line->x, line->y);
-			cairo_line_to (cr, line->x, line->y + line->length);
-			cairo_set_line_width (cr, line->width);
-			cairo_stroke (cr);
-		}
+                        case GL_BARCODE_SHAPE_LINE:
+                                line = (glBarcodeShapeLine *) shape;
+
+                                cairo_move_to (cr, line->x, line->y);
+                                cairo_line_to (cr, line->x, line->y + line->length);
+                                cairo_set_line_width (cr, line->width);
+                                cairo_stroke (cr);
+
+                                break;
+
+                        case GL_BARCODE_SHAPE_ALPHA:
+                                bchar = (glBarcodeShapeAlpha *) shape;
+
+                                layout = pango_cairo_create_layout (cr);
+
+                                desc = pango_font_description_new ();
+                                pango_font_description_set_family (desc, GL_BARCODE_FONT_FAMILY);
+                                pango_font_description_set_size   (desc, bchar->fsize * PANGO_SCALE * FONT_SCALE);
+                                pango_layout_set_font_description (layout, desc);
+                                pango_font_description_free       (desc);
 
-		for (li = gbc->chars; li != NULL; li = li->next) {
-			bchar = (glBarcodeChar *) li->data;
+                                cstring = g_strdup_printf ("%c", bchar->c);
+                                pango_layout_set_text (layout, cstring, -1);
+                                g_free (cstring);
 
-                        layout = pango_cairo_create_layout (cr);
+                                y_offset = 0.2 * bchar->fsize;
 
-                        desc = pango_font_description_new ();
-                        pango_font_description_set_family (desc, GL_BARCODE_FONT_FAMILY);
-                        pango_font_description_set_size   (desc, bchar->fsize * PANGO_SCALE * FONT_SCALE);
-                        pango_layout_set_font_description (layout, desc);
-                        pango_font_description_free       (desc);
+                                cairo_move_to (cr, bchar->x, bchar->y-y_offset);
+                                pango_cairo_show_layout (cr, layout);
 
-			cstring = g_strdup_printf ("%c", bchar->c);
-                        pango_layout_set_text (layout, cstring, -1);
-			g_free (cstring);
+                                g_object_unref (layout);
 
-                        y_offset = 0.2 * bchar->fsize;
+                                break;
 
-			cairo_move_to (cr, bchar->x, bchar->y-y_offset);
-                        pango_cairo_show_layout (cr, layout);
+                        default:
+                                g_assert_not_reached ();
+                                break;
 
-                        g_object_unref (layout);
+                        }
 
 		}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]