]> saetta.ns0.it Git - reptool/libreptool/commitdiff
Added letter spacing property to text object (closes #173).
authorAndrea Zagli <azagli@libero.it>
Mon, 31 Oct 2011 17:10:23 +0000 (18:10 +0100)
committerAndrea Zagli <azagli@libero.it>
Mon, 31 Oct 2011 17:10:23 +0000 (18:10 +0100)
data/reptool.dtd
data/reptool_report.dtd
src/rptobjecttext.c
src/rptprint.c

index 6e454e4e7d538ab890da9432f7e208e952f7f618..b421db8ae003e810fa5b982f908436232dd940cc 100644 (file)
@@ -73,6 +73,7 @@
   padding-bottom     CDATA #IMPLIED
   padding-left       CDATA #IMPLIED
   ellipsize          (none | start | middle | end)
+  letter-spacing     CDATA #IMPLIED
 >
 
 <!ELEMENT line EMPTY>
index cca9d2a17dab7003ec5987bf6ec9fef18d39a6f3..481a7e0ecf4203ad8415a13af2b4688f3d792e10 100644 (file)
@@ -67,6 +67,7 @@
   padding-bottom     CDATA #IMPLIED
   padding-left       CDATA #IMPLIED
   ellipsize          (none | start | middle | end)
+  letter-spacing     CDATA #IMPLIED
 >
 
 <!ELEMENT line EMPTY>
index 640cc1db21df7dbf6f694c2d1eac5d6b914bfd36..62922158cc20903a8bd612b38b5862184ec06a46 100644 (file)
@@ -33,7 +33,8 @@ enum
        PROP_PADDING_RIGHT,
        PROP_PADDING_BOTTOM,
        PROP_PADDING_LEFT,
-       PROP_ELLIPSIZE
+       PROP_ELLIPSIZE,
+       PROP_LETTER_SPACING
 };
 
 static void rpt_obj_text_class_init (RptObjTextClass *klass);
@@ -66,6 +67,7 @@ struct _RptObjTextPrivate
                gdouble padding_bottom;
                gdouble padding_left;
                eRptEllipsize ellipsize;
+               guint letter_spacing;
        };
 
 G_DEFINE_TYPE (RptObjText, rpt_obj_text, TYPE_RPT_OBJECT)
@@ -149,6 +151,12 @@ rpt_obj_text_class_init (RptObjTextClass *klass)
                                                            "Ellipsize",
                                                            RPT_ELLIPSIZE_NONE, RPT_ELLIPSIZE_END, RPT_ELLIPSIZE_NONE,
                                                            G_PARAM_READWRITE));
+       g_object_class_install_property (object_class, PROP_LETTER_SPACING,
+                                        g_param_spec_uint ("letter-spacing",
+                                                           "Letter spacing",
+                                                           "Amount of extra space to add between graphemes of the text.",
+                                                           0, G_MAXUINT, 0,
+                                                           G_PARAM_READWRITE));
 }
 
 static void
@@ -178,6 +186,8 @@ rpt_obj_text_init (RptObjText *rpt_obj_text)
        priv->background_color = NULL;
 
        priv->ellipsize = RPT_ELLIPSIZE_NONE;
