Example #1
0
static void
gtk_databox_bars_real_draw (GtkDataboxGraph *graph,
                             GtkDataboxCanvas *canvas)
{
   GtkDataboxBars *bars = GTK_DATABOX_BARS (graph);
   GdkSegment *data;
   guint i = 0;
   gfloat *X;
   gfloat *Y;
   gint len;
   gint size = 0;
   gint16 zero = 0;

   g_return_if_fail (GTK_DATABOX_IS_BARS (bars));
   g_return_if_fail (canvas);
   g_return_if_fail (canvas->pixmap);

   if (!graph->gc) 
      gtk_databox_graph_create_gc (graph, canvas);

   len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph));
   X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph));
   Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph));
   size = gtk_databox_graph_get_size (graph);

   data = bars->priv->data;

   zero = (gint16) ((0 - canvas->top_left_visible.y)
                    * canvas->translation_factor.y);
   for (i = 0; i < len; i++, data++, X++, Y++)
   {
      data->x1 = data->x2 =
         (gint16) ((*X - canvas->top_left_visible.x) 
                   * canvas->translation_factor.x);
      data->y1 = zero;
      data->y2 =
         (gint16) ((*Y - canvas->top_left_visible.y) 
                   * canvas->translation_factor.y);
   }
   
   /* More than 2^16 bars will cause X IO error on most XServers
      (Hint from Paul Barton-Davis) */
   for (i = 0; i < len; i += 65536)
   {
       gdk_draw_segments (canvas->pixmap, graph->gc, 
                          bars->priv->data + i,
                          MIN (65536, len - i));
   }
   
   return;
}
static void
cross_simple_finalize (GObject * object)
{
   gpointer pointer;

   pointer = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (object));
   if (pointer)
      g_free (pointer);

   pointer = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (object));
   if (pointer)
      g_free (pointer);

   /* Chain up to the parent class */
   G_OBJECT_CLASS (gtk_databox_cross_simple_parent_class)->finalize (object);
}
static void
gtk_databox_xyc_graph_set_property (GObject * object,
				    guint property_id,
				    const GValue * value, GParamSpec * pspec)
{
   GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (object);

   switch (property_id)
   {
   case PROP_X:
      {
	 gtk_databox_xyc_graph_set_X (xyc_graph,
				      (gfloat *) g_value_get_pointer (value));
      }
      break;
   case PROP_Y:
      {
	 gtk_databox_xyc_graph_set_Y (xyc_graph,
				      (gfloat *) g_value_get_pointer (value));
      }
      break;
   case PROP_LEN:
      {
	 gtk_databox_xyc_graph_set_length (xyc_graph,
					   g_value_get_int (value));
      }
      break;
   default:
      /* We don't have any other property... */
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
   }
}
static gint
gtk_databox_xyc_graph_real_calculate_extrema (GtkDataboxGraph * graph,
					      gfloat * min_x, gfloat * max_x,
					      gfloat * min_y, gfloat * max_y)
{
   GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (graph);
   guint i;

   g_return_val_if_fail (GTK_DATABOX_IS_XYC_GRAPH (graph), -1);
   g_return_val_if_fail (min_x, -1);
   g_return_val_if_fail (max_x, -1);
   g_return_val_if_fail (min_y, -1);
   g_return_val_if_fail (max_y, -1);
   g_return_val_if_fail (xyc_graph->priv->len, -1);

   *min_x = *max_x = xyc_graph->priv->X[0];
   *min_y = *max_y = xyc_graph->priv->Y[0];

   for (i = 1; i < xyc_graph->priv->len; ++i)
   {
      if (xyc_graph->priv->X[i] < *min_x)
	 *min_x = xyc_graph->priv->X[i];
      else if (xyc_graph->priv->X[i] > *max_x)
	 *max_x = xyc_graph->priv->X[i];
      if (xyc_graph->priv->Y[i] < *min_y)
	 *min_y = xyc_graph->priv->Y[i];
      else if (xyc_graph->priv->Y[i] > *max_y)
	 *max_y = xyc_graph->priv->Y[i];

   }

   return 0;
}
static void
gtk_databox_xyc_graph_instance_init (GTypeInstance * instance
				     /*, gpointer g_class */ )
{
   GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (instance);

   xyc_graph->priv = g_new0 (GtkDataboxXYCGraphPrivate, 1);
}
Example #6
0
static void
complete (GtkDataboxMarker *marker)
{
   marker->priv->marker_info = 
      g_new0 (GtkDataboxMarkerInfo, 
              gtk_databox_xyc_graph_get_length 
                 (GTK_DATABOX_XYC_GRAPH (marker)));

}
Example #7
0
static void
gtk_databox_bars_complete (GtkDataboxBars *bars)
{
   bars->priv->data = 
      g_new0 (GdkSegment, 
              gtk_databox_xyc_graph_get_length 
                 (GTK_DATABOX_XYC_GRAPH (bars)));

}
static void
xyc_graph_finalize (GObject * object)
{
   GtkDataboxXYCGraph *xyc_graph = GTK_DATABOX_XYC_GRAPH (object);

   g_free (xyc_graph->priv->xyc_graph);
   g_free (xyc_graph->priv);

   /* Chain up to the parent class */
   G_OBJECT_CLASS (parent_class)->finalize (object);
}
Example #9
0
void
gtk_databox_marker_set_position (GtkDataboxMarker *marker, 
                                 guint index, 
                                 GtkDataboxMarkerPosition position)
{
   gint len;
   
   g_return_if_fail (GTK_DATABOX_IS_MARKER (marker));
   len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (marker));
   g_return_if_fail (index < len);

   marker->priv->marker_info[index].position = position;
}
Example #10
0
void
gtk_databox_marker_set_label (GtkDataboxMarker *marker,
                              guint index, 
                              GtkDataboxTextPosition label_position,
                              gchar *text,
                              gboolean boxed)
{
   gint len;
   
   g_return_if_fail (GTK_DATABOX_IS_MARKER (marker));
   len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (marker));
   g_return_if_fail (index < len);

   marker->priv->marker_info[index].label_position = label_position;
   marker->priv->marker_info[index].text = g_strdup (text);
   marker->priv->marker_info[index].boxed = boxed;

   if (marker->priv->marker_info[index].label)
   {
      pango_layout_set_text (marker->priv->marker_info[index].label, 
                             marker->priv->marker_info[index].text, 
                             -1);
   }
}
Example #11
0
static void
gtk_databox_marker_real_draw (GtkDataboxGraph *graph,
                             GtkDataboxCanvas *canvas)
{
   GtkDataboxMarker *marker = GTK_DATABOX_MARKER (graph);
   GdkPoint points [3];
   gfloat *X;
   gfloat *Y;
   gint len;
   gint16 x;
   gint16 y;
   GtkDataboxCoord coord;
   gint size;
   gint i;
 
   g_return_if_fail (GTK_DATABOX_IS_MARKER (marker));
   g_return_if_fail (canvas);
   g_return_if_fail (canvas->pixmap);
   g_return_if_fail (canvas->context);

   if (!graph->gc) 
      gtk_databox_graph_create_gc (graph, canvas);

   len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph));
   X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph));
   Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph));
   size = gtk_databox_graph_get_size (graph);

   for (i = 0; i < len; ++i)
   {
      x = (gint16) ((X[i] - canvas->top_left_visible.x) 
            * canvas->translation_factor.x);
      y = (gint16) ((Y[i] - canvas->top_left_visible.y) 
            * canvas->translation_factor.y);
      
      switch (marker->priv->type)
      {
         case GTK_DATABOX_MARKER_TRIANGLE:
            switch (marker->priv->marker_info[i].position) 
            {
               case GTK_DATABOX_MARKER_C:
                  coord.x = x;
                  coord.y = y;
                  y = y - size / 2;
                  points[0].x = x;
                  points[0].y = y;
                  points[1].x = x - size / 2;
                  points[1].y = y + size;
                  points[2].x = x + size / 2;
                  points[2].y = y + size;
                  break;
               case GTK_DATABOX_MARKER_N:
                  coord.x = x;
                  coord.y = y - 2 - size / 2;
                  y = y - 2;
                  points[0].x = x;
                  points[0].y = y;
                  points[1].x = x - size / 2;
                  points[1].y = y - size;
                  points[2].x = x + size / 2;
                  points[2].y = y - size;
                  break;
               case GTK_DATABOX_MARKER_E:
                  coord.x = x + 2 + size / 2;
                  coord.y = y;
                  x = x + 2;
                  points[0].x = x;
                  points[0].y = y;
                  points[1].x = x + size;
                  points[1].y = y + size / 2;
                  points[2].x = x + size;
                  points[2].y = y - size / 2;
                  break;
               case GTK_DATABOX_MARKER_S:
                  coord.x = x;
                  coord.y = y + 2 + size / 2;
                  y = y + 2;
                  points[0].x = x;
                  points[0].y = y;
                  points[1].x = x - size / 2;
                  points[1].y = y + size;
                  points[2].x = x + size / 2;
                  points[2].y = y + size;
                  break;
               case GTK_DATABOX_MARKER_W:
                  coord.x = x - 2 - size / 2;
                  coord.y = y;
                  x = x - 2;
                  points[0].x = x;
                  points[0].y = y;
                  points[1].x = x - size;
                  points[1].y = y + size / 2;
                  points[2].x = x - size;
                  points[2].y = y - size / 2;
                  break;
            }
            gdk_draw_polygon (canvas->pixmap, graph->gc, 
                              TRUE, points, 3);
            break;
            /* End of GTK_DATABOX_MARKER_TRIANGLE */
         case GTK_DATABOX_MARKER_SOLID_LINE:
         case GTK_DATABOX_MARKER_DASHED_LINE:
            switch (marker->priv->marker_info[i].position) 
            {
               case GTK_DATABOX_MARKER_C:
                  coord.x = x;
                  coord.y = y;
                  points[0].x = x;
                  points[0].y = 0;
                  points[1].x = x;
                  points[1].y = canvas->height;
                  break;
               case GTK_DATABOX_MARKER_N:
                  coord.x = x;
                  points[0].x = x;
                  points[0].y = 0;
                  points[1].x = x;
                  points[1].y = canvas->height;
                  break;
               case GTK_DATABOX_MARKER_E:
                  coord.y = y;
                  points[0].x = 0;
                  points[0].y = y;
                  points[1].x = canvas->width;
                  points[1].y = y;
                  break;
               case GTK_DATABOX_MARKER_S:
                  coord.x = x;
                  points[0].x = x;
                  points[0].y = 0;
                  points[1].x = x;
                  points[1].y = canvas->height;
                  break;
               case GTK_DATABOX_MARKER_W:
                  coord.y = y;
                  points[0].x = 0;
                  points[0].y = y;
                  points[1].x = canvas->width;
                  points[1].y = y;
                  break;
            }

            gdk_draw_line (canvas->pixmap, graph->gc,
                           points[0].x, points[0].y,
                           points[1].x, points[1].y);
            break;
            /* End of GTK_DATABOX_MARKER_LINE */

         case GTK_DATABOX_MARKER_NONE:
         default:
            coord.x = x;
            coord.y = y;
            break;
      }

      if (marker->priv->marker_info[i].text)
      {
         if (!marker->priv->marker_info[i].label)
         {
            marker->priv->marker_info[i].label = 
               pango_layout_new (canvas->context);
            pango_layout_set_text (marker->priv->marker_info[i].label, 
                                   marker->priv->marker_info[i].text, 
                                   -1);
         }

         if (marker->priv->type == GTK_DATABOX_MARKER_SOLID_LINE
               || marker->priv->type == GTK_DATABOX_MARKER_DASHED_LINE)
         {
            gint width;
            gint height;
            pango_layout_get_pixel_size (marker->priv->marker_info[i].label, 
                                         &width, &height);

            width = (width + 1) / 2 + 2;
            height = (height + 1) / 2 + 2;
            size = 0;

            switch (marker->priv->marker_info[i].position)
            {
               case GTK_DATABOX_MARKER_C:
               break;
               case GTK_DATABOX_MARKER_N:
                  coord.y = height;
               break;
               case GTK_DATABOX_MARKER_E:
                  coord.x = canvas->width - width;
               break;
               case GTK_DATABOX_MARKER_S:
                  coord.y = canvas->height - height;
               break;
               case GTK_DATABOX_MARKER_W:
                  coord.x = width;
               break;
            }
         }
         
         gtk_databox_label_write_at (canvas->pixmap, 
                                    marker->priv->marker_info[i].label, 
                                    marker->priv->label_gc, coord,
                                    marker->priv->marker_info[i].label_position,
                                    (size + 1) / 2 + 2,
                                    marker->priv->marker_info[i].boxed);
      }
   }
      
   return;
}
static void
gtk_databox_bars_real_draw (GtkDataboxGraph * graph,
			    GtkDatabox* box)
{
   GtkDataboxBars *bars = GTK_DATABOX_BARS (graph);
   GtkDataboxBarsPrivate *priv=GTK_DATABOX_BARS_GET_PRIVATE(bars);
   guint i = 0;
   void *X;
   void *Y;
   guint len, maxlen;
   gint16 zero = 0;
   gfloat fzero = 0.0;
   cairo_t *cr;
   gint16 *xpixels, *ypixels;
   guint xstart, xstride, ystart, ystride;
   GType xtype, ytype;

   g_return_if_fail (GTK_DATABOX_IS_BARS (bars));
   g_return_if_fail (GTK_IS_DATABOX (box));

   if (gtk_databox_get_scale_type_y (box) == GTK_DATABOX_SCALE_LOG)
      g_warning
	 ("gtk_databox_bars do not work well with logarithmic scale in Y axis");

   cr = gtk_databox_graph_create_gc (graph, box);

   len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph));
   maxlen = gtk_databox_xyc_graph_get_maxlen (GTK_DATABOX_XYC_GRAPH (graph));

   if (priv->pixelsalloc < len)
   {
   	priv->pixelsalloc = len;
	priv->xpixels = (gint16 *)g_realloc(priv->xpixels, len * sizeof(gint16));
	priv->ypixels = (gint16 *)g_realloc(priv->ypixels, len * sizeof(gint16));
   }

   xpixels = priv->xpixels;
   ypixels = priv->ypixels;

   X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph));
   xstart = gtk_databox_xyc_graph_get_xstart (GTK_DATABOX_XYC_GRAPH (graph));
   xstride = gtk_databox_xyc_graph_get_xstride (GTK_DATABOX_XYC_GRAPH (graph));
   xtype = gtk_databox_xyc_graph_get_xtype (GTK_DATABOX_XYC_GRAPH (graph));
   gtk_databox_values_to_xpixels(box, xpixels, X, xtype, maxlen, xstart, xstride, len);

   Y = gtk_databox_xyc_graph_get_Y (GTK_DATABOX_XYC_GRAPH (graph));
   ystart = gtk_databox_xyc_graph_get_ystart (GTK_DATABOX_XYC_GRAPH (graph));
   ystride = gtk_databox_xyc_graph_get_ystride (GTK_DATABOX_XYC_GRAPH (graph));
   ytype = gtk_databox_xyc_graph_get_ytype (GTK_DATABOX_XYC_GRAPH (graph));
   gtk_databox_values_to_ypixels(box, ypixels, Y, ytype, maxlen, ystart, ystride, len);

   gtk_databox_values_to_ypixels(box, &zero, &fzero, G_TYPE_FLOAT, 1, 0, 1, 1);

   for (i = 0; i < len; i++, xpixels++, ypixels++)
   {
      cairo_move_to (cr, *xpixels + 0.5, zero + 0.5);
      cairo_line_to (cr, *xpixels + 0.5, *ypixels + 0.5);
   }
   cairo_stroke(cr);
   cairo_destroy(cr);

   return;
}