示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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));
}
示例#5
0
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;
}
示例#6
0
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);
}