spv_writer_close_file (w, "");
}
+static cairo_status_t
+write_to_zip (void *zw_, const unsigned char *data, unsigned int length)
+{
+ struct zip_writer *zw = zw_;
+
+ zip_writer_add_write (zw, data, length);
+ return CAIRO_STATUS_SUCCESS;
+}
+
+void
+spv_writer_put_image (struct spv_writer *w, cairo_surface_t *image)
+{
+ bool initial_depth = w->heading_depth;
+ if (!initial_depth)
+ spv_writer_open_file (w);
+
+ char *uri = xasprintf ("%010d_Imagegeneric.png", ++w->n_tables);
+
+ start_container (w);
+
+ start_elem (w, "label");
+ write_text (w, "Image");
+ end_elem (w);
+
+ start_elem (w, "object");
+ write_attr (w, "type", "unknown");
+ write_attr (w, "uri", uri);
+ end_elem (w); /* object */
+ end_elem (w); /* container */
+
+ if (!initial_depth)
+ spv_writer_close_file (w, "");
+
+ zip_writer_add_start (w->zw, uri);
+ cairo_surface_write_to_png_stream (image, write_to_zip, w->zw);
+ zip_writer_add_finish (w->zw);
+
+ free (uri);
+}
+
void
spv_writer_eject_page (struct spv_writer *w)
{
case PIVOT_VALUE_STRING:
put_byte (buf, 4);
put_value_mod (buf, value, NULL);
- put_format (buf,
- &(struct fmt_spec) { FMT_A, strlen (value->string.s), 0 },
- false);
+ size_t len = strlen (value->string.s);
+ if (value->string.hex)
+ put_format (buf, &(struct fmt_spec) { FMT_AHEX, len * 2, 0 }, false);
+ else
+ put_format (buf, &(struct fmt_spec) { FMT_A, len, 0 }, false);
put_string (buf, value->string.value_label);
put_string (buf, value->string.var_name);
put_show_values (buf, value->string.show);
else
{
put_bytes (buf, "\0\0\1", 3);
- put_u32 (buf, 0);
+ put_u32 (buf, 0); /* x23 */
put_u32 (buf, -1);
put_u32 (buf, c->n_subs);
for (size_t i = 0; i < c->n_subs; i++)
{
put_u32 (buf, table->settings.epoch);
put_byte (buf, table->settings.decimal);
- put_byte (buf, table->grouping);
+ put_byte (buf, ',');
}
static void
static void
put_x1 (struct buf *buf, const struct pivot_table *table)
{
- put_byte (buf, 0);
+ put_byte (buf, 0); /* x14 */
put_byte (buf, table->show_title ? 1 : 10);
- put_byte (buf, 0);
- put_byte (buf, 0);
+ put_byte (buf, 0); /* x16 */
+ put_byte (buf, 0); /* lang */
put_show_values (buf, table->show_variables);
put_show_values (buf, table->show_values);
- put_u32 (buf, -1);
- put_u32 (buf, -1);
+ put_u32 (buf, -1); /* x18 */
+ put_u32 (buf, -1); /* x19 */
for (int i = 0; i < 17; i++)
put_byte (buf, 0);
- put_bool (buf, false);
+ put_bool (buf, false); /* x20 */
put_byte (buf, table->show_caption);
}
}
static void
-put_x3 (struct buf *buf, const struct pivot_table *table)
+put_y1 (struct buf *buf, const struct pivot_table *table)
{
- put_bytes (buf, "\1\0\4\0\0\0", 6);
put_string (buf, table->command_c);
put_string (buf, table->command_local);
put_string (buf, table->language);
put_string (buf, table->locale);
put_bytes (buf, "\0\0\1\1", 4);
put_y0 (buf, table);
+}
+
+static void
+put_y2 (struct buf *buf, const struct pivot_table *table)
+{
+ put_custom_currency (buf, table);
+ put_byte (buf, '.');
+ put_bool (buf, 0);
+}
+
+static void
+put_x3 (struct buf *buf, const struct pivot_table *table)
+{
+ put_byte (buf, 1);
+ put_byte (buf, 0);
+ put_byte (buf, 4); /* x21 */
+ put_byte (buf, 0);
+ put_byte (buf, 0);
+ put_byte (buf, 0);
+ put_y1 (buf, table);
put_double (buf, table->small);
put_byte (buf, 1);
put_string (buf, table->dataset);
put_u32 (buf, 0);
put_u32 (buf, table->date);
put_u32 (buf, 0);
-
- /* Y2. */
- put_custom_currency (buf, table);
- put_byte (buf, '.');
- put_bool (buf, 0);
+ put_y2 (buf, table);
}
static void
put_u32 (buf, table->n_footnotes);
for (size_t i = 0; i < table->n_footnotes; i++)
{
- put_value (buf, table->footnotes[i]->content);
- put_optional_value (buf, table->footnotes[i]->marker);
- put_u32 (buf, 0);
+ const struct pivot_footnote *f = table->footnotes[i];
+ put_value (buf, f->content);
+ put_optional_value (buf, f->marker);
+ put_u32 (buf, f->show ? 1 : -1);
}
/* Areas. */
{
const struct pivot_dimension *d = table->dimensions[i];
put_value (buf, d->root->name);
- put_byte (buf, 0);
+ put_byte (buf, 0); /* x1 */
put_byte (buf, x2[i]);
- put_u32 (buf, 2);
+ put_u32 (buf, 2); /* x3 */
put_bool (buf, !d->root->show_label);
put_bool (buf, d->hide_all_labels);
put_bool (buf, 1);