diff options
Diffstat (limited to 'plugin')
| -rw-r--r-- | plugin/drumgizmo.ttl | 2 | ||||
| -rw-r--r-- | plugin/drumgizmo_plugin.cc | 97 | ||||
| -rw-r--r-- | plugin/drumgizmo_plugin.h | 34 | 
3 files changed, 133 insertions, 0 deletions
| diff --git a/plugin/drumgizmo.ttl b/plugin/drumgizmo.ttl index 2e9b930..e5b163d 100644 --- a/plugin/drumgizmo.ttl +++ b/plugin/drumgizmo.ttl @@ -22,6 +22,7 @@  @prefix pprops: <http://lv2plug.in/ns/ext/port-props#> .  @prefix lv2:    <http://lv2plug.in/ns/lv2core#> .  @prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> . +@prefix idpy:   <http://harrisonconsoles.com/lv2/inlinedisplay#> .  <http://drumgizmo.org/lv2#ui>      a ui:X11UI ; @@ -43,6 +44,7 @@  	doap:license <http://opensource.org/licenses/gpl-3.0> ;  	lv2:optionalFeature <http://lv2plug.in/ns/ext/uri-map> ;  	lv2:optionalFeature <http://lv2plug.in/ns/ext/event> ; +	lv2:optionalFeature idpy:queue_draw ;    lv2:extensionData state:interface ;  	lv2:port [      a lv2:InputPort, lv2:ControlPort ; diff --git a/plugin/drumgizmo_plugin.cc b/plugin/drumgizmo_plugin.cc index fa51575..9414914 100644 --- a/plugin/drumgizmo_plugin.cc +++ b/plugin/drumgizmo_plugin.cc @@ -156,6 +156,103 @@ void DrumGizmoPlugin::process(size_t pos,  	this->output_samples = nullptr;  } +bool DrumGizmoPlugin::hasInlineGUI() +{ +	return true; +} + +class InlinePixelBufferAlpha +	: public GUI::PixelBufferAlpha +{ +public: +	InlinePixelBufferAlpha(Plugin::InlineDrawContext& context) +	{ +		buf = context.data; +		width = context.width; +		height = context.height; +		x = 0; +		y = 0; +	} +}; + +class InlineCanvas +	: public GUI::Canvas +{ +public: +	InlineCanvas(Plugin::InlineDrawContext& context) +		: pixbuf(context) +	{ +	} + +	GUI::PixelBufferAlpha& GetPixelBuffer() +	{ +		return pixbuf; +	} +	void beginPaint() {} +	void endPaint() {} + +private: +	InlinePixelBufferAlpha pixbuf; +}; + +void DrumGizmoPlugin::onInlineRedraw(std::size_t width, +                                     std::size_t max_height, +                                     InlineDrawContext& context) +{ +	std::size_t height = std::min(11u, max_height); +	if(!context.data || +	   (context.width != width) || +	   (context.height != height) || +	   settingsGetter.number_of_files.hasChanged() || +	   settingsGetter.number_of_files_loaded.hasChanged() || +	   settingsGetter.drumkit_load_status.hasChanged()) +	{ +		context.width = width; +		context.height = height; +		assert(context.width * context.height <= sizeof(inlineDisplayBuffer)); +) +		context.data = (unsigned char*)inlineDisplayBuffer; +		box.setSize(context.width, context.height); + +		InlineCanvas canvas(context); +		GUI::Painter painter(canvas); +		painter.clear(); +		painter.drawImage(0, 1, box); + +		double progress = +			(double)settingsGetter.number_of_files_loaded.getValue() / +			(double)settingsGetter.number_of_files.getValue(); + +		int brd = 4; +		int val = (width - (2 * brd)) * progress; + +		switch(settingsGetter.drumkit_load_status.getValue()) +		{ +		case LoadStatus::Error: +			bar_red.setSize(val, height); +			painter.drawImage(brd, 0, bar_red); +			break; +		case LoadStatus::Done: +			bar_green.setSize(val, height); +			painter.drawImage(brd, 0, bar_green); +			break; +		case LoadStatus::Loading: +		case LoadStatus::Idle: +			bar_blue.setSize(val, height); +			painter.drawImage(brd, 0, bar_blue); +			break; +		} + +		// Convert to correct pixel format +		for(std::size_t i = 0; i < context.height * context.width; ++i) +		{ +			std::uint32_t pixel = inlineDisplayBuffer[i]; +			unsigned char* p = (unsigned char*)&pixel; +			inlineDisplayBuffer[i] = pgzRGBA(p[0], p[1], p[2], p[3]); +		} +	} +} +  bool DrumGizmoPlugin::hasGUI()  {  	return true; diff --git a/plugin/drumgizmo_plugin.h b/plugin/drumgizmo_plugin.h index 2e3da26..de4f4af 100644 --- a/plugin/drumgizmo_plugin.h +++ b/plugin/drumgizmo_plugin.h @@ -50,6 +50,9 @@  #include <audiooutputengine.h>  #include <plugingui.h> +#include <texturedbox.h> +#include <imagecache.h> +  class DrumGizmoPlugin  #ifdef LV2  	: public PluginLV2 @@ -95,6 +98,14 @@ public:  	             size_t count) override;  	// +	// Inline GUI +	// +	bool hasInlineGUI() override; +	void onInlineRedraw(std::size_t width, +	                    std::size_t max_height, +	                    InlineDrawContext& context) override; + +	//  	// GUI  	//  	bool hasGUI() override; @@ -174,7 +185,30 @@ private:  	Settings settings;  	ConfigStringIO config_string_io; +	SettingsGetter settingsGetter{settings}; + +	GUI::ImageCache imageCache; +	GUI::TexturedBox box{imageCache, ":progress.png", +			0, 0, // atlas offset (x, y) +			6, 1, 6, // dx1, dx2, dx3 +			11, 0, 0}; // dy1, dy2, dy3 + +	GUI::TexturedBox bar_red{imageCache, ":progress.png", +			13, 0, // atlas offset (x, y) +			2, 1, 2, // dx1, dx2, dx3 +			11, 0, 0}; // dy1, dy2, dy3 + +	GUI::TexturedBox bar_green{imageCache, ":progress.png", +			18, 0, // atlas offset (x, y) +			2, 1, 2, // dx1, dx2, dx3 +			11, 0, 0}; // dy1, dy2, dy3 + +	GUI::TexturedBox bar_blue{imageCache, ":progress.png", +			23, 0, // atlas offset (x, y) +			2, 1, 2, // dx1, dx2, dx3 +			11, 0, 0}; // dy1, dy2, dy3  	std::shared_ptr<GUI::PluginGUI> plugin_gui;  	std::shared_ptr<DrumGizmo> drumgizmo; +	std::uint32_t inlineDisplayBuffer[1024*1024];  }; | 
