[gnumeric] xlsx: import and export patterns.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] xlsx: import and export patterns.
- Date: Mon, 9 Feb 2015 18:45:28 +0000 (UTC)
commit 379bac22ef36ef4e9d1d92bc8d9502ea62cb288f
Author: Morten Welinder <terra gnome org>
Date: Mon Feb 9 13:45:10 2015 -0500
xlsx: import and export patterns.
NEWS | 1 +
plugins/excel/xlsx-read-drawing.c | 104 +++++++++++++++++++++++++++++++++---
plugins/excel/xlsx-write-drawing.c | 43 ++++++++++++++-
3 files changed, 140 insertions(+), 8 deletions(-)
---
diff --git a/NEWS b/NEWS
index 1355efb..420354b 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ Andreas:
Morten:
* Initial xlsx import of sheet widgets.
* Initial xlsx export of sheet widgets.
+ * xlsx import/exports of patterns.
--------------------------------------------------------------------------
Gnumeric 1.12.20
diff --git a/plugins/excel/xlsx-read-drawing.c b/plugins/excel/xlsx-read-drawing.c
index d910eb8..74dad9f 100644
--- a/plugins/excel/xlsx-read-drawing.c
+++ b/plugins/excel/xlsx-read-drawing.c
@@ -1679,6 +1679,96 @@ xlsx_chart_solid_fill_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
}
static void
+xlsx_chart_patt_fill (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
+{
+ XLSXReadState *state = (XLSXReadState *)xin->user_state;
+ static EnumVal const patterns[] = {
+ { "pct5", GO_PATTERN_GREY625 },
+ { "pct10", GO_PATTERN_GREY125 },
+ { "pct20", GO_PATTERN_GREY25 },
+ { "pct25", GO_PATTERN_GREY25 },
+ { "pct30", GO_PATTERN_GREY25 },
+ { "pct40", GO_PATTERN_GREY50 },
+ { "pct50", GO_PATTERN_GREY50 },
+ { "pct60", GO_PATTERN_GREY50 },
+ { "pct70", GO_PATTERN_GREY75 },
+ { "pct75", GO_PATTERN_GREY75 },
+ { "pct80", GO_PATTERN_GREY75 },
+ { "pct90", GO_PATTERN_GREY75 },
+ { "horz", GO_PATTERN_HORIZ },
+ { "vert", GO_PATTERN_VERT },
+ { "ltHorz", GO_PATTERN_THIN_HORIZ },
+ { "ltVert", GO_PATTERN_THIN_VERT },
+ { "dkHorz", GO_PATTERN_HORIZ },
+ { "dkVert", GO_PATTERN_VERT },
+ { "narHorz", GO_PATTERN_HORIZ },
+ { "narVert", GO_PATTERN_VERT },
+ { "dashHorz", GO_PATTERN_THIN_HORIZ },
+ { "dashVert", GO_PATTERN_THIN_VERT },
+ { "cross", -1 },
+ { "dnDiag", GO_PATTERN_REV_DIAG },
+ { "upDiag", GO_PATTERN_DIAG },
+ { "ltDnDiag", GO_PATTERN_THIN_REV_DIAG },
+ { "ltUpDiag", GO_PATTERN_THIN_DIAG },
+ { "dkDnDiag", GO_PATTERN_REV_DIAG },
+ { "dkUpDiag", GO_PATTERN_DIAG },
+ { "wdDnDiag", GO_PATTERN_REV_DIAG },
+ { "wdUpDiag", GO_PATTERN_DIAG },
+ { "dashDnDiag", GO_PATTERN_THIN_REV_DIAG },
+ { "dashUpDiag", GO_PATTERN_THIN_DIAG },
+ { "diagCross", GO_PATTERN_DIAG_CROSS },
+ { "smCheck", -1 },
+ { "lgCheck", -1 },
+ { "smGrid", GO_PATTERN_THIN_HORIZ_CROSS },
+ { "lgGrid", GO_PATTERN_THIN_HORIZ_CROSS },
+ { "dotGrid", -1 },
+ { "smConfetti", GO_PATTERN_SMALL_CIRCLES },
+ { "lgConfetti", GO_PATTERN_SMALL_CIRCLES },
+ { "horzBrick", GO_PATTERN_BRICKS },
+ { "diagBrick", GO_PATTERN_BRICKS },
+ { "solidDmnd", -1 },
+ { "openDmnd", GO_PATTERN_THIN_DIAG_CROSS },
+ { "dotDmnd", -1 },
+ { "plaid", -1 },
+ { "sphere", GO_PATTERN_LARGE_CIRCLES },
+ { "weave", GO_PATTERN_THATCH },
+ { "divot", -1 },
+ { "shingle", GO_PATTERN_SEMI_CIRCLES },
+ { "wave", -1 },
+ { "trellis", GO_PATTERN_THICK_DIAG_CROSS },
+ { "zigZag", -1 },
+ { NULL, 0 }
+ };
+ int pat = -1;
+
+ for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
+ if (attr_enum (xin, attrs, "prst", patterns, &pat)) {
+ /* Nothing */
+ }
+ }
+
+ state->cur_style->fill.type = GO_STYLE_FILL_PATTERN;
+ state->cur_style->fill.auto_type = (pat < 0);
+ state->cur_style->fill.pattern.pattern = (pat < 0 ? GO_PATTERN_SOLID : pat);
+}
+
+static void
+xlsx_chart_patt_fill_clr (GsfXMLIn *xin, G_GNUC_UNUSED xmlChar const **attrs)
+{
+ XLSXReadState *state = (XLSXReadState *)xin->user_state;
+ gboolean is_fg = xin->node->user_data.v_int;
+
+ xlsx_chart_push_color_state (state, is_fg ? XLSX_CS_FILL_FORE : XLSX_CS_FILL_BACK);
+}
+
+static void
+xlsx_chart_patt_fill_clr_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
+{
+ XLSXReadState *state = (XLSXReadState *)xin->user_state;
+ xlsx_chart_pop_color_state (state, XLSX_CS_ANY);
+}
+
+static void
color_set_helper (XLSXReadState *state)
{
#ifdef DEBUG_COLOR
@@ -2029,10 +2119,10 @@ GSF_XML_IN_NODE_FULL (START, CHART_SPACE, XL_NS_CHART, "chartSpace", GSF_XML_NO_
GSF_XML_IN_NODE (GRAD_LIST_ITEM, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL, NULL),
/* 2nd Def */
GSF_XML_IN_NODE (FILL_GRAD, GRAD_LINE, XL_NS_DRAW, "lin", GSF_XML_NO_CONTENT,
&xlsx_chart_grad_linear, NULL),
- GSF_XML_IN_NODE (SHAPE_PR, FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT,
&xlsx_chart_solid_fill, NULL),
- GSF_XML_IN_NODE (FILL_PATT, FILL_PATT_BG, XL_NS_DRAW, "bgClr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE (SHAPE_PR, FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT,
&xlsx_chart_patt_fill, NULL),
+ GSF_XML_IN_NODE_FULL (FILL_PATT, FILL_PATT_BG, XL_NS_DRAW, "bgClr", GSF_XML_NO_CONTENT, FALSE, TRUE,
&xlsx_chart_patt_fill_clr, &xlsx_chart_patt_fill_clr_end, FALSE),
GSF_XML_IN_NODE (FILL_PATT_BG, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL, NULL),
/* 2nd Def */
- GSF_XML_IN_NODE (FILL_PATT, FILL_PATT_FG, XL_NS_DRAW, "fgClr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE_FULL (FILL_PATT, FILL_PATT_FG, XL_NS_DRAW, "fgClr", GSF_XML_NO_CONTENT, FALSE, TRUE,
&xlsx_chart_patt_fill_clr, &xlsx_chart_patt_fill_clr_end, TRUE),
GSF_XML_IN_NODE (FILL_PATT_FG, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL, NULL),
/* 2nd Def */
GSF_XML_IN_NODE (SHAPE_PR, SHAPE_PR_LN, XL_NS_DRAW, "ln", GSF_XML_NO_CONTENT, &xlsx_style_line_start,
&xlsx_style_line_end),
@@ -2832,7 +2922,7 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
GSF_XML_IN_NODE (SHAPE_PR_LN, LN_NOFILL, XL_NS_DRAW, "noFill", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (SHAPE_PR_LN, LN_DASH, XL_NS_DRAW, "prstDash", GSF_XML_NO_CONTENT,
&xlsx_draw_line_dash, NULL),
GSF_XML_IN_NODE (SHAPE_PR_LN, FILL_SOLID, XL_NS_DRAW, "solidFill", GSF_XML_NO_CONTENT,
&xlsx_chart_solid_fill, &xlsx_chart_solid_fill_end),
- GSF_XML_IN_NODE (SHAPE_PR_LN, FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT, NULL,
NULL),
+ GSF_XML_IN_NODE (SHAPE_PR_LN, LN_FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT,
NULL, NULL),
GSF_XML_IN_NODE (SHAPE_PR_LN, LN_MITER, XL_NS_DRAW, "miter", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (SHAPE_PR_LN, LN_ROUND, XL_NS_DRAW, "round", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (SHAPE_PR_LN, LN_HEAD, XL_NS_DRAW, "headEnd", GSF_XML_NO_CONTENT, NULL,
NULL),
@@ -2862,10 +2952,10 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
GSF_XML_IN_NODE (GRAD_LIST_ITEM, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL,
NULL), /* 2nd Def */
GSF_XML_IN_NODE (FILL_GRAD, GRAD_LINE, XL_NS_DRAW, "lin", GSF_XML_NO_CONTENT, NULL, NULL),
- GSF_XML_IN_NODE (SHAPE_PR, FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT, NULL, NULL),
- GSF_XML_IN_NODE (FILL_PATT, FILL_PATT_BG, XL_NS_DRAW, "bgClr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE (SHAPE_PR, FILL_PATT, XL_NS_DRAW, "pattFill", GSF_XML_NO_CONTENT,
&xlsx_chart_patt_fill, NULL),
+ GSF_XML_IN_NODE_FULL (FILL_PATT, FILL_PATT_BG, XL_NS_DRAW, "bgClr", GSF_XML_NO_CONTENT,
FALSE, TRUE, &xlsx_chart_patt_fill_clr, &xlsx_chart_patt_fill_clr_end, FALSE),
GSF_XML_IN_NODE (FILL_PATT_BG, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL, NULL),
/* 2nd Def */
- GSF_XML_IN_NODE (FILL_PATT, FILL_PATT_FG, XL_NS_DRAW, "fgClr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE_FULL (FILL_PATT, FILL_PATT_FG, XL_NS_DRAW, "fgClr", GSF_XML_NO_CONTENT,
FALSE, TRUE, &xlsx_chart_patt_fill_clr, &xlsx_chart_patt_fill_clr_end, TRUE),
GSF_XML_IN_NODE (FILL_PATT_FG, COLOR_RGB, XL_NS_DRAW, "srgbClr", GSF_XML_NO_CONTENT, NULL, NULL),
/* 2nd Def */
GSF_XML_IN_NODE (SHAPE_PR, SHAPE_PR_LN, XL_NS_DRAW, "ln", GSF_XML_NO_CONTENT, NULL, NULL),
diff --git a/plugins/excel/xlsx-write-drawing.c b/plugins/excel/xlsx-write-drawing.c
index 010d848..5ba9453 100644
--- a/plugins/excel/xlsx-write-drawing.c
+++ b/plugins/excel/xlsx-write-drawing.c
@@ -211,7 +211,8 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style,
g_warning ("invalid fill type, saving as none");
case GO_STYLE_FILL_IMAGE:
/* FIXME: export image */
- case GO_STYLE_FILL_PATTERN:
+ case GO_STYLE_FILL_PATTERN: {
+ const char *pattname = NULL;
switch (style->fill.pattern.pattern) {
case GO_PATTERN_SOLID:
if (!style->fill.auto_back) {
@@ -227,8 +228,48 @@ xlsx_write_go_style_full (GsfXMLOut *xml, GOStyle *style,
gsf_xml_out_end_element (xml);
}
break;
+ case GO_PATTERN_GREY75: pattname = "pct75"; break;
+ case GO_PATTERN_GREY50: pattname = "pct50"; break;
+ case GO_PATTERN_GREY25: pattname = "pct25"; break;
+ case GO_PATTERN_GREY125: pattname = "pct10"; break;
+ case GO_PATTERN_GREY625: pattname = "pct5"; break;
+ case GO_PATTERN_HORIZ: pattname = "horz"; break;
+ case GO_PATTERN_VERT: pattname = "vert"; break;
+ case GO_PATTERN_REV_DIAG: pattname = "dnDiag"; break;
+ case GO_PATTERN_DIAG: pattname = "upDiag"; break;
+ case GO_PATTERN_DIAG_CROSS: pattname = "diagCross"; break;
+ case GO_PATTERN_THICK_DIAG_CROSS: pattname = "trellis"; break;
+ case GO_PATTERN_THIN_HORIZ: pattname = "ltHorz"; break;
+ case GO_PATTERN_THIN_VERT: pattname = "ltVert"; break;
+ case GO_PATTERN_THIN_REV_DIAG: pattname = "ltDnDiag"; break;
+ case GO_PATTERN_THIN_DIAG: pattname = "ltUpDiag"; break;
+ case GO_PATTERN_THIN_HORIZ_CROSS: pattname = "smGrid"; break;
+ case GO_PATTERN_THIN_DIAG_CROSS: pattname = "openDmnd"; break;
+ case GO_PATTERN_SMALL_CIRCLES: pattname = "smConfetti"; break;
+ case GO_PATTERN_SEMI_CIRCLES: pattname = "shingle"; break;
+ case GO_PATTERN_THATCH: pattname = "weave"; break;
+ case GO_PATTERN_LARGE_CIRCLES: pattname = "sphere"; break;
+ case GO_PATTERN_BRICKS: pattname = "horzBrick"; break;
}
+
+ if (pattname) {
+ gsf_xml_out_start_element (xml, "a:pattFill");
+ gsf_xml_out_add_cstr_unchecked (xml, "prst", pattname);
+ if (!style->fill.auto_fore) {
+ gsf_xml_out_start_element (xml, "a:fgClr");
+ xlsx_write_rgbarea (xml, style->fill.pattern.fore);
+ gsf_xml_out_end_element (xml);
+ }
+ if (!style->fill.auto_back) {
+ gsf_xml_out_start_element (xml, "a:bgClr");
+ xlsx_write_rgbarea (xml, style->fill.pattern.back);
+ gsf_xml_out_end_element (xml);
+ }
+ gsf_xml_out_end_element (xml);
+ }
+
break;
+ }
case GO_STYLE_FILL_GRADIENT:
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]