[gnumeric] xlsx: fix import/export of graph backplane.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] xlsx: fix import/export of graph backplane.
- Date: Tue, 21 Apr 2015 13:49:59 +0000 (UTC)
commit 3d7f1211bb35653d3d4d9bab03bdb851f7736ae7
Author: Morten Welinder <terra gnome org>
Date: Tue Apr 21 09:49:36 2015 -0400
xlsx: fix import/export of graph backplane.
NEWS | 3 +++
plugins/excel/ChangeLog | 4 ++++
plugins/excel/xlsx-read-drawing.c | 34 +++++++++++++++++++++++++++++++++-
plugins/excel/xlsx-write-drawing.c | 34 ++++++++++++++++++++++++----------
4 files changed, 64 insertions(+), 11 deletions(-)
---
diff --git a/NEWS b/NEWS
index 33c0157..83cceeb 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ Gnumeric 1.12.23
Jean:
* Fix xlsx import of plot area manual layout. [#748016]
+Morten:
+ * Fix import/export of graph backplane.
+
--------------------------------------------------------------------------
Gnumeric 1.12.22
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 4a79277..a32562d 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,7 @@
+2015-04-21 Morten Welinder <terra gnome org>
+
+ * xlsx-read-drawing.c (xlsx_chart_ring_hole): read hole size.
+
2015-04-17 Jean Brefort <jean brefort normalesup org>
* xlsx-read-drawing.c (xlsx_chart_layout_manual): fix plot area manual
diff --git a/plugins/excel/xlsx-read-drawing.c b/plugins/excel/xlsx-read-drawing.c
index 8b5c7c3..6c392de 100644
--- a/plugins/excel/xlsx-read-drawing.c
+++ b/plugins/excel/xlsx-read-drawing.c
@@ -634,6 +634,9 @@ xlsx_chart_add_plot (GsfXMLIn *xin, char const *type)
/* Replace dummy object. */
xlsx_chart_pop_obj (state);
xlsx_chart_push_obj (state, bp);
+
+ /* If there is no style, we will remove the backplane. */
+ state->cur_style->fill.type = GO_STYLE_FILL_NONE;
}
}
}
@@ -669,6 +672,17 @@ xlsx_chart_pie_angle (GsfXMLIn *xin, xmlChar const **attrs)
"initial-angle", (double)angle, NULL);
}
+static void
+xlsx_chart_ring_hole (GsfXMLIn *xin, xmlChar const **attrs)
+{
+ XLSXReadState *state = (XLSXReadState *)xin->user_state;
+ unsigned size = 50;
+ (void)simple_uint (xin, attrs, &size);
+ /* Allow full range for size. Spec says 10-90. */
+ g_object_set (G_OBJECT (state->plot),
+ "center-size", CLAMP (size, 0, 100) / 100.0, NULL);
+}
+
/* shared with pie of pie, and bar of pie */
static void xlsx_chart_pie (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs) { xlsx_chart_add_plot (xin,
"GogPiePlot"); }
static void xlsx_chart_ring (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs) { xlsx_chart_add_plot (xin,
"GogRingPlot"); }
@@ -2122,7 +2136,20 @@ static void
xlsx_plot_area_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
{
XLSXReadState *state = (XLSXReadState *)xin->user_state;
+ GogObject *bp = state->cur_obj;
+ GOStyle const *s = state->cur_style;
+ gboolean delete;
+
+ delete = (GOG_IS_GRID (bp) &&
+ !go_style_is_fill_visible (s) &&
+ gog_object_is_deletable (bp));
+ if (delete)
+ gog_object_clear_parent (bp);
+
xlsx_chart_pop_obj (state);
+
+ if (delete)
+ g_object_unref (bp); /* from _clear_parent. */
}
@@ -2217,6 +2244,7 @@ xlsx_ext_gostyle (GsfXMLIn *xin, xmlChar const **attrs)
for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
gnm_float f;
+ int i;
if (strcmp (attrs[0], "pattern") == 0) {
GOPatternType p = go_pattern_from_str (attrs[1]);
@@ -2229,6 +2257,10 @@ xlsx_ext_gostyle (GsfXMLIn *xin, xmlChar const **attrs)
style->fill.pattern.fore = GO_COLOR_BLACK;
}
style->fill.pattern.pattern = p;
+ } else if (attr_bool (xin, attrs, "auto-pattern", &i)) {
+ style->fill.auto_type = i != 0;
+ } else if (attr_bool (xin, attrs, "auto-back", &i)) {
+ style->fill.auto_back = i != 0;
} else if (start_arrow && strcmp (attrs[0], "StartArrowType") == 0) {
start_arrow->typ = go_arrow_type_from_str (attrs[1]);
} else if (start_arrow && attr_float (xin, attrs, "StartArrowShapeA", &f)) {
@@ -2695,7 +2727,7 @@ GSF_XML_IN_NODE_FULL (START, CHART_SPACE, XL_NS_CHART, "chartSpace", GSF_XML_NO_
GSF_XML_IN_NODE (DOUGHNUT, SERIES, XL_NS_CHART, "ser", GSF_XML_2ND, NULL, NULL),
GSF_XML_IN_NODE (DOUGHNUT, VARY_COLORS, XL_NS_CHART, "varyColors", GSF_XML_2ND, NULL, NULL),
GSF_XML_IN_NODE (DOUGHNUT, PIE_FIRST_SLICE, XL_NS_CHART, "firstSliceAng", GSF_XML_2ND, NULL,
NULL),
- GSF_XML_IN_NODE (DOUGHNUT, HOLE_SIZE, XL_NS_CHART, "holeSize", GSF_XML_NO_CONTENT, NULL,
NULL),
+ GSF_XML_IN_NODE (DOUGHNUT, HOLE_SIZE, XL_NS_CHART, "holeSize", GSF_XML_NO_CONTENT,
&xlsx_chart_ring_hole, NULL),
GSF_XML_IN_NODE (DOUGHNUT, PLOT_DLBLS, XL_NS_CHART, "dLbls", GSF_XML_2ND, NULL, NULL),
GSF_XML_IN_NODE (PLOTAREA, DATA_TABLE, XL_NS_CHART, "dTable", GSF_XML_NO_CONTENT, NULL, NULL),
diff --git a/plugins/excel/xlsx-write-drawing.c b/plugins/excel/xlsx-write-drawing.c
index dba243a..c566f24 100644
--- a/plugins/excel/xlsx-write-drawing.c
+++ b/plugins/excel/xlsx-write-drawing.c
@@ -321,6 +321,8 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style, const XLSXStyleContext
!style->font.auto_color);
gboolean has_font = xlsx_go_style_has_font (style);
gboolean ext_fill_pattern = FALSE;
+ gboolean ext_fill_auto_pattern = FALSE;
+ gboolean ext_fill_auto_back = FALSE;
gboolean ext_start_arrow = FALSE;
gboolean ext_end_arrow = FALSE;
gboolean ext_gradient_rev = FALSE;
@@ -358,18 +360,16 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style, const XLSXStyleContext
break;
case GO_STYLE_FILL_PATTERN: {
const char *pattname = NULL;
+ ext_fill_auto_pattern = TRUE;
switch (style->fill.pattern.pattern) {
case GO_PATTERN_SOLID:
ext_fill_pattern = TRUE;
- if (!style->fill.auto_back) {
+ if (!style->fill.auto_back || sctx->must_fill_fill) {
+ if (style->fill.auto_back)
+ ext_fill_auto_back = TRUE;
gsf_xml_out_start_element (xml, "a:solidFill");
xlsx_write_rgbarea (xml, style->fill.pattern.back);
gsf_xml_out_end_element (xml);
- } else if (sctx->must_fill_fill) {
- /* We must output a color, or we'll get the foreground colour, i.e.,
black. */
- gsf_xml_out_start_element (xml, "a:solidFill");
- xlsx_write_rgbarea (xml, GO_COLOR_WHITE);
- gsf_xml_out_end_element (xml);
}
break;
case GO_PATTERN_FOREGROUND_SOLID:
@@ -557,7 +557,8 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style, const XLSXStyleContext
}
if (sctx->state->with_extension &&
- (ext_fill_pattern || ext_start_arrow || ext_end_arrow ||
+ (ext_fill_pattern || ext_fill_auto_pattern || ext_fill_auto_back ||
+ ext_start_arrow || ext_end_arrow ||
ext_gradient_rev || ext_dash_type)) {
gsf_xml_out_start_element (xml, "a:extLst");
gsf_xml_out_start_element (xml, "a:ext");
@@ -570,7 +571,14 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style, const XLSXStyleContext
: go_line_dash_as_str (style->line.dash_type));
}
if (ext_fill_pattern) {
- gsf_xml_out_add_cstr (xml, "pattern", go_pattern_as_str
(style->fill.pattern.pattern));
+ gsf_xml_out_add_cstr (xml, "pattern",
+ go_pattern_as_str (style->fill.pattern.pattern));
+ }
+ if (ext_fill_auto_pattern) {
+ xlsx_add_bool (xml, "auto-pattern", style->fill.auto_type);
+ }
+ if (ext_fill_auto_back) {
+ xlsx_add_bool (xml, "auto-back", style->fill.auto_back);
}
if (ext_start_arrow) {
GOArrow const *arrow = sctx->start_arrow;
@@ -1208,8 +1216,14 @@ xlsx_write_one_chart (XLSXWriteState *state, GsfXMLOut *xml, GogObject const *ch
xlsx_write_plots (state, xml, chart, &ser_count);
obj = gog_object_get_child_by_name (GOG_OBJECT (chart), "Backplane");
- if (obj)
- xlsx_write_go_style (xml, state, go_styled_object_get_style (GO_STYLED_OBJECT (obj)));
+ if (obj) {
+ XLSXStyleContext sctx;
+ xlsx_style_context_init (&sctx, state);
+ sctx.must_fill_fill = TRUE;
+ xlsx_write_go_style_full
+ (xml, go_styled_object_get_style (GO_STYLED_OBJECT (obj)),
+ &sctx);
+ }
gsf_xml_out_end_element (xml); /* </c:plotArea> */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]