X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fspv%2Fspv-writer.c;h=c5a600571a8e869a4ceb5d6700c43e4a1fd0a7ce;hb=f8659933d48c5682010d1e1f04ae7acb5cbcd611;hp=b8a4768fc00e300818b772e183cc7e2fab963960;hpb=b0486442675e454c1e542a7098e5f127b2757787;p=pspp diff --git a/src/output/spv/spv-writer.c b/src/output/spv/spv-writer.c index b8a4768fc0..c5a600571a 100644 --- a/src/output/spv/spv-writer.c +++ b/src/output/spv/spv-writer.c @@ -323,6 +323,48 @@ spv_writer_put_text (struct spv_writer *w, const struct text_item *text, spv_writer_close_file (w, ""); } +#ifdef HAVE_CAIRO +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); +} +#endif + void spv_writer_eject_page (struct spv_writer *w) { @@ -555,9 +597,10 @@ put_value_mod (struct buf *buf, const struct pivot_value *value, } static void -put_format (struct buf *buf, const struct fmt_spec *f) +put_format (struct buf *buf, const struct fmt_spec *f, bool honor_small) { - put_u32 (buf, (fmt_to_io (f->type) << 16) | (f->w << 8) | f->d); + int type = f->type == FMT_F && honor_small ? 40 : fmt_to_io (f->type); + put_u32 (buf, (type << 16) | (f->w << 8) | f->d); } static int @@ -585,7 +628,7 @@ put_value (struct buf *buf, const struct pivot_value *value) { put_byte (buf, 2); put_value_mod (buf, value, NULL); - put_format (buf, &value->numeric.format); + put_format (buf, &value->numeric.format, value->numeric.honor_small); put_double (buf, value->numeric.x); put_string (buf, value->numeric.var_name); put_string (buf, value->numeric.value_label); @@ -595,7 +638,7 @@ put_value (struct buf *buf, const struct pivot_value *value) { put_byte (buf, 1); put_value_mod (buf, value, NULL); - put_format (buf, &value->numeric.format); + put_format (buf, &value->numeric.format, value->numeric.honor_small); put_double (buf, value->numeric.x); } break; @@ -603,8 +646,11 @@ put_value (struct buf *buf, const struct pivot_value *value) 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 }); + 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); @@ -687,7 +733,7 @@ put_category (struct buf *buf, const struct pivot_category *c) 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++) @@ -700,7 +746,7 @@ put_y0 (struct buf *buf, const struct pivot_table *table) { put_u32 (buf, table->settings.epoch); put_byte (buf, table->settings.decimal); - put_byte (buf, table->grouping); + put_byte (buf, ','); } static void @@ -720,17 +766,17 @@ put_custom_currency (struct buf *buf, const struct pivot_table *table) 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); } @@ -744,9 +790,8 @@ put_x2 (struct buf *buf) } 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); @@ -754,6 +799,26 @@ put_x3 (struct buf *buf, const struct pivot_table *table) 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); @@ -761,11 +826,7 @@ put_x3 (struct buf *buf, const struct pivot_table *table) 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 @@ -939,9 +1000,9 @@ put_light_table (struct buf *buf, uint64_t table_id, { 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);