2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <unistd.h> /* access */
22 #include <Ecore_Evas.h>
24 #include <livebox-errno.h>
29 #include "buffer_handler.h"
37 struct buffer_info *buffer;
40 HAPI int fb_init(void)
42 return LB_STATUS_SUCCESS;
45 HAPI int fb_fini(void)
47 return LB_STATUS_SUCCESS;
50 static void *alloc_fb(void *data, int size)
52 struct fb_info *info = data;
54 DbgPrint("FB size: %d\n", size);
56 if (buffer_handler_load(info->buffer) < 0) {
57 ErrPrint("Failed to load buffer handler\n");
61 return buffer_handler_fb(info->buffer);
64 static void free_fb(void *data, void *ptr)
66 struct fb_info *info = data;
69 ErrPrint("Buffer is not valid (maybe already released)\n");
73 if (buffer_handler_fb(info->buffer) != ptr)
74 ErrPrint("Buffer pointer is not matched\n");
76 (void)buffer_handler_unload(info->buffer);
79 HAPI struct fb_info *fb_create(struct inst_info *inst, int w, int h, enum buffer_type type)
83 info = calloc(1, sizeof(*info));
85 ErrPrint("Heap: %s\n", strerror(errno));
89 info->buffer = buffer_handler_create(inst, type, w, h, sizeof(int));
91 ErrPrint("Failed to create a buffer\n");
100 static void sw_render_pre_cb(void *data, Evas *e, void *event_info)
102 struct fb_info *info = data;
106 buffer_handler_get_size(info->buffer, &w, &h);
107 evas_damage_rectangle_add(e, 0, 0, w, h);
110 static void sw_render_post_cb(void *data, Evas *e, void *event_info)
113 Ecore_Evas *internal_ee;
116 internal_ee = ecore_evas_ecore_evas_get(e);
118 ErrPrint("Failed to get ecore evas\n");
122 // Get a pointer of a buffer of the virtual canvas
123 canvas = (void*)ecore_evas_buffer_pixels_get(internal_ee);
125 ErrPrint("Failed to get pixel canvas\n");
129 ecore_evas_geometry_get(internal_ee, &x, &y, &w, &h);
130 evas_data_argb_unpremul(canvas, w * h);
133 static void render_pre_cb(void *data, Evas *e, void *event_info)
135 fb_pixmap_render_pre(data);
136 sw_render_pre_cb(data, e, event_info);
139 static void render_post_cb(void *data, Evas *e, void *event_info)
141 sw_render_post_cb(data, e, event_info);
142 fb_pixmap_render_post(data);
145 HAPI int fb_create_buffer(struct fb_info *info)
151 buffer_handler_get_size(info->buffer, &ow, &oh);
152 DbgPrint("Buffer handler size: %dx%d\n", ow, oh);
153 if (ow == 0 && oh == 0) {
154 DbgPrint("ZERO Size FB accessed\n");
155 return LB_STATUS_SUCCESS;
162 ecore_evas_geometry_get(info->ee, NULL, NULL, &w, &h);
163 if (w != ow || h != oh) {
164 ErrPrint("EE exists, size mismatched requested (%dx%d) but (%dx%d)\n", ow, oh, w, h);
165 ecore_evas_resize(info->ee, ow, oh);
168 return LB_STATUS_SUCCESS;
171 info->ee = ecore_evas_buffer_allocfunc_new(ow, oh, alloc_fb, free_fb, info);
173 ErrPrint("Failed to create a buffer\n");
174 return LB_STATUS_ERROR_FAULT;
177 e = ecore_evas_get(info->ee);
178 if (buffer_handler_type(info->buffer) == BUFFER_TYPE_PIXMAP) {
179 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, render_pre_cb, info);
180 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, render_post_cb, info);
184 * ecore_evas_alpha_set tries to access the canvas buffer.
185 * Without any render_pre/render_post callback.
187 fb_pixmap_render_pre(info);
188 ecore_evas_alpha_set(info->ee, EINA_TRUE);
189 fb_pixmap_render_post(info);
191 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_PRE, sw_render_pre_cb, info);
192 evas_event_callback_add(e, EVAS_CALLBACK_RENDER_POST, sw_render_post_cb, info);
193 ecore_evas_alpha_set(info->ee, EINA_TRUE);
196 return LB_STATUS_SUCCESS;
199 HAPI int fb_destroy_buffer(struct fb_info *info)
202 ErrPrint("EE is not exists (Maybe ZERO byte ee?)\n");
203 return LB_STATUS_ERROR_INVALID;
206 if (buffer_handler_type(info->buffer) == BUFFER_TYPE_PIXMAP) {
208 e = ecore_evas_get(info->ee);
210 evas_event_callback_del(e, EVAS_CALLBACK_RENDER_POST, render_post_cb);
211 evas_event_callback_del(e, EVAS_CALLBACK_RENDER_PRE, render_pre_cb);
215 ecore_evas_free(info->ee);
217 return LB_STATUS_SUCCESS;
220 HAPI int fb_destroy(struct fb_info *info)
222 fb_destroy_buffer(info);
224 return LB_STATUS_SUCCESS;
227 HAPI Ecore_Evas * const fb_canvas(struct fb_info *info)
232 HAPI const char *fb_id(struct fb_info *fb)
234 return fb ? buffer_handler_id(fb->buffer) : "";
237 HAPI int fb_resize(struct fb_info *info, int w, int h)
239 buffer_handler_update_size(info->buffer, w, h);
242 ecore_evas_resize(info->ee, w, h);
243 } else if (!info->ee && !info->buffer) {
245 * This object has no size at the initial time.
246 * Create a new buffer and use it
250 return LB_STATUS_SUCCESS;
253 HAPI int fb_get_size(struct fb_info *info, int *w, int *h)
255 return buffer_handler_get_size(info->buffer, w, h);
258 HAPI void fb_sync(struct fb_info *info)
260 buffer_handler_flush(info->buffer);
263 HAPI void *fb_pixmap_render_pre(struct fb_info *info)
266 canvas = buffer_handler_pixmap_acquire_buffer(info->buffer);
270 HAPI int fb_pixmap_render_post(struct fb_info *info)
276 * info->buffer == struct buffer_info
278 canvas = buffer_handler_pixmap_buffer(info->buffer);
279 return buffer_handler_pixmap_release_buffer(canvas);