]> git.sur5r.net Git - glabels/commitdiff
Added support for Maxicode barcodes using the libzint backend.
authorRobin Stuart <robin@zint.org.uk>
Sun, 22 Aug 2010 03:04:21 +0000 (23:04 -0400)
committerJim Evins <evins@snaught.com>
Sun, 22 Aug 2010 03:04:21 +0000 (23:04 -0400)
src/bc-backends.c
src/bc-zint.c
src/bc.c
src/bc.h
src/label-barcode.c

index b7a6e230e0e900e8f571b0133ba5a012162a6657..89c202a27f33bcf3d6e045eefe9ff224b4be55ac 100644 (file)
@@ -308,6 +308,9 @@ static const Backend backends[] = {
         { "LOGM", N_("LOGMARS"), gl_barcode_zint_new,
           TRUE, TRUE, TRUE, FALSE, "0000000000", TRUE, 10},
 
+        { "MAXI", N_("Maxicode"), gl_barcode_zint_new,
+          FALSE, FALSE, FALSE, FALSE, "0000000000", TRUE, 10},
+
         { "MPDF", N_("Micro PDF417"), gl_barcode_zint_new,
           FALSE, FALSE, TRUE, FALSE, "0000000000", TRUE, 10},
 
index d8f3ebdccb5d206f759c54a6fe77a29789179232..d96e5d7fea2c48ea8aec8696d7dc24378567bcde 100644 (file)
@@ -123,6 +123,7 @@ gl_barcode_zint_new (const gchar          *id,
        if (g_ascii_strcasecmp (id, "TELEX") == 0) { symbol->symbology = BARCODE_TELEPEN_NUM; }
        if (g_ascii_strcasecmp (id, "JAPAN") == 0) { symbol->symbology = BARCODE_JAPANPOST; }
        if (g_ascii_strcasecmp (id, "KOREA") == 0) { symbol->symbology = BARCODE_KOREAPOST; }
+       if (g_ascii_strcasecmp (id, "MAXI") == 0) { symbol->symbology = BARCODE_MAXICODE; }
        if (g_ascii_strcasecmp (id, "MPDF") == 0) { symbol->symbology = BARCODE_MICROPDF417; }
        if (g_ascii_strcasecmp (id, "MSI") == 0) { symbol->symbology = BARCODE_MSI_PLESSEY; }
        if (g_ascii_strcasecmp (id, "MQR") == 0) { symbol->symbology = BARCODE_MICROQR; }
@@ -173,19 +174,16 @@ gl_barcode_zint_new (const gchar          *id,
 
 /*--------------------------------------------------------------------------
  * PRIVATE. Render to glBarcode the provided Zint symbol.
- *
- * Based on the SVG output from Zint library, handles lots of otherwise
- * internal  Zint code to convert directly to glBarcode representation.
- *
  *--------------------------------------------------------------------------*/
 static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag)
 {
         glBarcode            *gbc;
 
-        struct zint_render        *render;
-        struct zint_render_line   *zline;
-        struct zint_render_string *zstring;
-
+        struct zint_render         *render;
+        struct zint_render_line    *zline;
+        struct zint_render_string  *zstring;
+        struct zint_render_ring    *zring;
+        struct zint_render_hexagon *zhexagon;
 
         render = symbol->rendered;
         gbc = gl_barcode_new ();
@@ -195,9 +193,16 @@ static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag)
                 gl_barcode_add_box (gbc, zline->x, zline->y, zline->width, zline->length);
         }
 
-       /*
-        * Repeat loop for characters
-        */
+        for ( zring = render->rings; zring != NULL; zring = zring->next )
+        {
+                gl_barcode_add_ring (gbc, zring->x, zring->y, zring->radius, zring->line_width);
+        }
+
+        for ( zhexagon = render->hexagons; zhexagon != NULL; zhexagon = zhexagon->next )
+        {
+                gl_barcode_add_hexagon (gbc, zhexagon->x, zhexagon->y);
+        }
+
         if(text_flag)
         {
                 for ( zstring = render->strings; zstring != NULL; zstring = zstring->next )
index aa5529c1c1bb833948419131e7f0201e100c1727..0df1d320a51193909adfa196e5b592d50bb7999f 100644 (file)
--- a/src/bc.c
+++ b/src/bc.c
@@ -182,6 +182,44 @@ gl_barcode_add_string (glBarcode      *bc,
         gl_barcode_add_shape (bc, (glBarcodeShape *)string_shape);
 }
 
+/*****************************************************************************/
+/* Add ring.                                                                 */
+/*****************************************************************************/
+void
+gl_barcode_add_ring (glBarcode      *bc,
+                     gdouble         x,
+                     gdouble         y,
+                     gdouble         radius,
+                     gdouble         line_width)
+{
+        glBarcodeShapeRing *ring_shape = g_new0 (glBarcodeShapeRing, 1);
+        ring_shape->type = GL_BARCODE_SHAPE_RING;
+
+        ring_shape->x          = x;
+        ring_shape->y          = y;
+        ring_shape->radius     = radius;
+        ring_shape->line_width = line_width;
+
+        gl_barcode_add_shape (bc, (glBarcodeShape *)ring_shape);
+}
+
+/*****************************************************************************/
+/* Add hexagon.                                                              */
+/*****************************************************************************/
+void
+gl_barcode_add_hexagon (glBarcode      *bc,
+                        gdouble         x,
+                        gdouble         y)
+{
+        glBarcodeShapeHexagon *hexagon_shape = g_new0 (glBarcodeShapeHexagon, 1);
+        hexagon_shape->type = GL_BARCODE_SHAPE_HEXAGON;
+
+        hexagon_shape->x      = x;
+        hexagon_shape->y      = y;
+
+        gl_barcode_add_shape (bc, (glBarcodeShape *)hexagon_shape);
+}
+
 
 /*****************************************************************************/
 /* Add shape to barcode.                                                     */
index 06503c209914e3489fb06e3805e849f6051ebbca..70512aebf81778d67a0541e0f243bba0c4a3e3d9 100644 (file)
--- a/src/bc.h
+++ b/src/bc.h
@@ -74,6 +74,15 @@ void             gl_barcode_add_string       (glBarcode      *bc,
                                               gchar          *string,
                                               gsize           length);
 
+void             gl_barcode_add_ring         (glBarcode      *bc,
+                                              gdouble         x,
+                                              gdouble         y,
+                                              gdouble         radius,
+                                              gdouble         line_width);
+
+void             gl_barcode_add_hexagon      (glBarcode      *bc,
+                                              gdouble         x,
+                                              gdouble         y);
 
 /*******************************/
 /* Barcode Drawing Primitives. */
@@ -84,6 +93,8 @@ typedef enum {
         GL_BARCODE_SHAPE_BOX,
         GL_BARCODE_SHAPE_CHAR,
         GL_BARCODE_SHAPE_STRING,
+        GL_BARCODE_SHAPE_RING,
+        GL_BARCODE_SHAPE_HEXAGON,
 } glBarcodeShapeType;
 
 typedef struct {
@@ -211,6 +222,69 @@ typedef struct {
 
 } glBarcodeShapeString;
 
+/*
+ * glBarcodeShapeRing:
+ *
+ * @ = origin (x,y) is centre of circle
+ *
+ *                v  line_width
+ *           _.-""""-._
+ *         .'   ____   `.
+ *        /   .'  ^ `.   \
+ *       |   /        \   |
+ *       |   |    @---|---|------
+ *       |   \        /   |     ^
+ *        \   `.____.'   /      | radius
+ *         `._    ...._.'.......|
+ *            `-....-'
+ */
+
+typedef struct {
+
+        /* Begin Common Fields */
+        glBarcodeShapeType  type; /* Always GL_BARCODE_SHAPE_RING. */
+        gdouble             x;
+        gdouble             y;
+        /* End Common Fields */
+
+        gdouble             radius;
+        gdouble             line_width;
+
+} glBarcodeShapeRing;
+
+/*
+ * glBarcodeShapeHexagon;
+ *
+ * @ = origin (x,y) is top of hexagon
+ *
+ *                  @
+ *              _-"   "-_
+ *          _-"           "-_
+ *       +"                   "+
+ *       |                     |
+ *       |                     |
+ *       |                     |
+ *       |                     |
+ *       |                     |
+ *       +_                   _+
+ *         "-_             _-"
+ *            "-_       _-"
+ *               "-_ _-"
+ *                  "
+ *
+ * NOTE: For Maxicode hexagons height is always 1.02mm, width is always 0.88mm
+ */
+
+typedef struct {
+
+        /* Begin Common Fields */
+        glBarcodeShapeType  type; /* Always GL_BARCODE_SHAPE_HEXAGON. */
+        gdouble             x;
+        gdouble             y;
+        /* End Common Fields */
+
+} glBarcodeShapeHexagon;
+
 typedef union {
 
         glBarcodeShapeType    type;
@@ -220,6 +294,8 @@ typedef union {
         glBarcodeShapeBox     box;
         glBarcodeShapeChar    bchar;
         glBarcodeShapeString  string;
+        glBarcodeShapeRing    ring;
+        glBarcodeShapeHexagon hexagon;
 
 } glBarcodeShape;
 
index bb5fba7da3a10811f0a81813657a1f7c96895978..a57721f1bd486e1082a424c99ed984e57c08f53d 100644 (file)
 
 #include "debug.h"
 
-
 /*========================================================*/
 /* Private macros and constants.                          */
 /*========================================================*/
 
 #define FONT_SCALE (72.0/96.0)
+#define PI 3.141592654
 
 
 /*========================================================*/
 /*========================================================*/
 
 struct _glLabelBarcodePrivate {
-       glTextNode     *text_node;
-       gchar          *id;
-       glColorNode    *color_node;
-       gboolean        text_flag;
-       gboolean        checksum_flag;
-       guint           format_digits;
+        glTextNode     *text_node;
+        gchar          *id;
+        glColorNode    *color_node;
+        gboolean        text_flag;
+        gboolean        checksum_flag;
+        guint           format_digits;
 };
 
 
@@ -63,14 +63,14 @@ struct _glLabelBarcodePrivate {
 static void  gl_label_barcode_finalize      (GObject             *object);
 
 static void  copy                           (glLabelObject       *dst_object,
-                                            glLabelObject       *src_object);
+                                             glLabelObject       *src_object);
 
 static void  get_size                       (glLabelObject       *object,
-                                            gdouble             *w,
-                                            gdouble             *h);
+                                             gdouble             *w,
+                                             gdouble             *h);
 
 static void  set_line_color                 (glLabelObject       *object,
-                                            glColorNode         *line_color,
+                                             glColorNode         *line_color,
                                              gboolean             checkpoint);
 
 static glColorNode *get_line_color          (glLabelObject       *object);
@@ -95,44 +95,44 @@ G_DEFINE_TYPE (glLabelBarcode, gl_label_barcode, GL_TYPE_LABEL_OBJECT);
 static void
 gl_label_barcode_class_init (glLabelBarcodeClass *class)
 {
-       GObjectClass       *object_class       = G_OBJECT_CLASS (class);
-       glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
+        GObjectClass       *object_class       = G_OBJECT_CLASS (class);
+        glLabelObjectClass *label_object_class = GL_LABEL_OBJECT_CLASS (class);
 
-       gl_label_barcode_parent_class = g_type_class_peek_parent (class);
+        gl_label_barcode_parent_class = g_type_class_peek_parent (class);
 
-       label_object_class->copy           = copy;
-       label_object_class->get_size       = get_size;
-       label_object_class->set_line_color = set_line_color;
-       label_object_class->get_line_color = get_line_color;
+        label_object_class->copy           = copy;
+        label_object_class->get_size       = get_size;
+        label_object_class->set_line_color = set_line_color;
+        label_object_class->get_line_color = get_line_color;
         label_object_class->draw_object    = draw_object;
         label_object_class->draw_shadow    = NULL;
         label_object_class->object_at      = object_at;
 
-       object_class->finalize = gl_label_barcode_finalize;
+        object_class->finalize = gl_label_barcode_finalize;
 }
 
 
 static void
 gl_label_barcode_init (glLabelBarcode *lbc)
 {
-       lbc->priv = g_new0 (glLabelBarcodePrivate, 1);
-       lbc->priv->text_node  = gl_text_node_new_from_text ("");
+        lbc->priv = g_new0 (glLabelBarcodePrivate, 1);
+        lbc->priv->text_node  = gl_text_node_new_from_text ("");
 }
 
 
 static void
 gl_label_barcode_finalize (GObject *object)
 {
-       glLabelBarcode *lbc = GL_LABEL_BARCODE (object);
+        glLabelBarcode *lbc = GL_LABEL_BARCODE (object);
 
-       g_return_if_fail (object && GL_IS_LABEL_BARCODE (object));
+        g_return_if_fail (object && GL_IS_LABEL_BARCODE (object));
 
-       gl_text_node_free (&lbc->priv->text_node);
-       g_free (lbc->priv->id);
-       gl_color_node_free (&(lbc->priv->color_node));
-       g_free (lbc->priv);
+        gl_text_node_free (&lbc->priv->text_node);
+        g_free (lbc->priv->id);
+        gl_color_node_free (&(lbc->priv->color_node));
+        g_free (lbc->priv);
 
-       G_OBJECT_CLASS (gl_label_barcode_parent_class)->finalize (object);
+        G_OBJECT_CLASS (gl_label_barcode_parent_class)->finalize (object);
 }
 
 
@@ -143,10 +143,10 @@ GObject *
 gl_label_barcode_new (glLabel *label,
                       gboolean checkpoint)
 {
-       glLabelBarcode      *lbc;
-       glColorNode         *line_color_node;
+        glLabelBarcode      *lbc;
+        glColorNode         *line_color_node;
 
-       lbc = g_object_new (gl_label_barcode_get_type(), NULL);
+        lbc = g_object_new (gl_label_barcode_get_type(), NULL);
 
         if (label != NULL)
         {
@@ -165,7 +165,7 @@ gl_label_barcode_new (glLabel *label,
                 gl_label_object_set_parent (GL_LABEL_OBJECT (lbc), label);
         }
 
-       return G_OBJECT (lbc);
+        return G_OBJECT (lbc);
 }
 
 
@@ -176,33 +176,33 @@ static void
 copy (glLabelObject *dst_object,
       glLabelObject *src_object)
 {
-       glLabelBarcode      *lbc     = (glLabelBarcode *)src_object;
-       glLabelBarcode      *new_lbc = (glLabelBarcode *)dst_object;
-       glTextNode          *text_node;
-       gchar               *id;
-       gboolean             text_flag;
-       gboolean             checksum_flag;
-       glColorNode         *color_node;
-       guint                format_digits;
+        glLabelBarcode      *lbc     = (glLabelBarcode *)src_object;
+        glLabelBarcode      *new_lbc = (glLabelBarcode *)dst_object;
+        glTextNode          *text_node;
+        gchar               *id;
+        gboolean             text_flag;
+        gboolean             checksum_flag;
+        glColorNode         *color_node;
+        guint                format_digits;
 
-       gl_debug (DEBUG_LABEL, "START");
+        gl_debug (DEBUG_LABEL, "START");
 
-       g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
-       g_return_if_fail (new_lbc && GL_IS_LABEL_BARCODE (new_lbc));
+        g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
+        g_return_if_fail (new_lbc && GL_IS_LABEL_BARCODE (new_lbc));
 
-       text_node = gl_label_barcode_get_data (lbc);
-       gl_label_barcode_get_props (lbc, &id, &text_flag, &checksum_flag, &format_digits);
-       color_node = get_line_color (src_object);
+        text_node = gl_label_barcode_get_data (lbc);
+        gl_label_barcode_get_props (lbc, &id, &text_flag, &checksum_flag, &format_digits);
+        color_node = get_line_color (src_object);
 
-       gl_label_barcode_set_data (new_lbc, text_node, FALSE);
-       gl_label_barcode_set_props (new_lbc, id, text_flag, checksum_flag, format_digits, FALSE);
-       set_line_color (dst_object, color_node, FALSE);
+        gl_label_barcode_set_data (new_lbc, text_node, FALSE);
+        gl_label_barcode_set_props (new_lbc, id, text_flag, checksum_flag, format_digits, FALSE);
+        set_line_color (dst_object, color_node, FALSE);
 
-       gl_color_node_free (&color_node);
-       gl_text_node_free (&text_node);
-       g_free (id);
+        gl_color_node_free (&color_node);
+        gl_text_node_free (&text_node);
+        g_free (id);
 
-       gl_debug (DEBUG_LABEL, "END");
+        gl_debug (DEBUG_LABEL, "END");
 }
 
 
@@ -211,16 +211,16 @@ copy (glLabelObject *dst_object,
 /*****************************************************************************/
 void
 gl_label_barcode_set_data (glLabelBarcode *lbc,
-                          glTextNode     *text_node,
+                           glTextNode     *text_node,
                            gboolean        checkpoint)
 {
         glLabel *label;
 
-       gl_debug (DEBUG_LABEL, "START");
+        gl_debug (DEBUG_LABEL, "START");
 
-       g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
+        g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
 
-       if (!gl_text_node_equal (lbc->priv->text_node, text_node))
+        if (!gl_text_node_equal (lbc->priv->text_node, text_node))
         {
                 if ( checkpoint )
                 {
@@ -228,35 +228,35 @@ gl_label_barcode_set_data (glLabelBarcode *lbc,
                         gl_label_checkpoint (label, _("Barcode data"));
                 }
                 
-               gl_text_node_free (&lbc->priv->text_node);
-               lbc->priv->text_node = gl_text_node_dup (text_node);
+                gl_text_node_free (&lbc->priv->text_node);
+                lbc->priv->text_node = gl_text_node_dup (text_node);
 
-               gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc));
-       }
+                gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc));
+        }
 
-       gl_debug (DEBUG_LABEL, "END");
+        gl_debug (DEBUG_LABEL, "END");
 }
 
 
 void
 gl_label_barcode_set_props (glLabelBarcode *lbc,
-                           gchar          *id,
-                           gboolean        text_flag,
-                           gboolean        checksum_flag,
-                           guint           format_digits,
+                            gchar          *id,
+                            gboolean        text_flag,
+                            gboolean        checksum_flag,
+                            guint           format_digits,
                             gboolean        checkpoint)
 {
         glLabel *label;
 
-       gl_debug (DEBUG_LABEL, "START");
+        gl_debug (DEBUG_LABEL, "START");
 
-       g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
+        g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
 
-       if ( ((lbc->priv->id == NULL) && (id != NULL))
-            || ((lbc->priv->id != NULL) && (id != NULL) && (g_ascii_strcasecmp (lbc->priv->id, id) != 0))
-            || (lbc->priv->text_flag != text_flag)
-            || (lbc->priv->checksum_flag != checksum_flag)
-            || (lbc->priv->format_digits != format_digits))
+        if ( ((lbc->priv->id == NULL) && (id != NULL))
+             || ((lbc->priv->id != NULL) && (id != NULL) && (g_ascii_strcasecmp (lbc->priv->id, id) != 0))
+             || (lbc->priv->text_flag != text_flag)
+             || (lbc->priv->checksum_flag != checksum_flag)
+             || (lbc->priv->format_digits != format_digits))
         {
                 if ( checkpoint )
                 {
@@ -264,15 +264,15 @@ gl_label_barcode_set_props (glLabelBarcode *lbc,
                         gl_label_checkpoint (label, _("Barcode property"));
                 }
 
-               lbc->priv->id               = g_strdup (id);
-               lbc->priv->text_flag        = text_flag;
-               lbc->priv->checksum_flag    = checksum_flag;
-               lbc->priv->format_digits    = format_digits;
+                lbc->priv->id               = g_strdup (id);
+                lbc->priv->text_flag        = text_flag;
+                lbc->priv->checksum_flag    = checksum_flag;
+                lbc->priv->format_digits    = format_digits;
 
-               gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc));
-       }
+                gl_label_object_emit_changed (GL_LABEL_OBJECT(lbc));
+        }
 
