Fwd: [PATCH] Limit to 4 the number of cylinders shown in the data frame
Dirk Hohndel
dirk at hohndel.org
Wed Dec 26 13:31:01 PST 2012
Begin forwarded message:
> From: Salvador Cuñat <salvador.cunat at gmail.com>
> Subject: Re: [PATCH] Limit to 4 the number of cylinders shown in the data frame
> Date: December 26, 2012 1:28:36 PM PST
> To: Dirk Hohndel <dirk at hohndel.org>
>
> Sorry, here they are.
>
> Regards.
>
> Salva
>
>
> 2012/12/26 Dirk Hohndel <dirk at hohndel.org>
>
> Were you planning to attach screenshots or pdfs?
>
> /D
>
> On Dec 26, 2012, at 1:25 PM, Salvador Cuñat wrote:
>
> > Good night.
> > Here are attached a pair of printouts of the test dives. I have modified a pair of them, adding more text, weight and dummy tank data.
> > As you can see, there is room for more data, probed they are not very big.
> >
> > Regards.
> >
> > Salva.
> >
> >
> > 2012/12/26 Salvador Cuñat <salvador.cunat at gmail.com>
> > For dives with more than 4 cylinders, the frame got very crowded and we
> > needed a magnifier to see the numbers.
> > If we used more than four tanks, let's put the info in another frame, if not, print
> > the OTUs, the maxcns and the weight sytem in the new frame.
> > There is still room for two more short data.
> >
> > There are issues with the size of some translations, and CNS hasn't been
> > translated (and I think it isn't worth the effort).
> >
> >
> > Signed-off-by: Salvador Cuñat <salvador.cunat at gmail.com>
> > ---
> > print.c | 350 ++++++++++++++++++++++++++++++++++++++++++++++----------------
> > 1 files changed, 259 insertions(+), 91 deletions(-)
> >
> > diff --git a/print.c b/print.c
> > index 368ab94..d061862 100644
> > --- a/print.c
> > +++ b/print.c
> > @@ -168,113 +168,281 @@ static void show_dive_notes(struct dive *dive, cairo_t *cr, double w,
> >
> > /*
> > * Show the tanks used in the dive, the mix, and the gas consumed
> > - * as pressures are shown in the plot
> > + * as pressures are shown in the plot. And other data if we used
> > + * less than four cilynders.
> > */
> > static void show_dive_tanks(struct dive *dive, cairo_t *cr, double w,
> > double h, PangoFontDescription *font)
> > {
> > - int maxwidth, maxheight, curwidth, height, decimals, n, i, z,
> > - cyl_wp, cyl_press, cyl_end;
> > - double cyl_cap, cyl_cons_gas;
> > - const char *unit_vol, *unit_press;
> > - char buffer[80], dataheader1[3][80]= { N_("Cylinder"), N_("Gasmix"), N_("Gas Used")};
> > - PangoLayout *layout;
> > + int maxwidth, maxheight, height, tank_count;
> > +
> > + /* Print the tank data */
> > + void print_tanks (int maxwidth, int maxheight, int height, int tank_count, int first_tank)
> > + {
> > + int curwidth, decimals, n, i, cyl_wp, cyl_press, cyl_end;
> > + double cyl_cap, cyl_cons_gas;
> > + const char *unit_vol, *unit_press;
> > + char buffer[80], dataheader1[3][80]= { N_("Cylinder"), N_("Gasmix"), N_("Gas Used")};
> > + PangoLayout *layout;
> > +
> > + /* First create a header */
> > + maxheight -= height / 6;
> > + curwidth = 0;
> > + for (i = 0; i < 3; i++) {
> > + cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > + layout = pango_cairo_create_layout(cr);
> > + pango_layout_set_height(layout,maxheight);
> > + pango_layout_set_width(layout, maxwidth / 3);
> > + pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
> > + if (tank_count < 4) {
> > + set_font(layout, font, FONT_SMALL - (0.5 * tank_count), PANGO_ALIGN_CENTER);
> > + } else {
> > + set_font(layout, font, FONT_SMALL - 2, PANGO_ALIGN_CENTER);
> > + }
> > + pango_layout_set_text(layout, _(dataheader1[i]), -1);
> > + pango_layout_set_justify(layout, 0);
> > + pango_cairo_show_layout(cr, layout);
> > + curwidth = curwidth + maxwidth/ 3;
> > + }
> > + /* Then the cylinder stuff */
> > + n = first_tank;
> > + while ( n < tank_count && n < first_tank + 4){
> > + cairo_translate (cr, 0, height / (double) PANGO_SCALE);
> > + cairo_move_to(cr, 0, 0);
> > + cyl_cap = get_volume_units(dive->cylinder[n].type.size.mliter, &decimals, &unit_vol);
> > + cyl_wp = get_pressure_units(dive->cylinder[n].type.workingpressure.mbar, &unit_press);
> > + cyl_press= get_pressure_units(dive->cylinder[n].start.mbar, &unit_press);
> > + cyl_end= get_pressure_units(dive->cylinder[n].end.mbar, &unit_press);
> > + cyl_cons_gas = (cyl_press - cyl_end) * cyl_cap;
> > + curwidth = 0;
> > + i = 0;
> > + while ( i < 3 ) {
> > + cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > + switch(i) {
> > + case 0 : if (prefs.output_units.volume == CUFT) {
> > + cyl_cap *= cyl_wp / 14.7 ;
> > + }
> > + snprintf(buffer, sizeof(buffer), _("%.*f %s"),
> > + decimals,
> > + cyl_cap,
> > + unit_vol);
> > + break;
> > + case 1 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > + if (dive->cylinder[n].gasmix.o2.permille == 0){
> > + snprintf(buffer, sizeof(buffer), _("air"));
> > + } else {
> > + snprintf(buffer, sizeof(buffer), _("%d/%d"),
> > + dive->cylinder[n].gasmix.o2.permille /10,
> > + dive->cylinder[n].gasmix.he.permille /10);
> > + }
> > + break;
> > + case 2 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > + if (prefs.output_units.volume == CUFT) {
> > + cyl_cons_gas /= 14.7 ;
> > + }
> > + snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
> > + decimals,
> > + cyl_cons_gas,
> > + unit_vol);
> > + break;
> > + default : snprintf(buffer, sizeof(buffer),"Error");
> > + }
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + curwidth += (maxwidth/ 3);
> > + i++;
> > + }
> > + maxheight -= height;
> > + n++;
> > + }
> > + cairo_translate(cr, -0, - ((h * PANGO_SCALE * 0.9) - maxheight) / PANGO_SCALE);
> > + g_object_unref (layout);
> > + }
> >
> > - /*Create a frame to separate tank area, note the scaling*/
> > - cairo_rectangle(cr, 0, 0 + h*0.05, w, h*0.9);
> > - cairo_set_line_width(cr, 0.01);
> > - cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
> > - cairo_stroke(cr);
> > + /* Calculate total weight
> > + * copy/paste from divelist.c
> > + */
> > + double total_weight(struct dive *dive)
> > + {
> > + int i, total_grams = 0;
> > +
> > + if (dive)
> > + for (i=0; i< MAX_WEIGHTSYSTEMS; i++)
> > + total_grams += dive->weightsystem[i].weight.grams;
> > + return total_grams;
> > + }
> > +
> > + /* Print weight system */
> > + void print_weight_data (int maxwidth, int maxheight, int height){
> > + int decimals,i;
> > + double totalweight, totalweightsystem, weightsystemcounter;
> > + const char *unit_weight;
> > + char buffer[80];
> > + PangoLayout *layout;
> >
> > - maxwidth = w * PANGO_SCALE;
> > - maxheight = h * PANGO_SCALE * 0.9;
> > + layout = pango_cairo_create_layout(cr);
> > + pango_layout_set_height(layout,maxheight);
> > + pango_layout_set_width(layout, maxwidth);
> > + pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
> > + set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_CENTER);
> >
> > - /* We need to know how many cylinders we used*/
> > - for (z = 0; z < MAX_CYLINDERS; z++ ){
> > - if (dive->cylinder[z].start.mbar == 0) {
> > - break;
> > + /* Header for the weight system */
> > + cairo_move_to(cr, 0, 0);
> > + snprintf (buffer, sizeof(buffer),_("Weight System"));
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > +
> > + /* Detail of the weight */
> > + cairo_translate (cr, 0, height / (3 * (double) PANGO_SCALE));
> > + set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
> > + weightsystemcounter = 0;
> > + for (i=0; i< MAX_WEIGHTSYSTEMS; i++){
> > + totalweightsystem = get_weight_units(dive->weightsystem[i].weight.grams, &decimals, &unit_weight);
> > + if (totalweightsystem == 0){
> > + }else{
> > + cairo_move_to(cr, 0, 0);
> > + snprintf(buffer, sizeof(buffer), _("%s"),dive->weightsystem[i].description);
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + cairo_move_to(cr,(2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
> > + decimals,
> > + totalweightsystem,
> > + unit_weight);
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + weightsystemcounter++;
> > + cairo_translate (cr, 0, height / (4 * (double) PANGO_SCALE));
> > + }
> > }
> > +
> > + /* Total weight of the system */
> > + totalweight = get_weight_units(total_weight(dive), &decimals, &unit_weight);
> > + cairo_translate (cr, 0, height / (4 * (double) PANGO_SCALE));
> > + cairo_move_to (cr, 0, 0);
> > + snprintf(buffer, sizeof(buffer), _("Total Weight:"));
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + cairo_move_to(cr,(2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
> > + decimals,
> > + totalweight,
> > + unit_weight);
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > +
> > + /* undo translations */
> > + cairo_translate (cr, 0, -(weightsystemcounter * height) / (4 * (double) PANGO_SCALE));
> > + cairo_translate (cr, 0, -height / (3 * (double) PANGO_SCALE));
> > + g_object_unref (layout);
> > }
> >
> > - /* to determine the distance between lines*/
> > - if (z == 0){
> > - height = maxheight / 1;
> > - } else {
> > - height = maxheight / (z + 1);
> > + /* Print the dive OTUs */
> > + void print_otus (int maxwidth, int maxheight){
> > + char buffer[20];
> > + PangoLayout *layout;
> > +
> > + layout = pango_cairo_create_layout(cr);
> > + pango_layout_set_height(layout, maxheight);
> > + pango_layout_set_width(layout, maxwidth);
> > + pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
> > + set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
> > +
> > + cairo_move_to (cr,(maxwidth*0.05) / ((double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), _("OTU"));
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + cairo_move_to (cr, (2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), "%d", dive->otu);
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + g_object_unref (layout);
> > }
> >
> > - /* Then create the layout.
> > - * First a header */
> > - cairo_translate (cr, 0, height / (6 * (double) PANGO_SCALE));
> > - maxheight -= height / 6;
> > - curwidth = 0;
> > - for (i = 0; i < 3; i++) {
> > - cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > + /* Print the dive maxCNS */
> > + void print_cns (int maxwidth, int maxheight){
> > + char buffer[20];
> > + PangoLayout *layout;
> > +
> > layout = pango_cairo_create_layout(cr);
> > - pango_layout_set_height(layout,maxheight);
> > - pango_layout_set_width(layout, maxwidth / 3);
> > + pango_layout_set_height(layout, maxheight);
> > + pango_layout_set_width(layout, maxwidth);
> > pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
> > - set_font(layout, font, FONT_SMALL * 0.10 *(11-z), PANGO_ALIGN_CENTER);
> > - pango_layout_set_text(layout, _(dataheader1[i]), -1);
> > - pango_layout_set_justify(layout, 0);
> > + set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
> > +
> > + cairo_move_to (cr,(maxwidth*0.05) / ((double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), _("Max. CNS"));
> > + pango_layout_set_text(layout, buffer, -1);
> > pango_cairo_show_layout(cr, layout);
> > - curwidth = curwidth + maxwidth/ 3;
> > + cairo_move_to (cr, (2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
> > + snprintf(buffer, sizeof(buffer), "%d", dive->maxcns);
> > + pango_layout_set_text(layout, buffer, -1);
> > + pango_cairo_show_layout(cr, layout);
> > + g_object_unref (layout);
> > }
> >
> > - /* Now the relevant info*/
> > - for (n = 0; n < z; n++) {
> > - cairo_translate (cr, 0, height / (double) PANGO_SCALE);
> > - cairo_move_to(cr, 0, 0);
> > + /*
> > + * The real show_dive_tanks stuff
> > + */
> > + maxwidth = w * PANGO_SCALE;
> > + maxheight = h * PANGO_SCALE * 0.9;
> >
> > - cyl_cap = get_volume_units(dive->cylinder[n].type.size.mliter, &decimals, &unit_vol);
> > - cyl_wp = get_pressure_units(dive->cylinder[n].type.workingpressure.mbar, &unit_press);
> > - cyl_press= get_pressure_units(dive->cylinder[n].start.mbar, &unit_press);
> > - cyl_end= get_pressure_units(dive->cylinder[n].end.mbar, &unit_press);
> > - cyl_cons_gas = (cyl_press - cyl_end) * cyl_cap;
> > + /* We need to know how many cylinders we used*/
> > + for ( tank_count = 0; tank_count < MAX_CYLINDERS; tank_count++ ){
> > + if (dive->cylinder[tank_count].start.mbar == 0) {
> > + break;
> > + }
> > + }
> >
> > - curwidth = 0;
> > - i = 0;
> > - while ( i < 3 ) {
> > - cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > - switch(i) {
> > - case 0 : if (prefs.output_units.volume == CUFT) {
> > - cyl_cap *= cyl_wp / 14.7 ;
> > - }
> > - snprintf(buffer, sizeof(buffer), _("%.*f %s"),
> > - decimals,
> > - cyl_cap,
> > - unit_vol);
> > - break;
> > - case 1 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > - if (dive->cylinder[n].gasmix.o2.permille == 0){
> > - snprintf(buffer, sizeof(buffer), _("air"));
> > -
> > - } else {
> > - snprintf(buffer, sizeof(buffer), _("%d/%d"),
> > - dive->cylinder[n].gasmix.o2.permille /10,
> > - dive->cylinder[n].gasmix.he.permille /10);
> > - }
> > - break;
> > - case 2 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
> > - if (prefs.output_units.volume == CUFT) {
> > - cyl_cons_gas /= 14.7 ;
> > - }
> > - snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
> > - decimals,
> > - cyl_cons_gas,
> > - unit_vol);
> > - break;
> > - default : snprintf(buffer, sizeof(buffer),"Error");
> > - }
> > - pango_layout_set_text(layout, buffer, -1);
> > - pango_cairo_show_layout(cr, layout);
> > - curwidth += (maxwidth/ 3);
> > - i += 1;
> > + /* and determine the distance between lines*/
> > + if (tank_count == 0) {
> > + height = maxheight;
> > + } else {
> > + if ( tank_count<=4 ) {
> > + height = maxheight / (tank_count + 1);
> > + } else {
> > + height = maxheight / 5;
> > }
> > - maxheight -= height;
> > }
> > - cairo_translate(cr,0, - ((h * PANGO_SCALE * 0.9) - maxheight) / PANGO_SCALE);
> > - g_object_unref(layout);
> > +
> > + /*Create a frame to separate tank area, note the scaling*/
> > + cairo_set_line_width(cr, 0.01);
> > + cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
> > + cairo_rectangle(cr, 0, h*0.02, w, h*0.95);
> > + cairo_stroke(cr);
> > + cairo_translate (cr, 0, height / (6 * (double) PANGO_SCALE));
> > +
> > + print_tanks (maxwidth, maxheight, height, tank_count, 0);
> > +
> > + cairo_set_line_width(cr, 0.01);
> > + cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
> > + cairo_rectangle(cr, w, h*0.02, w, h*0.95);
> > + cairo_stroke(cr);
> > +
> > + /* If there are more than 4 tanks use the full width, else print other data*/
> > + if (tank_count > 4){
> > + cairo_translate (cr, w, height / (6 * (double) PANGO_SCALE));
> > + print_tanks (maxwidth, maxheight, height, tank_count, 4);
> > + cairo_translate (cr, -w, -height / (6 * (double) PANGO_SCALE));
> > + } else {
> > + /* Plot a grid for the data */
> > + cairo_move_to(cr, 3*w/2, h*0.05);
> > + cairo_line_to (cr, 3*w/2, h);
> > + cairo_move_to (cr, w, ((h * 0.9)/4) + (h*0.05));
> > + cairo_line_to (cr, 3*w/2, ((h * 0.9)/4) + (h*0.05));
> > + cairo_move_to (cr, w, ((h * 0.9)*2/4) + (h*0.05));
> > + cairo_line_to (cr, 3*w/2, ((h * 0.9)*2/4) + (h*0.05));
> > + cairo_stroke (cr);
> > + /* and print OTUs, CNS and weight */
> > + cairo_translate (cr, (3.05*w/2), height / (6 * (double) PANGO_SCALE));
> > + print_weight_data (maxwidth * 0.90/2 , maxheight, maxheight / 2);
> > + cairo_translate (cr, -(3.05*w/2), -height / (6 * (double) PANGO_SCALE));
> > + cairo_translate (cr, w, 0);
> > + print_otus (maxwidth * 0.90/2, maxheight);
> > + cairo_translate (cr, 0, h/4);
> > + print_cns (maxwidth * 0.90/2, maxheight);
> > + cairo_translate (cr, -w, -h/4);
> > + }
> > }
> >
> > static void show_table_header(cairo_t *cr, double w, double h,
> > @@ -453,17 +621,17 @@ static void print(int divenr, cairo_t *cr, double x, double y, double w,
> > cairo_scale(cr, 0.5, 0.5);
> >
> > /* Dive plot in the upper two thirds - note the scaling */
> > - show_dive_profile(dive, cr, w*2, h*1.33);
> > + show_dive_profile(dive, cr, w*2, h*1.30);
> >
> > /* Dive information in the lower third */
> > - cairo_translate(cr, 0, h*1.33);
> > + cairo_translate(cr, 0, h*1.30);
> > show_dive_header(dive, cr, w*2, h*0.15, font);
> >
> > cairo_translate(cr, 0, h*0.15);
> > - show_dive_tanks (dive, cr, w*1, h*0.20, font);
> > + show_dive_tanks (dive, cr, w*1, h*0.25, font);
> >
> > - cairo_translate(cr, 0, h*0.20);
> > - show_dive_notes(dive, cr, w*2, h*0.32, font);
> > + cairo_translate(cr, 0, h*0.25);
> > + show_dive_notes(dive, cr, w*2, h*0.30, font);
> >
> > cairo_restore(cr);
> > }
> > --
> > 1.7.2.5
> >
> > _______________________________________________
> > subsurface mailing list
> > subsurface at hohndel.org
> > http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20121226/419ede2c/attachment-0003.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 1xpage_test_dives.pdf
Type: application/pdf
Size: 70390 bytes
Desc: not available
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20121226/419ede2c/attachment-0002.pdf>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20121226/419ede2c/attachment-0004.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 6xpage_test_dives.pdf
Type: application/pdf
Size: 164475 bytes
Desc: not available
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20121226/419ede2c/attachment-0003.pdf>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20121226/419ede2c/attachment-0005.html>
More information about the subsurface
mailing list