X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiControlFlow%2FDraw_Item.c;h=4a6d6d2af729437828d2a816d3d33a376dced7ba;hb=f66eba62898bf525692d55ef95935266aee56096;hp=4ccd30e8760ab74f7fd4d27047d647c97b81e7b6;hpb=b782dd11ec8e363e135b32a563687a8e4f70bedb;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 4ccd30e8..4a6d6d2a 100644 --- a/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c +++ b/ltt/branches/poly/lttv/modules/guiControlFlow/Draw_Item.c @@ -37,9 +37,13 @@ * GQuark.) The habitual place for xpm icons is in * ${prefix}/share/LinuxTraceToolkit.) + position (over or under line) * - line (color, width, style) - * - Arc (can be seen as points) (color, size) + * - Arc (big points) (color, size) * - background color (color) * + * An item is a leaf of the attributes tree. It is, in that case, including + * all kind of events categories we can have. It then associates each category + * with one or more actions (drawing something) or nothing. + * * Each item has an array of hooks (hook list). Each hook represents an * operation to perform. We seek the array each time we want to * draw an item. We execute each operation in order. An operation type @@ -64,177 +68,274 @@ * 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 */ #include +#include +#include #include #include #include +#include #include #include -/* 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. - */ -struct _DrawContext { - GdkDrawable *drawable; - GdkGC *gc; - - DrawInfo *Current; - DrawInfo *Previous; -}; - -struct _DrawInfo { - ItemInfo *over; - ItemInfo *middle; - ItemInfo *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. - */ - -typedef enum _DrawableItems { - ITEM_TEXT, ITEM_ICON, ITEM_LINE, ITEM_POINT, ITEM_BACKGROUND -} DrawableItems; - -static gchar * Items_Priorities = { - 50, /* ITEM_TEXT */ - 40, /* ITEM_ICON */ - 20, /* ITEM_LINE */ - 30, /* ITEM_POINT */ - 10 /* ITEM_BACKGROUND */ -}; - -typedef enum _RelPos { - OVER, MIDDLE, UNDER -} RelPos; - -/* - * 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; -}; - - +#include "Draw_Item.h" +#define MAX_PATH_LEN 256 /* Drawing hook functions */ -gboolean DrawText( void *hook_data, void *call_data) +gboolean draw_text( void *hook_data, void *call_data) { PropertiesText *Properties = (PropertiesText*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; + + PangoContext *context; + PangoLayout *layout; + PangoFontDescription *FontDesc;// = pango_font_description_new(); + gint Font_Size; + PangoRectangle ink_rect; + + 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); + 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) { + case OVER: + gdk_draw_layout(Draw_Context->drawable, Draw_Context->gc, + Draw_Context->Current->modify_over->x, + Draw_Context->Current->modify_over->y, + layout); + Draw_Context->Current->modify_over->x += ink_rect.width; + + break; + case MIDDLE: + gdk_draw_layout(Draw_Context->drawable, Draw_Context->gc, + Draw_Context->Current->modify_middle->x, + Draw_Context->Current->modify_middle->y, + layout); + Draw_Context->Current->modify_middle->x += ink_rect.width; + break; + case UNDER: + gdk_draw_layout(Draw_Context->drawable, Draw_Context->gc, + Draw_Context->Current->modify_under->x, + Draw_Context->Current->modify_under->y, + layout); + Draw_Context->Current->modify_under->x += ink_rect.width; + break; + } + + + pango_font_description_set_size(FontDesc, Font_Size); + g_free(layout); + + return 0; } -gboolean DrawIcon( void *hook_data, void *call_data) + +/* 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; + 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, + Draw_Context->gc, + icon_info->pixmap, + 0, 0, + Draw_Context->Current->modify_over->x, + Draw_Context->Current->modify_over->y, + Properties->width, Properties->height); + + Draw_Context->Current->modify_over->x += Properties->width; + + 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, + 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, + Draw_Context->gc, + icon_info->pixmap, + 0, 0, + Draw_Context->Current->modify_under->x, + Draw_Context->Current->modify_under->y, + Properties->width, Properties->height); + + Draw_Context->Current->modify_under->x += Properties->width; + break; + } + + gdk_gc_set_clip_origin(Draw_Context->gc, 0, 0); + gdk_gc_set_clip_mask(Draw_Context->gc, NULL); + + return 0; } -gboolean DrawLine( void *hook_data, void *call_data) +gboolean draw_line( void *hook_data, void *call_data) { PropertiesLine *Properties = (PropertiesLine*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; + gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + gdk_gc_set_line_attributes( Draw_Context->gc, + Properties->line_width, + Properties->style, + GDK_CAP_BUTT, + GDK_JOIN_MITER); + + switch(Properties->position) { + case OVER: + drawing_draw_line( + NULL, Draw_Context->drawable, + Draw_Context->Previous->over->x, + Draw_Context->Previous->over->y, + Draw_Context->Current->over->x, + Draw_Context->Current->over->y, + Draw_Context->gc); + break; + case MIDDLE: + drawing_draw_line( + NULL, Draw_Context->drawable, + Draw_Context->Previous->middle->x, + Draw_Context->Previous->middle->y, + Draw_Context->Current->middle->x, + Draw_Context->Current->middle->y, + Draw_Context->gc); + break; + case UNDER: + drawing_draw_line( + NULL, Draw_Context->drawable, + Draw_Context->Previous->under->x, + Draw_Context->Previous->under->y, + Draw_Context->Current->under->x, + Draw_Context->Current->under->y, + Draw_Context->gc); + + break; + } + + return 0; } -gboolean DrawArc( void *hook_data, void *call_data) +gboolean draw_arc( void *hook_data, void *call_data) { PropertiesArc *Properties = (PropertiesArc*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; + gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + + switch(Properties->position) { + case OVER: + gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc, + Properties->filled, + Draw_Context->Current->modify_over->x, + 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, + Properties->filled, + Draw_Context->Current->modify_middle->x, + Draw_Context->Current->modify_middle->y, + Properties->size, Properties->size, 0, 360*64); + Draw_Context->Current->modify_middle->x += Properties->size; + + break; + case UNDER: + gdk_draw_arc(Draw_Context->drawable, Draw_Context->gc, + Properties->filled, + Draw_Context->Current->modify_under->x, + Draw_Context->Current->modify_under->y, + Properties->size, Properties->size, 0, 360*64); + Draw_Context->Current->modify_under->x += Properties->size; + + break; + } + + + return 0; } -gboolean DrawBG( void *hook_data, void *call_data) +gboolean draw_bg( void *hook_data, void *call_data) { PropertiesBG *Properties = (PropertiesBG*)hook_data; DrawContext *Draw_Context = (DrawContext*)call_data; + gdk_gc_set_foreground(Draw_Context->gc, Properties->color); + + + gdk_draw_rectangle(Draw_Context->drawable, Draw_Context->gc, + TRUE, + Draw_Context->Previous->over->x, + Draw_Context->Previous->over->y, + Draw_Context->Current->over->x - Draw_Context->Previous->over->x, + Draw_Context->Previous->under->y); + + return 0; }