Re: drawing on offscreen surface
- From: Jean Brefort <jean brefort normalesup org>
- To: Prasanta Sadhukhan <psadhukhan gmail com>
- Cc: gtk-list gnome org
- Subject: Re: drawing on offscreen surface
- Date: Fri, 10 Aug 2012 11:39:30 +0200
The code in expose_event_offscr actually draws on screen. Actually your
widget might use double buffering.
surface is the offscreen scene.
Or may be I just not understand your point.
Le vendredi 10 août 2012 à 14:58 +0530, Prasanta Sadhukhan a écrit :
> I have added the drawing of green rectangle in configure_event_cb()
> code where I am creating the surface.
> Now, when I run this I get BOTH the green rectangle and blue rectangle
> on the main window.
> I assume since I am not calling cairo_set_source_surface() in
> configure_event_cb() that means the green rectangle is being drawn on
> main window and NOT on offscreen surface, whereas
> in expose_event(), since I am calling cairo_set_source_surface() and
> drawing blue rectangle on that surface, it is getting drawn on
> offscreen.
> Please confirm and second my understanding.
>
> Thank you all for your help.
>
> #include <gtk/gtk.h>
>
> static cairo_surface_t *surface = NULL;
>
> static gboolean
> configure_event_cb (GtkWidget *widget, GdkEventConfigure *event,
> gpointer data)
> {
> cairo_t *cr;
> g_print("configure event: %d, %d\n", event->width, event->height);
>
> if (surface)
> cairo_surface_destroy(surface);
>
> surface = gdk_window_create_similar_surface (event->window,
> CAIRO_CONTENT_COLOR,
> event->width,
> event->height);
> cr = cairo_create(surface);
> cairo_set_source_rgb(cr, 0, 0, 0);
> cairo_paint(cr);
>
> cairo_set_source_rgb(cr, 0, 1, 0);
> cairo_rectangle(cr, 100, 100, 200, 200);
> cairo_stroke(cr);
>
> return FALSE;
> }
>
> static gboolean
> expose_event_offscr (GtkWidget *widget,GdkEventExpose *event, gpointer
> data)
> {
> g_print("draw event offscr\n");
>
> cairo_t *cr = gdk_cairo_create(widget->window);
> cairo_set_source_surface(cr, surface, 0, 0);
> cairo_paint(cr);
>
> cairo_set_source_rgb(cr, 0, 0, 1);
> cairo_rectangle(cr, 300, 300, 200, 200);
> cairo_stroke(cr);
> return TRUE;
> }
>
>
> int
> main(int argc,
> char **argv)
> {
> GtkWidget *window,
> *area;
>
> gtk_init(&argc, &argv);
>
> window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
> gtk_window_set_default_size (GTK_WINDOW (window), 1200, 800);
> g_signal_connect (window, "destroy", gtk_main_quit, NULL);
>
> area = gtk_drawing_area_new();
> g_signal_connect (area, "expose-event",
> G_CALLBACK (expose_event_offscr), NULL);
> g_signal_connect (area, "configure-event",
> G_CALLBACK(configure_event_cb), NULL);
> gtk_container_add (GTK_CONTAINER (window), area);
>
> gtk_widget_show_all(window);
> gtk_main();
>
> return 0;
> }
>
>
> On Fri, Aug 10, 2012 at 2:38 PM, Jean Brefort
> <jean brefort normalesup org> wrote:
> I suppose that surface is the offscreen scene. In that case,
> ther bule
> rectangle should not be drawn during the expose event
> callback, but when
> you build surface. Then you can use the code in my previous
> message,
> replacing the blue color by green color.
>
> Hope this helps.
>
> Le vendredi 10 août 2012 à 14:34 +0530, Prasanta Sadhukhan a
> écrit :
> > Thanks for your code. This draws a blue rectangle on a black
> > background and the offscreen surface contents is rendered on
> main
> > window.
> > But I also would like to draw green rectangle in main window
> so after
> > final rendering of offscreen contents (the blue rectangle)
> on main
> > window, I would get both blue and green rectangles on main
> window.
> > Can you please clarify how can I achieve that (both
> offscreen & main
> > window contents being shown on main window)?
> >
> > Thanks in advance!!
> >
> > Regards
> > Prasanta
> >
> > On Fri, Aug 10, 2012 at 2:22 PM, Jean Brefort
> > <jean brefort normalesup org> wrote:
> > You should use something like:
> >
> > cairo_set_source_surface(cr, surface, 0, 0);
> > cairo_paint(cr).
> > cairo_set_source_rgb(cr, 0, 0, 1);
> > cairo_rectangle(cr, 300,300, 200, 200);
> > cairo_stroke(cr);
> >
> >
> > This will paint the window with surface as source
> and then
> > draw a blue
> > rectangle.
> >
> > Le vendredi 10 août 2012 à 14:09 +0530, Prasanta
> Sadhukhan a
> > écrit :
> > >
> > >
> > > On Fri, Aug 10, 2012 at 1:22 PM, Jean Brefort
> > > <jean brefort normalesup org> wrote:
> > > This code is quite strange. Your call to
> > > cairo_set_source_surface() is
> > > not useful since you use
> cairo_set_source_rgb() just
> > after.
> > > You should
> > > call cairo_paint() just after
> > cairo_set_source_surface() if
> > > you want it
> > > to have any effect.
> > >
> > > If I do not call cairo_set_source_rgb(cr, 0,
> 0, 1); how
> > will get a
> > > blue rectangle?
> > > Just having these is giving me a window with
> black
> > background.
> > > cairo_set_source_surface(cr, surface, 0, 0);
> > > cairo_rectangle(cr, 300,300, 200, 200);
> > > cairo_stroke(cr);
> > > cairo_paint(cr).
> > >
> > > Can you please clarify?
> > > As I told, I would like to get a blue rectangle in
> offscreen
> > surface
> > > and a green rectangle in main visible surface so
> after final
> > rendering
> > > of offscreen contents on main window, I would get
> both
> > rectangles on
> > > main window.
> > >
> > > Regards
> > > Prasanta
> > >
> > > Hope it helps,
> > > Jean
> > >
> > > Le vendredi 10 août 2012 à 13:07 +0530,
> Prasanta
> > Sadhukhan a
> > > écrit :
> > > > expose_event (GtkWidget
> *widget,GdkEventExpose
> > *event,
> > > gpointer
> > > > data)
> > > > {
> > > > g_print("draw event main\n");
> > > >
> > > > cairo_t *cr =
> gdk_cairo_create(widget->window);
> > > > // draw blue rectangle into offscreen
> > > > cairo_set_source_surface(cr, surface,
> 0, 0);
> > > > cairo_set_source_rgb(cr, 0, 0, 1);
> > > > cairo_rectangle(cr, 300, 300, 200,
> 200);
> > > > cairo_stroke(cr);
> > > > cairo_paint(cr);
> > > >
> > > > //draw green rectangle onto main window
> > > > cairo_set_source_rgb(cr, 0, 1, 0);
> > > > cairo_rectangle(cr, 100, 100, 200,
> 200);
> > > > cairo_stroke(cr)
> > > > }
> > > >
> > > >
> > > >
> > >
> > >
> > >
> _______________________________________________
> > > gtk-list mailing list
> > > gtk-list gnome org
> > >
> https://mail.gnome.org/mailman/listinfo/gtk-list
> > >
> >
> >
> >
> >
>
>
>
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]