forked from achimdoebler/UGUI
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathugui_image.c
135 lines (109 loc) · 3.72 KB
/
ugui_image.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "ugui_image.h"
/* -------------------------------------------------------------------------------- */
/* -- IMAGE FUNCTIONS -- */
/* -------------------------------------------------------------------------------- */
/* Static functions */
static void _UG_ImageUpdate(UG_WINDOW* wnd, UG_OBJECT* obj);
UG_RESULT UG_ImageCreate( UG_WINDOW* wnd, UG_IMAGE* img, UG_U8 id, UG_S16 xs, UG_S16 ys, UG_S16 xe, UG_S16 ye )
{
UG_OBJECT* obj;
obj = _UG_GetFreeObject( wnd );
if ( obj == NULL ) return UG_RESULT_FAIL;
/* Initialize object-specific parameters */
img->img = NULL;
img->type = IMG_TYPE_BMP;
/* Initialize standard object parameters */
obj->update = _UG_ImageUpdate;
#ifdef UGUI_USE_TOUCH
obj->touch_state = OBJ_TOUCH_STATE_INIT;
#endif
obj->type = OBJ_TYPE_IMAGE;
obj->event = OBJ_EVENT_NONE;
obj->a_rel.xs = xs;
obj->a_rel.ys = ys;
obj->a_rel.xe = xe;
obj->a_rel.ye = ye;
obj->a_abs.xs = -1;
obj->a_abs.ys = -1;
obj->a_abs.xe = -1;
obj->a_abs.ye = -1;
obj->id = id;
obj->state |= OBJ_STATE_VISIBLE | OBJ_STATE_REDRAW | OBJ_STATE_VALID;
obj->data = (void*)img;
/* Update function: Do your thing! */
obj->state &= ~OBJ_STATE_FREE;
return UG_RESULT_OK;
}
UG_RESULT UG_ImageDelete( UG_WINDOW* wnd, UG_U8 id )
{
return _UG_DeleteObject( wnd, OBJ_TYPE_IMAGE, id );
}
UG_RESULT UG_ImageShow( UG_WINDOW* wnd, UG_U8 id )
{
UG_OBJECT* obj=NULL;
obj = _UG_SearchObject( wnd, OBJ_TYPE_IMAGE, id );
if ( obj == NULL ) return UG_RESULT_FAIL;
obj->state |= OBJ_STATE_VISIBLE;
obj->state |= OBJ_STATE_UPDATE | OBJ_STATE_REDRAW;
return UG_RESULT_OK;
}
UG_RESULT UG_ImageHide( UG_WINDOW* wnd, UG_U8 id )
{
UG_OBJECT* obj=NULL;
obj = _UG_SearchObject( wnd, OBJ_TYPE_IMAGE, id );
if ( obj == NULL ) return UG_RESULT_FAIL;
obj->state &= ~OBJ_STATE_VISIBLE;
obj->state |= OBJ_STATE_UPDATE;
return UG_RESULT_OK;
}
UG_RESULT UG_ImageSetBMP( UG_WINDOW* wnd, UG_U8 id, const UG_BMP* bmp )
{
UG_OBJECT* obj=NULL;
UG_IMAGE* img=NULL;
obj = _UG_SearchObject( wnd, OBJ_TYPE_IMAGE, id );
if ( obj == NULL ) return UG_RESULT_FAIL;
img = (UG_IMAGE*)(obj->data);
img->img = (void*)bmp;
img->type = IMG_TYPE_BMP;
obj->state |= OBJ_STATE_UPDATE | OBJ_STATE_REDRAW;
return UG_RESULT_OK;
}
static void _UG_ImageUpdate(UG_WINDOW* wnd, UG_OBJECT* obj)
{
UG_IMAGE* img;
UG_AREA a;
/* Get object-specific data */
img = (UG_IMAGE*)(obj->data);
/* -------------------------------------------------- */
/* Object update section */
/* -------------------------------------------------- */
if ( obj->state & OBJ_STATE_UPDATE )
{
if ( obj->state & OBJ_STATE_VISIBLE )
{
/* Full redraw necessary? */
if ( obj->state & OBJ_STATE_REDRAW )
{
UG_WindowGetArea(wnd,&a);
/* ToDo: more/better image features */
obj->a_abs.xs = obj->a_rel.xs + a.xs;
obj->a_abs.ys = obj->a_rel.ys + a.ys;
obj->a_abs.xe = obj->a_rel.xs + ((UG_BMP*)img->img)->width + a.xs;
obj->a_abs.ye = obj->a_rel.ys + ((UG_BMP*)img->img)->height + a.ys;
if ( obj->a_abs.ye > wnd->ye ) return;
if ( obj->a_abs.xe > wnd->xe ) return;
/* Draw Image */
if ( (img->img != NULL) && (img->type & IMG_TYPE_BMP) )
{
UG_DrawBMP(obj->a_abs.xs,obj->a_abs.ys,(UG_BMP*)img->img);
}
obj->state &= ~OBJ_STATE_REDRAW;
}
}
else
{
UG_FillFrame(obj->a_abs.xs, obj->a_abs.ys, obj->a_abs.xe, obj->a_abs.ye, wnd->bc);
}
obj->state &= ~OBJ_STATE_UPDATE;
}
}