示例#1
0
GtkWidget *
gog_barcol_plot_pref (GogBarColPlot *barcol, GOCmdContext *cc)
{
	GtkWidget  *w;
	GtkBuilder *gui =
		go_gtk_builder_load ("res:go:plot_barcol/gog-barcol-prefs.ui",
				    GETTEXT_PACKAGE, cc);
        if (gui == NULL)
                return NULL;

	w = go_gtk_builder_get_widget (gui, "gap_spinner");
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), barcol->gap_percentage);
	g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
		"value_changed",
		G_CALLBACK (cb_gap_changed), barcol);

	w = go_gtk_builder_get_widget (gui, "overlap_spinner");
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), barcol->overlap_percentage);
	g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
		"value_changed",
		G_CALLBACK (cb_overlap_changed), barcol);

	w = go_gtk_builder_get_widget (gui, "before-grid");
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
			(GOG_PLOT (barcol))->rendering_order == GOG_PLOT_RENDERING_BEFORE_GRID);
	g_signal_connect (G_OBJECT (w),
		"toggled",
		G_CALLBACK (display_before_grid_cb), barcol);

	w = GTK_WIDGET (g_object_ref (gtk_builder_get_object (gui, "gog-barcol-prefs")));
	g_object_unref (gui);

	return w;
}
示例#2
0
static void
gog_matrix_plot_init (GogMatrixPlot *matrix)
{
	GogPlot *plot = GOG_PLOT (matrix);

	plot->rendering_order = GOG_PLOT_RENDERING_BEFORE_GRID;
}
示例#3
0
文件: gog-chart.c 项目: GNOME/goffice
static void
role_plot_post_add (GogObject *parent, GogObject *plot)
{
	GogChart *chart = GOG_CHART (parent);
	gboolean ok = TRUE;
	GogPlotClass *plot_klass = GOG_PLOT_CLASS (G_OBJECT_GET_CLASS (plot));
	GogAxisSet axis_set = plot_klass->axis_set & ~GOG_AXIS_SET_FUNDAMENTAL;

	if (axis_set) {
		int i = GOG_AXIS_VIRTUAL, j = 1 << GOG_AXIS_VIRTUAL;
		for (; i < GOG_AXIS_TYPES; i++, j <<= 1)
			if ((axis_set & j) != 0 && (chart->axis_set & j) == 0) {
				GogObject *axis = GOG_OBJECT (g_object_new (GOG_TYPE_AXIS, "type", i, NULL));
				chart->axis_set |= j;
				switch (i) {
				case GOG_AXIS_PSEUDO_3D:
					gog_object_add_by_name (GOG_OBJECT (chart), "Pseudo-3D-Axis", axis);
					break;
				case GOG_AXIS_COLOR:
					gog_object_add_by_name (GOG_OBJECT (chart), "Color-Axis", axis);
					break;
				case GOG_AXIS_BUBBLE:
					gog_object_add_by_name (GOG_OBJECT (chart), "Bubble-Axis", axis);
					break;
				default:
					g_warning ("Unknown axis type: %x\n", i);
				}
			}
	}
	/* APPEND to keep order, there won't be that many */
	chart->plots = g_slist_append (chart->plots, plot);
	gog_chart_request_cardinality_update (chart);

	if (chart->plots->next == NULL)
		ok = gog_chart_axis_set_assign (chart,
			gog_plot_axis_set_pref (GOG_PLOT (plot)));
	ok |= gog_plot_axis_set_assign (GOG_PLOT (plot),
		chart->axis_set);

	/* a quick post condition to keep us on our toes */
	g_return_if_fail (ok);
}
示例#4
0
文件: gog-chart.c 项目: GNOME/goffice
static void
gog_chart_view_render (GogView *view, GogViewAllocation const *bbox)
{
	GSList *ptr;
	GogView *child_view;
	gboolean grid_line_rendered = FALSE;
	GogChart *chart = GOG_CHART (gog_view_get_model (view));

	cview_parent_klass->render (view, bbox);

	if (gog_chart_is_3d (chart)) {
		for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
			child_view = ptr->data;
			if (!GOG_IS_AXIS (child_view->model) && !GOG_IS_PLOT (child_view->model) && !GOG_IS_LABEL (child_view->model))
				gog_view_render	(ptr->data, bbox);
		}
		/* now render plot and axes */
		for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
			child_view = ptr->data;
			if (!GOG_IS_AXIS (child_view->model))
				continue;
			gog_view_render (ptr->data, bbox);
			grid_line_render (ptr, bbox);
		}
		for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
			child_view = ptr->data;
			if (!GOG_IS_PLOT (child_view->model))
				continue;
			gog_view_render	(ptr->data, bbox);
		}
	} else {
		/* KLUDGE: render grid lines before axis */
		for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
			child_view = ptr->data;
			if (!grid_line_rendered && GOG_IS_AXIS (child_view->model)) {
				plot_render (view, bbox, GOG_PLOT_RENDERING_BEFORE_GRID);
				grid_line_render (ptr, bbox);
				plot_render (view, bbox, GOG_PLOT_RENDERING_BEFORE_AXIS);
				grid_line_rendered = TRUE;
			}
			if (GOG_IS_PLOT (child_view->model)) {
			    if (!GOG_PLOT (child_view->model)->rendering_order)
				gog_view_render	(ptr->data, bbox);
			} else if (!GOG_IS_LABEL (child_view->model))
				gog_view_render	(ptr->data, bbox);
		}
	}
	for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
		child_view = ptr->data;
		if (!GOG_IS_LABEL (child_view->model))
			continue;
		gog_view_render	(ptr->data, bbox);
	}
}
示例#5
0
文件: gog-chart.c 项目: GNOME/goffice
static void
plot_render (GogView *view, GogViewAllocation const *bbox, GogPlotRenderingOrder order)
{
	GSList *ptr;
	GogView *child_view;

	/* Render some plots before axes */
	for (ptr = view->children ; ptr != NULL ; ptr = ptr->next) {
		child_view = ptr->data;
		if (GOG_IS_PLOT (child_view->model) &&
		    GOG_PLOT (child_view->model)->rendering_order == order)
			gog_view_render	(ptr->data, bbox);
	}
}
示例#6
0
static void
gog_pie_plot_set_property (GObject *obj, guint param_id,
			   GValue const *value, GParamSpec *pspec)
{
	GogPiePlot *pie = GOG_PIE_PLOT (obj);

	switch (param_id) {
	case PLOT_PROP_INITIAL_ANGLE: {
		double a = g_value_get_double (value);
		a = fmod (a, 360);
		if (a < 0) a += 360;
		pie->initial_angle = a;
		break;
	}
	case PLOT_PROP_DEFAULT_SEPARATION: {
		double f = g_value_get_double (value);
		pie->default_separation = CLAMP (f, 0., 5.);
		break;
	}
	case PLOT_PROP_IN_3D:
		pie->in_3d = g_value_get_boolean (value);
		break;
	case PLOT_PROP_SPAN:
		pie->span = g_value_get_double (value);
		break;
	case PLOT_PROP_SHOW_NEGS : {
		GSList *ptr = GOG_PLOT (obj)->series;
		pie->show_negatives = gog_show_neg_mode_from_str (g_value_get_string (value));
		/* we need to update all the series */
		while (ptr) {
			gog_object_request_update (GOG_OBJECT (ptr->data));
			ptr = ptr->next;
		}
		break;
	}

	default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
		 return; /* NOTE : RETURN */
	}

	/* none of the attributes triggers a size change yet.
	 * When we add data labels we'll need it */
	gog_object_emit_changed (GOG_OBJECT (obj), FALSE);
}
示例#7
0
static void
gog_xy_dropbar_get_property (GObject *obj, guint param_id,
		     GValue *value, GParamSpec *pspec)
{
	GogPlot *plot = GOG_PLOT (obj);
	GogXYDropBarPlot *dropbar = GOG_XY_DROPBAR_PLOT (obj);

	switch (param_id) {
	case XY_DROPBAR_PROP_FILL_BEFORE_GRID:
		g_value_set_boolean (value, plot->rendering_order == GOG_PLOT_RENDERING_BEFORE_GRID);
		break;
	case XY_DROPBAR_PROP_HORIZONTAL:
		g_value_set_boolean (value, dropbar->horizontal);
		break;
	case XY_DROPBAR_PROP_WIDTH:
		g_value_set_double (value, dropbar->width);
		break;
	default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
		 break;
	}
}
示例#8
0
文件: gog-chart.c 项目: GNOME/goffice
static void
role_plot_pre_remove (GogObject *parent, GogObject *plot)
{
	GogChart *chart = GOG_CHART (parent);
	gog_plot_axis_clear (GOG_PLOT (plot), GOG_AXIS_SET_ALL);
	chart->plots = g_slist_remove (chart->plots, plot);
	gog_chart_request_cardinality_update (chart);

	if (chart->plots == NULL)
		gog_chart_axis_set_assign (chart, GOG_AXIS_SET_UNKNOWN);

	if (chart->grid != NULL &&
	    chart->axis_set != GOG_AXIS_SET_XY &&
	    chart->axis_set != GOG_AXIS_SET_X &&
	    chart->axis_set != GOG_AXIS_SET_XY_pseudo_3d &&
	    chart->axis_set != GOG_AXIS_SET_XY_COLOR &&
	    chart->axis_set != GOG_AXIS_SET_RADAR) {
		GogObject *grid = chart->grid; /* clear_parent clears ::grid */
		gog_object_clear_parent (GOG_OBJECT (grid));
		g_object_unref (grid);
	}
}
示例#9
0
static void
gog_xy_dropbar_set_property (GObject *obj, guint param_id,
		     GValue const *value, GParamSpec *pspec)
{
	GogPlot *plot = GOG_PLOT (obj);
	GogXYDropBarPlot *dropbar = GOG_XY_DROPBAR_PLOT (obj);
	switch (param_id) {
	case XY_DROPBAR_PROP_FILL_BEFORE_GRID:
		plot->rendering_order = (g_value_get_boolean (value))?
					 GOG_PLOT_RENDERING_BEFORE_GRID:
					 GOG_PLOT_RENDERING_LAST;
		break;
	case XY_DROPBAR_PROP_HORIZONTAL:
		dropbar->horizontal = g_value_get_boolean (value);
		break;
	case XY_DROPBAR_PROP_WIDTH:
		dropbar->width = g_value_get_double (value);
		break;
	default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
		 return;
	}
	gog_object_emit_changed (GOG_OBJECT (obj), FALSE);
}
示例#10
0
static void
gog_xy_dropbar_populate_editor (GogObject *obj,
			     GOEditor *editor,
                             GogDataAllocator *dalloc,
                             GOCmdContext *cc)
{
#ifdef GOFFICE_WITH_GTK
	GogXYDropBarPlot *dropbar = GOG_XY_DROPBAR_PLOT (obj);
	GtkBuilder *gui =
		go_gtk_builder_load ("res:go:plot_xy/gog-xy-dropbar-prefs.ui",
				    GETTEXT_PACKAGE, cc);

	if (gui != NULL) {
		GtkWidget *w = go_gtk_builder_get_widget (gui, "before-grid");
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w),
				(GOG_PLOT (obj))->rendering_order == GOG_PLOT_RENDERING_BEFORE_GRID);
		g_signal_connect (G_OBJECT (w),
			"toggled",
			G_CALLBACK (display_before_grid_cb), obj);
		w = go_gtk_builder_get_widget (gui, "horizontal");
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), dropbar->horizontal);
		g_signal_connect (G_OBJECT (w),
			"toggled",
			G_CALLBACK (horizontal_cb), obj);
		w = go_gtk_builder_get_widget (gui, "width-btn");
		gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), dropbar->width);
		g_signal_connect (G_OBJECT (w),
			"value_changed",
			G_CALLBACK (value_changed_cb), obj);
		w = go_gtk_builder_get_widget (gui, "gog-xy-dropbar-prefs");
		go_editor_add_page (editor, w, _("Properties"));
		g_object_unref (gui);
	}