+
+       priv->letter_spacing = 0;
 }
 
 /**
@@ -201,10 +211,11 @@ RptObject
                        rpt_obj_text = RPT_OBJECT (g_object_new (rpt_obj_text_get_type (), NULL));
 
                        g_object_set (G_OBJECT (rpt_obj_text),
-                             "name", name_,
-                             "position", &position,
-                             NULL);
+                                     "name", name_,
+                                     "position", &position,
+                                     NULL);
                }
+       g_free (name_);
 
        return rpt_obj_text;
 }
@@ -263,25 +274,25 @@ RptObject
                                        prop = (gchar *)xmlGetProp (xnode, "padding-top");
                                        if (prop != NULL)
                                                {
-                                                       g_object_set (rpt_obj_text, "padding-top", strtod (prop, NULL), NULL);
+                                                       g_object_set (rpt_obj_text, "padding-top", g_strtod (prop, NULL), NULL);
                                                        xmlFree (prop);
                                                }
                                        prop = (gchar *)xmlGetProp (xnode, "padding-right");
                                        if (prop != NULL)
                                                {
-                                                       g_object_set (rpt_obj_text, "padding-right", strtod (prop, NULL), NULL);
+                                                       g_object_set (rpt_obj_text, "padding-right", g_strtod (prop, NULL), NULL);
                                                        xmlFree (prop);
                                                }
                                        prop = (gchar *)xmlGetProp (xnode, "padding-bottom");
                                        if (prop != NULL)
                                                {
-                                                       g_object_set (rpt_obj_text, "padding-bottom", strtod (prop, NULL), NULL);
+                                                       g_object_set (rpt_obj_text, "padding-bottom", g_strtod (prop, NULL), NULL);
                                                        xmlFree (prop);
                                                }
                                        prop = (gchar *)xmlGetProp (xnode, "padding-left");
                                        if (prop != NULL)
                                                {
-                                                       g_object_set (rpt_obj_text, "padding-left", strtod (prop, NULL), NULL);
+                                                       g_object_set (rpt_obj_text, "padding-left", g_strtod (prop, NULL), NULL);
                                                        xmlFree (prop);
                                                }
                                        prop = (gchar *)xmlGetProp (xnode, "ellipsize");
@@ -290,6 +301,12 @@ RptObject
                                                        g_object_set (rpt_obj_text, "ellipsize", rpt_common_strellipsize_to_enum (prop), NULL);
                                                        xmlFree (prop);
                                                }
+                                       prop = (gchar *)xmlGetProp (xnode, "letter-spacing");
+                                       if (prop != NULL)
+                                               {
+                                                       g_object_set (rpt_obj_text, "letter-spacing", strtol (prop, NULL, 10), NULL);
+                                                       xmlFree (prop);
+                                               }
                                }
                }
 
@@ -342,6 +359,10 @@ rpt_obj_text_get_xml (RptObject *rpt_objtext, xmlNode *xnode)
                {
                        xmlSetProp (xnode, "ellipsize", rpt_common_enum_to_strellipsize (priv->ellipsize));
                }
+       if (priv->letter_spacing > 0)
+               {
+                       xmlSetProp (xnode, "letter-spacing", g_strdup_printf ("%d", priv->letter_spacing));
+               }
 }
 
 static void
@@ -400,6 +421,10 @@ rpt_obj_text_set_property (GObject *object, guint property_id, const GValue *val
                                priv->ellipsize = g_value_get_uint (value);
                                break;
 
+                       case PROP_LETTER_SPACING:
+                               priv->letter_spacing = g_value_get_uint (value);
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
@@ -462,6 +487,10 @@ rpt_obj_text_get_property (GObject *object, guint property_id, GValue *value, GP
                                g_value_set_uint (value, priv->ellipsize);
                                break;
 
+                       case PROP_LETTER_SPACING:
+                               g_value_set_uint (value, priv->letter_spacing);
+                               break;
+
                        default:
                                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                                break;
index f7de3150d1aefdb90d6e6380ff2f0dcaebd7df55..2f1e7d59df7b9ce6e59047f815373cfa5c103ce2 100644 (file)
@@ -904,6 +904,32 @@ rpt_print_text_xml (RptPrint *rpt_print, xmlNode *xnode)
                        pango_attr_list_insert (lpattr, pattr);
                }
 
+       /* letter spacing */
+       prop = xmlGetProp (xnode, (const xmlChar *)"letter-spacing");
+       if (prop != NULL)
+               {
+                       guint spacing;
+
+                       spacing = strtol (prop, NULL, 10);
+
+                       if (spacing > 0)
+                               {
+                                       PangoAttribute *pattr;
+
+                                       pattr = pango_attr_letter_spacing_new (spacing * PANGO_SCALE);
+                                       pattr->start_index = 0;
+                                       pattr->end_index = strlen (text) + 1;
+
+                                       if (lpattr == NULL)
+                                               {
+                                                       lpattr = pango_attr_list_new ();
+                                               }
+                                       pango_attr_list_insert (lpattr, pattr);
+                               }
+
+                       xmlFree (prop);
+               }
+
        if (lpattr != NULL)
                {
                        pango_layout_set_attributes (playout, lpattr);