forked from enlightenment/efl
evas: and now fix Evas GL backend to display Evas_Object_VG correctly.
This commit is contained in:
parent
e4b5167861
commit
f8cd006b2f
|
@ -22,6 +22,7 @@
|
|||
#endif
|
||||
|
||||
#include "cairo/Ector_Cairo.h"
|
||||
#include "software/Ector_Software.h"
|
||||
|
||||
#include "ector_cairo_software_surface.eo.h"
|
||||
|
||||
|
@ -2092,13 +2093,26 @@ eng_texture_image_set(void *data EINA_UNUSED, void *texture, void *image)
|
|||
}
|
||||
|
||||
static Ector_Surface *_software_ector = NULL;
|
||||
static Eina_Bool use_cairo;
|
||||
|
||||
static Ector_Surface *
|
||||
eng_ector_get(void *data EINA_UNUSED)
|
||||
{
|
||||
if (!_software_ector)
|
||||
{
|
||||
const char *ector_backend;
|
||||
|
||||
ector_backend = getenv("ECTOR_BACKEND");
|
||||
if (ector_backend && !strcasecmp(ector_backend, "freetype"))
|
||||
{
|
||||
_software_ector = eo_add(ECTOR_SOFTWARE_SURFACE_CLASS, NULL);
|
||||
use_cairo = EINA_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
_software_ector = eo_add(ECTOR_CAIRO_SOFTWARE_SURFACE_CLASS, NULL);
|
||||
use_cairo = EINA_TRUE;
|
||||
}
|
||||
}
|
||||
return _software_ector;
|
||||
}
|
||||
|
@ -2118,16 +2132,18 @@ _evas_render_op_to_ector_rop(Evas_Render_Op op)
|
|||
}
|
||||
|
||||
static void
|
||||
eng_ector_renderer_draw(void *data EINA_UNUSED, void *context, void *surface, Ector_Renderer *renderer, Eina_Array *clips, int x, int y, Eina_Bool do_async EINA_UNUSED)
|
||||
eng_ector_renderer_draw(void *data, void *context EINA_UNUSED, void *surface, Ector_Renderer *renderer, Eina_Array *clips, int x, int y, Eina_Bool do_async EINA_UNUSED)
|
||||
{
|
||||
Evas_GL_Image *dst = surface;
|
||||
Evas_Engine_GL_Context *gc = context;
|
||||
Evas_Engine_GL_Context *gc;
|
||||
Render_Engine_GL_Generic *re = data;
|
||||
Eina_Rectangle *r;
|
||||
Eina_Array *c;
|
||||
Eina_Rectangle clip;
|
||||
Eina_Array_Iterator it;
|
||||
unsigned int i;
|
||||
|
||||
gc = re->window_gl_context_get(re->software.ob);
|
||||
if (gc->dc->clip.use)
|
||||
{
|
||||
clip.x = gc->dc->clip.x;
|
||||
|
@ -2185,35 +2201,62 @@ static void *software_buffer = NULL;
|
|||
static void
|
||||
eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, void *surface, Eina_Bool do_async EINA_UNUSED)
|
||||
{
|
||||
Evas_GL_Image *dst = surface;
|
||||
Evas_Engine_GL_Context *gl_context;
|
||||
Render_Engine_GL_Generic *re = data;
|
||||
int w, h;
|
||||
|
||||
software_buffer = realloc(software_buffer, sizeof (unsigned int) * dst->w * dst->h);
|
||||
re->window_use(re->software.ob);
|
||||
gl_context = re->window_gl_context_get(re->software.ob);
|
||||
evas_gl_common_context_target_surface_set(gl_context, surface);
|
||||
gl_context->dc = context;
|
||||
|
||||
w = gl_context->w; h = gl_context->h;
|
||||
|
||||
software_buffer = realloc(software_buffer, sizeof (unsigned int) * w * h);
|
||||
if (use_cairo)
|
||||
{
|
||||
eo_do(_software_ector,
|
||||
ector_cairo_software_surface_set(software_buffer, dst->w, dst->h));
|
||||
ector_cairo_software_surface_set(software_buffer, w, h));
|
||||
}
|
||||
else
|
||||
{
|
||||
eo_do(_software_ector,
|
||||
ector_software_surface_set(software_buffer, w, h));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eng_ector_end(void *data, void *context, void *surface, Eina_Bool do_async)
|
||||
eng_ector_end(void *data, void *context EINA_UNUSED, void *surface EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
|
||||
{
|
||||
Evas_GL_Image *dst = surface;
|
||||
Evas_Engine_GL_Context *gl_context;
|
||||
Render_Engine_GL_Generic *re = data;
|
||||
Evas_GL_Image *im;
|
||||
int w, h;
|
||||
|
||||
gl_context = re->window_gl_context_get(re->software.ob);
|
||||
w = gl_context->w; h = gl_context->h;
|
||||
|
||||
if (use_cairo)
|
||||
{
|
||||
eo_do(_software_ector,
|
||||
ector_cairo_software_surface_set(NULL, 0, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
eo_do(_software_ector,
|
||||
ector_software_surface_set(NULL, 0, 0));
|
||||
}
|
||||
|
||||
im = evas_gl_common_image_new_from_data(context, dst->w, dst->h, software_buffer, 1, EVAS_COLORSPACE_ARGB8888);
|
||||
eng_image_draw(data, context, surface, im,
|
||||
im = evas_gl_common_image_new_from_copied_data(gl_context, w, h, software_buffer, 1, EVAS_COLORSPACE_ARGB8888);
|
||||
// We actually just bluntly push the pixel all over the
|
||||
// destination surface. We don't have the actual information
|
||||
// of the widget size. This is not a problem.
|
||||
// Later on, we don't want that information and today when
|
||||
// using GL backend, you just need to turn on Evas_Map on
|
||||
// the Evas_Object_VG.
|
||||
0, 0, dst->w, dst->h,
|
||||
0, 0, dst->w, dst->h, 0, do_async);
|
||||
evas_gl_common_image_draw(gl_context, im, 0, 0, w, h, 0, 0, w, h, 0);
|
||||
|
||||
evas_common_rgba_image_free(software_buffer);
|
||||
software_buffer = NULL;
|
||||
evas_gl_common_image_free(im);
|
||||
}
|
||||
|
||||
static Evas_Func func, pfunc;
|
||||
|
|
Loading…
Reference in New Issue