Clipping and on-demand redraw

"Enrico Weigelt, metux IT consult" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Hi folks,


I'm currently trying to sort out how to do effiencent on-demand redraw
in my gui toolkit.

For now, the draw function looks like this:
(hope you can understand it w/o all the rest of the code ;-o)

The whole process starts with the root widget and steps down the tree.


int twtk_widget_do_draw(twtk_widget_t *widget, cairo_t* cr)
{
    if (widget == NULL)
        return -EFAULT;

    twtk_vector_t vp_size = widget->viewport_size;

    cairo_save(cr);
    cairo_translate(cr, widget->viewport_pos.x, widget->viewport_pos.y);
    if (widget->viewport_angle)
    {
        double dx = widget->viewport_size.x / 2;
        double dy = widget->viewport_size.y / 2;
        cairo_translate(cr, dx, dy);
        cairo_rotate(cr, widget->viewport_angle);
        cairo_translate(cr, - dx, - dy);
    }
    cairo_rectangle(cr, 0, 0, vp_size.x, vp_size.y);
    cairo_clip(cr);

    /* fill with background color */
    if (widget->background_color.alpha)
    {
        _twtk_ut_set_rgba(cr, widget->background_color);
        cairo_rectangle (cr, 0, 0, vp_size.x, vp_size.y);
        cairo_fill (cr);
    }

    cairo_scale(cr, widget->surface_scale.x, widget->surface_scale.y);
    cairo_rotate(cr, widget->surface_angle);
    // call the widget's paint() method
    if ((widget->cls) && (widget->cls->op_paint))
    {
        cairo_save(cr);
        widget->cls->op_paint(widget, cr);
        cairo_restore(cr);
    }

    // trigger repaint of sub's
    twtk_widget_list_entry_t *ent;
    for (ent = widget->frames.first; ent != NULL; ent = ent->next)
    {
        printf("repainting: %s\n", ent->name);
        twtk_widget_do_draw(ent->widget, cr);
    }

    cairo_restore(cr);

    return 0;
}


Now I'd like to change it in a way, that

a) repaint only happens when the widget isn't overlapped by others
b) clip-out all regions that are overlapped by others
c) dont paint at all if completely overlapped


I'd guess, at the very first, i should iterate through all subsequent
widgets (which, per definition are in front of the current one) and
clip them out. And before actual painting, check whether everything's
clipped-out. But I dont know yet, how to do that also w/ rotation.

Any suggestions ?


--mtx

--
Enrico Weigelt,
metux IT consulting
+49-151-27565287
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.