static void setPangoAttributes(const Font* font, const TextRun& run, PangoLayout* layout, bool rtl) { PangoAttrList* list = pango_attr_list_new(); PangoAttribute* attr; attr = pango_attr_size_new_absolute((int)(font->size() * PANGO_SCALE)); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); attr = pango_attr_letter_spacing_new(font->letterSpacing() * PANGO_SCALE); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); // Pango does not yet support synthesising small caps // See http://bugs.webkit.org/show_bug.cgi?id=15610 pango_layout_set_attributes(layout, list); pango_attr_list_unref(list); pango_layout_set_auto_dir(layout, FALSE); PangoContext* pangoContext = pango_layout_get_context(layout); PangoDirection direction = rtl ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; pango_context_set_base_dir(pangoContext, direction); }
static void setPangoAttributes(const Font* font, const TextRun& run, PangoLayout* layout) { #if USE(FREETYPE) if (font->primaryFont()->platformData().m_pattern) { PangoFontDescription* desc = pango_fc_font_description_from_pattern(font->primaryFont()->platformData().m_pattern.get(), FALSE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); } #elif USE(PANGO) if (font->primaryFont()->platformData().m_font) { PangoFontDescription* desc = pango_font_describe(font->primaryFont()->platformData().m_font); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); } #endif pango_layout_set_auto_dir(layout, FALSE); PangoContext* pangoContext = pango_layout_get_context(layout); PangoDirection direction = run.rtl() ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; pango_context_set_base_dir(pangoContext, direction); PangoAttrList* list = pango_attr_list_new(); PangoAttribute* attr; attr = pango_attr_size_new_absolute(font->pixelSize() * PANGO_SCALE); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); if (!run.spacingDisabled()) { attr = pango_attr_letter_spacing_new(font->letterSpacing() * PANGO_SCALE); attr->end_index = G_MAXUINT; pango_attr_list_insert_before(list, attr); } // Pango does not yet support synthesising small caps // See http://bugs.webkit.org/show_bug.cgi?id=15610 pango_layout_set_attributes(layout, list); pango_attr_list_unref(list); }
static void timing_inst_layout_refresh(struct vgpu_compute_unit_t *compute_unit) { struct vgpu_uop_t *uop; int x, y, top_y; int i; /* Check if diagram needs to get recalculated */ if (timing_dia_needs_refresh(compute_unit)) timing_dia_refresh(compute_unit); /* Remove all child widgets in 'timing_inst_layout' */ gtk_container_destroy_children(GTK_CONTAINER(compute_unit->timing_inst_layout)); /* White background */ GdkColor color; gdk_color_parse("white", &color); /* Attributes for labels */ PangoAttrList *attrs; PangoAttribute *size_attr; attrs = pango_attr_list_new(); size_attr = pango_attr_size_new_absolute(13 << 10); pango_attr_list_insert(attrs, size_attr); /* Instruction list */ top_y = -((int) compute_unit->timing_dia_vscrollbar_value % timing_dia_row_height); y = top_y; for (i = 0; i < compute_unit->timing_dia_height; i++) { char text[MAX_STRING_SIZE]; GtkWidget *label; GtkWidget *event_box; GtkRequisition req; uop = list_get(compute_unit->timing_inst_uops, i); if (uop) { /* Create label + event box for 'I-x' */ x = 0; snprintf(text, sizeof text, "I-%d", uop->id); label = gtk_label_new(text); event_box = gtk_event_box_new(); gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &color); gtk_container_add(GTK_CONTAINER(event_box), label); gtk_layout_put(GTK_LAYOUT(compute_unit->timing_inst_layout), event_box, x, y); gtk_widget_set_size_request(event_box, 40, timing_dia_row_height); gtk_label_set_attributes(GTK_LABEL(label), attrs); g_signal_connect(G_OBJECT(event_box), "enter-notify-event", G_CALLBACK(list_layout_label_enter_notify_event), NULL); g_signal_connect(G_OBJECT(event_box), "leave-notify-event", G_CALLBACK(list_layout_label_leave_notify_event), NULL); g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(timing_inst_layout_clicked_event), uop); /* Create label + event box for instruction name */ x = 42; label = gtk_label_new(NULL); event_box = gtk_event_box_new(); gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &color); vgpu_uop_get_markup(uop, text, sizeof(text)); gtk_label_set_markup(GTK_LABEL(label), text); gtk_container_add(GTK_CONTAINER(event_box), label); gtk_layout_put(GTK_LAYOUT(compute_unit->timing_inst_layout), event_box, x, y); gtk_widget_size_request(label, &req); gtk_widget_set_size_request(event_box, req.width, timing_dia_row_height); gtk_label_set_attributes(GTK_LABEL(label), attrs); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); } y += timing_dia_row_height; } gtk_widget_show_all(compute_unit->timing_inst_layout); }
void vi_list_refresh(struct vi_list_t *list) { int width; int height; int x; int y; int count; int i; GtkStyle *style; GList *child; /* Clear current item list and empty layout */ while (list->item_list->count) vi_list_item_free(list_remove_at(list->item_list, 0)); while ((child = gtk_container_get_children(GTK_CONTAINER(list->widget)))) gtk_container_remove(GTK_CONTAINER(list->widget), child->data); /* Get 'list' widget size */ width = gtk_widget_get_allocated_width(list->widget); height = gtk_widget_get_allocated_height(list->widget); list->width = width; list->height = height; /* Background color */ GdkColor color; style = gtk_widget_get_style(list->widget); color = style->bg[GTK_STATE_NORMAL]; /* Fill it with labels */ x = 0; y = 0; count = list->elem_list->count; for (i = 0; i < count; i++) { int last; struct vi_list_item_t *item; void *elem; char str1[MAX_STRING_SIZE]; char str2[MAX_STRING_SIZE]; char *comma; GtkWidget *label; GtkWidget *event_box; PangoAttrList *attrs; PangoAttribute *size_attr; GtkRequisition req; /* Create list item */ item = vi_list_item_create(); /* Get current element */ elem = list_get(list->elem_list, i); /* Create label */ comma = i < count - 1 ? "," : ""; if (list->get_elem_name) (*list->get_elem_name)(elem, str1, sizeof str1); else snprintf(str1, sizeof str1, "item-%d", i); snprintf(str2, sizeof str2, "%s%s", str1, comma); label = gtk_label_new(str2); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); /* Set label font attributes */ attrs = pango_attr_list_new(); size_attr = pango_attr_size_new_absolute(list->text_size << 10); pango_attr_list_insert(attrs, size_attr); gtk_label_set_attributes(GTK_LABEL(label), attrs); /* Get position */ gtk_widget_get_preferred_size(label, &req, NULL); last = 0; if (x > 0 && x + req.width >= width) { x = 0; y += req.height; if (y + 2 * req.height >= height && i < count - 1) { snprintf(str1, sizeof str1, "+ %d more", count - i); gtk_label_set_text(GTK_LABEL(label), str1); gtk_widget_get_preferred_size(label, &req, NULL); last = 1; } } /* Create event box */ event_box = gtk_event_box_new(); gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &color); gtk_container_add(GTK_CONTAINER(event_box), label); gtk_widget_add_events(event_box, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); /* Events for event box */ g_signal_connect(G_OBJECT(event_box), "enter-notify-event", G_CALLBACK(vi_list_item_enter_notify_event), item); g_signal_connect(G_OBJECT(event_box), "leave-notify-event", G_CALLBACK(vi_list_item_leave_notify_event), item); if (last) g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(vi_list_item_more_press_event), item); else g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(vi_list_item_button_press_event), item); /* Insert event box in 'list' layout */ gtk_layout_put(GTK_LAYOUT(list->widget), event_box, x, y); /* Initialize item */ item->list = list; item->elem = elem; item->event_box = event_box; item->label = label; list_add(list->item_list, item); /* Advance */ x += req.width + 5; if (last) break; } /* Show all new widgets */ gtk_widget_show_all(list->widget); gtk_container_check_resize(GTK_CONTAINER(list->widget)); }
struct vi_list_popup_t *vi_list_popup_create(struct vi_list_t *list) { struct vi_list_popup_t *popup; /* Initialize */ popup = xcalloc(1, sizeof(struct vi_list_popup_t)); popup->list = list; int i; int count; /* Create list of 'vi_list_item_t' */ popup->item_list = list_create(); /* Create main window */ GtkWidget *window; window = gtk_window_new(GTK_WINDOW_POPUP); popup->window = window; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); gtk_widget_set_size_request(window, 200, 250); gtk_window_set_modal(GTK_WINDOW(window), TRUE); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(vi_list_popup_destroy_event), popup); /* Close button */ GtkWidget *image_close = gtk_image_new_from_file(vi_list_image_close_path); GtkWidget *event_box_close = gtk_event_box_new(); popup->image_close = image_close; gtk_container_add(GTK_CONTAINER(event_box_close), image_close); gtk_widget_add_events(event_box_close, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(event_box_close), "enter-notify-event", G_CALLBACK(vi_list_popup_image_close_enter_notify_event), popup); g_signal_connect(G_OBJECT(event_box_close), "leave-notify-event", G_CALLBACK(vi_list_popup_image_close_leave_notify_event), popup); g_signal_connect(G_OBJECT(event_box_close), "button-press-event", G_CALLBACK(vi_list_popup_image_close_clicked_event), popup); /* Title */ GtkWidget *title_label = gtk_label_new(list->title); GtkWidget *title_event_box = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(title_event_box), title_label); /* Separator below title */ GtkWidget *hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); /* Scrolled window */ GtkWidget *scrolled_window; scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); /* Main table */ GtkWidget *main_table; main_table = gtk_table_new(3, 2, FALSE); gtk_table_attach(GTK_TABLE(main_table), title_event_box, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(main_table), event_box_close, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(main_table), hsep, 0, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach_defaults(GTK_TABLE(main_table), scrolled_window, 0, 2, 2, 3); gtk_container_add(GTK_CONTAINER(window), main_table); GdkColor color; gdk_color_parse("#ffffa0", &color); GtkWidget *table; count = list->elem_list->count; table = gtk_table_new(count, 1, FALSE); for (i = 0; i < count; i++) { void *elem; char str[MAX_STRING_SIZE]; struct vi_list_item_t *item; /* Get element */ elem = list_get(list->elem_list, i); /* Create label */ GtkWidget *label; if (list->get_elem_name) (*list->get_elem_name)(elem, str, sizeof str); else snprintf(str, sizeof str, "item-%d", i); label = gtk_label_new(str); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); /* Set label font attributes */ PangoAttrList *attrs; attrs = pango_attr_list_new(); PangoAttribute *size_attr = pango_attr_size_new_absolute(12 << 10); pango_attr_list_insert(attrs, size_attr); gtk_label_set_attributes(GTK_LABEL(label), attrs); /* Event box */ GtkWidget *event_box; event_box = gtk_event_box_new(); gtk_widget_modify_bg(event_box, GTK_STATE_NORMAL, &color); gtk_container_add(GTK_CONTAINER(event_box), label); /* Create list_layout_item */ item = vi_list_item_create(); item->list = list; item->event_box = event_box; item->label = label; item->elem = elem; list_add(list->item_list, item); /* Events for event box */ gtk_widget_add_events(event_box, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(event_box), "enter-notify-event", G_CALLBACK(vi_list_item_enter_notify_event), item); g_signal_connect(G_OBJECT(event_box), "leave-notify-event", G_CALLBACK(vi_list_item_leave_notify_event), item); g_signal_connect(G_OBJECT(event_box), "button-press-event", G_CALLBACK(vi_list_item_button_press_event), item); gtk_table_attach(GTK_TABLE(table), event_box, 0, 1, i, i + 1, GTK_FILL, GTK_FILL, 0, 0); } GtkWidget *viewport; viewport = gtk_viewport_new(NULL, NULL); gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &color); gtk_container_add(GTK_CONTAINER(viewport), table); gtk_widget_modify_bg(viewport, GTK_STATE_NORMAL, &color); gtk_container_add(GTK_CONTAINER(scrolled_window), viewport); /* Return */ return popup; }
static void draw_str(struct gra2cairo_local *local, int draw, char *str, struct fontmap *font, int size, int space, int *fw, int *ah, int *dh) { PangoAttribute *attr; PangoAttrList *alist; PangoLayoutIter *piter; int w, h, baseline; if (size == 0 || str == NULL) { if (fw) *fw = 0; if (ah) *ah = 0; if (dh) *dh = 0; return; } if (local->layout == NULL) { local->layout = pango_cairo_create_layout(local->cairo); } alist = pango_attr_list_new(); attr = pango_attr_size_new_absolute(mxd2ph(local, size) * PANGO_SCALE); pango_attr_list_insert(alist, attr); attr = pango_attr_letter_spacing_new(mxd2ph(local, space) * PANGO_SCALE); pango_attr_list_insert(alist, attr); pango_layout_set_font_description(local->layout, font->font); pango_layout_set_attributes(local->layout, alist); pango_attr_list_unref(alist); pango_layout_set_text(local->layout, str, -1); pango_layout_get_pixel_size(local->layout, &w, &h); piter = pango_layout_get_iter(local->layout); baseline = pango_layout_iter_get_baseline(piter) / PANGO_SCALE; if (fw) *fw = w; if (ah) *ah = baseline; if (dh) *dh = h - baseline; if (draw && str) { double x, y; double cx, cy; x = - local->fontsin * baseline; y = - local->fontcos * baseline; cairo_get_current_point(local->cairo, &cx, &cy); relative_move(local->cairo, x, y); cairo_save(local->cairo); cairo_rotate(local->cairo, -local->fontdir * G_PI / 180.); pango_cairo_update_layout(local->cairo, local->layout); if (local->text2path) { pango_cairo_layout_path(local->cairo, local->layout); cairo_fill(local->cairo); cairo_restore(local->cairo); cairo_move_to(local->cairo, cx + w * local->fontcos, cy - w * local->fontsin); } else { pango_cairo_show_layout(local->cairo, local->layout); cairo_restore(local->cairo); relative_move(local->cairo, w * local->fontcos - x, - w * local->fontsin - y); } } pango_layout_iter_free(piter); }