-       gl_debug (DEBUG_LABEL, "END");
+        gl_debug (DEBUG_LABEL, "END");
 }
 
 
@@ -282,25 +282,25 @@ gl_label_barcode_set_props (glLabelBarcode *lbc,
 glTextNode *
 gl_label_barcode_get_data (glLabelBarcode *lbc)
 {
-       g_return_val_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc), NULL);
+        g_return_val_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc), NULL);
 
-       return gl_text_node_dup (lbc->priv->text_node);
+        return gl_text_node_dup (lbc->priv->text_node);
 }
 
 
 void
 gl_label_barcode_get_props (glLabelBarcode *lbc,
-                           gchar          **id,
-                           gboolean       *text_flag,
-                           gboolean       *checksum_flag,
-                           guint          *format_digits)
+                            gchar          **id,
+                            gboolean       *text_flag,
+                            gboolean       *checksum_flag,
+                            guint          *format_digits)
 {
-       g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
+        g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
 
-       *id               = g_strdup (lbc->priv->id);
-       *text_flag        = lbc->priv->text_flag;
-       *checksum_flag    = lbc->priv->checksum_flag;
-       *format_digits    = lbc->priv->format_digits;
+        *id               = g_strdup (lbc->priv->id);
+        *text_flag        = lbc->priv->text_flag;
+        *checksum_flag    = lbc->priv->checksum_flag;
+        *format_digits    = lbc->priv->format_digits;
 }
 
 
