Change plot routine to take a drawing_area as argument

Previously we passed in width and height and the routine itself decided to
keep 5% margin around each edge - oddly doing this with double precision,
even though this is all integer coordinates.

Instead we are now passing in a drawing_area. We are kind of abusing the
cairo_rectangle_int_t data type here - but it seemed silly to redefine a
new data type for this.
Width and height give the size of the TOTAL drawing area (as before).
x and y give the offset from the edges - so the EFFECTIVE drawing area is
width-2x and height-2y
This is in preparation for adding tooltips - those need to know the
coordinate offsets from the edges - so having this hard coded inside the
plot function didn't make sense anymore.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2011-10-04 12:14:26 -07:00
parent d7e35c512c
commit b72ade0e78
4 changed files with 15 additions and 14 deletions

View file

@ -22,7 +22,7 @@ struct graphics_context {
double topy, bottomy; double topy, bottomy;
}; };
extern void plot(struct graphics_context *gc, int w, int h, struct dive *dive); extern void plot(struct graphics_context *gc, cairo_rectangle_int_t *drawing_area, struct dive *dive);
extern void set_source_rgb(struct graphics_context *gc, double r, double g, double b); extern void set_source_rgb(struct graphics_context *gc, double r, double g, double b);
#endif #endif

View file

@ -674,18 +674,21 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer
{ {
struct dive *dive = current_dive; struct dive *dive = current_dive;
struct graphics_context gc = { .printer = 0 }; struct graphics_context gc = { .printer = 0 };
int w,h; static cairo_rectangle_int_t drawing_area;
w = widget->allocation.width; /* the drawing area gives TOTAL width * height - x,y is used as the topx/topy offset
h = widget->allocation.height; * so effective drawing area is width-2x * height-2y */
drawing_area.width = widget->allocation.width;
drawing_area.height = widget->allocation.height;
drawing_area.x = drawing_area.width / 20.0;
drawing_area.y = drawing_area.height / 20.0;
gc.cr = gdk_cairo_create(widget->window); gc.cr = gdk_cairo_create(widget->window);
set_source_rgb(&gc, 0, 0, 0); set_source_rgb(&gc, 0, 0, 0);
cairo_paint(gc.cr); cairo_paint(gc.cr);
if (dive) if (dive)
plot(&gc, w, h, dive); plot(&gc, &drawing_area, dive);
cairo_destroy(gc.cr); cairo_destroy(gc.cr);
return FALSE; return FALSE;

View file

@ -127,12 +127,13 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
static void show_dive_profile(struct dive *dive, cairo_t *cr, double w, double h) static void show_dive_profile(struct dive *dive, cairo_t *cr, double w, double h)
{ {
cairo_rectangle_int_t drawing_area = { w/20.0, h/20.0, w, h};
struct graphics_context gc = { struct graphics_context gc = {
.printer = 1, .printer = 1,
.cr = cr .cr = cr
}; };
cairo_save(cr); cairo_save(cr);
plot(&gc, w, h, dive); plot(&gc, &drawing_area, dive);
cairo_restore(cr); cairo_restore(cr);
} }

View file

@ -722,14 +722,11 @@ static struct plot_info *create_plot_info(struct dive *dive)
return analyze_plot_info(pi); return analyze_plot_info(pi);
} }
void plot(struct graphics_context *gc, int w, int h, struct dive *dive) void plot(struct graphics_context *gc, cairo_rectangle_int_t *drawing_area, struct dive *dive)
{ {
double topx, topy;
struct plot_info *pi = create_plot_info(dive); struct plot_info *pi = create_plot_info(dive);
topx = w / 20.0; cairo_translate(gc->cr, drawing_area->x, drawing_area->y);
topy = h / 20.0;
cairo_translate(gc->cr, topx, topy);
cairo_set_line_width(gc->cr, 2); cairo_set_line_width(gc->cr, 2);
cairo_set_line_cap(gc->cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_cap(gc->cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join(gc->cr, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join(gc->cr, CAIRO_LINE_JOIN_ROUND);
@ -741,8 +738,8 @@ void plot(struct graphics_context *gc, int w, int h, struct dive *dive)
* *
* Snif. What a pity. * Snif. What a pity.
*/ */
gc->maxx = (w - 2*topx); gc->maxx = (drawing_area->width - 2*drawing_area->x);
gc->maxy = (h - 2*topy); gc->maxy = (drawing_area->height - 2*drawing_area->y);
/* Temperature profile */ /* Temperature profile */
plot_temperature_profile(gc, pi); plot_temperature_profile(gc, pi);