ExampleImagesWidget.hpp (5583B)
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 17 #ifndef EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED 18 #define EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED 19 20 // ------------------------------------------------------ 21 // DGL Stuff 22 23 #include "../../dgl/ImageBase.hpp" 24 #include "../../dgl/StandaloneWindow.hpp" 25 #include "../../dgl/SubWidget.hpp" 26 27 // ------------------------------------------------------ 28 // Images 29 30 #include "../images_res/CatPics.hpp" 31 32 START_NAMESPACE_DGL 33 34 // ------------------------------------------------------ 35 // our widget 36 37 template <class BaseWidget, class BaseImage> 38 class ExampleImagesWidget : public BaseWidget, 39 public IdleCallback 40 { 41 static const int kImg1y = 0; 42 static const int kImg2y = 500/2-CatPics::cat2Height/2; 43 static const int kImg3x = 400/3-CatPics::cat3Width/3; 44 45 static const int kImg1max = 500-CatPics::cat1Width; 46 static const int kImg2max = 500-CatPics::cat2Width; 47 static const int kImg3max = 400-CatPics::cat3Height; 48 49 int imgTop1st, imgTop2nd, imgTop3rd; 50 int img1x, img2x, img3y; 51 bool img1rev, img2rev, img3rev; 52 BaseImage img1, img2, img3; 53 54 public: 55 static constexpr const char* kExampleWidgetName = "Images"; 56 57 // SubWidget 58 explicit ExampleImagesWidget(Widget* const parent); 59 60 // TopLevelWidget 61 explicit ExampleImagesWidget(Window& windowToMapTo); 62 63 // StandaloneWindow 64 explicit ExampleImagesWidget(Application& app); 65 66 protected: 67 void init(Application& app) 68 { 69 imgTop1st = 1; 70 imgTop2nd = 2; 71 imgTop3rd = 3; 72 img1x = 0; 73 img2x = kImg2max; 74 img3y = kImg3max; 75 img1rev = false; 76 img2rev = true; 77 img3rev = true; 78 img1 = BaseImage(CatPics::cat1Data, CatPics::cat1Width, CatPics::cat1Height, kImageFormatBGR); 79 img2 = BaseImage(CatPics::cat2Data, CatPics::cat2Width, CatPics::cat2Height, kImageFormatBGR); 80 img3 = BaseImage(CatPics::cat3Data, CatPics::cat3Width, CatPics::cat3Height, kImageFormatBGR); 81 82 BaseWidget::setSize(500, 400); 83 app.addIdleCallback(this); 84 } 85 86 void idleCallback() noexcept override 87 { 88 if (img1rev) 89 { 90 img1x -= 2; 91 if (img1x <= -50) 92 { 93 img1rev = false; 94 setNewTopImg(1); 95 } 96 } 97 else 98 { 99 img1x += 2; 100 if (img1x >= kImg1max+50) 101 { 102 img1rev = true; 103 setNewTopImg(1); 104 } 105 } 106 107 if (img2rev) 108 { 109 img2x -= 1; 110 if (img2x <= -50) 111 { 112 img2rev = false; 113 setNewTopImg(2); 114 } 115 } 116 else 117 { 118 img2x += 4; 119 if (img2x >= kImg2max+50) 120 { 121 img2rev = true; 122 setNewTopImg(2); 123 } 124 } 125 126 if (img3rev) 127 { 128 img3y -= 3; 129 if (img3y <= -50) 130 { 131 img3rev = false; 132 setNewTopImg(3); 133 } 134 } 135 else 136 { 137 img3y += 3; 138 if (img3y >= kImg3max+50) 139 { 140 img3rev = true; 141 setNewTopImg(3); 142 } 143 } 144 145 BaseWidget::repaint(); 146 } 147 148 void onDisplay() override 149 { 150 const GraphicsContext& context(BaseWidget::getGraphicsContext()); 151 152 switch (imgTop3rd) 153 { 154 case 1: 155 img1.drawAt(context, img1x, kImg1y); 156 break; 157 case 2: 158 img2.drawAt(context, img2x, kImg2y); 159 break; 160 case 3: 161 img3.drawAt(context, kImg3x, img3y); 162 break; 163 }; 164 165 switch (imgTop2nd) 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 178 switch (imgTop1st) 179 { 180 case 1: 181 img1.drawAt(context, img1x, kImg1y); 182 break; 183 case 2: 184 img2.drawAt(context, img2x, kImg2y); 185 break; 186 case 3: 187 img3.drawAt(context, kImg3x, img3y); 188 break; 189 }; 190 } 191 192 private: 193 void setNewTopImg(const int imgId) noexcept 194 { 195 if (imgTop1st == imgId) 196 return; 197 198 if (imgTop2nd == imgId) 199 { 200 imgTop2nd = imgTop1st; 201 imgTop1st = imgId; 202 return; 203 } 204 205 imgTop3rd = imgTop2nd; 206 imgTop2nd = imgTop1st; 207 imgTop1st = imgId; 208 } 209 }; 210 211 // ------------------------------------------------------ 212 213 END_NAMESPACE_DGL 214 215 #endif // EXAMPLE_IMAGES_WIDGET_HPP_INCLUDED