@@ -309,47 +309,47 @@ gl_label_barcode_get_props (glLabelBarcode *lbc,
 /*---------------------------------------------------------------------------*/
 static void
 get_size (glLabelObject *object,
-         gdouble       *w,
-         gdouble       *h)
+          gdouble       *w,
+          gdouble       *h)
 {
-       glLabelBarcode      *lbc = (glLabelBarcode *)object;
-       gchar               *data;
-       gdouble              w_parent, h_parent;
-       glBarcode           *gbc;
+        glLabelBarcode      *lbc = (glLabelBarcode *)object;
+        gchar               *data;
+        gdouble              w_parent, h_parent;
+        glBarcode           *gbc;
 
-       gl_debug (DEBUG_LABEL, "START");
+        gl_debug (DEBUG_LABEL, "START");
 
-       g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
+        g_return_if_fail (lbc && GL_IS_LABEL_BARCODE (lbc));
 
-       gl_label_object_get_raw_size (object, &w_parent, &h_parent);
+        gl_label_object_get_raw_size (object, &w_parent, &h_parent);
 
-       if (lbc->priv->text_node->field_flag) {
-               data = gl_barcode_backends_default_digits (lbc->priv->id,
+        if (lbc->priv->text_node->field_flag) {
+                data = gl_barcode_backends_default_digits (lbc->priv->id,
                                                            lbc->priv->format_digits);
-       } else {
-               data = gl_text_node_expand (lbc->priv->text_node, NULL);
-       }
+        } else {
+                data = gl_text_node_expand (lbc->priv->text_node, NULL);
+        }
 
-       gbc = gl_barcode_backends_new_barcode (lbc->priv->id,
+        gbc = gl_barcode_backends_new_barcode (lbc->priv->id,
                                                lbc->priv->text_flag,
                                                lbc->priv->checksum_flag,
                                                w_parent,
                                                h_parent,
                                                data);
-       g_free (data);
+        g_free (data);
 
-       if ( gbc == NULL ) {
-               /* Try again with default digits. */
-               data = gl_barcode_backends_default_digits (lbc->priv->id,
-                                                 lbc->priv->format_digits);
-               gbc = gl_barcode_backends_new_barcode (lbc->priv->id,
+        if ( gbc == NULL ) {
+                /* Try again with default digits. */
+                data = gl_barcode_backends_default_digits (lbc->priv->id,
+                                                  lbc->priv->format_digits);
+                gbc = gl_barcode_backends_new_barcode (lbc->priv->id,
                                                        lbc->priv->text_flag,
                                                        lbc->priv->checksum_flag,
                                                        w_parent,
                                                        h_parent,
                                                        data);
                 g_free (data);
-       }
+        }
 
         if ( gbc != NULL )
         {
@@ -363,9 +363,9 @@ get_size (glLabelObject *object,
                 *h = 72;
         }
 
-       gl_barcode_free (&gbc);
+        gl_barcode_free (&gbc);
 
-       gl_debug (DEBUG_LABEL, "END");
+        gl_debug (DEBUG_LABEL, "END");
 }
 
 
@@ -374,15 +374,15 @@ get_size (glLabelObject *object,
 /*---------------------------------------------------------------------------*/
 static void
 set_line_color (glLabelObject *object,
-               glColorNode   *line_color_node,
+                glColorNode   *line_color_node,
                 gboolean       checkpoint)
 {
-       glLabelBarcode *lbarcode = (glLabelBarcode *)object;
+        glLabelBarcode *lbarcode = (glLabelBarcode *)object;
         glLabel        *label;
 
-       g_return_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode));
+        g_return_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode));
 
-       if ( !gl_color_node_equal(lbarcode->priv->color_node, line_color_node) )
+        if ( !gl_color_node_equal(lbarcode->priv->color_node, line_color_node) )
         {
                 if ( checkpoint )
                 {
@@ -390,10 +390,10 @@ set_line_color (glLabelObject *object,
                         gl_label_checkpoint (label, _("Barcode data"));
                 }
 
-               gl_color_node_free (&(lbarcode->priv->color_node));
-               lbarcode->priv->color_node = gl_color_node_dup (line_color_node);
-               gl_label_object_emit_changed (GL_LABEL_OBJECT(lbarcode));
-       }
+                gl_color_node_free (&(lbarcode->priv->color_node));
+                lbarcode->priv->color_node = gl_color_node_dup (line_color_node);
+                gl_label_object_emit_changed (GL_LABEL_OBJECT(lbarcode));
+        }
 }
 
 
@@ -403,11 +403,11 @@ set_line_color (glLabelObject *object,
 static glColorNode*
 get_line_color (glLabelObject *object)
 {
-       glLabelBarcode *lbarcode = (glLabelBarcode *)object;
+        glLabelBarcode *lbarcode = (glLabelBarcode *)object;
 
-       g_return_val_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode), NULL);
+        g_return_val_if_fail (lbarcode && GL_IS_LABEL_BARCODE (lbarcode), NULL);
 
-       return gl_color_node_dup (lbarcode->priv->color_node);
+        return gl_color_node_dup (lbarcode->priv->color_node);
 }
 
 
@@ -426,6 +426,8 @@ draw_object (glLabelObject *object,
         glBarcodeShape       *shape;
         glBarcodeShapeLine   *line;
         glBarcodeShapeBox    *box;
+        glBarcodeShapeRing   *ring;
+        glBarcodeShapeHexagon *hexagon;
         glBarcodeShapeChar   *bchar;
         glBarcodeShapeString *bstring;
         GList                *p;
@@ -444,36 +446,36 @@ draw_object (glLabelObject *object,
         gint                  iw, ih;
         gdouble               layout_width;
 
-       gl_debug (DEBUG_LABEL, "START");
+        gl_debug (DEBUG_LABEL, "START");
 
         gl_label_object_get_position (object, &x0, &y0);
         gl_label_object_get_matrix (object, &matrix);
 
-       text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE (object));
-       gl_label_barcode_get_props (GL_LABEL_BARCODE (object),
-                                   &id, &text_flag, &checksum_flag, &format_digits);
-                                       
-       color_node = gl_label_object_get_line_color (object);
-       color = gl_color_node_expand (color_node, record);
+        text_node = gl_label_barcode_get_data (GL_LABEL_BARCODE (object));
+        gl_label_barcode_get_props (GL_LABEL_BARCODE (object),
+                                    &id, &text_flag, &checksum_flag, &format_digits);
+
+        color_node = gl_label_object_get_line_color (object);
+        color = gl_color_node_expand (color_node, record);
         if (color_node->field_flag && screen_flag)
         {
                 color = GL_COLOR_MERGE_DEFAULT;
         }
-       gl_color_node_free (&color_node);
-       
-       gl_label_object_get_size (object, &w, &h);
+        gl_color_node_free (&color_node);
+
+        gl_label_object_get_size (object, &w, &h);
 
-       text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object));
+        text_node = gl_label_barcode_get_data(GL_LABEL_BARCODE(object));
         text = gl_text_node_expand (text_node, record);
