[gnumeric] Graph: maintain refs to markups.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Graph: maintain refs to markups.
- Date: Thu, 3 Nov 2011 12:48:59 +0000 (UTC)
commit c0ebe1bdcd462756c1ece513d85e7ff66838f214
Author: Morten Welinder <terra gnome org>
Date: Thu Nov 3 08:48:23 2011 -0400
Graph: maintain refs to markups.
This might not be needed, but I'll sleep better.
ChangeLog | 5 +++++
src/graph.c | 47 ++++++++++++++++++++++++++---------------------
2 files changed, 31 insertions(+), 21 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c95413e..5d54cab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-11-03 Morten Welinder <terra gnome org>
+
+ * src/graph.c (gnm_go_data_vector_get_markup): Maintain a ref to
+ markup.
+
2011-11-02 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/mstyle.c (gnm_style_set_from_pango_attribute): handle super- and
diff --git a/src/graph.c b/src/graph.c
index 4da3a8e..7c29ac4 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -457,7 +457,7 @@ struct _GnmGODataVector {
GnmDependent dep;
GnmValue *val;
gboolean as_col;
- PangoAttrList const **markup;
+ GPtrArray *markup;
};
typedef GODataVectorClass GnmGODataVectorClass;
@@ -472,8 +472,10 @@ gnm_go_data_vector_eval (GnmDependent *dep)
value_release (vec->val);
vec->val = NULL;
- g_free (vec->markup);
- vec->markup = NULL;
+ if (vec->markup) {
+ g_ptr_array_free (vec->markup, TRUE);
+ vec->markup = NULL;
+ }
go_data_emit_changed (GO_DATA (vec));
}
@@ -488,8 +490,10 @@ gnm_go_data_vector_finalize (GObject *obj)
g_free (vec->base.values);
vec->base.values = NULL;
- g_free (vec->markup);
- vec->markup = NULL;
+ if (vec->markup) {
+ g_ptr_array_free (vec->markup, TRUE);
+ vec->markup = NULL;
+ }
vector_parent_klass->finalize (obj);
}
@@ -813,23 +817,25 @@ gnm_go_data_vector_get_str (GODataVector *dat, unsigned i)
return render_val (vec->val, i, j, fmt, &ep);
}
-struct markup_closure {
- PangoAttrList const **l;
- unsigned i;
-};
+static void
+cond_pango_attr_list_unref (PangoAttrList *al)
+{
+ if (al)
+ pango_attr_list_unref (al);
+}
static gpointer
-cb_assign_markup (GnmCellIter const *iter, struct markup_closure *dat)
+cb_assign_markup (GnmCellIter const *iter, GPtrArray *markup)
{
- GOFormat const *fmt;
PangoAttrList const *l = NULL;
if (iter->cell != NULL) {
- fmt = gnm_cell_get_format (iter->cell);
+ GOFormat const *fmt = gnm_cell_get_format (iter->cell);
if (go_format_is_markup (fmt))
l = go_format_get_markup (fmt);
}
- dat->l[dat->i++] = l;
+ g_ptr_array_add (markup,
+ l ? pango_attr_list_ref ((PangoAttrList *)l) : NULL);
return NULL;
}
@@ -845,13 +851,12 @@ gnm_go_data_vector_get_markup (GODataVector *dat, unsigned i)
GnmRange r;
Sheet *start_sheet, *end_sheet;
GnmValue *v;
- struct markup_closure closure;
go_data_vector_get_len (dat); /* force calculation */
if (dat->len <= 0 || !vec->dep.sheet)
return NULL;
- closure.l = vec->markup = (PangoAttrList const **) g_new0 (gpointer, vec->base.len);
- closure.i = 0;
+ vec->markup = g_ptr_array_new_with_free_func
+ ((GDestroyNotify)cond_pango_attr_list_unref);
switch (vec->val->type) {
case VALUE_CELLRANGE:
gnm_rangeref_normalize (&vec->val->v_range.cell,
@@ -869,11 +874,11 @@ gnm_go_data_vector_get_markup (GODataVector *dat, unsigned i)
if (r.start.col <= r.end.col && r.start.row <= r.end.row) {
sheet_foreach_cell_in_range (start_sheet, CELL_ITER_ALL,
r.start.col, r.start.row, r.end.col, r.end.row,
- (CellIterFunc)cb_assign_markup, &closure);
+ (CellIterFunc)cb_assign_markup, vec->markup);
}
break;
- case VALUE_ARRAY : {
+ case VALUE_ARRAY: {
int len = vec->as_col? vec->val->v_array.y: vec->val->v_array.x;
while (len-- > 0) {
v = vec->as_col
@@ -895,18 +900,18 @@ gnm_go_data_vector_get_markup (GODataVector *dat, unsigned i)
if (r.start.col <= r.end.col && r.start.row <= r.end.row)
sheet_foreach_cell_in_range (start_sheet, CELL_ITER_ALL,
r.start.col, r.start.row, r.end.col, r.end.row,
- (CellIterFunc)cb_assign_markup, &closure);
+ (CellIterFunc)cb_assign_markup, vec->markup);
}
}
break;
}
- default :
+ default:
break;
}
}
- return pango_attr_list_copy ((PangoAttrList *) vec->markup[i]);
+ return pango_attr_list_copy (g_ptr_array_index (vec->markup, i));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]