diff options
Diffstat (limited to 'plugingui')
| -rw-r--r-- | plugingui/colour.cc | 20 | ||||
| -rw-r--r-- | plugingui/colour.h | 3 | ||||
| -rw-r--r-- | plugingui/drumkittab.cc | 63 | ||||
| -rw-r--r-- | plugingui/drumkittab.h | 5 | ||||
| -rw-r--r-- | plugingui/painter.cc | 43 | ||||
| -rw-r--r-- | plugingui/painter.h | 15 | 
6 files changed, 123 insertions, 26 deletions
| diff --git a/plugingui/colour.cc b/plugingui/colour.cc index 7fd649c..de740e9 100644 --- a/plugingui/colour.cc +++ b/plugingui/colour.cc @@ -79,4 +79,24 @@ bool Colour::operator!=(const Colour& other) const  	return !(*this == other);  } +Colour Colour::operator+(const Colour& other) const +{ +	Colour c = *this; +	c.pixel[0] += other.pixel[0]; +	c.pixel[1] += other.pixel[1]; +	c.pixel[2] += other.pixel[2]; +	c.pixel[3] += other.pixel[3]; +	return c; +} + +Colour Colour::operator*(float v) const +{ +	Colour c = *this; +	c.pixel[0] *= v; +	c.pixel[1] *= v; +	c.pixel[2] *= v; +	c.pixel[3] *= v; +	return c; +} +  } // GUI:: diff --git a/plugingui/colour.h b/plugingui/colour.h index 0bc8659..0b4f09e 100644 --- a/plugingui/colour.h +++ b/plugingui/colour.h @@ -54,6 +54,9 @@ public:  	std::uint8_t* data() { return pixel.data(); }  	const std::uint8_t* data() const { return pixel.data(); } +	Colour operator+(const Colour& other) const; +	Colour operator*(float v) const; +  private:  	std::array<std::uint8_t, 4> pixel{{255, 255, 255, 255}};  }; diff --git a/plugingui/drumkittab.cc b/plugingui/drumkittab.cc index 8d85f1e..701fcff 100644 --- a/plugingui/drumkittab.cc +++ b/plugingui/drumkittab.cc @@ -70,9 +70,17 @@ void DrumkitTab::resize(std::size_t width, std::size_t height)  		Painter painter(*this);  		painter.clear(); -		drumkit_image_x = (this->width()-drumkit_image->width())/2; -		drumkit_image_y = (this->height()-drumkit_image->height())/2; -		painter.drawImage(drumkit_image_x, drumkit_image_y, *drumkit_image); +		double scale_x = (double)this->width() / drumkit_image->width(); +		double scale_y = (double)this->height() / drumkit_image->height(); +		drumkit_scale = std::min(scale_x, scale_y); + +		drumkit_image_x = (this->width() - drumkit_image->width() * drumkit_scale) / 2; +		drumkit_image_y = (this->height() - drumkit_image->height() * drumkit_scale) / 2; +		painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +		                           *drumkit_image, +		                           drumkit_image->width() * drumkit_scale, +		                           drumkit_image->height() * drumkit_scale, +		                           Filter::Linear);  	}  	velocity_label.move(10, height-velocity_label.height()-5); @@ -89,7 +97,11 @@ void DrumkitTab::buttonEvent(ButtonEvent* buttonEvent)  			if(buttonEvent->direction == GUI::Direction::down)  			{  				Painter painter(*this); -				painter.drawImage(drumkit_image_x, drumkit_image_y, *map_image); +				painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +				                           *map_image, +				                           drumkit_image->width() * drumkit_scale, +				                           drumkit_image->height() * drumkit_scale, +				                           Filter::Linear);  				shows_overlay = true;  				redraw();  				return; @@ -99,7 +111,11 @@ void DrumkitTab::buttonEvent(ButtonEvent* buttonEvent)  			{  				Painter painter(*this);  				painter.clear(); -				painter.drawImage(drumkit_image_x, drumkit_image_y, *drumkit_image); +				painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +				                           *drumkit_image, +				                           drumkit_image->width() * drumkit_scale, +				                           drumkit_image->height() * drumkit_scale, +				                           Filter::Linear);  				highlightInstrument(current_index); @@ -125,10 +141,18 @@ void DrumkitTab::buttonEvent(ButtonEvent* buttonEvent)  			{  				Painter painter(*this);  				painter.clear(); -				painter.drawImage(drumkit_image_x, drumkit_image_y, *drumkit_image); +				painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +				                           *drumkit_image, +				                           drumkit_image->width() * drumkit_scale, +				                           drumkit_image->height() * drumkit_scale, +				                           Filter::Linear);  				if(shows_overlay)  				{ -					painter.drawImage(drumkit_image_x, drumkit_image_y, *map_image); +					painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +					                           *map_image, +					                           drumkit_image->width() * drumkit_scale, +					                           drumkit_image->height() * drumkit_scale, +					                           Filter::Linear);  				}  				highlightInstrument(current_index);  				redraw(); @@ -154,17 +178,26 @@ void DrumkitTab::mouseMoveEvent(MouseMoveEvent* mouseMoveEvent)  	auto const x = mouseMoveEvent->x - drumkit_image_x;  	auto const y = mouseMoveEvent->y - drumkit_image_y; -	auto index = pos_to_colour_index(x, y); +	auto index = pos_to_colour_index(x / drumkit_scale, y / drumkit_scale);  	if(index == current_index) { return; }  	current_index = index;  	Painter painter(*this);  	painter.clear(); -	painter.drawImage(drumkit_image_x, drumkit_image_y, *drumkit_image); +	painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +	                           *drumkit_image, +	                           drumkit_image->width() * drumkit_scale, +	                           drumkit_image->height() * drumkit_scale, +	                           Filter::Linear); +  	if(shows_overlay)  	{ -		painter.drawImage(drumkit_image_x, drumkit_image_y, *map_image); +		painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +		                           *map_image, +		                           drumkit_image->width() * drumkit_scale, +		                           drumkit_image->height() * drumkit_scale, +		                           Filter::Linear);  	}  	highlightInstrument(index); @@ -178,7 +211,11 @@ void DrumkitTab::mouseLeaveEvent()  	{  		Painter painter(*this);  		painter.clear(); -		painter.drawImage(drumkit_image_x, drumkit_image_y, *drumkit_image); +		painter.drawImageStretched(drumkit_image_x, drumkit_image_y, +		                           *drumkit_image, +		                           drumkit_image->width() * drumkit_scale, +		                           drumkit_image->height() * drumkit_scale, +		                           Filter::Linear);  		shows_overlay = false;  		redraw(); @@ -191,7 +228,7 @@ void DrumkitTab::triggerAudition(int x, int y)  	x -= drumkit_image_x;  	y -= drumkit_image_y; -	auto index = pos_to_colour_index(x, y); +	auto index = pos_to_colour_index(x / drumkit_scale, y / drumkit_scale);  	if(index == -1)  	{  		return; @@ -215,7 +252,7 @@ void DrumkitTab::highlightInstrument(int index)  		//Colour colour(1.0f, 1.0f, 0.0f);  		auto const& positions = colour_index_to_positions[index];  		painter.draw(positions.begin(), positions.end(), -		             drumkit_image_x, drumkit_image_y, colour); +		             drumkit_image_x, drumkit_image_y, colour, drumkit_scale);  		shows_instrument_overlay = true;  	}  	else diff --git a/plugingui/drumkittab.h b/plugingui/drumkittab.h index a14a9c5..d56bc5a 100644 --- a/plugingui/drumkittab.h +++ b/plugingui/drumkittab.h @@ -95,8 +95,9 @@ private:  	std::unique_ptr<Image> drumkit_image;  	std::unique_ptr<Image> map_image; -	int drumkit_image_x; -	int drumkit_image_y; +	int drumkit_image_x{0}; +	int drumkit_image_y{0}; +	double drumkit_scale{1.0};  	Label velocity_label{this};  	Label instrument_name_label{this}; diff --git a/plugingui/painter.cc b/plugingui/painter.cc index bad5318..ba1e621 100644 --- a/plugingui/painter.cc +++ b/plugingui/painter.cc @@ -461,7 +461,7 @@ void Painter::drawRestrictedImage(int x0, int y0,  }  void Painter::drawImageStretched(int x0, int y0, const Drawable& image, -                                 int width, int height) +                                 int width, int height, Filter filter)  {  	float fw = image.width();  	float fh = image.height(); @@ -482,15 +482,44 @@ void Painter::drawImageStretched(int x0, int y0, const Drawable& image,  		return;  	} -	for(int y = -1 * std::min(0, y0); y < height; ++y) +	switch(filter)  	{ -		for(int x = -1 * std::min(0, x0); x < width; ++x) +	case Filter::Nearest: +		for(int y = -1 * std::min(0, y0); y < height; ++y)  		{ -			int lx = ((float)x / (float)width) * fw; -			int ly = ((float)y / (float)height) * fh; -			auto& c = image.getPixel(lx, ly); -			pixbuf.addPixel(x0 + x, y0 + y, c); +			for(int x = -1 * std::min(0, x0); x < width; ++x) +			{ +				int lx = ((float)x / (float)width) * fw; +				int ly = ((float)y / (float)height) * fh; +				auto& c = image.getPixel(lx, ly); +				pixbuf.addPixel(x0 + x, y0 + y, c); +			} +		} +		break; + +	case Filter::Linear: +		for(int y = -1 * std::min(0, y0); y < height; ++y) +		{ +			for(int x = -1 * std::min(0, x0); x < width; ++x) +			{ +				float lx = ((float)x / (float)width) * fw; +				float ly = ((float)y / (float)height) * fh; +				float px = lx - std::floor(lx); +				float py = ly - std::floor(ly); +				//printf("px: %f, py: %f\n", px, py); +				// 1,1   2,1 +				// 1,2   2,2 +				auto& c11 = image.getPixel(std::floor(lx), std::floor(ly)); +				auto& c12 = image.getPixel(std::floor(lx), std::ceil(ly)); +				auto& c21 = image.getPixel(std::ceil(lx), std::floor(ly)); +				auto& c22 = image.getPixel(std::ceil(lx), std::ceil(ly)); +				auto c1 = c11 * (1 - px) + c21 * px; +				auto c2 = c12 * (1 - px) + c22 * px; +				auto c = c1 * (1 - py) + c2 * py; +				pixbuf.addPixel(x0 + x, y0 + y, c); +			}  		} +		break;  	}  } diff --git a/plugingui/painter.h b/plugingui/painter.h index b38bf88..3bdbe2d 100644 --- a/plugingui/painter.h +++ b/plugingui/painter.h @@ -39,6 +39,12 @@ class Drawable;  class Image;  class Canvas; +enum class Filter +{ +	Nearest, +	Linear, +}; +  class Painter  {  public: @@ -59,10 +65,11 @@ public:  	void drawRestrictedImage(int x0, int y0, const Colour& restriction_colour,  	                         const Drawable& image);  	void drawImageStretched(int x, int y, const Drawable& image, -	                        int width, int height); +	                        int width, int height, +	                        Filter filter = Filter::Nearest);  	template<typename Iterator> -	void draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour); +	void draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour, double scale = 1.0);  	typedef struct {  		Image* topLeft; @@ -92,11 +99,11 @@ private:  };  template<typename Iterator> -void Painter::draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour) +void Painter::draw(Iterator begin, Iterator end, int x_offset, int y_offset, Colour const& colour, double scale)  {  	for (auto it = begin; it != end; ++it)  	{ -		pixbuf.addPixel(x_offset + it->x, y_offset + it->y, colour); +		pixbuf.addPixel(x_offset + it->x * scale, y_offset + it->y * scale, colour);  	}  } | 
