[prev in list] [next in list] [prev in thread] [next in thread]
List: gtk-app-devel
Subject: Re: Any simple text rendering
From: Carlo Agrusti <carlo-ag () libero ! it>
Date: 2004-09-29 14:00:02
Message-ID: 415ABFE2.2020306 () libero ! it
[Download RAW message or body]
Frank Hrebabetzky ha scritto lo scorso 29/09/2004 15:00:
> I am working on a Program which draws diagrams on a drawing area and
> therefore I need to draw some simple text such as 'y-Axis' or '0.00',
> '1.00' and so on, nothing fancy, no chinese or arab, just plain english
> monospaced text. Now how should I do that ?
>
> Label widgets? I didn't see how to get ascent and descent which I need
> to place the text correctly. Besides that, I need to allocate each
> label, but as the number of axis numbers depends on the size of the
> drawing area (grid spacing), this must be done anew after each resizing
> and labels would accumulate contiuously.
>
> Pango? No idea where to start reading. Seems a huge engine. Use this
> just to display a few characters?
>
> So what would you guys do?
This is how I managed a similar issue - drawing a simple x-y chart;
sorry for the comments (they are in italian). HTH.
void on_drawGraph_expose_event (GtkWidget * draw,
GdkEventExpose * event,
gpointer user_data) {
GdkGC * gc;
GdkPoint * points = NULL;
gint i, np;
guint width, height, x0, y0, x1, y1;
gchar * buf;
gchar * ulabel = NULL;
gchar label[64];
gsize len;
GIOChannel
* dati;
gfloat fx, fy;
GdkColor * nero,
* grigio,
* rosso;
PangoLayout
* pl;
PangoFontDescription
* lblfont;
GdkWChar * wlabel;
/* Dimensioni della finestra
*/
gdk_window_get_geometry (draw->window, NULL, NULL, & width, & height,
NULL);
x0 = 50;
y0 = 10;
x1 = width - 10;
y1 = height - 50;
/* Impostazione dei colori personalizzati
*/
rosso = (GdkColor *)g_malloc (sizeof (GdkColor));
rosso->pixel = 0;
rosso->red = 0xffff;
rosso->green = 0;
rosso->blue = 0;
nero = (GdkColor *)g_malloc (sizeof (GdkColor));
nero->pixel = 0;
nero->red = 0;
nero->green = 0;
nero->blue = 0;
grigio = (GdkColor *)g_malloc (sizeof (GdkColor));
grigio->pixel = 0;
grigio->red = 0x8fff;
grigio->green = 0x8fff;
grigio->blue = 0x8fff;
/* Ora non resta che disegnare il grafico
*/
gc = gdk_gc_new (draw->window);
/* ticks & labels; il grafico avrà range fissi
* [0 < fx < 65, 550 < fy < 950] e tick prefissati
*/
points = (GdkPoint *)g_malloc (2 * sizeof (GdkPoint));
pl = gtk_widget_create_pango_layout (draw, " ");
lblfont = pango_font_description_from_string ("Sans 8");
pango_layout_set_font_description (pl, lblfont);
/* Asse X
*/
for (i = 0; i < 9; i ++) {
points[0].y = y1;
points[0].x = points[1].x = (guint)(x0 + (x1 - x0) * (i * 10)/ 65);
points[1].y = y1 + 3;
/* Imposta gli stili della linea e traccia le ticks
*/
gdk_gc_set_line_attributes (gc, 0, GDK_LINE_SOLID, GDK_CAP_ROUND,
GDK_JOIN_ROUND);
gdk_gc_set_rgb_fg_color (gc, nero);
gdk_draw_lines (draw->window, gc, points, 2);
points[0].y = y1;
points[1].y = y0;
/* Imposta gli stili della linea e traccia le linee di divisione
*/
gdk_gc_set_line_attributes (gc, 0, GDK_LINE_ON_OFF_DASH,
GDK_CAP_ROUND, GDK_JOIN_ROUND);
gdk_gc_set_rgb_fg_color (gc, grigio);
gdk_draw_lines (draw->window, gc, points, 2);
/* labels
*/
g_sprintf (label, "%8.1f\0", (gfloat)(i * 10));
ulabel = g_locale_to_utf8 (label, -1, NULL, NULL, NULL);
pango_layout_set_text (pl, ulabel, -1);
g_free (ulabel);
points[0].x -= 21;
points[0].y += 10;
gdk_draw_layout_with_colors (draw->window, gc, points[0].x,
points[0].y, pl, grigio, NULL);
}
/* Asse Y
*/
for (i = 0; i < 9; i ++) {
points[0].x = x0 - 3;
points[0].y = points[1].y = (guint)(y1 - (y1 - y0) * (i * 50)/ 400);
points[1].x = x0;
/* Imposta gli stili della linea e traccia le ticks
*/
gdk_gc_set_line_attributes (gc, 0, GDK_LINE_SOLID, GDK_CAP_ROUND,
GDK_JOIN_ROUND);
gdk_gc_set_rgb_fg_color (gc, nero);
gdk_draw_lines (draw->window, gc, points, 2);
points[0].x = x0;
points[1].x = x1;
/* Imposta gli stili della linea e traccia le linee di divisione
*/
gdk_gc_set_line_attributes (gc, 0, GDK_LINE_ON_OFF_DASH,
GDK_CAP_ROUND, GDK_JOIN_ROUND);
gdk_gc_set_rgb_fg_color (gc, grigio);
gdk_draw_lines (draw->window, gc, points, 2);
/* labels
*/
g_sprintf (label, "%d \260C\0", (i * 50 + 550));
ulabel = g_locale_to_utf8 (label, -1, NULL, NULL, NULL);
pango_layout_set_text (pl, ulabel, -1);
g_free (ulabel);
points[0].x -= 45;
points[0].y -= 7;
gdk_draw_layout_with_colors (draw->window, gc, points[0].x,
points[0].y, pl, grigio, NULL);
}
/*
* Risultati: legge i punti da graficare da SimulaDeb.out
*/
dati = g_io_channel_new_file ("SimulaDeb.out", "r", NULL);
np = 1;
while (g_io_channel_read_line (dati, & buf, & len, NULL, NULL) !=
G_IO_STATUS_EOF) {
points = (GdkPoint *)g_realloc (points, np * sizeof (GdkPoint));
sscanf (buf, "%f %f", & fx, & fy);
/* I valori spazio-Temp letti devono ora essere trasformati in
posizioni sul gc [ 0 < fx < 65, 500 < fy < 1000]
*/
points[np-1].x = (guint)(x0 + (x1-x0) * fx/ 65);
points[np-1].y = (guint)(y1 - (y1-y0) * (fy - 550)/ 400);
np ++;
g_free (buf);
}
/*
* Traccia il grafico
*
* Imposta il colore (rosso)
*/
gdk_gc_set_rgb_fg_color (gc, rosso);
/* Imposta gli stili della linea
*/
gdk_gc_set_line_attributes (gc, 2, GDK_LINE_SOLID, GDK_CAP_ROUND,
GDK_JOIN_ROUND);
/* Traccia la linea
*/
gdk_draw_lines (draw->window, gc, points, np - 1);
/* e infine il frame-box
*/
gdk_gc_set_line_attributes (gc, 0, GDK_LINE_SOLID, GDK_CAP_ROUND,
GDK_JOIN_ROUND);
gdk_gc_set_rgb_fg_color (gc, nero);
gdk_draw_rectangle (draw->window, gc, FALSE,
x0, y0, x1 - x0, y1 - y0);
/* Libera tutti
*/
g_io_channel_shutdown (dati, FALSE, NULL);
g_io_channel_unref (dati);
pango_font_description_free (lblfont);
g_object_unref (pl);
g_free (points);
g_free (nero);
g_free (rosso);
g_free (grigio);
g_object_unref (gc);
}
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic