/* This is -*- C -*- */ /* $Id: guppi-axis-print.c,v 1.16 2001/10/15 20:58:40 trow Exp $ */ /* * guppi-axis-print.c * * Copyright (C) 2000 EMC Capital Management, Inc. * Copyright (C) 2001 The Free Software Foundation * * Developed by Jon Trowbridge and * Havoc Pennington . * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ #include #include "guppi-axis-print.h" #include #include #include "guppi-axis-state.h" #include "guppi-axis-view.h" static GtkObjectClass *parent_class = NULL; static void guppi_axis_print_finalize (GtkObject *obj) { if (parent_class->finalize) parent_class->finalize (obj); } /**************************************************************************/ static void print (GuppiElementPrint *ep) { GuppiAxisState *state = GUPPI_AXIS_STATE (guppi_element_print_state (ep)); GuppiElementView *view = guppi_element_print_view (ep); double bbx0, bbx1, bby0, bby1; gchar *legend_text; guppi_compass_t position; gboolean show_edge, shrink_labels_to_fit, horizontal, rotate_labels; double edge_thickness; GnomeFont *lfont; guint32 lcolor, edge_color; guppi_element_print_get_bbox (ep, &bbx0, &bby0, &bbx1, &bby1); guppi_element_state_get (GUPPI_ELEMENT_STATE (state), "position", &position, "show_edge", &show_edge, "shrink_labels_to_fit", &shrink_labels_to_fit, "rotate_labels", &rotate_labels, "edge_thickness", &edge_thickness, "edge_color", &edge_color, "legend_font", &lfont, "legend_color", &lcolor, NULL); horizontal = position == GUPPI_NORTH || position == GUPPI_SOUTH; /* Draw edge */ if (show_edge) { double x0 = 0, y0 = 0, x1 = 0, y1 = 0; switch (position) { case GUPPI_NORTH: x0 = bbx0; x1 = bbx1; y0 = y1 = bby0; break; case GUPPI_SOUTH: x0 = bbx0; x1 = bbx1; y0 = y1 = bby1; break; case GUPPI_WEST: x0 = x1 = bbx1; y0 = bby0; y1 = bby1; break; case GUPPI_EAST: x0 = x1 = bbx0; y0 = bby0; y1 = bby1; break; default: g_assert_not_reached (); } guppi_element_print_gsave (ep); /* We need to double the line width, since half of it disappears from the clipping. */ guppi_element_print_setlinewidth (ep, 2 * edge_thickness); guppi_element_print_setrgbacolor_uint (ep, edge_color); guppi_element_print_newpath (ep); guppi_element_print_moveto (ep, x0, y0); guppi_element_print_lineto (ep, x1, y1); guppi_element_print_stroke (ep); guppi_element_print_grestore (ep); } /* Next, paint the legend */ if ((legend_text = guppi_axis_state_displayed_legend (state)) != NULL) { double lx, ly, w, h, lrot = 0; w = gnome_font_get_width_string (lfont, legend_text); h = gnome_font_get_ascender (lfont) + gnome_font_get_descender (lfont); guppi_element_print_gsave (ep); guppi_element_print_setfont (ep, lfont); guppi_element_print_setrgbacolor_uint (ep, lcolor); switch (position) { case GUPPI_NORTH: lx = (bbx0 + bbx1) / 2 - w / 2; ly = bby1 - h; break; case GUPPI_SOUTH: lx = (bbx0 + bbx1) / 2 - w / 2; ly = bby0; break; case GUPPI_WEST: lx = bbx0 + h; ly = (bby0 + bby1) / 2 - w / 2; lrot = 90; break; case GUPPI_EAST: lx = bbx1 - h; ly = (bby0 + bby1) / 2 + w / 2; lrot = -90; break; default: lx = ly = 0; g_assert_not_reached (); } guppi_element_print_moveto (ep, lx, ly); if (lrot) { double rot_matrix[6]; art_affine_rotate (rot_matrix, lrot); guppi_element_print_concat (ep, rot_matrix); } guppi_element_print_show (ep, legend_text); guppi_free (legend_text); guppi_element_print_grestore (ep); } /* Next, paint the markers */ { GuppiAxisMarkers *marks = NULL; marks = guppi_element_view_axis_markers (view, horizontal ? GUPPI_X_AXIS : GUPPI_Y_AXIS); if (marks) { gint i, N; double shrink_factor = 1; if (shrink_labels_to_fit) { shrink_factor = guppi_axis_view_label_shrink_to_fit_factor ((GuppiAxisView *) view, marks); } N = guppi_axis_markers_size (marks); for (i = 0; i < N; ++i) { const GuppiTick *tick = guppi_axis_markers_get (marks, i); gboolean show = FALSE, show_label = FALSE; double pos, length = 0, thick = 0, label_offset; guint32 tick_color = 0, label_color = 0; GnomeFont *font = NULL; double x0 = 0, y0 = 0, x1 = 0, y1 = 0, lx = 0, ly = 0; pos = tick->position; guppi_axis_view_tick_properties ((GuppiAxisView *) view, tick, shrink_factor, &show, &tick_color, &thick, &length, &show_label, &label_offset, &label_color, &font); if (!show) length = 0; if (horizontal) guppi_element_print_vp2pt_auto (ep, &pos, NULL); else guppi_element_print_vp2pt_auto (ep, NULL, &pos); switch (position) { case GUPPI_NORTH: x0 = x1 = lx = pos; y0 = bby0; y1 = bby0 + length; ly = y1 + label_offset; break; case GUPPI_SOUTH: x0 = x1 = lx = pos; y0 = bby1; y1 = bby1 - length; ly = y1 - label_offset; break; case GUPPI_WEST: x0 = bbx1; x1 = bbx1 - length; lx = x1 - label_offset; y0 = y1 = ly = pos; break; case GUPPI_EAST: x0 = bbx0; x1 = bbx0 + length; lx = x1 + label_offset; y0 = y1 = ly = pos; break; default: g_assert_not_reached (); } if (show && length > 0) { guppi_element_print_setrgbacolor_uint (ep, tick_color); guppi_element_print_setlinewidth (ep, thick); guppi_element_print_newpath (ep); guppi_element_print_moveto (ep, x0, y0); guppi_element_print_lineto (ep, x1, y1); guppi_element_print_stroke (ep); } if (show_label && guppi_tick_label (tick) != NULL && font != NULL) { const gchar *label = guppi_tick_label (tick); gboolean rotate = FALSE; double w, h; GnomeFont *used_font; if (shrink_factor < 1.0) { used_font = gnome_font_new (gnome_font_get_name (font), gnome_font_get_size (font) * shrink_factor); } else { used_font = font; } guppi_element_print_setfont (ep, used_font); guppi_element_print_setrgbacolor_uint (ep, label_color); w = gnome_font_get_width_string (used_font, label); h = gnome_font_get_ascender (used_font); if (shrink_factor < 1.0) { guppi_unref0 (used_font); } if (rotate_labels) { double tmp = w; w = h; h = tmp; rotate = TRUE; } /* Adjust label positioning */ switch (position) { case GUPPI_NORTH: lx -= w / 2; break; case GUPPI_SOUTH: lx -= w / 2; ly -= h; break; case GUPPI_WEST: lx -= w; ly -= h / 2; break; case GUPPI_EAST: ly -= h / 2; break; default: g_assert_not_reached (); } if (rotate) lx += w; guppi_element_print_moveto (ep, lx, ly); if (rotate) { double rot_matrix[6]; art_affine_rotate (rot_matrix, 90); guppi_element_print_gsave (ep); guppi_element_print_concat (ep, rot_matrix); } guppi_element_print_show (ep, label); if (rotate) guppi_element_print_grestore (ep); } } } } } /**************************************************************************/ static void guppi_axis_print_class_init (GuppiAxisPrintClass *klass) { GtkObjectClass *object_class = (GtkObjectClass *) klass; GuppiElementPrintClass *ep_class = GUPPI_ELEMENT_PRINT_CLASS (klass); parent_class = gtk_type_class (GUPPI_TYPE_ELEMENT_PRINT); object_class->finalize = guppi_axis_print_finalize; ep_class->print = print; } static void guppi_axis_print_init (GuppiAxisPrint *obj) { } GtkType guppi_axis_print_get_type (void) { static GtkType guppi_axis_print_type = 0; if (!guppi_axis_print_type) { static const GtkTypeInfo guppi_axis_print_info = { "GuppiAxisPrint", sizeof (GuppiAxisPrint), sizeof (GuppiAxisPrintClass), (GtkClassInitFunc) guppi_axis_print_class_init, (GtkObjectInitFunc) guppi_axis_print_init, NULL, NULL, (GtkClassInitFunc) NULL }; guppi_axis_print_type = gtk_type_unique (GUPPI_TYPE_ELEMENT_PRINT, &guppi_axis_print_info); } return guppi_axis_print_type; } /* $Id: guppi-axis-print.c,v 1.16 2001/10/15 20:58:40 trow Exp $ */