added lottie2gif converter for both cmake and meson build
[platform/core/uifw/lottie-player.git] / example / evasapp.cpp
1 /* 
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
3  * 
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  * 
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  * 
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "evasapp.h"
20 #include <dirent.h>
21 #include <algorithm>
22
23 static void
24 _on_resize(Ecore_Evas *ee)
25 {
26    EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app");
27    int w, h;
28    ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
29    app->resize(w, h);
30    if (app->mResizeCb)
31        app->mResizeCb(app->mResizeData, nullptr);
32 }
33
34 static void
35 _on_delete(Ecore_Evas *ee)
36 {
37    EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app");
38    if (app->mExitCb)
39        app->mExitCb(app->mExitData, nullptr);
40
41    ecore_main_loop_quit();
42    ecore_evas_free(ee);
43 }
44
45 static Eina_Bool
46 on_key_down(void *data, int type, void *event)
47 {
48     Ecore_Event_Key *keyData = (Ecore_Event_Key *)event;
49
50     EvasApp *app = (EvasApp *) data;
51     if (app && app->mKeyCb)
52         app->mKeyCb(app->mKeyData, (void *)keyData->key);
53
54     return false;
55 }
56
57 static void
58 on_pre_render(Ecore_Evas *ee)
59 {
60     EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app");
61     if (app->mRenderPreCb)
62         app->mRenderPreCb(app->mRenderPreData, nullptr);
63 }
64
65 static void
66 on_post_render(Ecore_Evas *ee)
67 {
68     EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app");
69     if (app && app->mRenderPostCb)
70         app->mRenderPostCb(app->mRenderPostData, nullptr);
71 }
72
73 EvasApp::EvasApp(int w, int h)
74 {
75     if (!ecore_evas_init())
76      return;
77     mw = w;
78     mh = h;
79     //setenv("ECORE_EVAS_ENGINE", "opengl_x11", 1);
80     mEcoreEvas = ecore_evas_new(NULL, 0, 0, mw, mh, NULL);
81     if (!mEcoreEvas) return;
82 }
83
84 void
85 EvasApp::setup()
86 {
87     ecore_evas_data_set(mEcoreEvas, "app", this);
88     ecore_evas_callback_resize_set(mEcoreEvas, _on_resize);
89     ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete);
90     ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, on_key_down, this);
91     ecore_evas_callback_pre_render_set(mEcoreEvas, on_pre_render);
92     ecore_evas_callback_post_render_set(mEcoreEvas, on_post_render);
93
94     ecore_evas_show(mEcoreEvas);
95     mEvas = ecore_evas_get(mEcoreEvas);
96     mBackground = evas_object_rectangle_add(mEvas);
97     evas_object_color_set(mBackground, 70, 70, 70, 255);
98     evas_object_show(mBackground);
99 }
100
101 void
102 EvasApp::resize(int w, int h)
103 {
104     evas_object_resize(mBackground, w, h);
105     mw = w;
106     mh = h;
107 }
108
109 void EvasApp::run()
110 {
111     resize(mw, mh);
112     ecore_main_loop_begin();
113     ecore_evas_shutdown();
114 }
115
116 static bool isJsonFile(const char *filename) {
117   const char *dot = strrchr(filename, '.');
118   if(!dot || dot == filename) return false;
119   return !strcmp(dot + 1, "json");
120 }
121
122 std::vector<std::string>
123 EvasApp::jsonFiles(const std::string &dirName, bool recurse)
124 {
125     DIR *d;
126     struct dirent *dir;
127     std::vector<std::string> result;
128     d = opendir(dirName.c_str());
129     if (d) {
130       while ((dir = readdir(d)) != NULL) {
131         if (isJsonFile(dir->d_name))
132           result.push_back(dirName + dir->d_name);
133       }
134       closedir(d);
135     }
136
137     std::sort(result.begin(), result.end(), [](auto & a, auto &b){return a < b;});
138
139     return result;
140 }
141