Hi (sorry the message wasn't finished....),
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 themdon'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 :
static void wavesel_paint(t_wavesel *x, t_object *view) { t_rect bg_rect; ebox_get_rect_for_view((t_ebox *)x, &bg_rect);
// Background layer 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_end_layer((t_ebox*)x, bg_layer_name); } ebox_paint_layer((t_ebox *)x, bg_layer_name, 0.f, 0.f); // The box paint the layer
// Waveform layer t_elayer *g = ebox_start_layer((t_ebox *)x, fg_layer_name, rect->width, rect->height); if (g) { Here you can draw what you want in the "fg_layer_name" layer. Then you finish your layer with : ebox_end_layer((t_ebox*)x, fg_layer_name); } ebox_paint_layer((t_ebox *)x, fg_layer_name, 0.f, 0.f); // The box paint the layer }
Now you want to change the "fg_layer_name" layer when the buffer has changed for example :
static void wavesel_setarray(t_wavesel *x, t_symbol *s) { // Load the new buffer ebox_invalidate_layer((t_ebox *)x, fg_layer_name); << invalidate "fg_layer_name" the layer (the "bg_layer_name" doesn't change so you don't have to invalidate the layer) ebox_redraw((t_ebox *)x); // the function calls the paint method of the object (and some other stuff) // // You don't have to call wavesel_paint(x, 0); }
The Graphic API is very similar to the Max's Graphical API so you can also have a look at it but a lot of thing are explained here : http://cicm.github.io/CicmWrapper/a00002.html
Cheers
2015-07-11 16:18 GMT+02:00 Pierre Guillot guillotpierre6@gmail.com:
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@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