1 /**
2 * @file lv_animimg.c
3 *
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9 #include "lv_animimage_private.h"
10 #include "../../core/lv_obj_class_private.h"
11 #if LV_USE_ANIMIMG != 0
12
13 /*Testing of dependencies*/
14 #if LV_USE_IMAGE == 0
15 #error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1) "
16 #endif
17
18 #include "../../draw/lv_image_decoder.h"
19 #include "../../misc/lv_assert.h"
20 #include "../../misc/lv_fs.h"
21 #include "../../misc/lv_text.h"
22 #include "../../misc/lv_math.h"
23 #include "../../misc/lv_log.h"
24 #include "../../misc/lv_anim.h"
25
26 /*********************
27 * DEFINES
28 *********************/
29 #define LV_OBJX_NAME "lv_animimg"
30
31 #define MY_CLASS (&lv_animimg_class)
32
33 /**********************
34 * TYPEDEFS
35 **********************/
36
37 /**********************
38 * STATIC PROTOTYPES
39 **********************/
40 static void index_change(lv_obj_t * obj, int32_t idx);
41 static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
42
43 /**********************
44 * STATIC VARIABLES
45 **********************/
46
47 #if LV_USE_OBJ_PROPERTY
48 static const lv_property_ops_t properties[] = {
49 {
50 .id = LV_PROPERTY_ANIMIMAGE_SRC,
51 .setter = lv_animimg_set_src,
52 .getter = lv_animimg_get_src,
53 },
54 {
55 .id = LV_PROPERTY_ANIMIMAGE_DURATION,
56 .setter = lv_animimg_set_duration,
57 .getter = lv_animimg_get_duration,
58 },
59 {
60 .id = LV_PROPERTY_ANIMIMAGE_REPEAT_COUNT,
61 .setter = lv_animimg_set_repeat_count,
62 .getter = lv_animimg_get_repeat_count,
63 },
64 {
65 .id = LV_PROPERTY_ANIMIMAGE_SRC_COUNT,
66 .setter = NULL,
67 .getter = lv_animimg_get_src_count,
68 },
69 };
70 #endif
71
72 const lv_obj_class_t lv_animimg_class = {
73 .constructor_cb = lv_animimg_constructor,
74 .instance_size = sizeof(lv_animimg_t),
75 .base_class = &lv_image_class,
76 .name = "animimg",
77 #if LV_USE_OBJ_PROPERTY
78 .prop_index_start = LV_PROPERTY_ANIMIMAGE_START,
79 .prop_index_end = LV_PROPERTY_ANIMIMAGE_END,
80 .properties = properties,
81 .properties_count = sizeof(properties) / sizeof(properties[0]),
82
83 #if LV_USE_OBJ_PROPERTY_NAME
84 .property_names = lv_animimage_property_names,
85 .names_count = sizeof(lv_animimage_property_names) / sizeof(lv_property_name_t),
86 #endif
87 #endif
88 };
89
90 /**********************
91 * MACROS
92 **********************/
93
94 /**********************
95 * GLOBAL FUNCTIONS
96 **********************/
97
lv_animimg_create(lv_obj_t * parent)98 lv_obj_t * lv_animimg_create(lv_obj_t * parent)
99 {
100 LV_LOG_INFO("begin");
101 lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent);
102 lv_obj_class_init_obj(obj);
103 return obj;
104 }
105
lv_animimg_set_src(lv_obj_t * obj,const void * dsc[],size_t num)106 void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num)
107 {
108 LV_ASSERT_OBJ(obj, MY_CLASS);
109 lv_animimg_t * animimg = (lv_animimg_t *)obj;
110 animimg->dsc = dsc;
111 animimg->pic_count = num;
112 lv_anim_set_values(&animimg->anim, 0, (int32_t)num);
113 }
114
lv_animimg_start(lv_obj_t * obj)115 void lv_animimg_start(lv_obj_t * obj)
116 {
117 LV_ASSERT_OBJ(obj, MY_CLASS);
118 lv_animimg_t * animimg = (lv_animimg_t *)obj;
119 lv_anim_start(&animimg->anim);
120 }
121
122 /*=====================
123 * Setter functions
124 *====================*/
125
lv_animimg_set_duration(lv_obj_t * obj,uint32_t duration)126 void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration)
127 {
128 LV_ASSERT_OBJ(obj, MY_CLASS);
129 lv_animimg_t * animimg = (lv_animimg_t *)obj;
130 lv_anim_set_duration(&animimg->anim, duration);
131 lv_anim_set_reverse_delay(&animimg->anim, duration);
132 }
133
lv_animimg_set_repeat_count(lv_obj_t * obj,uint32_t count)134 void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count)
135 {
136 LV_ASSERT_OBJ(obj, MY_CLASS);
137 lv_animimg_t * animimg = (lv_animimg_t *)obj;
138 lv_anim_set_repeat_count(&animimg->anim, count);
139 }
140
141 /*=====================
142 * Getter functions
143 *====================*/
144
lv_animimg_get_src(lv_obj_t * obj)145 const void ** lv_animimg_get_src(lv_obj_t * obj)
146 {
147 LV_ASSERT_OBJ(obj, MY_CLASS);
148 lv_animimg_t * animimg = (lv_animimg_t *)obj;
149 return animimg->dsc;
150 }
151
lv_animimg_get_src_count(lv_obj_t * obj)152 uint8_t lv_animimg_get_src_count(lv_obj_t * obj)
153 {
154 LV_ASSERT_OBJ(obj, MY_CLASS);
155 lv_animimg_t * animimg = (lv_animimg_t *)obj;
156 return animimg->pic_count;
157 }
158
lv_animimg_get_duration(lv_obj_t * obj)159 uint32_t lv_animimg_get_duration(lv_obj_t * obj)
160 {
161 LV_ASSERT_OBJ(obj, MY_CLASS);
162 lv_animimg_t * animimg = (lv_animimg_t *)obj;
163 return lv_anim_get_time(&animimg->anim);
164 }
165
lv_animimg_get_repeat_count(lv_obj_t * obj)166 uint32_t lv_animimg_get_repeat_count(lv_obj_t * obj)
167 {
168 LV_ASSERT_OBJ(obj, MY_CLASS);
169 lv_animimg_t * animimg = (lv_animimg_t *)obj;
170 return lv_anim_get_repeat_count(&animimg->anim);
171 }
172
lv_animimg_get_anim(lv_obj_t * obj)173 lv_anim_t * lv_animimg_get_anim(lv_obj_t * obj)
174 {
175 LV_ASSERT_OBJ(obj, MY_CLASS);
176 lv_animimg_t * animimg = (lv_animimg_t *)obj;
177 return &animimg->anim;
178 }
179
180 /**********************
181 * STATIC FUNCTIONS
182 **********************/
183
lv_animimg_constructor(const lv_obj_class_t * class_p,lv_obj_t * obj)184 static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
185 {
186 LV_TRACE_OBJ_CREATE("begin");
187
188 LV_UNUSED(class_p);
189 lv_animimg_t * animimg = (lv_animimg_t *)obj;
190
191 animimg->dsc = NULL;
192 animimg->pic_count = -1;
193
194 /*initial animation*/
195 lv_anim_init(&animimg->anim);
196 lv_anim_set_var(&animimg->anim, obj);
197 lv_anim_set_duration(&animimg->anim, 30);
198 lv_anim_set_exec_cb(&animimg->anim, (lv_anim_exec_xcb_t)index_change);
199 lv_anim_set_values(&animimg->anim, 0, 1);
200 lv_anim_set_repeat_count(&animimg->anim, LV_ANIM_REPEAT_INFINITE);
201 }
202
index_change(lv_obj_t * obj,int32_t idx)203 static void index_change(lv_obj_t * obj, int32_t idx)
204 {
205 lv_animimg_t * animimg = (lv_animimg_t *)obj;
206
207 if(animimg->dsc == NULL) {
208 LV_LOG_WARN("dsc is null");
209 return;
210 }
211
212 if(idx >= animimg->pic_count) idx = animimg->pic_count - 1;
213
214 lv_image_set_src(obj, animimg->dsc[idx]);
215 }
216
217 #endif
218