如何在GTK中动态更改SVG图像中元素的颜色?

时间:2012-03-24 00:34:35

标签: svg gtk

以下两行代码从SVG文件加载图像并将其设置为窗口的图标:

GdkPixbuf *icon = gdk_pixbuf_new_from_file("icon.svg", NULL);
gtk_window_set_icon(GTK_WINDOW(win), icon);

此SVG文件包含一个定义如下的矩形:

<rect
   style="fill:#000000"
   id="screen"
   ... />

我想在加载文件后动态更改此rect元素的颜色,但在将其设置为窗口的图标之前。

如果我在启动程序之前手动更改磁盘上该文件元素的style属性,它会产生所需的效果。但是我想让它由程序本身设置,以匹配它所选择的颜色。

(这是我可以区分窗口切换器菜单中的多个类似窗口,以及其他地方)

1 个答案:

答案 0 :(得分:3)

我现在已经从IRC(irc.gnome.org上的#gtk +)找到了答案,并阅读了GTK自己的源代码。

答案包括构建一个设置样式表的字符串,并使用XML的xinclude来提取原始图像。

GdkPixbuf *load_icon(char *background)
{
  /* This technique stolen from 
   *   http://git.gnome.org/browse/gtk+/tree/gtk/gtkicontheme.c#n3180
   */

  gchar *str = g_strconcat(
      "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
      "<svg version=\"1.1\"\n"
      "     xmlns=\"http://www.w3.org/2000/svg\"\n"
      "     xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n"
      "     width=\"64\"\n"
      "     height=\"64\">\n"
      "  <style type=\"text/css\">\n"
      "    #screen {\n"
      "      fill: ", background, " !important;\n"
      "    }\n"
      "  </style>\n"
      "  <xi:include href=\"" PANGOTERM_SHAREDIR "/pangoterm.svg" "\"/>\n"
      "</svg>",
    NULL);

  GInputStream *stream = g_memory_input_stream_new_from_data(str, -1, g_free);

  GdkPixbuf *ret = gdk_pixbuf_new_from_stream(stream, NULL, NULL);

  g_object_unref(stream);

  return ret;
}