"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "gtk/gtkdatabox_points.c" between
gtkdatabox-0.9.3.1.tar.gz and gtkdatabox-1.0.0.tar.gz

About: GtkDatabox is a Gtk+-widget for live display of large amounts of fluctuating numerical data.

gtkdatabox_points.c  (gtkdatabox-0.9.3.1):gtkdatabox_points.c  (gtkdatabox-1.0.0)
skipping to change at line 17 skipping to change at line 17
* as published by the Free Software Foundation; either version 2.1 * as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version. * of the License, or (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. * GNU Lesser General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <gtkdatabox_points.h> #include <gtkdatabox_points.h>
G_DEFINE_TYPE(GtkDataboxPoints, gtk_databox_points,
GTK_DATABOX_TYPE_XYC_GRAPH)
static void gtk_databox_points_real_draw (GtkDataboxGraph * points, static void gtk_databox_points_real_draw (GtkDataboxGraph * points,
GtkDatabox * box); GtkDatabox * box);
/** /**
* GtkDataboxPointsPrivate * GtkDataboxPointsPrivate
* *
* A private data structure used by the #GtkDataboxPoints. It shields all intern al things * A private data structure used by the #GtkDataboxPoints. It shields all intern al things
* from developers who are just using the object. * from developers who are just using the object.
* *
**/ **/
typedef struct _GtkDataboxPointsPrivate GtkDataboxPointsPrivate; typedef struct _GtkDataboxPointsPrivate GtkDataboxPointsPrivate;
struct _GtkDataboxPointsPrivate struct _GtkDataboxPointsPrivate
{ {
GdkPoint *data; gint16 *xpixels;
gint16 *ypixels;
guint pixelsalloc;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (GtkDataboxPoints, gtk_databox_points,
GTK_DATABOX_TYPE_XYC_GRAPH)
static void static void
points_finalize (GObject * object) points_finalize (GObject * object)
{ {
g_free (GTK_DATABOX_POINTS_GET_PRIVATE(object)->data); GtkDataboxPoints *points = GTK_DATABOX_POINTS (object);
GtkDataboxPointsPrivate *priv =
gtk_databox_points_get_instance_private (points);
g_free (priv->xpixels);
g_free (priv->ypixels);
/* Chain up to the parent class */ /* Chain up to the parent class */
G_OBJECT_CLASS (gtk_databox_points_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_databox_points_parent_class)->finalize (object);
} }
static void static void
gtk_databox_points_class_init (GtkDataboxPointsClass *klass) gtk_databox_points_class_init (GtkDataboxPointsClass * klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkDataboxGraphClass *graph_class = GTK_DATABOX_GRAPH_CLASS (klass); GtkDataboxGraphClass *graph_class = GTK_DATABOX_GRAPH_CLASS (klass);
gobject_class->finalize = points_finalize; gobject_class->finalize = points_finalize;
graph_class->draw = gtk_databox_points_real_draw; graph_class->draw = gtk_databox_points_real_draw;
g_type_class_add_private (klass, sizeof (GtkDataboxPointsPrivate));
} }
static void static void
gtk_databox_points_complete (GtkDataboxPoints * points) gtk_databox_points_complete (GtkDataboxPoints * points)
{ {
GTK_DATABOX_POINTS_GET_PRIVATE(points)->data = GtkDataboxPointsPrivate *priv =
g_new0 (GdkPoint, gtk_databox_points_get_instance_private (points);
gtk_databox_xyc_graph_get_length
(GTK_DATABOX_XYC_GRAPH (points)));
priv->xpixels = NULL;
priv->ypixels = NULL;
priv->pixelsalloc = 0;
} }
static void static void
gtk_databox_points_init (GtkDataboxPoints *points) gtk_databox_points_init (GtkDataboxPoints * points)
{ {
g_signal_connect (points, "notify::length", g_signal_connect (points, "notify::length",
G_CALLBACK (gtk_databox_points_complete), NULL); G_CALLBACK (gtk_databox_points_complete), NULL);
} }
/** /**
* gtk_databox_points_new: * gtk_databox_points_new:
* @len: length of @X and @Y * @len: length of @X and @Y
* @X: array of horizontal position values of markers * @X: array of horizontal position values of markers
* @Y: array of vertical position values of markers * @Y: array of vertical position values of markers
* @color: color of the markers * @color: color of the markers
* @size: marker size or line width (depending on the @type) * @size: marker size or line width (depending on the @type)
* *
* Creates a new #GtkDataboxPoints object which can be added to a #GtkDatabox wi dget. * Creates a new #GtkDataboxPoints object which can be added to a #GtkDatabox wi dget.
* *
* Return value: A new #GtkDataboxPoints object * Return value: A new #GtkDataboxPoints object
**/ **/
GtkDataboxGraph * GtkDataboxGraph *
gtk_databox_points_new (guint len, gfloat * X, gfloat * Y, gtk_databox_points_new (guint len, gfloat * X, gfloat * Y,
GdkColor * color, gint size) GdkRGBA * color, gint size)
{ {
GtkDataboxPoints *points; GtkDataboxPoints *points;
g_return_val_if_fail (X, NULL); g_return_val_if_fail (X, NULL);
g_return_val_if_fail (Y, NULL); g_return_val_if_fail (Y, NULL);
g_return_val_if_fail ((len > 0), NULL); g_return_val_if_fail ((len > 0), NULL);
points = g_object_new (GTK_DATABOX_TYPE_POINTS, points = g_object_new (GTK_DATABOX_TYPE_POINTS,
"X-Values", X, "X-Values", X,
"Y-Values", Y, "Y-Values", Y,
"length", len, "color", color, "size", size, NULL); "xstart", 0,
"ystart", 0,
"xstride", 1,
"ystride", 1,
"xtype", G_TYPE_FLOAT,
"ytype", G_TYPE_FLOAT,
"length", len,
"maxlen", len, "color", color, "size", size, NULL);
return GTK_DATABOX_GRAPH (points);
}
/**
* gtk_databox_points_new_full:
* @maxlen: maximum length of @X and @Y
* @len: actual number of @X and @Y values to plot
* @X: array of horizontal position values of markers
* @Y: array of vertical position values of markers
* @xstart: the first element in the X array to plot (usually 0)
* @ystart: the first element in the Y array to plot (usually 0)
* @xstride: successive elements in the X array are separated by this much (1 if
array, ncols if matrix)
* @ystride: successive elements in the Y array are separated by this much (1 if
array, ncols if matrix)
* @xtype: the GType of the X array elements. G_TYPE_FLOAT, G_TYPE_DOUBLE, etc.
* @ytype: the GType of the Y array elements. G_TYPE_FLOAT, G_TYPE_DOUBLE, etc.
* @color: color of the markers
* @size: marker size or line width (depending on the @type)
*
* Creates a new #GtkDataboxPoints object which can be added to a #GtkDatabox wi
dget.
*
* Return value: A new #GtkDataboxPoints object
**/
GtkDataboxGraph *
gtk_databox_points_new_full (guint maxlen, guint len,
void *X, guint xstart, guint xstride,
GType xtype, void *Y, guint ystart,
guint ystride, GType ytype, GdkRGBA * color,
gint size)
{
GtkDataboxPoints *points;
g_return_val_if_fail (X, NULL);
g_return_val_if_fail (Y, NULL);
g_return_val_if_fail ((len > 0), NULL);
points = g_object_new (GTK_DATABOX_TYPE_POINTS,
"X-Values", X,
"Y-Values", Y,
"xstart", xstart,
"ystart", ystart,
"xstride", xstride,
"ystride", ystride,
"xtype", xtype,
"ytype", ytype,
"length", len,
"maxlen", maxlen,
"color", color, "size", size, NULL);
return GTK_DATABOX_GRAPH (points); return GTK_DATABOX_GRAPH (points);
} }
static void static void
gtk_databox_points_real_draw (GtkDataboxGraph * graph, gtk_databox_points_real_draw (GtkDataboxGraph * graph, GtkDatabox * box)
GtkDatabox* box)
{ {
GtkDataboxPoints *points = GTK_DATABOX_POINTS (graph); GtkDataboxPoints *points = GTK_DATABOX_POINTS (graph);
GdkPoint *data; GtkDataboxPointsPrivate *priv =
GdkGC *gc; gtk_databox_points_get_instance_private (points);
GdkPixmap *pixmap;
guint i = 0; guint i = 0;
gfloat *X; void *X;
gfloat *Y; void *Y;
guint len; guint len, maxlen;
gint size = 0; gint pointsize = 0;
cairo_t *cr;
gint16 *xpixels, *ypixels;
guint xstart, xstride, ystart, ystride;
GType xtype, ytype;
g_return_if_fail (GTK_DATABOX_IS_POINTS (points)); g_return_if_fail (GTK_DATABOX_IS_POINTS (points));
g_return_if_fail (GTK_IS_DATABOX (box)); g_return_if_fail (GTK_IS_DATABOX (box));
pixmap = gtk_databox_get_backing_pixmap (box); cr = gtk_databox_graph_create_gc (graph, box);
if (!(gc = gtk_databox_graph_get_gc(graph)))
gc = gtk_databox_graph_create_gc (graph, box);
len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph)); len = gtk_databox_xyc_graph_get_length (GTK_DATABOX_XYC_GRAPH (graph));
X = gtk_databox_xyc_graph_get_X (GTK_DATABOX_XYC_GRAPH (graph)); maxlen = gtk_databox_xyc_graph_get_maxlen (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 = GTK_DATABOX_POINTS_GET_PRIVATE(points)->data;
gtk_databox_values_to_pixels (box, len, X, Y, data);
if (size < 2) if (priv->pixelsalloc < len)
{ {
/* More than 2^16 points will cause X IO error on most XServers priv->pixelsalloc = len;
(Hint from Paul Barton-Davis) */ priv->xpixels =
for (i = 0; i < len; i += 65536) (gint16 *) g_realloc (priv->xpixels, len * sizeof (gint16));
{ priv->ypixels =
gdk_draw_points (pixmap, gc, data + i, (gint16 *) g_realloc (priv->ypixels, len * sizeof (gint16));
MIN (65536, len - i));
}
}
else
{
for (i = 0; i < len; i++, data++)
{
/* Why on earth is there no gdk_draw_rectangles?? */
gdk_draw_rectangle (pixmap, gc, TRUE,
data->x - size / 2,
data->y - size / 2, size, size);
}
} }
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);
pointsize = gtk_databox_graph_get_size (graph);
for (i = 0; i < len; i++, xpixels++, ypixels++)
cairo_rectangle (cr, *xpixels - pointsize / 2, *ypixels - pointsize / 2,
pointsize, pointsize);
cairo_fill (cr);
cairo_destroy (cr);
return; return;
} }
 End of changes. 21 change blocks. 
54 lines changed or deleted 126 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)