DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

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