X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiControlFlow%2FDraw_Item.c;h=eccfef0fea5f876b46b58ab4c06bd5c499d28020;hb=90ffd2adca8a23a36f3a9b7279f40797907723de;hp=c02725be7807ffa01086b95803e85b104ee16ce4;hpb=09e2606fca29ce45f4c0bc6aa0bfd0a00e9bb5f8;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c index c02725be..eccfef0f 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c @@ -68,7 +68,8 @@ * We use the lttv global attributes to keep track of the loaded icons. * If we need an icon, we look for it in the icons / icon name pathname. * If found, we use the pointer to it. If not, we load the pixmap in - * memory and set the pointer to the GdkPixmap in the attributes. + * memory and set the pointer to the GdkPixmap in the attributes. The + * structure pointed to contains the pixmap and the mask bitmap. * * Author : Mathieu Desnoyers, October 2003 */ @@ -79,133 +80,15 @@ #include #include #include +#include #include #include #include "Draw_Item.h" - -/* The DrawContext keeps information about the current drawing position and - * the previous one, so we can use both to draw lines. - * - * over : position for drawing over the middle line. - * middle : middle line position. - * under : position for drawing under the middle line. - * - * the modify_* are used to take into account that we should go forward - * when we draw a text, an arc or an icon, while it's unneeded when we - * draw a line or background. - */ -struct _DrawContext { - GdkDrawable *drawable; - GdkGC *gc; - - DrawInfo *Current; - DrawInfo *Previous; -}; - -struct _DrawInfo { - ItemInfo *over; - ItemInfo *middle; - ItemInfo *under; - - ItemInfo *modify_over; - ItemInfo *modify_middle; - ItemInfo *modify_under; -}; - -/* LttvExecutionState is accessible through the LttvTracefileState. Is has - * a pointer to the LttvProcessState which points to the top of stack - * execution state : LttvExecutionState *state. - * - * LttvExecutionState contains (useful here): - * LttvExecutionMode t, - * LttvExecutionSubmode n, - * LttvProcessStatus s - * - * - * LttvTraceState will be used in the case we need the string of the - * different processes, eventtype_names, syscall_names, trap_names, irq_names. - * - * LttvTracefileState also gives the cpu_name and, as it herits from - * LttvTracefileContext, it gives the LttEvent structure, which is needed - * to get facility name and event name. - */ -struct _ItemInfo { - gint x, y; - LttvTraceState *ts; - LttvTracefileState *tfs; -}; -/* - * The Item element is only used so the DrawOperation is modifiable by users. - * During drawing, only the Hook is needed. - */ -struct _DrawOperation { - DrawableItems Item; - LttvHooks *Hook; -}; - -/* - * We define here each items that can be drawn, together with their - * associated priority. Many item types can have the same priority, - * it's only used for quicksorting the operations when we add a new one - * to the array of operations to perform. Lower priorities are executed - * first. So, for example, we may want to give background color a value - * of 10 while a line would have 20, so the background color, which - * is in fact a rectangle, does not hide the line. - */ - -static int Items_Priorities[] = { - 50, /* ITEM_TEXT */ - 40, /* ITEM_ICON */ - 20, /* ITEM_LINE */ - 30, /* ITEM_POINT */ - 10 /* ITEM_BACKGROUND */ -}; - -/* - * Here are the different structures describing each item type that can be - * drawn. They contain the information necessary to draw the item : not the - * position (this is provided by the DrawContext), but the text, icon name, - * line width, color; all the properties of the specific items. - */ - -struct _PropertiesText { - GdkColor *foreground; - GdkColor *background; - gint size; - gchar *Text; - RelPos position; -}; - - -struct _PropertiesIcon { - gchar *icon_name; - gint width; - gint height; - RelPos position; -}; - -struct _PropertiesLine { - GdkColor *color; - gint line_width; - GdkLineStyle style; - RelPos position; -}; - -struct _PropertiesArc { - GdkColor *color; - gint size; /* We force circle by width = height */ - gboolean filled; - RelPos position; -}; - -struct _PropertiesBG { - GdkColor *color; -}; - +#define MAX_PATH_LEN 256 /* Drawing hook functions */ gboolean draw_text( void *hook_data, void *call_data) @@ -222,13 +105,11 @@ gboolean draw_text( void *hook_data, void *call_data) gdk_gc_set_foreground(Draw_Context->gc, Properties->foreground); gdk_gc_set_background(Draw_Context->gc, Properties->background); - layout = gtk_widget_create_pango_layout(GTK_WIDGET(Draw_Context->drawable), NULL); + layout = Draw_Context->pango_layout; context = pango_layout_get_context(layout); FontDesc = pango_context_get_font_description(context); - Font_Size = pango_font_description_get_size(FontDesc); pango_font_description_set_size(FontDesc, Properties->size*PANGO_SCALE); - pango_layout_set_text(layout, Properties->Text, -1); pango_layout_get_pixel_extents(layout, &ink_rect, NULL); switch(Properties->position) { @@ -256,33 +137,50 @@ gboolean draw_text( void *hook_data, void *call_data) break; } - - pango_font_description_set_size(FontDesc, Font_Size); - g_free(layout); - return 0; } + +/* To speed up the process, search in already loaded icons list first. Only + * load it if not present. + */ gboolean draw_icon( void *hook_data, void *call_data) { PropertiesIcon *Properties = (PropertiesIcon*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; - GdkBitmap *mask = g_new(GdkBitmap, 1); - GdkPixmap *icon_pixmap = g_new(GdkPixmap, 1); - GdkGC *gc = gdk_gc_new(Draw_Context->drawable); - gdk_gc_copy(gc, Draw_Context->gc); - - icon_pixmap = gdk_pixmap_create_from_xpm(Draw_Context->drawable, &mask, NULL, - Properties->icon_name); - - gdk_gc_set_clip_mask(gc, mask); + LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes()); + LttvAttributeValue value; + gchar icon_name[MAX_PATH_LEN] = "icons/"; + IconStruct *icon_info; + strcat(icon_name, Properties->icon_name); + + g_assert(lttv_iattribute_find_by_path(attributes, icon_name, + LTTV_POINTER, &value)); + if(*(value.v_pointer) == NULL) + { + *(value.v_pointer) = icon_info = g_new(IconStruct,1); + + icon_info->pixmap = gdk_pixmap_create_from_xpm(Draw_Context->drawable, + &icon_info->mask, NULL, Properties->icon_name); + } + else + { + icon_info = *(value.v_pointer); + } + + gdk_gc_set_clip_mask(Draw_Context->gc, icon_info->mask); + switch(Properties->position) { case OVER: + gdk_gc_set_clip_origin( + Draw_Context->gc, + Draw_Context->Current->modify_over->x, + Draw_Context->Current->modify_over->y); gdk_draw_drawable(Draw_Context->drawable, - gc, - icon_pixmap, + Draw_Context->gc, + icon_info->pixmap, 0, 0, Draw_Context->Current->modify_over->x, Draw_Context->Current->modify_over->y, @@ -292,21 +190,28 @@ gboolean draw_icon( void *hook_data, void *call_data) break; case MIDDLE: + gdk_gc_set_clip_origin( + Draw_Context->gc, + Draw_Context->Current->modify_middle->x, + Draw_Context->Current->modify_middle->y); gdk_draw_drawable(Draw_Context->drawable, - gc, - icon_pixmap, + Draw_Context->gc, + icon_info->pixmap, 0, 0, Draw_Context->Current->modify_middle->x, Draw_Context->Current->modify_middle->y, Properties->width, Properties->height); - Draw_Context->Current->modify_middle->x += Properties->width; break; case UNDER: + gdk_gc_set_clip_origin( + Draw_Context->gc, + Draw_Context->Current->modify_under->x, + Draw_Context->Current->modify_under->y); gdk_draw_drawable(Draw_Context->drawable, - gc, - icon_pixmap, + Draw_Context->gc, + icon_info->pixmap, 0, 0, Draw_Context->Current->modify_under->x, Draw_Context->Current->modify_under->y, @@ -316,7 +221,8 @@ gboolean draw_icon( void *hook_data, void *call_data) break; } - g_free(gc); + gdk_gc_set_clip_origin(Draw_Context->gc, 0, 0); + gdk_gc_set_clip_mask(Draw_Context->gc, NULL); return 0; } @@ -382,7 +288,6 @@ gboolean draw_arc( void *hook_data, void *call_data) Draw_Context->Current->modify_over->y, Properties->size, Properties->size, 0, 360*64); Draw_Context->Current->modify_over->x += Properties->size; - break; case MIDDLE: gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc,