From cf49b305a0c9e10a8b08ac626019f1502c5f12ee Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 31 May 2019 15:50:24 +0200 Subject: Stretched drumkit image test. --- plugingui/colour.cc | 20 ++++++++++++++++ plugingui/colour.h | 3 +++ plugingui/drumkittab.cc | 63 +++++++++++++++++++++++++++++++++++++++---------- plugingui/drumkittab.h | 5 ++-- plugingui/painter.cc | 43 +++++++++++++++++++++++++++------ 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 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 drumkit_image; std::unique_ptr 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 - 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 -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); } } -- cgit v1.2.3