-       if (text_node->field_flag && screen_flag) {
-               text = gl_barcode_backends_default_digits (id, format_digits);
-       }
+        if (text_node->field_flag && screen_flag) {
+                text = gl_barcode_backends_default_digits (id, format_digits);
+        }
 
-       gbc = gl_barcode_backends_new_barcode (id, text_flag, checksum_flag, w, h, text);
+        gbc = gl_barcode_backends_new_barcode (id, text_flag, checksum_flag, w, h, text);
 
         cairo_set_source_rgba (cr, GL_COLOR_RGBA_ARGS (color));
 
-       if (gbc == NULL) {
+        if (gbc == NULL) {
 
                 layout = pango_cairo_create_layout (cr);
 
@@ -497,9 +499,9 @@ draw_object (glLabelObject *object,
 
                 g_object_unref (layout);
 
-       } else {
+        } else {
 
-               for (p = gbc->shapes; p != NULL; p = p->next) {
+                for (p = gbc->shapes; p != NULL; p = p->next) {
                         shape = (glBarcodeShape *)p->data;
                         switch (shape->type)
                         {
@@ -572,23 +574,46 @@ draw_object (glLabelObject *object,
 
                                 break;
 
+                        case GL_BARCODE_SHAPE_RING:
+                                ring = (glBarcodeShapeRing *) shape;
+
+                                cairo_arc (cr, ring->x, ring->y, ring->radius, 0.0, 2 * PI);
+                                cairo_set_line_width (cr, ring->line_width);
+                                cairo_stroke (cr);
+
+                                break;
+
+                        case GL_BARCODE_SHAPE_HEXAGON:
+                                hexagon = (glBarcodeShapeHexagon *) shape;
+
+                                cairo_move_to (cr, hexagon->x, hexagon->y);
+                                cairo_line_to (cr, hexagon->x + 1.25, hexagon->y + 0.70);
+                                cairo_line_to (cr, hexagon->x + 1.25, hexagon->y + 2.18);
+                                cairo_line_to (cr, hexagon->x, hexagon->y + 2.89);
+                                cairo_line_to (cr, hexagon->x - 1.25, hexagon->y + 2.18);
+                                cairo_line_to (cr, hexagon->x - 1.25, hexagon->y + 0.70);
+                                cairo_close_path (cr);
+                                cairo_fill (cr);
+
+                                break;
+
                         default:
                                 g_assert_not_reached ();
                                 break;
 
                         }
 
-               }
+                }
 
-               gl_barcode_free (&gbc);
+                gl_barcode_free (&gbc);
 
-       }
+        }
 
-       g_free (text);
-       gl_text_node_free (&text_node);
-       g_free (id);
+        g_free (text);
+        gl_text_node_free (&text_node);
+        g_free (id);
 
-       gl_debug (DEBUG_LABEL, "END");
+        gl_debug (DEBUG_LABEL, "END");
 }