e_blender: use ds_tizen_blender instead wtz-blender protocol
[platform/upstream/enlightenment.git] / src / bin / e_blender.c
1 #include "e_blender_intern.h"
2 #include "e_client_intern.h"
3 #include "e_comp_object_intern.h"
4
5 #include <libds-tizen/blender.h>
6
7 typedef struct _E_Blender E_Blender;
8 typedef struct _E_Blend E_Blend;
9
10 struct _E_Blender
11 {
12    struct ds_tizen_blender *tizen_blender;
13
14    struct wl_listener destroy_listener;
15    struct wl_listener new_blend_listener;
16 };
17
18 struct _E_Blend
19 {
20    struct ds_tizen_blend *tizen_blend;
21    struct wl_listener commit_listener;
22    struct wl_listener destroy_listener;
23
24    E_Client *ec;
25    E_Object_Delfn *ec_delfn;
26
27    uint32_t alpha;
28    enum ds_tizen_blend_equation equation;
29 };
30
31 static E_Blender *_blender = NULL;
32
33 static void _e_blend_ec_set(E_Blend *blend, E_Client *ec);
34
35 static void
36 _e_blend_free(E_Blend *blend)
37 {
38    ELOGF("E_BLENDER", "E_Blend:%p Free", blend->ec, blend);
39
40    if (blend->ec)
41      {
42         e_comp_object_render_op_set(blend->ec->frame, EVAS_RENDER_BLEND);
43         evas_object_color_set(blend->ec->frame, 255, 255, 255, 255);
44      }
45
46    _e_blend_ec_set(blend, NULL);
47
48    free(blend);
49 }
50
51 static void
52 _e_blend_cb_ds_tizen_blend_commit(struct wl_listener *listener, void *data)
53 {
54    E_Blend *blend;
55    struct ds_tizen_blend_state *state;
56    int a, r, g, b;
57
58    blend = container_of(listener, E_Blend, commit_listener);
59    if (!blend) return;
60    if (!blend->ec) return;
61
62    state = ds_tizen_blend_get_state(blend->tizen_blend);
63    if (!state) return;
64
65    blend->alpha = state->alpha;
66    blend->equation = state->equation;
67
68    if (!blend->ec->argb) return;
69
70    a = r = g = b = 255;
71    a = (int)((blend->alpha / (double)0xffffffff) * a);
72    evas_color_argb_premul(a, &r, &g, &b);
73
74    evas_object_color_set(blend->ec->frame, r, g, b, a);
75
76    if (blend->equation == DS_TIZEN_BLEND_EQUATION_PREMULTIPLIED)
77      e_comp_object_render_op_set(blend->ec->frame, EVAS_RENDER_BLEND);
78    else if (blend->equation == DS_TIZEN_BLEND_EQUATION_NONE)
79      e_comp_object_render_op_set(blend->ec->frame, EVAS_RENDER_COPY);
80 }
81
82 static void
83 _e_blend_cb_ec_free(void *data, void *obj)
84 {
85    E_Blend *blend = data;
86
87    blend->ec_delfn = NULL;
88    _e_blend_ec_set(blend, NULL);
89 }
90
91 static void
92 _e_blend_ec_set(E_Blend *blend, E_Client *ec)
93 {
94    if (blend->ec == ec) return;
95
96    if (blend->ec)
97      {
98         if (blend->ec_delfn)
99           {
100              e_object_delfn_del(E_OBJECT(blend->ec), blend->ec_delfn);
101              blend->ec_delfn = NULL;
102           }
103
104         blend->ec = NULL;
105      }
106
107    if (ec)
108      {
109         blend->ec_delfn = e_object_delfn_add(E_OBJECT(ec),
110                                             _e_blend_cb_ec_free,
111                                             blend);
112         blend->ec = ec;
113      }
114 }
115
116 static void
117 _e_blend_cb_ds_tizen_blend_destroy(struct wl_listener *listener, void *data)
118 {
119    E_Blend *blend;
120
121    blend = wl_container_of(listener, blend, destroy_listener);
122    if (!blend) return;
123
124    _e_blend_free(blend);
125 }
126
127 static void
128 _e_blender_cb_new_blend(struct wl_listener *listener, void *data)
129 {
130    E_Blender *blender = _blender;
131    struct ds_tizen_blend *tizen_blend = data;
132    E_Blend *blend;
133    struct ds_surface *surface;
134    struct wl_resource *surface_resource;
135    E_Client *ec;
136
137    if (!blender)
138      {
139         ERR("blend is not initialized");
140         return;
141      }
142
143    surface = ds_tizen_blend_get_surface(tizen_blend);
144    EINA_SAFETY_ON_NULL_RETURN(surface);
145
146    surface_resource = ds_surface_get_wl_resource(surface);
147    EINA_SAFETY_ON_NULL_RETURN(surface_resource);
148
149    ec = e_client_from_surface_resource(surface_resource);
150    EINA_SAFETY_ON_NULL_RETURN(surface_resource);
151
152    blend = E_NEW(E_Blend, 1);
153    EINA_SAFETY_ON_NULL_RETURN(blend);
154
155    blend->destroy_listener.notify = _e_blend_cb_ds_tizen_blend_destroy;
156    ds_tizen_blend_add_destroy_listener(tizen_blend, &blend->destroy_listener);
157
158    blend->commit_listener.notify = _e_blend_cb_ds_tizen_blend_commit;
159    ds_tizen_blend_add_commit_listener(tizen_blend, &blend->commit_listener);
160
161    blend->tizen_blend = tizen_blend;
162
163    _e_blend_ec_set(blend, ec);
164
165    ELOGF("E_BLENDER", "E_Blend:%p Create", ec, blend);
166
167    return;
168 }
169
170 static void
171 _e_blender_cb_destroy(struct wl_listener *listener, void *data)
172 {
173    E_Blender *blender;
174
175    blender = container_of(listener, E_Blender, destroy_listener);
176
177    free(blender);
178
179    _blender = NULL;
180 }
181
182 EINTERN Eina_Bool
183 e_blender_init(void)
184 {
185    E_Blender *blender;
186
187    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE);
188    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->wl.disp, EINA_FALSE);
189
190    if (_blender) return EINA_TRUE;
191
192    blender = E_NEW(E_Blender, 1);
193    EINA_SAFETY_ON_NULL_RETURN_VAL(blender, EINA_FALSE);
194
195    blender->tizen_blender = ds_tizen_blender_create(e_comp_wl->wl.disp);
196    EINA_SAFETY_ON_NULL_GOTO(blender, fail);
197
198    blender->destroy_listener.notify = _e_blender_cb_destroy;
199    ds_tizen_blender_add_destroy_listener(blender->tizen_blender,
200                                          &blender->destroy_listener);
201
202    blender->new_blend_listener.notify = _e_blender_cb_new_blend;
203    ds_tizen_blender_add_new_blend_listener(blender->tizen_blender,
204                                           &blender->new_blend_listener);
205
206    _blender = blender;
207
208    return EINA_TRUE;
209
210 fail:
211    free(blender);
212
213    return EINA_FALSE;
214 }