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