X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Fdrawitem.c;h=d97628b021f3b9abed37236c0693a612328662b5;hb=f0d243f7b3a3fd1f5fe74f9f272213192dc9cdaa;hp=2c72660a4b900a12e927b7f45eca73e678573ecf;hpb=c8bba5fa123e79c25c3ed0f6355f511ed84b88b2;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c index 2c72660a..d97628b0 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/drawitem.c @@ -94,6 +94,10 @@ * Author : Mathieu Desnoyers, October 2003 */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include @@ -104,7 +108,9 @@ #include #include +#include +#include "drawing.h" #include "drawitem.h" @@ -113,14 +119,12 @@ /* drawing hook functions */ gboolean draw_text( void *hook_data, void *call_data) { - PropertiesText *Properties = (PropertiesText*)hook_data; + PropertiesText *properties = (PropertiesText*)hook_data; DrawContext *draw_context = (DrawContext*)call_data; PangoContext *context; PangoLayout *layout; - PangoAttribute *attribute; PangoFontDescription *font_desc;// = pango_font_description_new(); - gint font_size; PangoRectangle ink_rect; layout = draw_context->pango_layout; @@ -128,39 +132,77 @@ gboolean draw_text( void *hook_data, void *call_data) context = pango_layout_get_context(layout); font_desc = pango_context_get_font_description(context); - pango_font_description_set_size(font_desc, Properties->size*PANGO_SCALE); + pango_font_description_set_size(font_desc, properties->size*PANGO_SCALE); pango_layout_context_changed(layout); - pango_layout_set_text(layout, Properties->text, -1); + 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_with_colors(draw_context->drawable, - draw_context->gc, - draw_context->drawinfo.modify_over.x, - draw_context->drawinfo.modify_over.y, - layout, Properties->foreground, Properties->background); - draw_context->drawinfo.modify_over.x += ink_rect.width; + gint x=0, y=0; + gint *offset=NULL; + gboolean enough_space = FALSE; + gint width = ink_rect.width; + + switch(properties->position.x) { + case POS_START: + x = draw_context->drawinfo.start.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.start.offset.over; + x += draw_context->drawinfo.start.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.start.offset.middle; + x += draw_context->drawinfo.start.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.start.offset.under; + x += draw_context->drawinfo.start.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x + width <= draw_context->drawinfo.end.x)) { + enough_space = TRUE; + *offset += width; + } break; - case MIDDLE: - gdk_draw_layout_with_colors(draw_context->drawable, - draw_context->gc, - draw_context->drawinfo.modify_middle.x, - draw_context->drawinfo.modify_middle.y, - layout, Properties->foreground, Properties->background); - draw_context->drawinfo.modify_middle.x += ink_rect.width; - break; - case UNDER: - gdk_draw_layout_with_colors(draw_context->drawable, - draw_context->gc, - draw_context->drawinfo.modify_under.x, - draw_context->drawinfo.modify_under.y, - layout, Properties->foreground, Properties->background); - draw_context->drawinfo.modify_under.x += ink_rect.width; + case POS_END: + x = draw_context->drawinfo.end.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.end.offset.over; + x += draw_context->drawinfo.end.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.end.offset.middle; + x += draw_context->drawinfo.end.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.end.offset.under; + x += draw_context->drawinfo.end.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x - width >= draw_context->drawinfo.start.x)) { + enough_space = TRUE; + *offset -= width; + } break; } + if(unlikely(enough_space)) + gdk_draw_layout_with_colors(draw_context->drawable, + draw_context->gc, + x, + y, + layout, properties->foreground, properties->background); + return 0; } @@ -182,7 +224,7 @@ gboolean draw_icon( void *hook_data, void *call_data) g_assert(lttv_iattribute_find_by_path(attributes, icon_name, LTTV_POINTER, &value)); - if(*(value.v_pointer) == NULL) + if(unlikely(*(value.v_pointer) == NULL)) { *(value.v_pointer) = icon_info = g_new(IconStruct,1); @@ -194,60 +236,82 @@ gboolean draw_icon( void *hook_data, void *call_data) icon_info = *(value.v_pointer); } - gdk_gc_set_clip_mask(draw_context->gc, icon_info->mask); + gint x=0, y=0; + gint *offset=NULL; + gboolean enough_space = FALSE; + gint width = properties->width; - switch(properties->position) { - case OVER: - gdk_gc_set_clip_origin( - draw_context->gc, - draw_context->drawinfo.modify_over.x, - draw_context->drawinfo.modify_over.y); - gdk_draw_drawable(draw_context->drawable, - draw_context->gc, - icon_info->pixmap, - 0, 0, - draw_context->drawinfo.modify_over.x, - draw_context->drawinfo.modify_over.y, - properties->width, properties->height); - - draw_context->drawinfo.modify_over.x += properties->width; - - break; - case MIDDLE: - gdk_gc_set_clip_origin( - draw_context->gc, - draw_context->drawinfo.modify_middle.x, - draw_context->drawinfo.modify_middle.y); - gdk_draw_drawable(draw_context->drawable, - draw_context->gc, - icon_info->pixmap, - 0, 0, - draw_context->drawinfo.modify_middle.x, - draw_context->drawinfo.modify_middle.y, - properties->width, properties->height); - - draw_context->drawinfo.modify_middle.x += properties->width; + switch(properties->position.x) { + case POS_START: + x = draw_context->drawinfo.start.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.start.offset.over; + x += draw_context->drawinfo.start.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.start.offset.middle; + x += draw_context->drawinfo.start.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.start.offset.under; + x += draw_context->drawinfo.start.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x + width <= draw_context->drawinfo.end.x)) { + enough_space = TRUE; + *offset += width; + } break; - case UNDER: - gdk_gc_set_clip_origin( - draw_context->gc, - draw_context->drawinfo.modify_under.x, - draw_context->drawinfo.modify_under.y); - gdk_draw_drawable(draw_context->drawable, - draw_context->gc, - icon_info->pixmap, - 0, 0, - draw_context->drawinfo.modify_under.x, - draw_context->drawinfo.modify_under.y, - properties->width, properties->height); - - draw_context->drawinfo.modify_under.x += properties->width; + case POS_END: + x = draw_context->drawinfo.end.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.end.offset.over; + x += draw_context->drawinfo.end.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.end.offset.middle; + x += draw_context->drawinfo.end.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.end.offset.under; + x += draw_context->drawinfo.end.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x - width >= draw_context->drawinfo.start.x)) { + enough_space = TRUE; + *offset -= width; + } break; } - gdk_gc_set_clip_origin(draw_context->gc, 0, 0); - gdk_gc_set_clip_mask(draw_context->gc, NULL); - + if(unlikely(enough_space)) { + gdk_gc_set_clip_mask(draw_context->gc, icon_info->mask); + + gdk_gc_set_clip_origin( + draw_context->gc, + x, + y); + gdk_draw_drawable(draw_context->drawable, + draw_context->gc, + icon_info->pixmap, + 0, 0, + x, + y, + properties->width, properties->height); + + gdk_gc_set_clip_origin(draw_context->gc, 0, 0); + gdk_gc_set_clip_mask(draw_context->gc, NULL); + } return 0; } @@ -255,11 +319,9 @@ gboolean draw_line( void *hook_data, void *call_data) { PropertiesLine *properties = (PropertiesLine*)hook_data; DrawContext *draw_context = (DrawContext*)call_data; - //GdkGC *gc = gdk_gc_new(draw_context->drawable); - //gdk_gc_set_foreground(draw_context->gc, properties->color); - gdk_gc_set_rgb_fg_color(draw_context->gc, &properties->color); - //gdk_gc_set_foreground(gc, properties->color); + gdk_gc_set_foreground(draw_context->gc, &properties->color); + //gdk_gc_set_rgb_fg_color(draw_context->gc, &properties->color); gdk_gc_set_line_attributes( draw_context->gc, properties->line_width, properties->style, @@ -271,38 +333,30 @@ gboolean draw_line( void *hook_data, void *call_data) // draw_context->drawinfo.middle.x, // draw_context->drawinfo.middle.y); - switch(properties->position) { + gint x_begin=0, x_end=0, y=0; + + x_begin = draw_context->drawinfo.start.x; + x_end = draw_context->drawinfo.end.x; + + switch(properties->y) { case OVER: - drawing_draw_line( - NULL, draw_context->drawable, - draw_context->previous->over->x, - draw_context->previous->over->y, - draw_context->drawinfo.over.x, - draw_context->current->over->y, - draw_context->gc); + y = draw_context->drawinfo.y.over; break; case MIDDLE: - drawing_draw_line( - NULL, draw_context->drawable, - draw_context->previous->middle->x, - draw_context->previous->middle->y, - draw_context->drawinfo.middle.x, - draw_context->drawinfo.middle.y, - draw_context->gc); + y = draw_context->drawinfo.y.middle; break; case UNDER: - drawing_draw_line( - NULL, draw_context->drawable, - draw_context->previous->under->x, - draw_context->previous->under->y, - draw_context->drawinfo.under.x, - draw_context->drawinfo.under.y, - draw_context->gc); - + y = draw_context->drawinfo.y.under; break; } - - //gdk_gc_unref(gc); + + drawing_draw_line( + NULL, draw_context->drawable, + x_begin, + y, + x_end, + y, + draw_context->gc); return 0; } @@ -312,38 +366,73 @@ 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); - gdk_gc_set_rgb_fg_color(draw_context->gc, properties->color); + gdk_gc_set_foreground(draw_context->gc, properties->color); + //gdk_gc_set_rgb_fg_color(draw_context->gc, properties->color); - switch(properties->position) { - case OVER: - gdk_draw_arc(draw_context->drawable, draw_context->gc, - properties->filled, - draw_context->drawinfo.modify_over.x, - draw_context->drawinfo.modify_over.y, - properties->size, properties->size, 0, 360*64); - draw_context->drawinfo.modify_over.x += properties->size; - break; - case MIDDLE: - gdk_draw_arc(draw_context->drawable, draw_context->gc, - properties->filled, - draw_context->drawinfo.modify_middle.x, - draw_context->drawinfo.modify_middle.y, - properties->size, properties->size, 0, 360*64); - draw_context->drawinfo.modify_middle.x += properties->size; - - break; - case UNDER: - gdk_draw_arc(draw_context->drawable, draw_context->gc, - properties->filled, - draw_context->drawinfo.modify_under.x, - draw_context->drawinfo.modify_under.y, - properties->size, properties->size, 0, 360*64); - draw_context->drawinfo.modify_under.x += properties->size; + gint x=0, y=0; + gint *offset=NULL; + gboolean enough_space = FALSE; + gint width = properties->size; + switch(properties->position.x) { + case POS_START: + x = draw_context->drawinfo.start.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.start.offset.over; + x += draw_context->drawinfo.start.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.start.offset.middle; + x += draw_context->drawinfo.start.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.start.offset.under; + x += draw_context->drawinfo.start.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x + width <= draw_context->drawinfo.end.x)) { + enough_space = TRUE; + *offset += width; + } + break; + case POS_END: + x = draw_context->drawinfo.end.x; + switch(properties->position.y) { + case OVER: + offset = &draw_context->drawinfo.end.offset.over; + x += draw_context->drawinfo.end.offset.over; + y = draw_context->drawinfo.y.over; + break; + case MIDDLE: + offset = &draw_context->drawinfo.end.offset.middle; + x += draw_context->drawinfo.end.offset.middle; + y = draw_context->drawinfo.y.middle; + break; + case UNDER: + offset = &draw_context->drawinfo.end.offset.under; + x += draw_context->drawinfo.end.offset.under; + y = draw_context->drawinfo.y.under; + break; + } + /* verify if there is enough space to draw */ + if(unlikely(x - width >= draw_context->drawinfo.start.x)) { + enough_space = TRUE; + *offset -= width; + } break; } + if(unlikely(enough_space)) + gdk_draw_arc(draw_context->drawable, draw_context->gc, + properties->filled, + x, + y, + properties->size, properties->size, 0, 360*64); return 0; } @@ -353,8 +442,8 @@ 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_gc_set_rgb_fg_color(draw_context->gc, properties->color); + gdk_gc_set_foreground(draw_context->gc, properties->color); + //gdk_gc_set_rgb_fg_color(draw_context->gc, properties->color); //g_critical("DRAWING RECT : x: %i, y: %i, w:%i, h:%i, val1 :%i, val2:%i ", // draw_context->previous->over->x, @@ -365,10 +454,10 @@ gboolean draw_bg( void *hook_data, void *call_data) // draw_context->previous->over->x); gdk_draw_rectangle(draw_context->drawable, draw_context->gc, TRUE, - draw_context->previous->over->x, - draw_context->previous->over->y, - draw_context->drawinfo.over.x - draw_context->previous->over->x, - draw_context->previous->under->y-draw_context->previous->over->y); + draw_context->drawinfo.start.x, + draw_context->drawinfo.y.over, + draw_context->drawinfo.end.x - draw_context->drawinfo.start.x, + draw_context->drawinfo.y.under - draw_context->drawinfo.y.over); return 0; }