2 * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
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.
17 * @file RenderBuffer.cpp
18 * @author Yunchan Cho (yunchan.cho@samsung.com)
23 #include <Ecore_Evas.h>
25 #include <provider_buffer.h>
26 #include <Core/Util/Log.h>
27 #include "IRenderBuffer.h"
28 #include "RenderBuffer.h"
30 RenderBuffer::RenderBuffer()
36 RenderBuffer::~RenderBuffer()
40 bool RenderBuffer::allocate()
49 ecore_evas_buffer_allocfunc_new(
50 getWidth(), getHeight(),
51 allocateCallback, freeCallback,
53 LogD("Using %s engine!", ecore_evas_engine_name_get(ee));
56 LogD("invalid ecore evas object");
60 LogD("evas ecore setting");
62 // alpha_set function access the canvas buffer directly,
63 // without pre/post render callback.
64 provider_buffer_pre_render(m_bufferInfo);
65 ecore_evas_alpha_set(ee, EINA_TRUE);
66 provider_buffer_post_render(m_bufferInfo);
67 ecore_evas_manual_render_set(ee, EINA_FALSE);
69 // resize function will invoke the freeCallback and allocateCallback again. (internally)
70 ecore_evas_resize(ee, getWidth(), getHeight());
72 ecore_evas_activate(ee);
74 LogD("Using %s engine!", ecore_evas_engine_name_get(ee));
76 Evas* e = ecore_evas_get(ee);
77 Evas_Object *eo = evas_object_rectangle_add(e);
78 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
79 evas_object_color_set(eo, 0, 0, 0, 0);
80 evas_object_resize(eo, getWidth(), getHeight());
89 bool RenderBuffer::reallocate(int width, int height)
94 // TODO This function should be implemented due to box resize operation
98 Ecore_Evas* ee = ecore_evas_ecore_evas_get(m_canvas);
99 // resize function will invoke the freeCallback and allocateCallback again. (internally)
100 ecore_evas_resize(ee, getWidth(), getHeight());
101 evas_object_resize(m_win, getWidth(), getHeight());
106 bool RenderBuffer::free()
113 ecore_evas_free(ecore_evas_ecore_evas_get(m_canvas));
120 void RenderBuffer::startCanvasUpdate()
123 evas_event_callback_del(
125 EVAS_CALLBACK_RENDER_PRE,
128 evas_event_callback_del(
130 EVAS_CALLBACK_RENDER_POST,
133 evas_event_callback_add(
135 EVAS_CALLBACK_RENDER_PRE,
136 preRenderCallback, this);
138 evas_event_callback_add(
140 EVAS_CALLBACK_RENDER_POST,
141 postRenderCallback, this);
145 void RenderBuffer::stopCanvasUpdate()
148 evas_event_callback_del(
150 EVAS_CALLBACK_RENDER_PRE,
153 evas_event_callback_del(
155 EVAS_CALLBACK_RENDER_POST,
159 Evas_Object* RenderBuffer::getWindow()
164 void RenderBuffer::preRenderCallback(void* data, Evas* canvas, void *eventInfo)
167 RenderBuffer *buffer = static_cast<RenderBuffer*>(data);
168 if (!provider_buffer_pixmap_is_support_hw(buffer->m_bufferInfo)) {
169 LogD("not hw backend");
173 provider_buffer_pre_render(buffer->m_bufferInfo);
174 evas_damage_rectangle_add(canvas, 0, 0, buffer->getWidth(), buffer->getHeight());
177 void RenderBuffer::postRenderCallback(void* data, Evas* canvas, void* eventInfo)
180 RenderBuffer* buffer = static_cast<RenderBuffer*>(data);
182 evas_data_argb_unpremul(static_cast<unsigned int*>(buffer->m_bufferAddr), buffer->getWidth() * buffer->getHeight());
183 #ifdef RENDER_BUFFER_VERIFY_SHOT
188 snprintf(filename, sizeof(filename) - 1, "/tmp/render%d-%dx%d.raw", idx++, buffer->getWidth(), buffer->getHeight());
189 fp = fopen(filename, "w+");
191 LogD("RenderShot: %s(%d)\n", filename, buffer->getWidth() * buffer->getHeight() * sizeof(int));
192 fwrite(buffer->m_bufferAddr, buffer->getWidth() * buffer->getHeight() * sizeof(int), 1, fp);
195 LogD("Failed to open a file: %s", filename);
200 if (!provider_buffer_pixmap_is_support_hw(buffer->m_bufferInfo)) {
201 provider_buffer_sync(buffer->m_bufferInfo);
202 buffer->updateBuffer();
204 provider_buffer_post_render(buffer->m_bufferInfo);
205 buffer->updateBuffer();
209 void RenderBuffer::paintColor(unsigned int color)
213 if (!provider_buffer_pixmap_is_support_hw(m_bufferInfo)) {
214 memset(m_bufferAddr, color, getWidth() * getHeight() * 4);
215 provider_buffer_sync(m_bufferInfo);
218 provider_buffer_pre_render(m_bufferInfo);
219 memset(m_bufferAddr, color, getWidth() * getHeight() * 4);
220 provider_buffer_post_render(m_bufferInfo);
225 Evas* RenderBuffer::getCanvas()
230 void* RenderBuffer::allocateCallback(void* data, int size)
233 RenderBuffer* buffer = static_cast<RenderBuffer*>(data);
235 if (buffer->m_bufferInfo) {
236 freeCallback(data, NULL);
239 buffer->m_bufferInfo = buffer->acquireBuffer();
240 if (!buffer->m_bufferInfo) {
244 // set buffer address
245 if (!provider_buffer_pixmap_is_support_hw(buffer->m_bufferInfo)) {
246 LogD("s/w evas backend");
247 buffer->m_bufferAddr = provider_buffer_ref(buffer->m_bufferInfo);
249 LogD("h/w evas backend");
250 int ret = provider_buffer_pixmap_create_hw(buffer->m_bufferInfo);
252 LogD("can't create hw pixmap");
254 buffer->m_bufferAddr = provider_buffer_pixmap_hw_addr(buffer->m_bufferInfo);
257 LogD("success to allocate buffer");
258 return buffer->m_bufferAddr;
261 void RenderBuffer::freeCallback(void* data, void *pix)
264 RenderBuffer* buffer = static_cast<RenderBuffer*>(data);
267 if (!provider_buffer_pixmap_is_support_hw(buffer->m_bufferInfo)) {
268 provider_buffer_unref(buffer->m_bufferAddr);
270 provider_buffer_pixmap_destroy_hw(buffer->m_bufferInfo);
273 provider_buffer_release(buffer->m_bufferInfo);
275 buffer->m_bufferInfo = NULL;
276 buffer->m_bufferAddr = NULL;
278 LogD("success to free buffer");
282 Evas_Object *RenderBuffer::getSnapshot(void)
285 Evas_Object *snapshot;
288 snapshot = evas_object_image_add(m_canvas);
291 evas_object_image_data_set(snapshot, NULL);
292 evas_object_image_colorspace_set(snapshot, EVAS_COLORSPACE_ARGB8888);
293 evas_object_image_alpha_set(snapshot, EINA_TRUE);
294 evas_object_image_size_set(snapshot, getWidth(), getHeight());
296 tmpBuffer = malloc(getWidth() * getHeight() * sizeof(int));
298 memcpy(tmpBuffer, m_bufferAddr, getWidth() * getHeight() * sizeof(int));
299 evas_data_argb_premul(
300 static_cast<unsigned int*>(tmpBuffer),
301 getWidth() * getHeight());
302 evas_object_image_data_set(snapshot, tmpBuffer);
304 LogD("Failed to allocate heap");
307 evas_object_image_data_update_add(snapshot, 0, 0, getWidth(), getHeight());
308 evas_object_image_fill_set(snapshot, 0, 0, getWidth(), getHeight());
309 evas_object_resize(snapshot, getWidth(), getHeight());