evas: split software backend use of ector surface in an attempt to fix windows build.

This commit is contained in:
Cedric BAIL 2015-04-14 21:26:17 +02:00
parent a51eceaf6d
commit 2260b9e328
3 changed files with 107 additions and 98 deletions

View File

@ -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)

View File

@ -0,0 +1,104 @@
#ifdef HAVE_CONFIG_H
#include "config.h" /* so that EAPI in Evas.h is correctly defined */
#endif
#include <Ector.h>
#include <cairo/Ector_Cairo.h>
#include <software/Ector_Software.h>
#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"

View File

@ -5,6 +5,8 @@
#include "evas_cs2_private.h"
#endif
#include <software/Ector_Software.h>
#ifdef HAVE_DLSYM
# include <dlfcn.h> /* 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"