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.

252 lines
6.7KB

  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. done();
  102. }
  103. protected:
  104. void idleCallback() noexcept override
  105. {
  106. if (img1rev)
  107. {
  108. img1x -= 2;
  109. if (img1x <= -50)
  110. {
  111. img1rev = false;
  112. setNewTopImg(1);
  113. }
  114. }
  115. else
  116. {
  117. img1x += 2;
  118. if (img1x >= kImg1max+50)
  119. {
  120. img1rev = true;
  121. setNewTopImg(1);
  122. }
  123. }
  124. if (img2rev)
  125. {
  126. img2x -= 1;
  127. if (img2x <= -50)
  128. {
  129. img2rev = false;
  130. setNewTopImg(2);
  131. }
  132. }
  133. else
  134. {
  135. img2x += 4;
  136. if (img2x >= kImg2max+50)
  137. {
  138. img2rev = true;
  139. setNewTopImg(2);
  140. }
  141. }
  142. if (img3rev)
  143. {
  144. img3y -= 3;
  145. if (img3y <= -50)
  146. {
  147. img3rev = false;
  148. setNewTopImg(3);
  149. }
  150. }
  151. else
  152. {
  153. img3y += 3;
  154. if (img3y >= kImg3max+50)
  155. {
  156. img3rev = true;
  157. setNewTopImg(3);
  158. }
  159. }
  160. BaseWidget::repaint();
  161. }
  162. void onDisplay() override
  163. {
  164. const GraphicsContext& context(BaseWidget::getGraphicsContext());
  165. switch (imgTop3rd)
  166. {
  167. case 1:
  168. img1.drawAt(context, img1x, kImg1y);
  169. break;
  170. case 2:
  171. img2.drawAt(context, img2x, kImg2y);
  172. break;
  173. case 3:
  174. img3.drawAt(context, kImg3x, img3y);
  175. break;
  176. };
  177. switch (imgTop2nd)
  178. {
  179. case 1:
  180. img1.drawAt(context, img1x, kImg1y);
  181. break;
  182. case 2:
  183. img2.drawAt(context, img2x, kImg2y);
  184. break;
  185. case 3:
  186. img3.drawAt(context, kImg3x, img3y);
  187. break;
  188. };
  189. switch (imgTop1st)
  190. {
  191. case 1:
  192. img1.drawAt(context, img1x, kImg1y);
  193. break;
  194. case 2:
  195. img2.drawAt(context, img2x, kImg2y);
  196. break;
  197. case 3:
  198. img3.drawAt(context, kImg3x, img3y);
  199. break;
  200. };
  201. }
  202. private:
  203. void setNewTopImg(const int imgId) noexcept
  204. {
  205. if (imgTop1st == imgId)
  206. return;
  207. if (imgTop2nd == imgId)
  208. {
  209. imgTop2nd = imgTop1st;
  210. imgTop1st = imgId;
  211. return;
  212. }
  213. imgTop3rd = imgTop2nd;
  214. imgTop2nd = imgTop1st;
  215. imgTop1st = imgId;
  216. }
  217. };
  218. // ------------------------------------------------------
  219. END_NAMESPACE_DGL
  220. #endif // EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED