summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2019-05-31 15:50:24 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2020-04-09 16:44:41 +0200
commitcf49b305a0c9e10a8b08ac626019f1502c5f12ee (patch)
tree9d85aa4c396d1dd3e9ea7badce4ff1b581bf1e70
parent22d2d946da85e513b67affc87dfef2b42ded3b27 (diff)
Stretched drumkit image test.
-rw-r--r--plugingui/colour.cc20
-rw-r--r--plugingui/colour.h3
-rw-r--r--plugingui/drumkittab.cc63
-rw-r--r--plugingui/drumkittab.h5
-rw-r--r--plugingui/painter.cc43
-rw-r--r--plugingui/painter.h15
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);
}
}