diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-06-06 21:37:26 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-06-06 21:37:26 +0200 |
commit | d5ed45c25651f04dc3972047d279c8eeb4ca9e51 (patch) | |
tree | c9a424cfca2af7922a981e5e89bf3d24725aadea | |
parent | 195a3d15e490465b64a19d2f09e8a2d8d81e2b2a (diff) |
New TexturedBox class.
37 files changed, 417 insertions, 75 deletions
diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui index 4c8b5eb..1f921cf 100644 --- a/plugingui/Makefile.am.plugingui +++ b/plugingui/Makefile.am.plugingui @@ -19,6 +19,8 @@ PLUGIN_GUI_SOURCES = \ $(top_srcdir)/plugingui/slider.cc \ $(top_srcdir)/plugingui/scrollbar.cc \ $(top_srcdir)/plugingui/textedit.cc \ + $(top_srcdir)/plugingui/texture.cc \ + $(top_srcdir)/plugingui/texturedbox.cc \ $(top_srcdir)/plugingui/layout.cc \ $(top_srcdir)/plugingui/listbox.cc \ $(top_srcdir)/plugingui/listboxthin.cc \ diff --git a/plugingui/button.cc b/plugingui/button.cc index b4e3fee..5270658 100644 --- a/plugingui/button.cc +++ b/plugingui/button.cc @@ -38,47 +38,10 @@ Button::Button(Widget *parent) , draw_state(up) , button_state(up) { - box_up.topLeft = new Image(":pushbutton_tl.png"); - box_up.top = new Image(":pushbutton_t.png"); - box_up.topRight = new Image(":pushbutton_tr.png"); - box_up.left = new Image(":pushbutton_l.png"); - box_up.right = new Image(":pushbutton_r.png"); - box_up.bottomLeft = new Image(":pushbutton_bl.png"); - box_up.bottom = new Image(":pushbutton_b.png"); - box_up.bottomRight = new Image(":pushbutton_br.png"); - box_up.center = new Image(":pushbutton_c.png"); - - box_down.topLeft = new Image(":pushbuttondown_tl.png"); - box_down.top = new Image(":pushbuttondown_t.png"); - box_down.topRight = new Image(":pushbuttondown_tr.png"); - box_down.left = new Image(":pushbuttondown_l.png"); - box_down.right = new Image(":pushbuttondown_r.png"); - box_down.bottomLeft = new Image(":pushbuttondown_bl.png"); - box_down.bottom = new Image(":pushbuttondown_b.png"); - box_down.bottomRight = new Image(":pushbuttondown_br.png"); - box_down.center = new Image(":pushbuttondown_c.png"); } Button::~Button() { - delete(box_up.topLeft); - delete(box_up.top); - delete(box_up.topRight); - delete(box_up.left); - delete(box_up.right); - delete(box_up.bottomLeft); - delete(box_up.bottom); - delete(box_up.bottomRight); - delete(box_up.center); - delete(box_down.topLeft); - delete(box_down.top); - delete(box_down.topRight); - delete(box_down.left); - delete(box_down.right); - delete(box_down.bottomLeft); - delete(box_down.bottom); - delete(box_down.bottomRight); - delete(box_down.center); } void Button::buttonEvent(ButtonEvent* buttonEvent) @@ -122,10 +85,13 @@ void Button::repaintEvent(RepaintEvent* repaintEvent) switch(draw_state) { case up: - p.drawBox(padLeft, padTop, box_up, w - padLeft, h - padTop); + box_up.setSize(w - padLeft, h - padTop); + p.drawImage(padLeft, padTop, box_up); + break; case down: - p.drawBox(padLeft, padTop, box_down, w - padLeft, h - padTop); + box_down.setSize(w - padLeft, h - padTop); + p.drawImage(padLeft, padTop, box_down); break; } diff --git a/plugingui/button.h b/plugingui/button.h index 1bfeb2d..f409a55 100644 --- a/plugingui/button.h +++ b/plugingui/button.h @@ -33,6 +33,7 @@ #include "widget.h" #include "painter.h" #include "font.h" +#include "texturedbox.h" namespace GUI { @@ -61,8 +62,15 @@ protected: private: bool in_button{false}; - Painter::Box box_up; - Painter::Box box_down; + TexturedBox box_up{getImageCache(), ":pushbutton.png", + 0, 0, // atlas offset (x, y) + 11, 1, 11, // dx1, dx2, dx3 + 10, 72, 12}; // dy1, dy2, dy3 + + TexturedBox box_down{getImageCache(), ":pushbutton.png", + 23, 0, // atlas offset (x, y) + 11, 1, 11, // dx1, dx2, dx3 + 10, 72, 12}; // dy1, dy2, dy3 typedef enum { up, diff --git a/plugingui/checkbox.cc b/plugingui/checkbox.cc index 6419fc3..a218d44 100644 --- a/plugingui/checkbox.cc +++ b/plugingui/checkbox.cc @@ -28,17 +28,14 @@ #include "painter.h" -#include <stdio.h> - -namespace GUI { +namespace GUI +{ CheckBox::CheckBox(Widget* parent) : Widget(parent) - , bg_on(":switch_back_on.png") - , bg_off(":switch_back_off.png") - , knob(":switch_front.png") - , state(false) - , middle(false) + , bg_on(getImageCache(), ":switch_back_on.png") + , bg_off(getImageCache(), ":switch_back_off.png") + , knob(getImageCache(), ":switch_front.png") { } diff --git a/plugingui/checkbox.h b/plugingui/checkbox.h index 5c658a5..f26c8d6 100644 --- a/plugingui/checkbox.h +++ b/plugingui/checkbox.h @@ -29,7 +29,7 @@ #include <notifier.h> #include "widget.h" -#include "image.h" +#include "texture.h" namespace GUI { @@ -59,14 +59,14 @@ protected: private: void internalSetChecked(bool checked); - Image bg_on; - Image bg_off; - Image knob; + Texture bg_on; + Texture bg_off; + Texture knob; - bool state; - bool middle; - bool buttonDown = false; - bool inCheckbox = false; + bool state{false}; + bool middle{false}; + bool buttonDown{false}; + bool inCheckbox{false}; std::string _text; }; diff --git a/plugingui/image.h b/plugingui/image.h index 4f591aa..ae0e051 100644 --- a/plugingui/image.h +++ b/plugingui/image.h @@ -29,25 +29,27 @@ #include <string> #include <vector> +#include "drawable.h" #include "colour.h" #include "resource.h" namespace GUI { class Image + : public Drawable { public: Image(const char* data, size_t size); Image(const std::string& filename); Image(Image&& other); - ~Image(); + virtual ~Image(); Image& operator=(Image&& other); - size_t width() const; - size_t height() const; + size_t width() const override; + size_t height() const override; - const Colour& getPixel(size_t x, size_t y) const; + const Colour& getPixel(size_t x, size_t y) const override; private: void setError(); diff --git a/plugingui/imagecache.h b/plugingui/imagecache.h index 9ca28fb..d31a844 100644 --- a/plugingui/imagecache.h +++ b/plugingui/imagecache.h @@ -41,14 +41,14 @@ class ScopedImageBorrower public: ScopedImageBorrower(ImageCache& imageCache, const std::string& filename); ScopedImageBorrower(ScopedImageBorrower&& other); - ~ScopedImageBorrower(); + virtual ~ScopedImageBorrower(); ScopedImageBorrower& operator=(ScopedImageBorrower&& other); Image& operator*(); Image& operator()(); -private: +protected: ImageCache& imageCache; std::string filename; Image& image; diff --git a/plugingui/knob.cc b/plugingui/knob.cc index 845d95a..27d4083 100644 --- a/plugingui/knob.cc +++ b/plugingui/knob.cc @@ -41,7 +41,7 @@ namespace GUI { Knob::Knob(Widget *parent) : Widget(parent) - , img_knob(":knob.png") + , img_knob(getImageCache(), ":knob.png") { state = up; diff --git a/plugingui/knob.h b/plugingui/knob.h index d144184..220ee80 100644 --- a/plugingui/knob.h +++ b/plugingui/knob.h @@ -29,7 +29,7 @@ #include <notifier.h> #include "widget.h" -#include "image.h" +#include "texture.h" #include "font.h" namespace GUI { @@ -72,7 +72,7 @@ private: float maximum; float minimum; - Image img_knob; + Texture img_knob; int mouse_offset_x; Font font; diff --git a/plugingui/painter.cc b/plugingui/painter.cc index 71e4b33..7d55294 100644 --- a/plugingui/painter.cc +++ b/plugingui/painter.cc @@ -30,7 +30,8 @@ #include <cmath> -namespace GUI { +namespace GUI +{ Painter::Painter(Widget& widget) : widget(widget) @@ -345,7 +346,7 @@ void Painter::drawFilledCircle(int cx, int cy, int radius) } } -void Painter::drawImage(int x0, int y0, const Image& image) +void Painter::drawImage(int x0, int y0, const Drawable& image) { size_t fw = image.width(); size_t fh = image.height(); @@ -371,7 +372,7 @@ void Painter::drawImage(int x0, int y0, const Image& image) } } -void Painter::drawImageStretched(int x0, int y0, const Image& image, +void Painter::drawImageStretched(int x0, int y0, const Drawable& image, int width, int height) { if((width < 1) || (height < 1)) diff --git a/plugingui/painter.h b/plugingui/painter.h index 42426bc..233d157 100644 --- a/plugingui/painter.h +++ b/plugingui/painter.h @@ -32,11 +32,15 @@ #include "colour.h" #include "pixelbuffer.h" #include "font.h" +#include "drawable.h" +#include "texture.h" #include "image.h" -namespace GUI { +namespace GUI +{ -class Painter { +class Painter +{ public: Painter(Widget& widget); ~Painter(); @@ -53,8 +57,8 @@ public: void drawPoint(int x, int y); void drawCircle(int x, int y, double r); void drawFilledCircle(int x, int y, int r); - void drawImage(int x, int y, const Image& image); - void drawImageStretched(int x, int y, const Image& image, + void drawImage(int x, int y, const Drawable& image); + void drawImageStretched(int x, int y, const Drawable& image, int width, int height); typedef struct { diff --git a/plugingui/resource_data.cc b/plugingui/resource_data.cc index ce29fd8..1d1136e 100644 --- a/plugingui/resource_data.cc +++ b/plugingui/resource_data.cc @@ -2371,6 +2371,95 @@ const rc_data_t rc_data[] = "\357\135\130\153\111\51\171\132\153\40\354\275\377\271\367\202" "\37\224\360\23\34\221\167\121\131\0\0\0\0\111\105\116" "\104\256\102\140\202" }, + { ":pushbutton.png", 1396, + "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" + "\0\0\0\56\0\0\0\136\10\6\0\0\0\134\233\46" + "\366\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" + "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" + "\7\340\6\6\23\25\16\276\326\315\144\0\0\0\35\151" + "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103" + "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120" + "\144\56\145\7\0\0\4\330\111\104\101\124\170\332\355\234" + "\317\117\33\107\24\307\277\343\131\23\147\41\256\114\161\53" + "\127\252\24\131\124\101\112\11\27\324\106\110\110\275\244\352" + "\325\160\344\17\40\22\247\36\375\107\104\125\17\105\342\340" + "\43\267\300\301\271\124\364\200\42\44\52\71\71\100\150\25" + "\254\106\361\301\50\166\153\130\67\301\306\330\336\335\351\201" + "\267\311\260\306\306\77\110\252\252\157\244\47\377\332\371\316" + "\167\337\174\346\331\227\147\201\177\147\10\12\150\217\372\120" + "\332\243\152\47\320\315\42\355\206\352\303\160\0\200\101\41" + "\351\265\360\151\272\0\34\0\66\205\333\355\132\242\126\253" + "\335\255\327\353\17\33\215\306\101\243\321\120\27\304\101\275" + "\136\177\130\253\325\356\366\220\200\40\200\160\42\221\270\225" + "\311\144\36\344\363\371\347\107\107\107\312\37\371\174\376\171" + "\46\223\171\220\110\44\156\1\10\323\74\321\51\233\2\200" + "\260\54\153\111\112\371\203\343\70\122\51\5\245\132\157\126" + "\10\1\41\4\244\224\216\343\70\337\217\216\216\376\324\141" + "\153\5\145\170\144\145\145\345\333\271\271\271\125\41\204\274" + "\354\116\225\122\316\372\372\372\302\342\342\342\6\200\12\145" + "\137\371\215\13\0\142\167\167\367\116\54\26\173\332\215\260" + "\276\100\241\120\230\236\232\232\172\326\306\274\4\60\74\73" + "\73\73\276\266\266\226\351\125\173\176\176\376\253\255\255\255" + "\27\0\252\204\20\2\276\303\142\230\246\271\244\224\222\275" + "\200\253\224\222\246\151\56\121\126\305\5\11\61\0\214\44" + "\223\311\373\275\230\246\235\225\311\144\362\76\200\21\115\377" + "\234\161\3\100\110\112\371\15\231\351\72\0\200\346\205\164" + "\161\237\166\70\36\217\337\353\105\327\213\170\74\176\217\130" + "\177\253\255\147\310\0\140\32\206\61\356\31\357\145\320\74" + "\223\70\164\56\100\345\172\44\22\271\331\253\56\0\104\42" + "\221\233\0\256\223\16\74\343\136\346\207\0\334\20\102\240" + "\37\161\41\4\0\334\0\160\12\240\251\231\367\112\140\260" + "\37\135\155\4\365\322\351\75\221\144\174\70\30\14\366\247" + "\172\66\157\230\164\144\233\372\75\310\70\127\357\15\75\43" + "\0\102\3\146\45\244\145\246\145\123\6\324\76\127\272\15" + "\355\115\171\105\333\51\333\175\41\15\250\335\222\176\275\34" + "\312\1\365\344\5\345\360\275\14\303\377\5\164\5\333\51" + "\72\324\373\367\142\374\312\305\331\170\7\306\377\163\203\121" + "\141\124\30\25\106\205\121\141\343\314\70\243\302\250\60\52" + "\154\234\31\147\124\30\25\106\205\121\141\124\330\70\63\316" + "\214\63\52\214\12\33\147\306\231\161\106\205\121\141\124\30" + "\25\106\205\31\147\306\31\25\106\205\121\141\306\231\161\106" + "\205\121\141\124\30\25\106\205\215\63\343\214\312\377\24\25" + "\333\266\41\145\357\75\36\216\343\164\221\360\201\62\256\72" + "\146\334\262\254\242\353\272\75\365\242\271\256\13\313\262\212" + "\227\54\352\132\226\165\320\117\257\233\145\131\7\360\65\243" + "\266\30\317\345\162\331\146\263\331\223\160\263\331\104\56\227" + "\313\166\62\15\240\231\315\146\237\364\143\74\233\315\76\301" + "\131\33\332\133\363\1\337\2\52\235\116\77\56\227\313\312" + "\165\335\256\366\317\165\135\224\313\145\225\116\247\37\243\175" + "\43\252\3\240\226\112\245\36\51\245\334\36\17\264\233\112" + "\245\36\1\250\101\153\376\363\172\206\15\234\165\357\205\213" + "\305\142\120\112\31\212\104\42\161\51\245\10\4\2\10\4" + "\132\317\260\155\333\250\126\253\50\24\12\152\143\143\343\227" + "\315\315\315\137\1\224\0\374\15\340\204\62\344\15\1\100" + "\126\52\25\303\262\254\362\364\364\364\327\350\242\311\111\51" + "\345\56\57\57\377\270\263\263\223\1\360\12\132\43\252\327" + "\155\165\15\100\4\300\347\0\276\0\20\237\230\230\270\63" + "\63\63\63\35\215\106\307\114\323\64\375\242\47\47\47\47" + "\245\122\351\160\173\173\373\351\376\376\376\63\0\57\1\374" + "\1\40\17\240\114\346\365\4\15\3\210\1\30\37\33\33" + "\273\275\260\260\360\335\344\344\344\227\321\150\64\352\327\56" + "\225\112\245\275\275\275\337\126\127\127\177\76\74\74\374\35" + "\300\13\0\5\277\161\257\45\62\14\340\63\0\161\212\30" + "\200\217\360\256\133\120\340\254\11\357\224\160\160\0\64\0" + "\274\46\321\227\24\257\0\274\241\353\364\214\33\70\353\202" + "\375\204\326\371\224\326\14\341\174\253\232\103\163\337\0\370" + "\223\364\376\202\257\147\331\360\231\250\122\266\216\150\27\100" + "\10\351\35\203\65\357\260\321\163\213\256\57\323\374\6\132" + "\33\121\25\55\132\241\317\52\164\263\272\266\320\17\62\151" + "\37\123\324\164\323\172\35\167\151\301\143\62\21\242\367\117" + "\51\113\103\164\255\111\10\330\164\175\205\214\27\151\336\61" + "\275\357\266\251\56\66\335\134\235\316\102\337\175\371\206\126" + "\11\154\62\145\151\246\137\23\233\327\150\221\60\155\241\103" + "\213\353\73\144\151\67\245\72\224\106\107\313\52\320\347\77" + "\41\30\276\154\234\352\345\213\114\171\315\245\222\16\160\231" + "\76\157\322\365\125\312\174\225\136\167\62\216\313\14\165\73" + "\132\372\362\361\356\357\25\206\50\364\346\322\217\51\273\112" + "\63\337\240\260\65\323\352\103\376\126\361\26\263\65\276\116" + "\65\6\275\70\322\314\271\32\217\352\103\231\6\200\177\0" + "\340\140\375\366\365\353\25\220\0\0\0\0\111\105\116\104" + "\256\102\140\202" }, { ":pushbutton_b.png", 205, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" "\0\0\0\1\0\0\0\14\10\6\0\0\0\243\213\327" diff --git a/plugingui/resources/pushbutton.png b/plugingui/resources/pushbutton.png Binary files differnew file mode 100644 index 0000000..4145e9a --- /dev/null +++ b/plugingui/resources/pushbutton.png diff --git a/plugingui/resources/pushbutton_b.png b/plugingui/resources/pushbutton_b.png Binary files differdeleted file mode 100644 index 9767ce9..0000000 --- a/plugingui/resources/pushbutton_b.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_bl.png b/plugingui/resources/pushbutton_bl.png Binary files differdeleted file mode 100644 index 8fa6f81..0000000 --- a/plugingui/resources/pushbutton_bl.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_br.png b/plugingui/resources/pushbutton_br.png Binary files differdeleted file mode 100644 index 8fcb9f7..0000000 --- a/plugingui/resources/pushbutton_br.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_c.png b/plugingui/resources/pushbutton_c.png Binary files differdeleted file mode 100644 index bff0c40..0000000 --- a/plugingui/resources/pushbutton_c.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_l.png b/plugingui/resources/pushbutton_l.png Binary files differdeleted file mode 100644 index 52adfe0..0000000 --- a/plugingui/resources/pushbutton_l.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_r.png b/plugingui/resources/pushbutton_r.png Binary files differdeleted file mode 100644 index 74af818..0000000 --- a/plugingui/resources/pushbutton_r.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_t.png b/plugingui/resources/pushbutton_t.png Binary files differdeleted file mode 100644 index add473f..0000000 --- a/plugingui/resources/pushbutton_t.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_tl.png b/plugingui/resources/pushbutton_tl.png Binary files differdeleted file mode 100644 index 2b49cd1..0000000 --- a/plugingui/resources/pushbutton_tl.png +++ /dev/null diff --git a/plugingui/resources/pushbutton_tr.png b/plugingui/resources/pushbutton_tr.png Binary files differdeleted file mode 100644 index 8f5a293..0000000 --- a/plugingui/resources/pushbutton_tr.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_b.png b/plugingui/resources/pushbuttondown_b.png Binary files differdeleted file mode 100644 index ed17c18..0000000 --- a/plugingui/resources/pushbuttondown_b.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_bl.png b/plugingui/resources/pushbuttondown_bl.png Binary files differdeleted file mode 100644 index 820253b..0000000 --- a/plugingui/resources/pushbuttondown_bl.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_br.png b/plugingui/resources/pushbuttondown_br.png Binary files differdeleted file mode 100644 index 7c1b1e1..0000000 --- a/plugingui/resources/pushbuttondown_br.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_c.png b/plugingui/resources/pushbuttondown_c.png Binary files differdeleted file mode 100644 index d5a8d80..0000000 --- a/plugingui/resources/pushbuttondown_c.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_l.png b/plugingui/resources/pushbuttondown_l.png Binary files differdeleted file mode 100644 index 5f65187..0000000 --- a/plugingui/resources/pushbuttondown_l.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_r.png b/plugingui/resources/pushbuttondown_r.png Binary files differdeleted file mode 100644 index a3013f7..0000000 --- a/plugingui/resources/pushbuttondown_r.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_t.png b/plugingui/resources/pushbuttondown_t.png Binary files differdeleted file mode 100644 index dd02350..0000000 --- a/plugingui/resources/pushbuttondown_t.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_tl.png b/plugingui/resources/pushbuttondown_tl.png Binary files differdeleted file mode 100644 index 662275d..0000000 --- a/plugingui/resources/pushbuttondown_tl.png +++ /dev/null diff --git a/plugingui/resources/pushbuttondown_tr.png b/plugingui/resources/pushbuttondown_tr.png Binary files differdeleted file mode 100644 index 114aff1..0000000 --- a/plugingui/resources/pushbuttondown_tr.png +++ /dev/null diff --git a/plugingui/texturedbox.cc b/plugingui/texturedbox.cc new file mode 100644 index 0000000..02f695c --- /dev/null +++ b/plugingui/texturedbox.cc @@ -0,0 +1,136 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * texturedbox.cc + * + * Sun Jun 5 12:22:15 CEST 2016 + * Copyright 2016 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "texturedbox.h" + +#include <cassert> + +namespace GUI +{ + +TexturedBox::TexturedBox(ImageCache& image_cache, const std::string& filename, + std::size_t x0, std::size_t y0, + std::size_t dx1, std::size_t dx2, std::size_t dx3, + std::size_t dy1, std::size_t dy2, std::size_t dy3) + : seg_a(image_cache, filename, x0 , y0 , dx1, dy1) + , seg_b(image_cache, filename, x0 + dx1 , y0 , dx2, dy1) + , seg_c(image_cache, filename, x0 + dx1 + dx2, y0 , dx3, dy1) + , seg_d(image_cache, filename, x0 , y0 + dy1 , dx1, dy2) + , seg_e(image_cache, filename, x0 + dx1 , y0 + dy1 , dx2, dy2) + , seg_f(image_cache, filename, x0 + dx1 + dx2, y0 + dy1 , dx3, dy2) + , seg_g(image_cache, filename, x0 , y0 + dy1 + dy2, dx1, dy3) + , seg_h(image_cache, filename, x0 + dx1 , y0 + dy1 + dy2, dx2, dy3) + , seg_i(image_cache, filename, x0 + dx1 + dx2, y0 + dy1 + dy2, dx3, dy3) + , _x(x0) + , _y(y0) + , dx1(dx1) + , dx2(dx2) + , dx3(dx3) + , dy1(dy1) + , dy2(dy2) + , dy3(dy3) +{ +} + +std::size_t TexturedBox::width() const +{ + return _width; +} + +std::size_t TexturedBox::height() const +{ + return _height; +} + +void TexturedBox::setSize(std::size_t width, std::size_t height) +{ + _width = width; + _height = height; +} + +const Colour& TexturedBox::getPixel(std::size_t x, std::size_t y) const +{ + assert(x < _width); + assert(y < _height); + + if(y < dy1) // row 1 + { + if(x < dx1) // col 1 + { + return seg_a.getPixel(x, y); + } + else if(x < (_width - dx3)) // col 2 + { + float scale = (float)(x - dx1) / (float)(_width - dx1 - dx3); + assert(seg_b.width() == dx2); + return seg_b.getPixel(scale * dx2, y); + } + else // col 3 + { + return seg_c.getPixel(x - (_width - dx3), y); + } + } + else if(y < (_height - dy3)) // row 2 + { + if(x < dx1) // col 1 + { + // TODO: Apply vertical scale + float scale = (float)(y - dy1) / (float)(_height - dy1 - dy3); + return seg_d.getPixel(x, scale * dy2); + } + else if(x < (_width - dx3)) // col 2 + { + float scale_x = (float)(x - dx1) / (float)(_width - dx1 - dx3); + float scale_y = (float)(y - dy1) / (float)(_height - dy1 - dy3); + return seg_e.getPixel(scale_x * dx2, scale_y * dy2); + } + else // col 3 + { + float scale = (float)(y - dy1) / (float)(_height - dy1 - dy3); + return seg_f.getPixel(x - (_width - dx3), scale * dy2); + } + } + else // row 3 + { + if(x < dx1) // col 1 + { + return seg_g.getPixel(x, y - (_height - dy3)); + } + else if(x < (_width - dx3)) // col 2 + { + float scale = (float)(x - dx1) / (float)(_width - dx1 - dx3); + return seg_h.getPixel(scale * dx2, y - (_height - dy3)); + } + else // col 3 + { + return seg_i.getPixel(x - (_width - dx3), y - (_height - dy3)); + } + } + + return outOfRange; +} + +} // GUI:: diff --git a/plugingui/texturedbox.h b/plugingui/texturedbox.h new file mode 100644 index 0000000..51aead5 --- /dev/null +++ b/plugingui/texturedbox.h @@ -0,0 +1,118 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * texturedbox.h + * + * Sun Jun 5 12:22:14 CEST 2016 + * Copyright 2016 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#pragma once + +#include "drawable.h" +#include "imagecache.h" +#include "texture.h" + +namespace GUI +{ + +class TexturedBox + : public Drawable +{ +public: + //! Draw a box from 9 image segments nested inside the same image. + //! An image says more than a thousand words: + //! .----------------------------------------. + //! | (x0, y0) | + //! | \ dx1 dx2 dx3 | + //! | .-----+-----------+-----. \ | + //! | dy1 | A | <--B--> | C | | | + //! | +-----+-----------+-----+ | | + //! | | /|\ | /|\ | /|\ | | h | + //! | | | | | | | | | e | + //! | dy2 | D | <--E--> | F | > i | + //! | | | | | | | | | g | + //! | | \|/ | \|/ | \|/ | | h | + //! | +-----+-----------+-----+ | t | + //! | dy3 | G | <--H--> | I | | | + //! | `-----+-----------+-----` / | + //! | | + //! | \___________ ___________/ | + //! | V | + //! | width | + //! `----------------------------------------` + //! + //! \param image_cache A reference to the image cache object. + //! \param filename The filename of the texture image to use. + //! \param (x0, y0) is coordinate of the upper left corner of the A segment. + //! \param (width, height) is the total rendered size of the Box. + //! \param dx1 is the width of the A, C and F segments. + //! \param dx2 is the width of the B, E and H segments. + //! \param dx3 is the width of the C, F and I segments. + //! \param dy1 is the height of the A, B and C segments. + //! \param dy2 is the height of the D, E and F segments. + //! \param dy3 is the height of the G, G and I segments. + //! + //! Segments A, C, G and I are drawn with no stretch. + //! Segments B and H are stretched horizontally to fill the + //! gaps between A, C and G, I so that resulting width is 'width' + //! Segments D and F are stretched vertically to fill the + //! gaps between A, G and C, I so that resulting height is 'height' + //! Segment E will be stretched both horizontally and vertically + //! to fill the inner space between B, H and D, F. + TexturedBox(ImageCache& image_cache, const std::string& filename, + std::size_t x0, std::size_t y0, + std::size_t dx1, std::size_t dx2, std::size_t dx3, + std::size_t dy1, std::size_t dy2, std::size_t dy3); + + // From Drawable: + std::size_t width() const override; + std::size_t height() const override; + + void setSize(std::size_t width, std::size_t height); + + const Colour& getPixel(std::size_t x, std::size_t y) const override; + +private: + Texture seg_a; + Texture seg_b; + Texture seg_c; + Texture seg_d; + Texture seg_e; + Texture seg_f; + Texture seg_g; + Texture seg_h; + Texture seg_i; + + std::size_t _x; + std::size_t _y; + std::size_t _width{100}; + std::size_t _height{100}; + std::size_t dx1; + std::size_t dx2; + std::size_t dx3; + std::size_t dy1; + std::size_t dy2; + std::size_t dy3; + + Colour outOfRange{0.0f, 0.0f, 0.0f, 0.0f}; +}; + +} // GUI:: diff --git a/plugingui/widget.cc b/plugingui/widget.cc index 9bac566..5cd013d 100644 --- a/plugingui/widget.cc +++ b/plugingui/widget.cc @@ -26,11 +26,11 @@ */ #include "widget.h" +#include <cassert> + #include "painter.h" #include "window.h" -#include <stdio.h> - namespace GUI { Widget::Widget(Widget* parent) @@ -155,6 +155,12 @@ size_t Widget::windowY() return window_y; } +ImageCache& Widget::getImageCache() +{ + assert(parent); + return parent->getImageCache(); +} + Widget* Widget::find(int x, int y) { for(auto i = children.rbegin(); i != children.rend(); ++i) diff --git a/plugingui/widget.h b/plugingui/widget.h index 02b8c07..bbe85d0 100644 --- a/plugingui/widget.h +++ b/plugingui/widget.h @@ -35,6 +35,7 @@ namespace GUI { +class ImageCache; class Window; class Widget : public Listener, public LayoutItem { @@ -71,6 +72,8 @@ public: virtual void mouseLeaveEvent() {} virtual void mouseEnterEvent() {} + virtual ImageCache& getImageCache(); + Widget* find(int x, int y); virtual Window* window(); diff --git a/plugingui/window.cc b/plugingui/window.cc index 8d56926..7449607 100644 --- a/plugingui/window.cc +++ b/plugingui/window.cc @@ -127,6 +127,11 @@ Window* Window::window() return this; } +ImageCache& Window::getImageCache() +{ + return image_cache; +} + EventHandler* Window::eventHandler() { return eventhandler; diff --git a/plugingui/window.h b/plugingui/window.h index 0c93658..9eb9d6d 100644 --- a/plugingui/window.h +++ b/plugingui/window.h @@ -32,6 +32,7 @@ #include "nativewindow.h" #include "image.h" #include "eventhandler.h" +#include "imagecache.h" namespace GUI { @@ -52,6 +53,8 @@ public: void hide() override; Window* window() override; + ImageCache& getImageCache() override; + EventHandler* eventHandler(); Widget* keyboardFocus(); @@ -91,6 +94,8 @@ protected: EventHandler* eventhandler{nullptr}; size_t maxRefcount{0}; + + ImageCache image_cache; }; } // GUI:: |