Hello everyone,

I am having following example code which i am using to Draw background of a
window plus a GtkImage On It. I am drawing background of GtkWindow by use of
Cairo on Expose Event. I am Adding One GtkImage on this window and in that
GtkImage i ma adding Text Using Pango but this image is not visible.


You can try and run this program.
It will just display window with given PNG image as background. but not the
image on it. when i use export XLIB_SKIP_ARGB_VISUALS=1 on terminal then it
displays both Window and Image on it but Transparency of background image is
Lost.


Code

--------------------------------------------------------------------------------------------------------------------------------

#include <gtk/gtk.h>
#include "string.h"

gboolean DrawTextOnImage(GtkWidget *image, const gchar *markup, const gchar*
fg_color)
{
    g_return_val_if_fail( image != NULL, FALSE );
    g_return_val_if_fail( markup != NULL, FALSE );

    gint x, y, pwidth, pheight;
    GdkGC *gc;
    GdkPixmap *pixmap;
    GdkPixbuf *pixbuf;
    GdkColor  color;
    GdkBitmap *mask;
    PangoRectangle  extents;
    GtkRequisition req;

    pixbuf = gtk_image_get_pixbuf( GTK_IMAGE(image) );
    gdk_pixbuf_render_pixmap_and_mask( pixbuf, &pixmap, &mask, 1 );

    if (fg_color == NULL)
        gdk_color_parse("black", &color);
    else
        gdk_color_parse(fg_color, &color);

    gc = gdk_gc_new( GDK_DRAWABLE( pixmap ) );
    gdk_gc_set_rgb_fg_color(gc, &color);

    PangoLayout *layout;
    layout = pango_layout_new( gtk_widget_get_pango_context(image));
    pango_layout_set_markup( layout, markup, strlen(markup) );
    pango_layout_get_pixel_extents (layout, &extents, NULL);

    gtk_widget_size_request( image, &req );

    x = image->allocation.x;
    y = image->allocation.y;

    gdk_draw_layout( GDK_DRAWABLE(pixmap),
             gc,
             x + (req.width - extents.width) / 2,
             y + (req.height - extents.height) / 2,
             layout);

    g_object_unref (G_OBJECT (gc));
    g_object_unref (G_OBJECT (layout));

    GdkColormap *cmap = NULL;
    cmap = gtk_widget_get_colormap(image);
    gdk_drawable_get_size(pixmap, &pwidth, &pheight);

    pixbuf = gdk_pixbuf_get_from_drawable( NULL, pixmap, cmap,
             0 , 0,
             0 , 0,
             pwidth, pheight );

    g_object_unref( pixmap );

    GdkPixmap *new_pixmap;
    gdk_pixbuf_render_pixmap_and_mask( pixbuf, &new_pixmap, NULL, 1 );

    gtk_image_clear( GTK_IMAGE(image) );
    gtk_image_set_from_pixmap( GTK_IMAGE(image), new_pixmap, mask );

    g_object_unref( pixbuf );
    g_object_unref( cmap );

    return TRUE;
}

G_MODULE_EXPORT gboolean window_expose_cb(GtkWidget *widget, GdkEventExpose
*event, gpointer data)
{
    char *img_path   = g_build_filename( "background.png", NULL);
    cairo_surface_t *g_imgGlass;
    g_imgGlass = cairo_image_surface_create_from_png( img_path );
    g_free( img_path );

    cairo_t *cr;
    cr = gdk_cairo_create(widget->window);
    cairo_set_source_surface(cr, g_imgGlass, 0, 0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_paint(cr);
    cairo_destroy(cr);

   return FALSE;
}


int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *image;
    GdkScreen*      screen;
    GdkColormap*    colormap;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 350, 100);
    gtk_window_set_title(GTK_WINDOW(window), "XYZ");
    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
    gtk_window_set_resizable( GTK_WINDOW(window), FALSE );
    gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
    gtk_widget_set_app_paintable(window, TRUE);
    gtk_window_set_opacity(GTK_WINDOW(window), 1);

    gtk_widget_set_events(window, GDK_EXPOSURE_MASK
              | GDK_ENTER_NOTIFY_MASK
              | GDK_LEAVE_NOTIFY_MASK
              | GDK_BUTTON_PRESS_MASK
              | GDK_BUTTON_RELEASE_MASK
              | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);

    g_signal_connect(G_OBJECT(window), "expose-event",
G_CALLBACK(window_expose_cb), NULL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit),
NULL );


    image = gtk_image_new_from_file("Button_normal.png");
    gtk_container_add(GTK_CONTAINER(window), image );

    DrawTextOnImage(image, "<span size='large'><b>Some Text</b></span>",
"#FFFFFF" );

    screen       = gtk_widget_get_screen(window);
    colormap     = gdk_screen_get_rgba_colormap(screen);
    gtk_widget_set_colormap(window, colormap);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
--------------------------------------------------------------------------------------------------------------------------------

Some times i get these types of Warnings and Errors:

--------------------------------------------------------------------------------------------------------------------------------
(gtkimage:4536): Gtk-CRITICAL **: gtk_widget_set_colormap: assertion
`GDK_IS_COLORMAP (colormap)' failed
(gtkimage:6146): Gdk-WARNING **: Attempt to draw a drawable with depth 16 to
a drawable with depth 32
--------------------------------------------------------------------------------------------------------------------------------

This is how my out put is coming when i set XLIB_SKIP_ARGB_VISUALS=1 and
when i set it to 0 i am not able to see the GtkImage on window.

This is the pout put screen shot Click Here
<image "src=
http://farm3.static.flickr.com/2678/4149277123%5F8e9138766f%5Fo.jpg"/>

why this must be happening can some one please provide some help on this
issue?
I am really Stuck on this.
Any Expert for Cairo, Pango and Gtk+ here please help?


Thanks,

AB.
_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to