memory buffer engine... not doing everything. api may change... working on it.

SVN revision: 6808
This commit is contained in:
Carsten Haitzler 2003-04-02 04:28:27 +00:00
parent 733ffbfc5d
commit bbfaab2ac1
15 changed files with 1429 additions and 9 deletions

View File

@ -12,6 +12,7 @@
#undef BUILD_ENGINE_SOFTWARE_X11
#undef BUILD_ENGINE_DIRECTFB
#undef BUILD_ENGINE_FB
#undef BUILD_ENGINE_BUFFER
#undef BUILD_ENGINE_SOFTWARE_WIN32_GDI
#undef BUILD_ENGINE_SOFTWARE_QTOPIA
#undef BUILD_ENGINE_GL_COMMON

View File

@ -171,6 +171,20 @@ AC_ARG_ENABLE(fb, [ --enable-fb enable the FB rendering bac
]
)
AC_MSG_CHECKING(whether buffer backend is to be built)
AC_ARG_ENABLE(fb, [ --enable-buffer enable the Buffer rendering backend], [
AC_MSG_RESULT(yes)
AM_CONDITIONAL(BUILD_ENGINE_BUFFER, true)
AC_DEFINE(BUILD_ENGINE_BUFFER)
ENGINE_BUFFER_PRG="evas_buffer_test"
], [
AC_MSG_RESULT(no)
AM_CONDITIONAL(BUILD_ENGINE_BUFFER, false)
ENGINE_BUFFER_PRG=""
]
)
AC_MSG_CHECKING(whether software qtopia backend is to be built)
AC_ARG_ENABLE(software-qtopia, [ --enable-software-qtopia enable the Software Qtopia rendering backend], [
@ -573,6 +587,7 @@ AC_SUBST(edb_libs)
AC_SUBST(ENGINE_SOFTWARE_X11_PRG)
AC_SUBST(ENGINE_DIRECTFB_PRG)
AC_SUBST(ENGINE_FB_PRG)
AC_SUBST(ENGINE_BUFFER_PRG)
AC_SUBST(ENGINE_SOFTWARE_QTOPIA_PRG)
AC_SUBST(ENGINE_GL_X11_PRG)
@ -589,6 +604,7 @@ src/lib/engines/Makefile
src/lib/engines/common/Makefile
src/lib/engines/software_x11/Makefile
src/lib/engines/fb/Makefile
src/lib/engines/buffer/Makefile
src/lib/engines/software_win32_gdi/Makefile
src/lib/engines/software_qtopia/Makefile
src/lib/engines/directfb/Makefile

View File

@ -8,6 +8,7 @@ bin_PROGRAMS = \
@ENGINE_SOFTWARE_X11_PRG@ \
@ENGINE_DIRECTFB_PRG@ \
@ENGINE_FB_PRG@ \
@ENGINE_BUFFER_PRG@ \
@ENGINE_SOFTWARE_QTOPIA_PRG@ \
@ENGINE_GL_X11_PRG@
@ -18,6 +19,7 @@ evas_software_x11_perf_load \
evas_directfb_test \
evas_directfb_window \
evas_fb_test \
evas_buffer_test \
evas_software_qtopia_test \
evas_gl_x11_test
@ -59,6 +61,12 @@ evas_fb_test_LDFLAGS = $(LDFLAGS)
evas_fb_test_CFLAGS = $(CFLAGS)
evas_fb_test_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
evas_buffer_test_SOURCES = evas_test_main.h evas_test_main.c evas_buffer_main.c
evas_buffer_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm
evas_buffer_test_LDFLAGS = $(LDFLAGS)
evas_buffer_test_CFLAGS = $(CFLAGS)
evas_buffer_test_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
if BUILD_ENGINE_SOFTWARE_QTOPIA
moc_evas_software_qtopia_main.cpp: evas_software_qtopia_main.h
@qt_moc@ evas_software_qtopia_main.h -o moc_evas_software_qtopia_main.cpp

View File

@ -0,0 +1,46 @@
#include "evas_test_main.h"
#include "Evas.h"
#include "Evas_Engine_Buffer.h"
#include <stdio.h>
#include <string.h>
int
main(int argc, char **argv)
{
int rot = 0;
unsigned char *img_buf = NULL;
if ((argc >= 3) && (!strcmp(argv[1], "-rot")))
rot = atoi(argv[2]);
evas = evas_new();
evas_output_method_set(evas, evas_render_method_lookup("buffer"));
evas_output_size_set(evas, win_w, win_h);
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
{
Evas_Engine_Info_Buffer *einfo;
einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(evas);
/* the following is specific to the engine */
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB24;
img_buf = malloc(win_w * win_h * 3);
einfo->info.dest_buffer = img_buf;
einfo->info.dest_buffer_row_bytes = win_w * 3;
einfo->info.use_color_key = 1;
einfo->info.alpha_threshold = 128;
einfo->info.color_key_r = 0xff;
einfo->info.color_key_g = 0x00;
einfo->info.color_key_b = 0xff;
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
}
setup();
orig_start_time = start_time = get_time();
for (;;)
{
loop();
evas_render(evas);
}
return 0;
}

View File

@ -0,0 +1,30 @@
#ifndef _EVAS_ENGINE_BUFFER_H
#define _EVAS_ENGINE_BUFFER_H
#define EVAS_ENGINE_BUFFER_DEPTH_RGBA32 0
#define EVAS_ENGINE_BUFFER_DEPTH_RGB24 1
typedef struct _Evas_Engine_Info_Buffer Evas_Engine_Info_Buffer;
struct _Evas_Engine_Info_Buffer
{
/* PRIVATE - don't mess with this baby or evas will poke its tongue out */
/* at you and make nasty noises */
Evas_Engine_Info magic;
struct {
int depth_type;
void *dest_buffer;
int dest_buffer_row_bytes;
char use_color_key : 1;
int alpha_threshold;
int color_key_r;
int color_key_g;
int color_key_b;
} info;
};
#endif

View File

@ -20,6 +20,7 @@ EXTRA_DIST = \
Evas_Engine_Software_X11.h \
Evas_Engine_DirectFB.h \
Evas_Engine_FB.h \
Evas_Engine_Buffer.h \
Evas_Engine_Software_Win32_GDI.h \
Evas_Engine_Software_Qtopia.h \
Evas_Engine_GL_X11.h
@ -48,6 +49,14 @@ ENGINE_FB =
ENGINE_FB_INC =
endif
if BUILD_ENGINE_BUFFER
ENGINE_BUFFER = engines/buffer/libevas_engine_buffer.la
ENGINE_BUFFER_INC = Evas_Engine_Buffer.h
else
ENGINE_BUFFER =
ENGINE_BUFFER_INC =
endif
if BUILD_ENGINE_SOFTWARE_QTOPIA
ENGINE_SOFTWARE_QTOPIA = engines/software_qtopia/libevas_engine_software_qtopia.la
ENGINE_SOFTWARE_QTOPIA_INC = Evas_Engine_Software_Qtopia.h
@ -69,6 +78,7 @@ Evas.h \
$(ENGINE_SOFTWARE_X11_INC) \
$(ENGINE_DIRECTFB_INC) \
$(ENGINE_FB_INC) \
$(ENGINE_BUFFER_INC) \
$(ENGINE_SOFTWARE_QTOPIA_INC) \
$(ENGINE_GL_X11_INC)
@ -85,6 +95,7 @@ libevas_la_LIBADD = $(LDFLAGS) \
$(ENGINE_SOFTWARE_X11) \
$(ENGINE_DIRECTFB) \
$(ENGINE_FB) \
$(ENGINE_BUFFER) \
$(ENGINE_SOFTWARE_QTOPIA) \
$(ENGINE_GL_X11)
@ -98,6 +109,7 @@ libevas_la_DEPENDENCIES = \
$(ENGINE_SOFTWARE_X11) \
$(ENGINE_DIRECTFB) \
$(ENGINE_FB) \
$(ENGINE_BUFFER) \
$(ENGINE_SOFTWARE_QTOPIA) \
$(ENGINE_GL_X11)

View File

@ -9,6 +9,9 @@
#ifdef BUILD_ENGINE_FB
#include "evas_engine_api_fb.h"
#endif
#ifdef BUILD_ENGINE_BUFFER
#include "evas_engine_api_buffer.h"
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
#include "evas_engine_api_software_win32_gdi.h"
#endif
@ -171,6 +174,11 @@ evas_output_method_set(Evas *e, int render_method)
e->engine.func = &evas_engine_fb_func;
else
#endif
#ifdef BUILD_ENGINE_BUFFER
if (e->output.render_method == RENDER_METHOD_BUFFER)
e->engine.func = &evas_engine_buffer_func;
else
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
if (e->output.render_method == RENDER_METHOD_SOFTWARE_WIN32_GDI)
e->engine.func = &evas_engine_software_win32_gdi_func;
@ -647,10 +655,13 @@ evas_render_method_lookup(const char *name)
if (!strcmp(name, "gl_x11")) return RENDER_METHOD_GL_X11;
#endif
#ifdef BUILD_ENGINE_DIRECTFB
if (!strcmp(name, "directfb")) return RENDER_METHOD_DIRECTFB;
if (!strcmp(name, "directfb")) return RENDER_METHOD_DIRECTFB;
#endif
#ifdef BUILD_ENGINE_FB
if (!strcmp(name, "fb")) return RENDER_METHOD_FB;
if (!strcmp(name, "fb")) return RENDER_METHOD_FB;
#endif
#ifdef BUILD_ENGINE_BUFFER
if (!strcmp(name, "buffer")) return RENDER_METHOD_BUFFER;
#endif
#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
if (!strcmp(name, "software_win32_gdi")) return RENDER_METHOD_SOFTWARE_WIN32_GDI;
@ -700,18 +711,21 @@ evas_render_method_list(void)
{
Evas_List *methods = NULL;
#ifdef BUILD_ENGINE_SOFTWARE_X11
#ifdef BUILD_ENGINE_SOFTWARE_X11
methods = evas_list_append(methods, strdup("software_x11"));
#endif
#ifdef BUILD_ENGINE_GL_X11
#ifdef BUILD_ENGINE_GL_X11
methods = evas_list_append(methods, strdup("gl_x11"));
#endif
#ifdef BUILD_ENGINE_DIRECTFB
#ifdef BUILD_ENGINE_DIRECTFB
methods = evas_list_append(methods, strdup("directfb"));
#endif
#ifdef BUILD_ENGINE_FB
#ifdef BUILD_ENGINE_FB
methods = evas_list_append(methods, strdup("fb"));
#endif
#ifdef BUILD_ENGINE_BUFFER
methods = evas_list_append(methods, strdup("buffer"));
#endif
#ifdef BBUILD_ENGINE_SOFTWARE_WIN32_GDI
methods = evas_list_append(methods, strdup("software_win32_gdi"));
#endif

View File

@ -4,6 +4,7 @@ SUBDIRS = \
common \
software_x11 \
fb \
buffer \
software_win32_gdi \
software_qtopia \
directfb \

View File

@ -0,0 +1,36 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = 1.4 foreign
# A list of all the files in the current directory which can be regenerated
MAINTAINERCLEANFILES = Makefile.in
LDFLAGS = -L/usr/local/lib
INCLUDES = @freetype_cflags@ \
-I. \
-I$(top_srcdir)/src/lib \
-I$(top_srcdir)/src/lib/include \
-I$(includedir) \
-I/usr/local/include
if BUILD_ENGINE_BUFFER
noinst_LTLIBRARIES = libevas_engine_buffer.la
libevas_engine_buffer_la_SOURCES = \
evas_engine.h \
evas_engine.c \
evas_outbuf.c
libevas_engine_buffer_la_LIBADD = \
$(LDFLAGS)
libevas_engine_buffer_la_DEPENDENCIES = \
$(top_builddir)/config.h
endif
EXTRA_DIST = \
evas_engine.h \
evas_engine.c \
evas_outbuf.c

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
#ifndef EVAS_ENGINE_H
#define EVAS_ENGINE_H
typedef struct _Outbuf Outbuf;
typedef enum _Outbuf_Depth Outbuf_Depth;
enum _Outbuf_Depth
{
OUTBUF_DEPTH_NONE,
OUTBUF_DEPTH_RGB_24BPP_888_888,
OUTBUF_DEPTH_RGB_32BPP_888_8888,
OUTBUF_DEPTH_LAST
};
struct _Outbuf
{
int w, h;
Outbuf_Depth depth;
void *dest;
int dest_row_bytes;
int alpha_level;
DATA32 color_key;
char use_color_key : 1;
};
/****/
void evas_buffer_outbuf_buf_init (void);
void evas_buffer_outbuf_buf_free (Outbuf *buf);
Outbuf *evas_buffer_outbuf_buf_setup_fb (int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level);
RGBA_Image *evas_buffer_outbuf_buf_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
void evas_buffer_outbuf_buf_free_region_for_update (Outbuf *buf, RGBA_Image *update);
void evas_buffer_outbuf_buf_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
#endif

View File

@ -0,0 +1,125 @@
#include "evas_common.h"
#include "evas_engine.h"
#include <sys/time.h>
#include <sys/utsname.h>
void
evas_buffer_outbuf_buf_init(void)
{
}
void
evas_buffer_outbuf_buf_free(Outbuf *buf)
{
free(buf);
}
Outbuf *
evas_buffer_outbuf_buf_setup_fb(int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level)
{
Outbuf *buf;
buf = calloc(1, sizeof(Outbuf));
if (!buf) return NULL;
buf->w = w;
buf->h = h;
buf->depth = depth;
buf->dest = dest;
buf->dest_row_bytes = dest_row_bytes;
buf->alpha_level = alpha_level;
buf->color_key = color_key;
buf->use_color_key = use_color_key;
return buf;
}
RGBA_Image *
evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
{
RGBA_Image *im;
*cx = 0; *cy = 0; *cw = w; *ch = h;
im = evas_common_image_create(w, h);
if (im)
{
im->flags |= RGBA_IMAGE_HAS_ALPHA;
memset(im->image->data, 0, w * h * sizeof(DATA32));
}
return im;
}
void
evas_buffer_outbuf_buf_free_region_for_update(Outbuf *buf, RGBA_Image *update)
{
evas_common_image_free(update);
}
void
evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
{
/* copy update image to out buf & convert */
switch (buf->depth)
{
case OUTBUF_DEPTH_RGB_24BPP_888_888:
/* copy & pack into 24bpp - if colorkey is enabled... etc. */
{
DATA8 thresh;
int xx, yy;
DATA32 colorkey;
DATA32 *src;
DATA8 *dst;
colorkey = buf->color_key;
thresh = buf->alpha_level;
if (buf->use_color_key)
{
for (yy = 0; yy < h; yy++)
{
dst = buf->dest + ((y + yy) * buf->dest_row_bytes);
src = update->image->data + (yy * update->image->w);
for (xx = 0; xx < w; xx++)
{
if (A_VAL(src) > thresh)
{
*dst++ = R_VAL(src);
*dst++ = G_VAL(src);
*dst++ = B_VAL(src);
}
else
{
*dst++ = R_VAL(&colorkey);
*dst++ = G_VAL(&colorkey);
*dst++ = B_VAL(&colorkey);
}
src++;
}
}
}
else
{
for (yy = 0; yy < h; yy++)
{
dst = buf->dest + ((y + yy) * buf->dest_row_bytes);
src = update->image->data + (yy * update->image->w);
for (xx = 0; xx < w; xx++)
{
*dst++ = R_VAL(src);
*dst++ = G_VAL(src);
*dst++ = B_VAL(src);
src++;
}
}
}
}
break;
case OUTBUF_DEPTH_RGB_32BPP_888_8888:
/* simple memcpy */
/* FIXME: write this */
break;
default:
break;
}
}

View File

@ -5,6 +5,7 @@ evas_common.h \
evas_engine_api_software_x11.h \
evas_engine_api_directfb.h \
evas_engine_api_fb.h \
evas_engine_api_buffer.h \
evas_engine_api_software_qtopia.h \
evas_engine_api_gl_x11.h \
evas_mmx.h \

View File

@ -0,0 +1,6 @@
#ifndef EVAS_ENGINE_BUFFER_H
#define EVAS_ENGINE_BUFFER_H
extern Evas_Func evas_engine_buffer_func;
#endif

View File

@ -10,9 +10,10 @@
#define RENDER_METHOD_SOFTWARE_X11 0x00000001
#define RENDER_METHOD_DIRECTFB 0x00000002
#define RENDER_METHOD_FB 0x00000003
#define RENDER_METHOD_SOFTWARE_WIN32_GDI 0x00000004
#define RENDER_METHOD_SOFTWARE_QTOPIA 0x00000005
#define RENDER_METHOD_GL_X11 0x00000006
#define RENDER_METHOD_BUFFER 0x00000004
#define RENDER_METHOD_SOFTWARE_WIN32_GDI 0x00000005
#define RENDER_METHOD_SOFTWARE_QTOPIA 0x00000006
#define RENDER_METHOD_GL_X11 0x00000007
#define RENDER_METHOD_INVALID 0x00000000