# HG changeset patch # User Thinker K.F. Li # Date 1291804299 -28800 # Node ID 851a062368bdee1b8fde7ce87515c158da44ce64 # Parent 77596f3d8d0c7ff2f4213a6680cea0fa394411bb Change signature of mbe_win_surface_create() by using format argument diff -r 77596f3d8d0c -r 851a062368bd include/mb_graph_engine_cairo.h --- a/include/mb_graph_engine_cairo.h Tue Dec 07 12:42:41 2010 +0800 +++ b/include/mb_graph_engine_cairo.h Wed Dec 08 18:31:39 2010 +0800 @@ -26,7 +26,6 @@ #define mbe_image_surface_get_width cairo_image_surface_get_width #define mbe_image_surface_get_data cairo_image_surface_get_data #define mbe_scaled_font_reference cairo_scaled_font_reference -#define mbe_win_surface_create cairo_xlib_surface_create #define mbe_scaled_font_destroy cairo_scaled_font_destroy #define mbe_font_face_reference cairo_font_face_reference #define mbe_font_face_destroy cairo_font_face_destroy @@ -78,6 +77,12 @@ } +extern mbe_surface_t *mbe_win_surface_create(void *display, + void *drawable, + int fmt, + int width, + int height); + extern mbe_font_face_t * mbe_query_font_face(const char *family, int slant, int weight); extern void mbe_free_font_face(mbe_font_face_t *face); diff -r 77596f3d8d0c -r 851a062368bd include/mb_graph_engine_openvg.h --- a/include/mb_graph_engine_openvg.h Tue Dec 07 12:42:41 2010 +0800 +++ b/include/mb_graph_engine_openvg.h Wed Dec 08 18:31:39 2010 +0800 @@ -207,9 +207,12 @@ #include #include -extern mbe_surface_t *mbe_win_surface_create(Display *display, - Drawable drawable, - Visual *visual, +/* + * TODO: define a proper type for display and drawable. + */ +extern mbe_surface_t *mbe_win_surface_create(void *display, + void *drawable, + int fmt, int width, int height); #endif diff -r 77596f3d8d0c -r 851a062368bd src/X_supp.c --- a/src/X_supp.c Tue Dec 07 12:42:41 2010 +0800 +++ b/src/X_supp.c Wed Dec 08 18:31:39 2010 +0800 @@ -755,6 +755,48 @@ } #endif /* XSHM */ +#include +#include + +static int +_get_img_fmt_from_xvisual(Display *display, Visual *visual) { + VisualID visual_id; + XVisualInfo temp; + XVisualInfo *infos; + int n; + int fmt = -1; + + visual_id = XVisualIDFromVisual(visual); + temp.visualid = visual_id; + infos = XGetVisualInfo(display, VisualIDMask, &temp, &n); + if(n != 1) + return -1; + + switch(infos->depth) { + case 32: + fmt = MB_IFMT_ARGB32; + break; + + case 24: + fmt = MB_IFMT_RGB24; + break; + + case 16: + fmt = MB_IFMT_RGB16_565; + break; + + case 8: + fmt = MB_IFMT_A8; + break; + + case 1: + fmt = MB_IFMT_A1; + break; + } + + return fmt; +} + /*! \brief Initialize a MadButterfy runtime for Xlib. * * This one is very like _x_supp_init(), except it accepts a @@ -772,6 +814,7 @@ mb_img_ldr_t *img_ldr; int w, h; int disp_fd; + int fmt; w = xmb_rt->w; h = xmb_rt->h; @@ -785,12 +828,17 @@ xmb_rt->surface = mbe_image_surface_create(MB_IFMT_ARGB32, w, h); - if(xmb_rt->backend_surface == NULL) /* xshm_init() may create one */ + if(xmb_rt->backend_surface == NULL) { /* xshm_init() may create one */ + fmt = _get_img_fmt_from_xvisual(xmb_rt->display, xmb_rt->visual); + if(fmt == -1) + return ERR; + xmb_rt->backend_surface = mbe_win_surface_create(xmb_rt->display, xmb_rt->win, - xmb_rt->visual, + fmt, w, h); + } xmb_rt->cr = mbe_create(xmb_rt->surface); xmb_rt->backend_cr = mbe_create(xmb_rt->backend_surface); diff -r 77596f3d8d0c -r 851a062368bd src/graph_engine_cairo.c --- a/src/graph_engine_cairo.c Tue Dec 07 12:42:41 2010 +0800 +++ b/src/graph_engine_cairo.c Wed Dec 08 18:31:39 2010 +0800 @@ -1,5 +1,6 @@ // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- // vim: sw=4:ts=8:sts=4 +#include #include #include #include "mb_graph_engine_cairo.h" @@ -82,6 +83,23 @@ } +extern mbe_surface_t * +mbe_win_surface_create(void *display, void *drawable, + int fmt, int width, int height) { + XWindowAttributes attrs; + mbe_surface_t *surf; + int r; + + r = XGetWindowAttributes((Display *)display, (Drawable)drawable, &attrs); + if(r == 0) + return NULL; + + surf = cairo_xlib_surface_create((Display *)display, (Drawable)drawable, + attrs.visual, width, height); + + return surf; +} + /*! \brief Find out a font face for a pattern specified. * * The pattern, here, is a vector of family, slant, and weight. diff -r 77596f3d8d0c -r 851a062368bd src/graph_engine_openvg.c --- a/src/graph_engine_openvg.c Tue Dec 07 12:42:41 2010 +0800 +++ b/src/graph_engine_openvg.c Wed Dec 08 18:31:39 2010 +0800 @@ -540,76 +540,30 @@ } #ifdef EGL_GLX -#include -#include - -static int -_get_img_fmt_from_xvisual(Display *display, Visual *visual) { - VisualID visual_id; - XVisualInfo temp; - XVisualInfo *infos; - int n; - int fmt = -1; - - visual_id = XVisualIDFromVisual(visual); - temp.visualid = visual_id; - infos = XGetVisualInfo(display, VisualIDMask, &temp, &n); - if(n != 1) - return -1; - - switch(infos->depth) { - case 32: - fmt = MB_IFMT_ARGB32; - break; - - case 24: - fmt = MB_IFMT_RGB24; - break; - - case 16: - fmt = MB_IFMT_RGB16_565; - break; - - case 8: - fmt = MB_IFMT_A8; - break; - - case 1: - fmt = MB_IFMT_A1; - break; - } - - return fmt; -} - /*! \brief Create an EGL window surface for X11. * * This function is compiled only for GLX enabled. */ mbe_surface_t * -mbe_win_surface_create(Display *display, Drawable drawable, - Visual *visual, int width, int height) { +mbe_win_surface_create(void *display, void *drawable, + int fmt, int width, int height) { EGLDisplay egl_disp; EGLSurface egl_surface; mbe_surface_t *surface; EGLConfig config; EGLint attrib_list[2] = {EGL_NONE}; - int fmt; int r; - fmt = _get_img_fmt_from_xvisual(display, visual); - if(fmt == -1) - return NULL; - r = _openvg_find_config(fmt, width, height, &config); if(r != 0) return NULL; - egl_disp = eglGetDisplay(display); + egl_disp = eglGetDisplay((Display *)display); if(egl_disp == EGL_NO_DISPLAY || egl_disp != _VG_DISPLAY()) return NULL; - egl_surface = eglCreateWindowSurface(egl_disp, config, drawable, + egl_surface = eglCreateWindowSurface(egl_disp, config, + (Drawable)drawable, attrib_list); surface = O_ALLOC(mbe_surface_t);