[PD] c.wavesel~ Was: [filterview~]. Was: Wavesel~ external preview available as deken-type distribution. (Fred Jan Kraan)
Pierre Guillot
guillotpierre6 at gmail.com
Sat Jul 11 16:18:48 CEST 2015
Hi,
> Currently I invalidate a layer and start by
> greating a new one. Is this the correct way, or are they reusable in a
way?
Yes, in fact when you create a layer for the 1st time, the function
allocates a layer. If the layer already exists but has been invalidated
the function returns the old pointer with empty paths. Otherwise, the
function returns NULL. If you have a "circle_layer" and a "rectangle_layer"
and you want to change the color or the size of the "circle_layer", you
have to invalidate the "circle_layer" then when you call ebox_draw, you
have to redraw the "circle_layer" but you don't have to redraw the
"rectangle_layer".
> The paint function is called at startup from the framework (via
> eclass_guiinit?).
No, eclass_guiinit initializes the class for GUI behavior (the paint
function can't be called because there isn't any object allocated).
> The redraw function is called when the waveform is changed (manual at
> the moment).
Yes, when you want to change a layer, you have to invalidate this layer
(you don't have to invalidate all the layers if some of them don't need to
be redrawn) and then call ebox_redraw().
There's no "redraw", "invalidate", "state" method so
eclass_addmethod(c, (method) wavesel_invalidate, "invalidate", A_SYMBOL, 0);
eclass_addmethod(c, (method) wavesel_state, "state", A_NULL, 0);
eclass_addmethod(c, (method) wavesel_redraw, "redraw", A_NULL, 0);
are useless methods.
I think you use the c.blackboard as a template but you should prefer to use
c.bang or something simpler. c.blackboard is a little bit tricky.
Now I'll try to explain everything better :
When the object is allocated in the patch, the method paint is called :
static void wavesel_paint(t_wavesel *x, t_object *view)
{
t_rect bg_rect;
ebox_get_rect_for_view((t_ebox *)x, &bg_rect);
t_elayer *g = ebox_start_layer((t_ebox *)x, bg_layer_name, rect->width,
rect->height);
if (g)
{
Here you can draw what you want in the "bg_layer_name" layer.
Then you finish your layer with
}
ebox_paint_layer((t_ebox *)x, bg_layer_name, 0.f, 0.f);
}
2015-07-10 14:33 GMT+02:00 Fred Jan Kraan <fjkraan at xs4all.nl>:
> Hi Pierre,
>
> Currently, graphics data is drawn to the canvas, but nothing is erased.
> If I specify a new waveform, it is drawn over the previous one, instead
> of removing it first.
>
> The real code is a bit messy due to the implementation details, but
> below is the skeleton, containing the framework interactions and key
> data. The paint function is called at startup from the framework (via
> eclass_guiinit?).
> The redraw function is called when the waveform is changed (manual at
> the moment).
>
> draw_background function:
> - ebox_start_layer(background_layer)
> - ebox_paint_layer()
>
> draw_waveform function:
> - ebox_start_layer(waveform_layer)
> - egraphics_line_fast(... here the waveform is defined ...)
> - ebox_end_layer()
> - ebox_paint_layer()
>
> paint function:
> - draw_background()
> - draw_waveform()
>
> redraw function:
> - ebox_invalidate_layer(background_layer)
> - ebox_invalidate_layer(waveform_layer)
> - paint()
> - ebox_redraw()
>
>
> You can look at the current code in my toy github repository:
> https://github.com/electrickery/pd-playground/tree/cicm/cicm-wavesel
>
> Greetings,
>
> Fred Jan
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20150711/a4d2aef8/attachment.html>
More information about the Pd-list
mailing list