174 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2014 Benjamin Otte <ottte@gnome.org>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library 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
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #include "config.h"
 | |
| 
 | |
| #include "graphdata.h"
 | |
| 
 | |
| enum {
 | |
|   PROP_0,
 | |
|   PROP_N_VALUES
 | |
| };
 | |
| 
 | |
| struct _GtkGraphDataPrivate
 | |
| {
 | |
|   guint n_values;
 | |
|   guint offset;
 | |
|   double *values;
 | |
| };
 | |
| 
 | |
| 
 | |
| G_DEFINE_TYPE_WITH_PRIVATE (GtkGraphData, gtk_graph_data, G_TYPE_OBJECT)
 | |
| 
 | |
| static void
 | |
| gtk_graph_data_get_property (GObject    *object,
 | |
|                              guint       param_id,
 | |
|                              GValue     *value,
 | |
|                              GParamSpec *pspec)
 | |
| {
 | |
|   GtkGraphData *graph = GTK_GRAPH_DATA (object);
 | |
|   GtkGraphDataPrivate *priv = graph->priv;
 | |
| 
 | |
|   switch (param_id)
 | |
|     {
 | |
|       case PROP_N_VALUES:
 | |
|         g_value_set_boolean (value, priv->n_values);
 | |
|         break;
 | |
|       default:
 | |
|         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_graph_data_finalize (GObject *object)
 | |
| {
 | |
|   GtkGraphData *graph = GTK_GRAPH_DATA (object);
 | |
|   GtkGraphDataPrivate *priv = graph->priv;
 | |
| 
 | |
|   g_free (priv->values);
 | |
| 
 | |
|   G_OBJECT_CLASS (gtk_graph_data_parent_class)->finalize (object);
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_graph_data_set_property (GObject      *object,
 | |
|                              guint         param_id,
 | |
|                              const GValue *value,
 | |
|                              GParamSpec   *pspec)
 | |
| {
 | |
|   GtkGraphData *graph = GTK_GRAPH_DATA (object);
 | |
|   GtkGraphDataPrivate *priv = graph->priv;
 | |
| 
 | |
|   switch (param_id)
 | |
|     {
 | |
|       case PROP_N_VALUES:
 | |
|         priv->n_values = g_value_get_uint (value);
 | |
|         priv->values = g_new0 (double, priv->n_values);
 | |
|         break;
 | |
|       default:
 | |
|         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_graph_data_class_init (GtkGraphDataClass *klass)
 | |
| {
 | |
|   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | |
| 
 | |
|   object_class->finalize = gtk_graph_data_finalize;
 | |
|   object_class->get_property = gtk_graph_data_get_property;
 | |
|   object_class->set_property = gtk_graph_data_set_property;
 | |
| 
 | |
|   g_object_class_install_property (object_class,
 | |
|                                    PROP_N_VALUES,
 | |
|                                    g_param_spec_uint ("n-values",
 | |
|                                                       "n values",
 | |
|                                                       "Number of values in the graph",
 | |
|                                                       1, G_MAXUINT, 1,
 | |
|                                                       G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
 | |
| }
 | |
| 
 | |
| static void
 | |
| gtk_graph_data_init (GtkGraphData *graph)
 | |
| {
 | |
|   graph->priv = gtk_graph_data_get_instance_private (graph);
 | |
| }
 | |
| 
 | |
| GtkGraphData *
 | |
| gtk_graph_data_new (guint n_values)
 | |
| {
 | |
|   return g_object_new (GTK_TYPE_GRAPH_DATA,
 | |
|                        "n-values", n_values,
 | |
|                        NULL);
 | |
| }
 | |
| 
 | |
| guint
 | |
| gtk_graph_data_get_n_values (GtkGraphData *data)
 | |
| {
 | |
|   return data->priv->n_values;
 | |
| }
 | |
| 
 | |
| double
 | |
| gtk_graph_data_get_value (GtkGraphData   *data,
 | |
|                           guint           i)
 | |
| {
 | |
|   GtkGraphDataPrivate *priv = data->priv;
 | |
| 
 | |
|   return priv->values[(priv->offset + i) % priv->n_values];
 | |
| }
 | |
| 
 | |
| double
 | |
| gtk_graph_data_get_minimum (GtkGraphData *data)
 | |
| {
 | |
|   GtkGraphDataPrivate *priv = data->priv;
 | |
|   double minimum = G_MAXDOUBLE;
 | |
|   guint i;
 | |
| 
 | |
|   for (i = 0; i < priv->n_values; i++)
 | |
|     {
 | |
|       minimum = MIN (minimum, priv->values[i]);
 | |
|     }
 | |
| 
 | |
|   return minimum;
 | |
| }
 | |
| 
 | |
| double
 | |
| gtk_graph_data_get_maximum (GtkGraphData *data)
 | |
| {
 | |
|   GtkGraphDataPrivate *priv = data->priv;
 | |
|   double maximum = -G_MAXDOUBLE;
 | |
|   guint i;
 | |
| 
 | |
|   for (i = 0; i < priv->n_values; i++)
 | |
|     {
 | |
|       maximum = MAX (maximum, priv->values[i]);
 | |
|     }
 | |
| 
 | |
|   return maximum;
 | |
| }
 | |
| 
 | |
| void
 | |
| gtk_graph_data_prepend_value (GtkGraphData *data,
 | |
|                               double        value)
 | |
| {
 | |
|   GtkGraphDataPrivate *priv = data->priv;
 | |
| 
 | |
|   priv->offset = (priv->offset + priv->n_values - 1) % priv->n_values;
 | |
|   priv->values[priv->offset] = value;
 | |
| }
 | |
| 
 | 