#endif
	gog_xy_dropbar_parent_klass->populate_editor (obj, editor, dalloc, cc);
};
示例#11
0
static void
gog_xy_dropbar_view_render (GogView *view, GogViewAllocation const *bbox)
{
	GogXYDropBarPlot const *model = GOG_XY_DROPBAR_PLOT (view->model);
	GogPlot *plot = GOG_PLOT (model);
	GogSeries const *series;
	GogAxisMap *x_map, *y_map, *val_map, *index_map;
	GogViewAllocation work;
	double *pos_vals, *start_vals, *end_vals;
	unsigned i;
	GSList *ptr;
	unsigned n, tmp, num_series;
	GOStyle *neg_style;

	for (num_series = 0, ptr = plot->series ; ptr != NULL ; ptr = ptr->next, num_series++);
	if (num_series < 1)
		return;

	x_map = gog_axis_map_new (GOG_PLOT (model)->axis[0],
				  view->allocation.x, view->allocation.w);
	y_map = gog_axis_map_new (GOG_PLOT (model)->axis[1], view->allocation.y + view->allocation.h,
				  -view->allocation.h);

	if (!(gog_axis_map_is_valid (x_map) &&
	      gog_axis_map_is_valid (y_map))) {
		gog_axis_map_free (x_map);
		gog_axis_map_free (y_map);
		return;
	}

	work.w = view->allocation.w * model->width / 100.;
	for (ptr = plot->series ; ptr != NULL ; ptr = ptr->next) {
		series = ptr->data;
		if (!gog_series_is_valid (GOG_SERIES (series)))
			continue;
		neg_style = go_style_dup ((GOG_STYLED_OBJECT (series))->style);
		neg_style->line.color ^= 0xffffff00;
		neg_style->fill.pattern.back ^= 0xffffff00;
		neg_style->fill.pattern.fore ^= 0xffffff00;
		pos_vals = go_data_get_values (series->values[0].data);
		n = go_data_get_vector_size (series->values[1].data);
		start_vals = go_data_get_values (series->values[1].data);
		tmp = go_data_get_vector_size (series->values[1].data);
		if (n > tmp)
			n = tmp;
		end_vals = go_data_get_values (series->values[2].data);
		tmp = go_data_get_vector_size (series->values[2].data);
		if (n > tmp)
			n = tmp;

		if (model->horizontal) {
			index_map = y_map;
			val_map = x_map;
		} else {
			index_map = x_map;
			val_map = y_map;
		}
		for (i = 0; i < n; i++) {
			work.x = pos_vals[i];
			work.y = start_vals[i];
			work.h = end_vals[i] - work.y;
			if (!gog_axis_map_finite (index_map, work.x) ||
				!gog_axis_map_finite (val_map, start_vals[i]) ||
				!gog_axis_map_finite (val_map, end_vals[i]))
				continue;
			gog_renderer_push_style (view->renderer, (start_vals[i] <= end_vals[i])?
						GOG_STYLED_OBJECT (series)->style: neg_style);
			barcol_draw_rect (view->renderer, model->horizontal, x_map, y_map, &work);
			gog_renderer_pop_style (view->renderer);
		}
		g_object_unref (neg_style);
	}

	gog_axis_map_free (x_map);
	gog_axis_map_free (y_map);
}
示例#12
0
GtkWidget *
gog_xyz_surface_plot_pref (GogXYZPlot *plot, GogDataAllocator *dalloc, GOCmdContext *cc)
{
	GogDataset *set = GOG_DATASET (plot);
	XYZSurfPrefsState *state;
	GtkWidget  *w, *grid;
	GtkBuilder *gui =
		go_gtk_builder_load ("res:go:plot_surface/gog-xyz-surface-prefs.ui",
				    GETTEXT_PACKAGE, cc);

        if (gui == NULL)
                return NULL;

	state = g_new (XYZSurfPrefsState, 1);
	state->plot = plot;

	state->x_spin = w = go_gtk_builder_get_widget (gui, "columns_spinner");
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), plot->columns);
	g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
		"value_changed",
		G_CALLBACK (cb_columns_changed), plot);
	state->x_label = go_gtk_builder_get_widget (gui, "cols-nb-lbl");

	grid = go_gtk_builder_get_widget (gui, "gog-xyz-surface-prefs");
	state->x_entry = GTK_WIDGET (gog_data_allocator_editor (dalloc, set, 0, GOG_DATA_VECTOR));
	gtk_widget_show_all (state->x_entry);
	gtk_widget_set_margin_left (state->x_entry, 12);
	gtk_grid_attach (GTK_GRID (grid), state->x_entry, 0, 2, 3, 1);
	w = go_gtk_builder_get_widget (gui, "preset-cols-btn");
	if (!state->plot->auto_x) {
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
		gtk_widget_hide (state->x_spin);
		gtk_widget_hide (state->x_label);
	} else
		gtk_widget_hide (state->x_entry);
	w = go_gtk_builder_get_widget (gui, "calc-cols-btn");
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_cols_toggled), state);

	state->y_spin = w = go_gtk_builder_get_widget (gui, "rows_spinner");
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), plot->rows);
	g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))),
		"value_changed",
		G_CALLBACK (cb_rows_changed), plot);
	state->y_label = go_gtk_builder_get_widget (gui, "rows-nb-lbl");

	state->y_entry = GTK_WIDGET (gog_data_allocator_editor (dalloc, set, 1, GOG_DATA_VECTOR));
	gtk_widget_show_all (state->y_entry);
	gtk_widget_set_margin_left (state->y_entry, 12);
	gtk_grid_attach (GTK_GRID (grid), state->y_entry, 0, 5, 3, 1);
	w = go_gtk_builder_get_widget (gui, "preset-rows-btn");
	if (!state->plot->auto_y) {
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE);
		gtk_widget_hide (state->y_spin);
		gtk_widget_hide (state->y_label);
	} else
		gtk_widget_hide (state->y_entry);
	w = go_gtk_builder_get_widget (gui, "calc-rows-btn");
	g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_rows_toggled), state);

	w = go_gtk_builder_get_widget (gui, "missing-as-btn");
	if (GOG_PLOT (plot)->desc.series.num_dim == 2) {
		gboolean as_density;
		gtk_widget_hide (w);
		gtk_widget_hide (go_gtk_builder_get_widget (gui, "missing-lbl"));
		w = gtk_check_button_new_with_label (_("Display population density"));
		gtk_container_add (GTK_CONTAINER (grid), w);
		gtk_widget_show (w);
		g_object_get (plot, "as-density", &as_density, NULL);
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), as_density);
		g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_as_density_toggled), state);
	} else {
		char const *missing;
		g_object_get (plot, "missing-as", &missing, NULL);
		gtk_combo_box_set_active (GTK_COMBO_BOX (w), missing_as_value (missing));
		g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (cb_missing_as_changed), state);
	}

	w = GTK_WIDGET (g_object_ref (grid));
	g_object_set_data_full (G_OBJECT (w), "state", state, g_free);
	g_object_unref (gui);

	return w;
}
示例#13
0
static void
gog_matrix_view_render (GogView *view, GogViewAllocation const *bbox)
{
	GogXYZPlot const *plot = GOG_XYZ_PLOT (view->model);
	GogSeries const *series;
	GOData *x_vec = NULL, *y_vec = NULL;
	GogAxisMap *x_map, *y_map, *z_map;
	GogAxisColorMap const *color_map = gog_axis_get_color_map (gog_plot_get_axis (GOG_PLOT (view->model), GOG_AXIS_COLOR));
	unsigned i, imax, j, jmax;
	double max, *data, z;
	GogRenderer *rend = view->renderer;
	GOStyle *style;
	gboolean xdiscrete, ydiscrete, hide_outliers = TRUE;
	GogViewAllocation rect;

	if (plot->base.series == NULL)
		return;
	series = GOG_SERIES (plot->base.series->data);
	if (plot->transposed) {
		imax = plot->columns;
		jmax = plot->rows;
	} else {
		imax = plot->rows;
		jmax = plot->columns;
	}
	if (imax == 0 || jmax == 0)
		return;

	if (plot->plotted_data)
		data = plot->plotted_data;
	else
		data = GOG_XYZ_PLOT (plot)->plotted_data = gog_matrix_plot_build_matrix (GOG_XYZ_PLOT (plot), NULL);

	x_map = gog_axis_map_new (plot->base.axis[0],
				  view->residual.x , view->residual.w);
	y_map = gog_axis_map_new (plot->base.axis[1],
				  view->residual.y + view->residual.h,
				  -view->residual.h);

	if (!(gog_axis_map_is_valid (x_map) &&
	      gog_axis_map_is_valid (y_map))) {
		gog_axis_map_free (x_map);
		gog_axis_map_free (y_map);
		return;
	}

	max = gog_axis_color_map_get_max (color_map);
	z_map = gog_axis_map_new (plot->base.axis[GOG_AXIS_COLOR], 0, max);

	xdiscrete = gog_axis_is_discrete (plot->base.axis[0]) ||
			series->values[(plot->transposed)? 1: 0].data == NULL;
	if (!xdiscrete)
		x_vec = gog_xyz_plot_get_x_vals (GOG_XYZ_PLOT (plot));
	ydiscrete = gog_axis_is_discrete (plot->base.axis[1]) ||
			series->values[(plot->transposed)? 0: 1].data == NULL;
	if (!ydiscrete)
		y_vec = gog_xyz_plot_get_y_vals (GOG_XYZ_PLOT (plot));
	/* clip to avoid problems with logarithmic axes */
	gog_renderer_push_clip_rectangle (rend, view->residual.x, view->residual.y,
					  view->residual.w, view->residual.h);

	style = go_style_new ();
	style->interesting_fields = GO_STYLE_FILL;
	style->disable_theming = GO_STYLE_ALL;
	style->fill.type = GO_STYLE_FILL_PATTERN;
	style->fill.pattern.pattern = GO_PATTERN_SOLID;
	gog_renderer_push_style (rend, style);

	for (j = 0; j < jmax; j++) {
		if (xdiscrete) {
			rect.x = gog_axis_map_to_view (x_map, j);
			rect.w = gog_axis_map_to_view (x_map, j + 1) - rect.x;
		} else {
			rect.x = gog_axis_map_to_view (x_map, go_data_get_vector_value (x_vec, j));
			rect.w = gog_axis_map_to_view (x_map, go_data_get_vector_value (x_vec, j + 1)) - rect.x;
		}

		for (i = 0; i < imax; i++) {
			if (ydiscrete) {
				rect.y = gog_axis_map_to_view (y_map, i);
				rect.h = gog_axis_map_to_view (y_map, i + 1) - rect.y;
			} else {
				rect.y = gog_axis_map_to_view (y_map, go_data_get_vector_value (y_vec, i));
				rect.h = gog_axis_map_to_view (y_map, go_data_get_vector_value (y_vec, i + 1)) - rect.y;
			}
			z = data[(i) * jmax + j];
			if (gog_axis_map_finite (z_map, z)) {
				double zc = gog_axis_map_to_view (z_map, z);
				if (hide_outliers && (zc < 0 || zc > max))
					style->fill.pattern.back = 0;
				else
					style->fill.pattern.back = gog_axis_color_map_get_color (color_map, CLAMP (zc, 0, max));
			} else
				style->fill.pattern.back = 0;
			gog_renderer_draw_rectangle (rend, &rect);
		}
	}

	gog_renderer_pop_style (rend);
	gog_renderer_pop_clip (rend);
	g_object_unref (style);
	gog_axis_map_free (x_map);
	gog_axis_map_free (y_map);
	gog_axis_map_free (z_map);
	if (!plot->plotted_data)
		g_free (data);
}