From 03e5deaa8f4541062fdca7ec3003cb8fab928582 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Wed, 30 Dec 2015 00:35:03 +0000 Subject: [PATCH] First functional test of insert_image(). --- .indent.pro | 1 - include/xlsxwriter/common.h | 1 + include/xlsxwriter/content_types.h | 3 +- include/xlsxwriter/drawing.h | 2 + include/xlsxwriter/packager.h | 3 +- include/xlsxwriter/workbook.h | 4 + include/xlsxwriter/worksheet.h | 5 + src/content_types.c | 14 +- src/drawing.c | 10 ++ src/packager.c | 141 +++++++++++++++++-- src/workbook.c | 8 +- src/worksheet.c | 103 ++++++++++++-- test/functional/src/images/red.png | Bin 0 -> 200 bytes test/functional/src/test_image01.c | 20 +++ test/functional/test_image.py | 18 +++ test/functional/xlsx_files/image01.xlsx | Bin 0 -> 8607 bytes test/unit/content_types/test_content_types.c | 2 +- test/unit/drawing/test_drawing_image.c | 4 +- 18 files changed, 306 insertions(+), 33 deletions(-) create mode 100644 test/functional/src/images/red.png create mode 100644 test/functional/src/test_image01.c create mode 100644 test/functional/test_image.py create mode 100644 test/functional/xlsx_files/image01.xlsx diff --git a/.indent.pro b/.indent.pro index b3c65827..500ca1d7 100644 --- a/.indent.pro +++ b/.indent.pro @@ -65,7 +65,6 @@ -T lxw_hash_table -T lxw_header_footer_options -T lxw_heading_pair --T lxw_image_meta -T lxw_image_options -T lxw_merged_range -T lxw_packager diff --git a/include/xlsxwriter/common.h b/include/xlsxwriter/common.h index 0b562873..01743a40 100644 --- a/include/xlsxwriter/common.h +++ b/include/xlsxwriter/common.h @@ -28,6 +28,7 @@ enum lxw_boolean { #define LXW_SHEETNAME_LEN 65 #define LXW_UINT32_T_LEN 11 /* Length of 4294967296\0. */ #define LXW_IGNORE 1 +#define FILENAME_LEN 128 #define LXW_ERROR(message) \ fprintf(stderr, "[ERROR][%s:%d]: " message "\n", __FILE__, __LINE__) diff --git a/include/xlsxwriter/content_types.h b/include/xlsxwriter/content_types.h index 67a5a59b..aea54719 100644 --- a/include/xlsxwriter/content_types.h +++ b/include/xlsxwriter/content_types.h @@ -45,7 +45,8 @@ void _ct_add_default(lxw_content_types *self, const char *key, const char *value); void _ct_add_override(lxw_content_types *self, const char *key, const char *value); -void _ct_add_worksheet_name(lxw_content_types *self, const char *str); +void _ct_add_worksheet_name(lxw_content_types *self, const char *name); +void _ct_add_drawing_name(lxw_content_types *self, const char *name); void _ct_add_shared_strings(lxw_content_types *self); void _ct_add_calc_chain(lxw_content_types *self); diff --git a/include/xlsxwriter/drawing.h b/include/xlsxwriter/drawing.h index f5d71696..11ea929e 100644 --- a/include/xlsxwriter/drawing.h +++ b/include/xlsxwriter/drawing.h @@ -86,6 +86,8 @@ lxw_drawing *_new_drawing(); void _free_drawing(lxw_drawing *drawing); void _drawing_assemble_xml_file(lxw_drawing *self); void _free_drawing_object(struct lxw_drawing_object *drawing_object); +void _add_drawing_object(lxw_drawing *drawing, + lxw_drawing_object *drawing_object); /* Declarations required for unit testing. */ #ifdef TESTING diff --git a/include/xlsxwriter/packager.h b/include/xlsxwriter/packager.h index 93064c9c..f6f05d35 100644 --- a/include/xlsxwriter/packager.h +++ b/include/xlsxwriter/packager.h @@ -24,7 +24,6 @@ #include "content_types.h" #include "relationships.h" -#define FILENAME_LEN 128 #define LXW_ZIP_BUFFER_SIZE (16384) /* @@ -41,6 +40,8 @@ typedef struct lxw_packager { char *filename; char *buffer; + uint16_t drawing_count; + } lxw_packager; diff --git a/include/xlsxwriter/workbook.h b/include/xlsxwriter/workbook.h index 59692348..4c3d1f25 100644 --- a/include/xlsxwriter/workbook.h +++ b/include/xlsxwriter/workbook.h @@ -200,6 +200,10 @@ typedef struct lxw_workbook { uint16_t fill_count; uint8_t optimize; + uint8_t has_png; + uint8_t has_jpg; + uint8_t has_bmp; + lxw_hash_table *used_xf_formats; } lxw_workbook; diff --git a/include/xlsxwriter/worksheet.h b/include/xlsxwriter/worksheet.h index 3e1f28b0..ef0510f4 100644 --- a/include/xlsxwriter/worksheet.h +++ b/include/xlsxwriter/worksheet.h @@ -49,6 +49,7 @@ #include #include "shared_strings.h" +#include "drawing.h" #include "common.h" #include "format.h" #include "utility.h" @@ -465,11 +466,15 @@ typedef struct lxw_worksheet { lxw_col_t *vbreaks; struct lxw_rel_tuples *external_hyperlinks; + struct lxw_rel_tuples *external_drawing_links; + struct lxw_rel_tuples *drawing_links; struct lxw_panes panes; struct lxw_protection protection; + lxw_drawing *drawing; + STAILQ_ENTRY (lxw_worksheet) list_pointers; } lxw_worksheet; diff --git a/src/content_types.c b/src/content_types.c index 270e5095..c18ff4fe 100644 --- a/src/content_types.c +++ b/src/content_types.c @@ -284,15 +284,21 @@ mem_error: * Add the name of a worksheet to the ContentTypes overrides. */ void -_ct_add_worksheet_name(lxw_content_types *self, const char *str) +_ct_add_worksheet_name(lxw_content_types *self, const char *name) { - char name[MAX_ATTRIBUTE_LENGTH]; - lxw_snprintf(name, MAX_ATTRIBUTE_LENGTH, "/xl/worksheets/%s.xml", str); - _ct_add_override(self, name, LXW_APP_DOCUMENT "spreadsheetml.worksheet+xml"); } +/* + * Add the name of a drawing to the ContentTypes overrides. + */ +void +_ct_add_drawing_name(lxw_content_types *self, const char *name) +{ + _ct_add_override(self, name, LXW_APP_DOCUMENT "drawing+xml"); +} + /* * Add the sharedStrings link to the ContentTypes overrides. */ diff --git a/src/drawing.c b/src/drawing.c index 8a830cc9..30065d65 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -86,6 +86,16 @@ _free_drawing(lxw_drawing *drawing) free(drawing); } +/* + * Add a drawing object to the drawing collection. + */ +void +_add_drawing_object(lxw_drawing *drawing, lxw_drawing_object *drawing_object) +{ + STAILQ_INSERT_TAIL(drawing->drawing_objects, drawing_object, + list_pointers); +} + /***************************************************************************** * * XML functions. diff --git a/src/packager.c b/src/packager.c index d4a53b3a..2dfffdc9 100644 --- a/src/packager.c +++ b/src/packager.c @@ -169,6 +169,71 @@ _write_worksheet_files(lxw_packager *self) return 0; } +/* + * Write the /xl/media/image?.xml files. + */ +STATIC uint8_t +_write_image_files(lxw_packager *self) +{ + lxw_workbook *workbook = self->workbook; + lxw_worksheet *worksheet; + lxw_image_options *image; + + char filename[FILENAME_LEN] = { 0 }; + uint16_t index = 1; + + STAILQ_FOREACH(worksheet, workbook->worksheets, list_pointers) { + + if (STAILQ_EMPTY(worksheet->images)) + continue; + + STAILQ_FOREACH(image, worksheet->images, list_pointers) { + + lxw_snprintf(filename, FILENAME_LEN, + "xl/media/image%d.png", index++); + + rewind(image->stream); + + _add_file_to_zip(self, image->stream, filename); + + fclose(image->stream); + } + } + + return 0; +} + +/* + * Write the drawing files. + */ +STATIC uint8_t +_write_drawing_files(lxw_packager *self) +{ + lxw_workbook *workbook = self->workbook; + lxw_worksheet *worksheet; + lxw_drawing *drawing; + char filename[FILENAME_LEN] = { 0 }; + uint16_t index = 1; + + STAILQ_FOREACH(worksheet, workbook->worksheets, list_pointers) { + drawing = worksheet->drawing; + + if (drawing) { + lxw_snprintf(filename, FILENAME_LEN, + "xl/drawings/drawing%d.xml", index++); + + drawing->file = lxw_tmpfile(); + _drawing_assemble_xml_file(drawing); + _add_file_to_zip(self, drawing->file, filename); + fclose(drawing->file); + + self->drawing_count++; + } + } + + return 0; +} + /* * Write the sharedStrings.xml file. */ @@ -340,14 +405,24 @@ _write_content_types_file(lxw_packager *self) lxw_content_types *content_types = _new_content_types(); lxw_workbook *workbook = self->workbook; lxw_worksheet *worksheet; - char sheetname[FILENAME_LEN] = { 0 }; + char filename[MAX_ATTRIBUTE_LENGTH] = { 0 }; uint16_t index = 1; content_types->file = lxw_tmpfile(); + if (workbook->has_png) + _ct_add_default(content_types, "png", "image/png"); + STAILQ_FOREACH(worksheet, workbook->worksheets, list_pointers) { - lxw_snprintf(sheetname, FILENAME_LEN, "sheet%d", index++); - _ct_add_worksheet_name(content_types, sheetname); + lxw_snprintf(filename, FILENAME_LEN, + "/xl/worksheets/sheet%d.xml", index++); + _ct_add_worksheet_name(content_types, filename); + } + + for (index = 1; index <= self->drawing_count; index++) { + lxw_snprintf(filename, FILENAME_LEN, + "/xl/drawings/drawing%d.xml", index++); + _ct_add_drawing_name(content_types, filename); } if (workbook->sst->string_count) @@ -409,7 +484,7 @@ STATIC uint8_t _write_worksheet_rels_file(lxw_packager *self) { lxw_relationships *rels; - lxw_rel_tuple *hlink; + lxw_rel_tuple *rel; lxw_workbook *workbook = self->workbook; lxw_worksheet *worksheet; char sheetname[FILENAME_LEN] = { 0 }; @@ -417,16 +492,21 @@ _write_worksheet_rels_file(lxw_packager *self) STAILQ_FOREACH(worksheet, workbook->worksheets, list_pointers) { - if (STAILQ_EMPTY(worksheet->external_hyperlinks)) + if (STAILQ_EMPTY(worksheet->external_hyperlinks) && + STAILQ_EMPTY(worksheet->external_drawing_links)) continue; rels = _new_relationships(); rels->file = lxw_tmpfile(); - STAILQ_FOREACH(hlink, worksheet->external_hyperlinks, list_pointers) { - _add_worksheet_relationship(rels, hlink->type, hlink->target, - hlink->target_mode); + STAILQ_FOREACH(rel, worksheet->external_hyperlinks, list_pointers) { + _add_worksheet_relationship(rels, rel->type, rel->target, + rel->target_mode); + } + STAILQ_FOREACH(rel, worksheet->external_drawing_links, list_pointers) { + _add_worksheet_relationship(rels, rel->type, rel->target, + rel->target_mode); } lxw_snprintf(sheetname, FILENAME_LEN, @@ -443,6 +523,48 @@ _write_worksheet_rels_file(lxw_packager *self) return 0; } +/* + * Write the drawing .rels files for worksheets that contain charts or + * drawings. + */ +STATIC uint8_t +_write_drawing_rels_file(lxw_packager *self) +{ + lxw_relationships *rels; + lxw_rel_tuple *rel; + lxw_workbook *workbook = self->workbook; + lxw_worksheet *worksheet; + char sheetname[FILENAME_LEN] = { 0 }; + uint16_t index = 1; + + STAILQ_FOREACH(worksheet, workbook->worksheets, list_pointers) { + + if (STAILQ_EMPTY(worksheet->drawing_links)) + continue; + + rels = _new_relationships(); + rels->file = lxw_tmpfile(); + + STAILQ_FOREACH(rel, worksheet->drawing_links, list_pointers) { + _add_worksheet_relationship(rels, rel->type, rel->target, + rel->target_mode); + + } + + lxw_snprintf(sheetname, FILENAME_LEN, + "xl/drawings/_rels/drawing%d.xml.rels", index++); + + _relationships_assemble_xml_file(rels); + + _add_file_to_zip(self, rels->file, sheetname); + + fclose(rels->file); + _free_relationships(rels); + } + + return 0; +} + /* * Write the _rels/.rels xml file. */ @@ -543,6 +665,7 @@ _create_package(lxw_packager *self) _write_worksheet_files(self); _write_workbook_file(self); + _write_drawing_files(self); _write_shared_strings_file(self); _write_app_file(self); _write_core_file(self); @@ -551,6 +674,8 @@ _create_package(lxw_packager *self) _write_content_types_file(self); _write_workbook_rels_file(self); _write_worksheet_rels_file(self); + _write_drawing_rels_file(self); + _write_image_files(self); _write_root_rels_file(self); zipClose(self->zipfile, NULL); diff --git a/src/workbook.c b/src/workbook.c index 3d6ee1b1..9515be5a 100644 --- a/src/workbook.c +++ b/src/workbook.c @@ -691,11 +691,13 @@ _prepare_drawings(lxw_workbook *self) if (_get_image_properties(image_options) != 0) continue; + if (image_options->image_type == IMAGE_PNG) + self->has_png = LXW_TRUE; + image_ref_id++; - /*sheet->_prepare_image(index, image_ref_id, drawing_id, width, - height, name, type); - */ + _worksheet_prepare_image(worksheet, image_ref_id, drawing_id, + image_options); } } diff --git a/src/worksheet.c b/src/worksheet.c index a96f5fc7..8ea63ee8 100644 --- a/src/worksheet.c +++ b/src/worksheet.c @@ -12,7 +12,6 @@ #include "xlsxwriter/xmlwriter.h" #include "xlsxwriter/worksheet.h" #include "xlsxwriter/format.h" -#include "xlsxwriter/drawing.h" #include "xlsxwriter/utility.h" #include "xlsxwriter/relationships.h" @@ -86,12 +85,21 @@ _new_worksheet(lxw_worksheet_init_data *init_data) worksheet->external_hyperlinks = calloc(1, sizeof(struct lxw_rel_tuples)); GOTO_LABEL_ON_MEM_ERROR(worksheet->external_hyperlinks, mem_error); + worksheet->external_drawing_links = + calloc(1, sizeof(struct lxw_rel_tuples)); + GOTO_LABEL_ON_MEM_ERROR(worksheet->external_drawing_links, mem_error); + + worksheet->drawing_links = calloc(1, sizeof(struct lxw_rel_tuples)); + GOTO_LABEL_ON_MEM_ERROR(worksheet->drawing_links, mem_error); + RB_INIT(worksheet->table); RB_INIT(worksheet->hyperlinks); STAILQ_INIT(worksheet->merged_ranges); STAILQ_INIT(worksheet->images); STAILQ_INIT(worksheet->selections); STAILQ_INIT(worksheet->external_hyperlinks); + STAILQ_INIT(worksheet->external_drawing_links); + STAILQ_INIT(worksheet->drawing_links); if (init_data && init_data->optimize) { worksheet->optimize_tmpfile = lxw_tmpfile(); @@ -225,7 +233,7 @@ _free_worksheet(lxw_worksheet *worksheet) lxw_merged_range *merged_range; lxw_image_options *image; lxw_selection *selection; - lxw_rel_tuple *external_hyperlink; + lxw_rel_tuple *relationship; if (!worksheet) return; @@ -295,17 +303,37 @@ _free_worksheet(lxw_worksheet *worksheet) free(worksheet->selections); } + /* TODO. Add function for freeing the relationship lists. */ while (!STAILQ_EMPTY(worksheet->external_hyperlinks)) { - external_hyperlink = STAILQ_FIRST(worksheet->external_hyperlinks); + relationship = STAILQ_FIRST(worksheet->external_hyperlinks); STAILQ_REMOVE_HEAD(worksheet->external_hyperlinks, list_pointers); - free(external_hyperlink->type); - free(external_hyperlink->target); - free(external_hyperlink->target_mode); - free(external_hyperlink); + free(relationship->type); + free(relationship->target); + free(relationship->target_mode); + free(relationship); } - free(worksheet->external_hyperlinks); + while (!STAILQ_EMPTY(worksheet->external_drawing_links)) { + relationship = STAILQ_FIRST(worksheet->external_drawing_links); + STAILQ_REMOVE_HEAD(worksheet->external_drawing_links, list_pointers); + free(relationship->type); + free(relationship->target); + free(relationship->target_mode); + free(relationship); + } + free(worksheet->external_drawing_links); + + while (!STAILQ_EMPTY(worksheet->drawing_links)) { + relationship = STAILQ_FIRST(worksheet->drawing_links); + STAILQ_REMOVE_HEAD(worksheet->drawing_links, list_pointers); + free(relationship->type); + free(relationship->target); + free(relationship->target_mode); + free(relationship); + } + free(worksheet->drawing_links); + if (worksheet->array) { for (col = 0; col < LXW_COL_MAX; col++) { _free_cell(worksheet->array[col]); @@ -316,6 +344,9 @@ _free_worksheet(lxw_worksheet *worksheet) if (worksheet->optimize_row) free(worksheet->optimize_row); + if (worksheet->drawing) + _free_drawing(worksheet->drawing); + free(worksheet->name); free(worksheet->quoted_name); @@ -1700,12 +1731,39 @@ _worksheet_prepare_image(lxw_worksheet *self, lxw_image_options *image) { lxw_drawing_object *drawing_object; + lxw_rel_tuple *relationship; double width; double height; + char filename[FILENAME_LEN]; + + if (!self->drawing) { + self->drawing = _new_drawing(); + self->drawing->embedded = LXW_TRUE; + RETURN_VOID_ON_MEM_ERROR(self->drawing); + + relationship = calloc(1, sizeof(lxw_rel_tuple)); + GOTO_LABEL_ON_MEM_ERROR(relationship, mem_error); + + relationship->type = lxw_strdup("/drawing"); + GOTO_LABEL_ON_MEM_ERROR(relationship->type, mem_error); + + lxw_snprintf(filename, FILENAME_LEN, "../drawings/drawing%d.xml", + drawing_id); + + relationship->target = lxw_strdup(filename); + GOTO_LABEL_ON_MEM_ERROR(relationship->target, mem_error); + + STAILQ_INSERT_TAIL(self->external_drawing_links, relationship, + list_pointers); + } drawing_object = calloc(1, sizeof(lxw_drawing_object)); RETURN_VOID_ON_MEM_ERROR(drawing_object); + drawing_object->anchor_type = LXW_ANCHOR_TYPE_IMAGE; + drawing_object->edit_as = LXW_ANCHOR_EDIT_AS_ONE_CELL; + drawing_object->description = lxw_strdup(image->short_name); + /* Scale to user scale. */ width = image->width * image->x_scale; height = image->height * image->y_scale; @@ -1721,12 +1779,33 @@ _worksheet_prepare_image(lxw_worksheet *self, _worksheet_position_object_emus(self, image, drawing_object); /* Convert from pixels to emus. */ - image->width *= 9525; - image->height *= 9525; + drawing_object->width = image->width * 9525; + drawing_object->height = image->height * 9525; - image_ref_id++; - drawing_id++; + _add_drawing_object(self->drawing, drawing_object); + relationship = calloc(1, sizeof(lxw_rel_tuple)); + GOTO_LABEL_ON_MEM_ERROR(relationship, mem_error); + + relationship->type = lxw_strdup("/image"); + GOTO_LABEL_ON_MEM_ERROR(relationship->type, mem_error); + + lxw_snprintf(filename, 32, "../media/image%d.png", image_ref_id); + + relationship->target = lxw_strdup(filename); + GOTO_LABEL_ON_MEM_ERROR(relationship->target, mem_error); + + STAILQ_INSERT_TAIL(self->drawing_links, relationship, list_pointers); + + return; + +mem_error: + if (relationship) { + free(relationship->type); + free(relationship->target); + free(relationship->target_mode); + free(relationship); + } } /***************************************************************************** diff --git a/test/functional/src/images/red.png b/test/functional/src/images/red.png new file mode 100644 index 0000000000000000000000000000000000000000..867a2f12e84e232b62b627ff1e4074609edfb2de GIT binary patch literal 200 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 E0Q)I|=>Px# literal 0 HcmV?d00001 diff --git a/test/unit/content_types/test_content_types.c b/test/unit/content_types/test_content_types.c index d6ab328d..41dcaf01 100644 --- a/test/unit/content_types/test_content_types.c +++ b/test/unit/content_types/test_content_types.c @@ -37,7 +37,7 @@ CTEST(content_types, content_types01) { lxw_content_types *content_types = _new_content_types(); content_types->file = testfile; - _ct_add_worksheet_name(content_types, "sheet1"); + _ct_add_worksheet_name(content_types, "/xl/worksheets/sheet1.xml"); _ct_add_default(content_types, "jpeg", "image/jpeg"); _ct_add_shared_strings(content_types); _ct_add_calc_chain(content_types); diff --git a/test/unit/drawing/test_drawing_image.c b/test/unit/drawing/test_drawing_image.c index e8bfd329..1a0d8970 100644 --- a/test/unit/drawing/test_drawing_image.c +++ b/test/unit/drawing/test_drawing_image.c @@ -5,7 +5,7 @@ * */ -#include ; +#include #include "../ctest.h" #include "../helper.h" @@ -88,7 +88,7 @@ CTEST(drawing, drawing_image01) { drawing_object->width = 1142857; drawing_object->height = 1142857; - STAILQ_INSERT_TAIL(drawing->drawing_objects, drawing_object, list_pointers); + _add_drawing_object(drawing, drawing_object); _drawing_assemble_xml_file(drawing);