13
0

update [LV2] Plugin Inline Display API: drop cairo dependency

This commit is contained in:
Robin Gareus 2016-03-14 16:44:20 +01:00
parent e180b0f706
commit 93bc9b9728
4 changed files with 31 additions and 9 deletions

View File

@ -36,13 +36,23 @@
/** Opaque handle for LV2_Inline_Display::queue_draw() */ /** Opaque handle for LV2_Inline_Display::queue_draw() */
typedef void* LV2_Inline_Display_Handle; typedef void* LV2_Inline_Display_Handle;
/** Alias for cairo_image_surface_t */ /** raw image pixmap format is ARGB32,
typedef void* LV2_Inline_Display_Image_Surface; * the data pointer is owned by the plugin and must be valid
* from the first call to render until cleanup.
*/
typedef struct {
unsigned char *data;
int width;
int height;
int stride;
} LV2_Inline_Display_Image_Surface;
/** a LV2 Feature provided by the Host to the plugin */
typedef struct { typedef struct {
/** Opaque host data */ /** Opaque host data */
LV2_Inline_Display_Handle handle; LV2_Inline_Display_Handle handle;
/** Request from run() that the host should call render() */ /** Request from run() that the host should call render() at a later time
* to update the inline display */
void (*queue_draw)(LV2_Inline_Display_Handle handle); void (*queue_draw)(LV2_Inline_Display_Handle handle);
} LV2_Inline_Display; } LV2_Inline_Display;
@ -53,12 +63,15 @@ typedef struct {
/** /**
* The render method. This is called by the host in a non-realtime context, * The render method. This is called by the host in a non-realtime context,
* usually the main GUI thread. * usually the main GUI thread.
* The data pointer is owned by the plugin and must be valid
* from the first call to render until cleanup.
* *
* @param instance The LV2 instance * @param instance The LV2 instance
* @param w the max available width * @param w the max available width
* @return pointer to a cairo image surface or NULL * @param h the max available height
* @return pointer to a LV2_Inline_Display_Image_Surface or NULL
*/ */
LV2_Inline_Display_Image_Surface (*render)(LV2_Handle instance, uint32_t w, uint32_t h); LV2_Inline_Display_Image_Surface* (*render)(LV2_Handle instance, uint32_t w, uint32_t h);
} LV2_Inline_Display_Interface; } LV2_Inline_Display_Interface;
/** /**

View File

@ -301,7 +301,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
#ifdef LV2_EXTENDED #ifdef LV2_EXTENDED
bool has_inline_display (); bool has_inline_display ();
void* render_inline_display (uint32_t, uint32_t); Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t);
#endif #endif
void latency_compute_run (); void latency_compute_run ();

View File

@ -111,8 +111,15 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
void realtime_locate (); void realtime_locate ();
void monitoring_changed (); void monitoring_changed ();
typedef struct {
unsigned char *data;
int width;
int height;
int stride;
} Display_Image_Surface;
virtual bool has_inline_display () { return false; } virtual bool has_inline_display () { return false; }
virtual void* render_inline_display (uint32_t, uint32_t) { return NULL; } virtual Display_Image_Surface* render_inline_display (uint32_t, uint32_t) { return NULL; }
PBD::Signal0<void> QueueDraw; PBD::Signal0<void> QueueDraw;
struct PresetRecord { struct PresetRecord {

View File

@ -866,10 +866,12 @@ LV2Plugin::has_inline_display () {
return _display_interface ? true : false; return _display_interface ? true : false;
} }
void* Plugin::Display_Image_Surface*
LV2Plugin::render_inline_display (uint32_t w, uint32_t h) { LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
if (_display_interface) { if (_display_interface) {
return _display_interface->render ((void*)_impl->instance->lv2_handle, w, h); /* Plugin::Display_Image_Surface is identical to
* LV2_Inline_Display_Image_Surface */
return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
} }
return NULL; return NULL;
} }