DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
6.6KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #ifndef EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED
  17. #define EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED
  18. // ------------------------------------------------------
  19. // DGL Stuff
  20. #include "../../dgl/ImageBase.hpp"
  21. #include "../../dgl/SubWidget.hpp"
  22. #include "../../dgl/TopLevelWidget.hpp"
  23. // ------------------------------------------------------
  24. // Images
  25. #include "../images_res/CatPics.hpp"
  26. START_NAMESPACE_DGL
  27. // ------------------------------------------------------
  28. // our widget
  29. template <class BaseWidget, class BaseImage>
  30. class ExampleImagesWidget : public BaseWidget,
  31. public IdleCallback
  32. {
  33. static const int kImg1y = 0;
  34. static const int kImg2y = 500/2-CatPics::cat2Height/2;
  35. static const int kImg3x = 400/3-CatPics::cat3Width/3;
  36. static const int kImg1max = 500-CatPics::cat1Width;
  37. static const int kImg2max = 500-CatPics::cat2Width;
  38. static const int kImg3max = 400-CatPics::cat3Height;
  39. int imgTop1st, imgTop2nd, imgTop3rd;
  40. int img1x, img2x, img3y;
  41. bool img1rev, img2rev, img3rev;
  42. BaseImage img1, img2, img3;
  43. public:
  44. static constexpr const char* kExampleWidgetName = "Images";
  45. // SubWidget
  46. ExampleImagesWidget(Widget* const parent)
  47. : BaseWidget(parent),
  48. imgTop1st(1),
  49. imgTop2nd(2),
  50. imgTop3rd(3),
  51. img1x(0),
  52. img2x(kImg2max),
  53. img3y(kImg3max),
  54. img1rev(false),
  55. img2rev(true),
  56. img3rev(true),
  57. img1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, kImageFormatBGR),
  58. img2(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, kImageFormatBGR),
  59. img3(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, kImageFormatBGR)
  60. {
  61. BaseWidget::setSize(500, 400);
  62. parent->getApp().addIdleCallback(this);
  63. }
  64. // TopLevelWidget
  65. ExampleImagesWidget(Window& windowToMapTo)
  66. : BaseWidget(windowToMapTo),
  67. imgTop1st(1),
  68. imgTop2nd(2),
  69. imgTop3rd(3),
  70. img1x(0),
  71. img2x(kImg2max),
  72. img3y(kImg3max),
  73. img1rev(false),
  74. img2rev(true),
  75. img3rev(true),
  76. img1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, kImageFormatBGR),
  77. img2(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, kImageFormatBGR),
  78. img3(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, kImageFormatBGR)
  79. {
  80. BaseWidget::setSize(500, 400);
  81. windowToMapTo.getApp().addIdleCallback(this);
  82. }
  83. // StandaloneWindow
  84. ExampleImagesWidget(Application& app)
  85. : BaseWidget(app),
  86. imgTop1st(1),
  87. imgTop2nd(2),
  88. imgTop3rd(3),
  89. img1x(0),
  90. img2x(kImg2max),
  91. img3y(kImg3max),
  92. img1rev(false),
  93. img2rev(true),
  94. img3rev(true),
  95. img1(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, kImageFormatBGR),
  96. img2(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, kImageFormatBGR),
  97. img3(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, kImageFormatBGR)
  98. {
  99. BaseWidget::setSize(500, 400);
  100. app.addIdleCallback(this);
  101. }
  102. protected:
  103. void idleCallback() noexcept override
  104. {
  105. if (img1rev)
  106. {
  107. img1x -= 2;
  108. if (img1x <= -50)
  109. {
  110. img1rev = false;
  111. setNewTopImg(1);
  112. }
  113. }
  114. else
  115. {
  116. img1x += 2;
  117. if (img1x >= kImg1max+50)
  118. {
  119. img1rev = true;
  120. setNewTopImg(1);
  121. }
  122. }
  123. if (img2rev)
  124. {
  125. img2x -= 1;
  126. if (img2x <= -50)
  127. {
  128. img2rev = false;
  129. setNewTopImg(2);
  130. }
  131. }
  132. else
  133. {
  134. img2x += 4;
  135. if (img2x >= kImg2max+50)
  136. {
  137. img2rev = true;
  138. setNewTopImg(2);
  139. }
  140. }
  141. if (img3rev)
  142. {
  143. img3y -= 3;
  144. if (img3y <= -50)
  145. {
  146. img3rev = false;
  147. setNewTopImg(3);
  148. }
  149. }
  150. else
  151. {
  152. img3y += 3;
  153. if (img3y >= kImg3max+50)
  154. {
  155. img3rev = true;
  156. setNewTopImg(3);
  157. }
  158. }
  159. BaseWidget::repaint();
  160. }
  161. void onDisplay() override
  162. {
  163. const GraphicsContext& context(BaseWidget::getGraphicsContext());
  164. switch (imgTop3rd)
  165. {
  166. case 1:
  167. img1.drawAt(context, img1x, kImg1y);
  168. break;
  169. case 2:
  170. img2.drawAt(context, img2x, kImg2y);
  171. break;
  172. case 3:
  173. img3.drawAt(context, kImg3x, img3y);
  174. break;
  175. };
  176. switch (imgTop2nd)
  177. {
  178. case 1:
  179. img1.drawAt(context, img1x, kImg1y);
  180. break;
  181. case 2:
  182. img2.drawAt(context, img2x, kImg2y);
  183. break;
  184. case 3:
  185. img3.drawAt(context, kImg3x, img3y);
  186. break;
  187. };
  188. switch (imgTop1st)
  189. {
  190. case 1:
  191. img1.drawAt(context, img1x, kImg1y);
  192. break;
  193. case 2:
  194. img2.drawAt(context, img2x, kImg2y);
  195. break;
  196. case 3:
  197. img3.drawAt(context, kImg3x, img3y);
  198. break;
  199. };
  200. }
  201. private:
  202. void setNewTopImg(const int imgId) noexcept
  203. {
  204. if (imgTop1st == imgId)
  205. return;
  206. if (imgTop2nd == imgId)
  207. {
  208. imgTop2nd = imgTop1st;
  209. imgTop1st = imgId;
  210. return;
  211. }
  212. imgTop3rd = imgTop2nd;
  213. imgTop2nd = imgTop1st;
  214. imgTop1st = imgId;
  215. }
  216. };
  217. // ------------------------------------------------------
  218. END_NAMESPACE_DGL
  219. #endif // EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED