From 2260b9e328eb46fe028d46efd06f15d7dd7b15dd Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 14 Apr 2015 21:26:17 +0200 Subject: [PATCH] evas: split software backend use of ector surface in an attempt to fix windows build. --- src/Makefile_Evas.am | 2 +- .../evas/engines/software_generic/ector_surface.c | 104 +++++++++++++++++++++ .../evas/engines/software_generic/evas_engine.c | 99 +------------------- 3 files changed, 107 insertions(+), 98 deletions(-) create mode 100644 src/modules/evas/engines/software_generic/ector_surface.c diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index ca5bf93..620e02f 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -529,7 +529,7 @@ if EVAS_STATIC_BUILD_SOFTWARE_GENERIC BUILT_SOURCES += \ modules/evas/engines/software_generic/ector_cairo_software_surface.eo.c \ modules/evas/engines/software_generic/ector_cairo_software_surface.eo.h -lib_evas_libevas_la_SOURCES += modules/evas/engines/software_generic/evas_engine.c modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h +lib_evas_libevas_la_SOURCES += modules/evas/engines/software_generic/evas_engine.c modules/evas/engines/software_generic/ector_surface.c modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h lib_evas_libevas_la_LIBADD += else enginesoftwaregenericpkgdir = $(libdir)/evas/modules/engines/software_generic/$(MODULE_ARCH) diff --git a/src/modules/evas/engines/software_generic/ector_surface.c b/src/modules/evas/engines/software_generic/ector_surface.c new file mode 100644 index 0000000..17edc95 --- /dev/null +++ b/src/modules/evas/engines/software_generic/ector_surface.c @@ -0,0 +1,104 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" /* so that EAPI in Evas.h is correctly defined */ +#endif + +#include + +#include +#include + +#include "ector_cairo_software_surface.eo.h" + +#define USE(Obj, Sym, Error) \ + if (!Sym) Sym = _ector_cairo_symbol_get(Obj, #Sym); \ + if (!Sym) return Error; + +static inline void * +_ector_cairo_symbol_get(Eo *ector_surface, const char *name) +{ + void *sym; + + eo_do(ector_surface, + sym = ector_cairo_surface_symbol_get(name)); + return sym; +} + +typedef struct _cairo_surface_t cairo_surface_t; +typedef enum { + CAIRO_FORMAT_INVALID = -1, + CAIRO_FORMAT_ARGB32 = 0, + CAIRO_FORMAT_RGB24 = 1, + CAIRO_FORMAT_A8 = 2, + CAIRO_FORMAT_A1 = 3, + CAIRO_FORMAT_RGB16_565 = 4, + CAIRO_FORMAT_RGB30 = 5 +} cairo_format_t; + +static cairo_surface_t *(*cairo_image_surface_create_for_data)(unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride) = NULL; +static void (*cairo_surface_destroy)(cairo_surface_t *surface) = NULL; +static cairo_t *(*cairo_create)(cairo_surface_t *target) = NULL; +static void (*cairo_destroy)(cairo_t *cr) = NULL; + +typedef struct _Ector_Cairo_Software_Surface_Data Ector_Cairo_Software_Surface_Data; +struct _Ector_Cairo_Software_Surface_Data +{ + cairo_surface_t *surface; + cairo_t *ctx; + + void *pixels; + + unsigned int width; + unsigned int height; +}; + +void +_ector_cairo_software_surface_surface_set(Eo *obj, Ector_Cairo_Software_Surface_Data *pd, void *pixels, unsigned int width, unsigned int height) +{ + USE(obj, cairo_image_surface_create_for_data, ); + USE(obj, cairo_surface_destroy, ); + USE(obj, cairo_create, ); + USE(obj, cairo_destroy, ); + + if (pd->surface) cairo_surface_destroy(pd->surface); pd->surface = NULL; + if (pd->ctx) cairo_destroy(pd->ctx); pd->ctx = NULL; + + pd->pixels = NULL; + pd->width = 0; + pd->height = 0; + + if (pixels) + { + pd->surface = cairo_image_surface_create_for_data(pixels, + CAIRO_FORMAT_ARGB32, + width, height, width * sizeof (int)); + if (!pd->surface) goto end; + + pd->ctx = cairo_create(pd->surface); + if (!pd->ctx) goto end; + } + + pd->pixels = pixels; + pd->width = width; + pd->height = height; + + end: + evas_common_cpu_end_opt(); + + eo_do(obj, + ector_cairo_surface_context_set(pd->ctx), + ector_surface_size_set(pd->width, pd->height)); +} + +void +_ector_cairo_software_surface_surface_get(Eo *obj EINA_UNUSED, Ector_Cairo_Software_Surface_Data *pd, void **pixels, unsigned int *width, unsigned int *height) +{ + if (pixels) *pixels = pd->pixels; + if (width) *width = pd->width; + if (height) *height = pd->height; +} + +#include "ector_cairo_software_surface.eo.c" diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index a5faae3..af26cb6 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -5,6 +5,8 @@ #include "evas_cs2_private.h" #endif +#include + #ifdef HAVE_DLSYM # include /* dlopen,dlclose,etc */ @@ -18,9 +20,6 @@ #include "Evas_Engine_Software_Generic.h" -#include "cairo/Ector_Cairo.h" -#include "software/Ector_Software.h" - #include "ector_cairo_software_surface.eo.h" #ifdef EVAS_GL @@ -4996,97 +4995,3 @@ void evas_engine_software_generic_shutdown(void) #ifndef EVAS_STATIC_BUILD_SOFTWARE_GENERIC EVAS_EINA_MODULE_DEFINE(engine, software_generic); #endif - -#define USE(Obj, Sym, Error) \ - if (!Sym) Sym = _ector_cairo_symbol_get(Obj, #Sym); \ - if (!Sym) return Error; - -static inline void * -_ector_cairo_symbol_get(Eo *ector_surface, const char *name) -{ - void *sym; - - eo_do(ector_surface, - sym = ector_cairo_surface_symbol_get(name)); - return sym; -} - -typedef struct _cairo_surface_t cairo_surface_t; -typedef enum { - CAIRO_FORMAT_INVALID = -1, - CAIRO_FORMAT_ARGB32 = 0, - CAIRO_FORMAT_RGB24 = 1, - CAIRO_FORMAT_A8 = 2, - CAIRO_FORMAT_A1 = 3, - CAIRO_FORMAT_RGB16_565 = 4, - CAIRO_FORMAT_RGB30 = 5 -} cairo_format_t; - -static cairo_surface_t *(*cairo_image_surface_create_for_data)(unsigned char *data, - cairo_format_t format, - int width, - int height, - int stride) = NULL; -static void (*cairo_surface_destroy)(cairo_surface_t *surface) = NULL; -static cairo_t *(*cairo_create)(cairo_surface_t *target) = NULL; -static void (*cairo_destroy)(cairo_t *cr) = NULL; - -typedef struct _Ector_Cairo_Software_Surface_Data Ector_Cairo_Software_Surface_Data; -struct _Ector_Cairo_Software_Surface_Data -{ - cairo_surface_t *surface; - cairo_t *ctx; - - void *pixels; - - unsigned int width; - unsigned int height; -}; - -void -_ector_cairo_software_surface_surface_set(Eo *obj, Ector_Cairo_Software_Surface_Data *pd, void *pixels, unsigned int width, unsigned int height) -{ - USE(obj, cairo_image_surface_create_for_data, ); - USE(obj, cairo_surface_destroy, ); - USE(obj, cairo_create, ); - USE(obj, cairo_destroy, ); - - if (pd->surface) cairo_surface_destroy(pd->surface); pd->surface = NULL; - if (pd->ctx) cairo_destroy(pd->ctx); pd->ctx = NULL; - - pd->pixels = NULL; - pd->width = 0; - pd->height = 0; - - if (pixels) - { - pd->surface = cairo_image_surface_create_for_data(pixels, - CAIRO_FORMAT_ARGB32, - width, height, width * sizeof (int)); - if (!pd->surface) goto end; - - pd->ctx = cairo_create(pd->surface); - if (!pd->ctx) goto end; - } - - pd->pixels = pixels; - pd->width = width; - pd->height = height; - - end: - evas_common_cpu_end_opt(); - - eo_do(obj, - ector_cairo_surface_context_set(pd->ctx), - ector_surface_size_set(pd->width, pd->height)); -} - -void -_ector_cairo_software_surface_surface_get(Eo *obj EINA_UNUSED, Ector_Cairo_Software_Surface_Data *pd, void **pixels, unsigned int *width, unsigned int *height) -{ - if (pixels) *pixels = pd->pixels; - if (width) *width = pd->width; - if (height) *height = pd->height; -} - -#include "ector_cairo_software_surface.eo.c" -- 2.7.4