[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