265 lines
12 KiB
C
265 lines
12 KiB
C
#ifndef EVAS_ENGINE_H
|
|
#define EVAS_ENGINE_H
|
|
|
|
#include <sys/ipc.h>
|
|
#include <sys/shm.h>
|
|
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xatom.h>
|
|
#include <X11/extensions/XShm.h>
|
|
#include <X11/extensions/Xrender.h>
|
|
#include <X11/Xresource.h> // xres - dpi
|
|
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
# include <xcb/xcb.h>
|
|
# include <xcb/render.h>
|
|
# include <xcb/xcb_image.h>
|
|
#endif
|
|
|
|
extern int _evas_xrender_xcb_log_dom ;
|
|
#ifdef ERR
|
|
# undef ERR
|
|
#endif
|
|
#define ERR(...) EINA_LOG_DOM_ERR(_evas_xrender_xcb_log_dom, __VA_ARGS__)
|
|
|
|
#ifdef DBG
|
|
# undef DBG
|
|
#endif
|
|
#define DBG(...) EINA_LOG_DOM_DBG(_evas_xrender_xcb_log_dom, __VA_ARGS__)
|
|
|
|
#ifdef INF
|
|
# undef INF
|
|
#endif
|
|
#define INF(...) EINA_LOG_DOM_INFO(_evas_xrender_xcb_log_dom, __VA_ARGS__)
|
|
|
|
#ifdef WRN
|
|
# undef WRN
|
|
#endif
|
|
#define WRN(...) EINA_LOG_DOM_WARN(_evas_xrender_xcb_log_dom, __VA_ARGS__)
|
|
|
|
#ifdef CRIT
|
|
# undef CRIT
|
|
#endif
|
|
#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_xrender_xcb_log_dom, __VA_ARGS__)
|
|
|
|
typedef struct _Ximage_Info Ximage_Info;
|
|
typedef struct _Ximage_Image Ximage_Image;
|
|
typedef struct _Xrender_Surface Xrender_Surface;
|
|
|
|
struct _Ximage_Info
|
|
{
|
|
struct {
|
|
void *connection;
|
|
void *screen;
|
|
unsigned int root;
|
|
unsigned int draw;
|
|
void *visual;
|
|
void *fmt32;
|
|
void *fmt24;
|
|
void *fmt8;
|
|
void *fmt4;
|
|
void *fmt1;
|
|
void *fmtdef;
|
|
} x11;
|
|
unsigned int depth;
|
|
unsigned int pool_mem;
|
|
Eina_List *pool;
|
|
unsigned char can_do_shm;
|
|
Xrender_Surface *mul;
|
|
unsigned char mul_r, mul_g, mul_b, mul_a;
|
|
int references;
|
|
};
|
|
|
|
struct _Ximage_Image
|
|
{
|
|
union {
|
|
struct {
|
|
XImage *xim;
|
|
XShmSegmentInfo *shm_info;
|
|
} xlib;
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
struct {
|
|
xcb_image_t *xim;
|
|
xcb_shm_segment_info_t *shm_info;
|
|
} xcb;
|
|
#endif
|
|
} x11;
|
|
Ximage_Info *xinf;
|
|
int width;
|
|
int height;
|
|
int depth;
|
|
int line_bytes;
|
|
unsigned char *data;
|
|
unsigned char available : 1;
|
|
};
|
|
|
|
struct _Xrender_Surface
|
|
{
|
|
union {
|
|
struct {
|
|
XRenderPictFormat *fmt;
|
|
Drawable draw;
|
|
Picture pic;
|
|
} xlib;
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
struct {
|
|
xcb_render_pictforminfo_t *fmt;
|
|
xcb_drawable_t draw;
|
|
xcb_render_picture_t pic;
|
|
} xcb;
|
|
#endif
|
|
} x11;
|
|
Ximage_Info *xinf;
|
|
int width;
|
|
int height;
|
|
int depth;
|
|
unsigned char alpha : 1;
|
|
unsigned char allocated : 1;
|
|
unsigned char bordered : 1;
|
|
};
|
|
|
|
/* ximage support calls (ximage vs xshmimage, cache etc.) */
|
|
Ximage_Info *_xr_xlib_image_info_get(Display *disp, Drawable draw, Visual *vis);
|
|
void _xr_xlib_image_info_free(Ximage_Info *xinf);
|
|
void _xr_xlib_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem);
|
|
Ximage_Image *_xr_xlib_image_new(Ximage_Info *xinf, int w, int h, int depth);
|
|
void _xr_xlib_image_free(Ximage_Image *xim);
|
|
void _xr_xlib_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h);
|
|
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
Ximage_Info *_xr_xcb_image_info_get(xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *visual);
|
|
void _xr_xcb_image_info_free(Ximage_Info *xinf);
|
|
void _xr_xcb_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem);
|
|
Ximage_Image *_xr_xcb_image_new(Ximage_Info *xinf, int w, int h, int depth);
|
|
void _xr_xcb_image_free(Ximage_Image *xim);
|
|
void _xr_xcb_image_put(Ximage_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h);
|
|
#endif
|
|
|
|
/* xrender support calls */
|
|
Xrender_Surface *_xr_xlib_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha);
|
|
Xrender_Surface *_xr_xlib_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha);
|
|
Xrender_Surface *_xr_xlib_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha);
|
|
void _xr_xlib_render_surface_free(Xrender_Surface *rs);
|
|
void _xr_xlib_render_surface_repeat_set(Xrender_Surface *rs, int repeat);
|
|
void _xr_xlib_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h);
|
|
void _xr_xlib_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
|
|
void _xr_xlib_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
|
|
void _xr_xlib_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh);
|
|
void _xr_xlib_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth);
|
|
void _xr_xlib_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h);
|
|
void _xr_xlib_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h);
|
|
void _xr_xlib_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
|
|
void _xr_xlib_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
|
|
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
Xrender_Surface *_xr_xcb_render_surface_new(Ximage_Info *xinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha);
|
|
Xrender_Surface *_xr_xcb_render_surface_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, int alpha);
|
|
Xrender_Surface *_xr_xcb_render_surface_format_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha);
|
|
void _xr_xcb_render_surface_free(Xrender_Surface *rs);
|
|
void _xr_xcb_render_surface_repeat_set(Xrender_Surface *rs, int repeat);
|
|
void _xr_xcb_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h);
|
|
void _xr_xcb_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
|
|
void _xr_xcb_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy);
|
|
void _xr_xcb_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh);
|
|
void _xr_xcb_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth);
|
|
void _xr_xcb_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h);
|
|
void _xr_xcb_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h);
|
|
void _xr_xcb_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2);
|
|
void _xr_xcb_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y);
|
|
#endif
|
|
|
|
|
|
typedef struct _XR_Image XR_Image;
|
|
|
|
struct _XR_Image
|
|
{
|
|
Ximage_Info *xinf;
|
|
const char *file;
|
|
const char *key;
|
|
char *fkey;
|
|
RGBA_Image *im;
|
|
void *data;
|
|
int w, h;
|
|
Xrender_Surface *surface;
|
|
int references;
|
|
char *format;
|
|
const char *comment;
|
|
Tilebuf *updates;
|
|
RGBA_Image_Loadopts load_opts;
|
|
int *load_error; /* points to Evas_Object's load_error field */
|
|
struct {
|
|
int space;
|
|
void *data;
|
|
unsigned char no_free : 1;
|
|
} cs;
|
|
unsigned char alpha : 1;
|
|
unsigned char dirty : 1;
|
|
unsigned char free_data : 1;
|
|
};
|
|
|
|
XR_Image *_xre_xlib_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
|
|
XR_Image *_xre_xlib_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
|
|
XR_Image *_xre_xlib_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
|
|
XR_Image *_xre_xlib_image_new(Ximage_Info *xinf, int w, int h);
|
|
void _xre_xlib_image_resize(XR_Image *im, int w, int h);
|
|
void _xre_xlib_image_free(XR_Image *im);
|
|
void _xre_xlib_image_region_dirty(XR_Image *im, int x, int y, int w, int h);
|
|
void _xre_xlib_image_dirty(XR_Image *im);
|
|
XR_Image *_xre_xlib_image_copy(XR_Image *im);
|
|
void *_xre_xlib_image_data_get(XR_Image *im);
|
|
XR_Image *_xre_xlib_image_data_find(void *data);
|
|
void _xre_xlib_image_data_put(XR_Image *im, void *data);
|
|
void _xre_xlib_image_alpha_set(XR_Image *im, int alpha);
|
|
int _xre_xlib_image_alpha_get(XR_Image *im);
|
|
void _xre_xlib_image_border_set(XR_Image *im, int l, int r, int t, int b);
|
|
void _xre_xlib_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
|
|
void _xre_xlib_image_surface_gen(XR_Image *im);
|
|
void _xre_xlib_image_cache_set(int size);
|
|
int _xre_xlib_image_cache_get(void);
|
|
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
XR_Image *_xre_xcb_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
|
|
XR_Image *_xre_xcb_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
|
|
XR_Image *_xre_xcb_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace);
|
|
XR_Image *_xre_xcb_image_new(Ximage_Info *xinf, int w, int h);
|
|
void _xre_xcb_image_resize(XR_Image *im, int w, int h);
|
|
void _xre_xcb_image_free(XR_Image *im);
|
|
void _xre_xcb_image_region_dirty(XR_Image *im, int x, int y, int w, int h);
|
|
void _xre_xcb_image_dirty(XR_Image *im);
|
|
XR_Image *_xre_xcb_image_copy(XR_Image *im);
|
|
void *_xre_xcb_image_data_get(XR_Image *im);
|
|
XR_Image *_xre_xcb_image_data_find(void *data);
|
|
void _xre_xcb_image_data_put(XR_Image *im, void *data);
|
|
void _xre_xcb_image_alpha_set(XR_Image *im, int alpha);
|
|
int _xre_xcb_image_alpha_get(XR_Image *im);
|
|
void _xre_xcb_image_border_set(XR_Image *im, int l, int r, int t, int b);
|
|
void _xre_xcb_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
|
|
void _xre_xcb_image_surface_gen(XR_Image *im);
|
|
void _xre_xcb_image_cache_set(int size);
|
|
int _xre_xcb_image_cache_get(void);
|
|
#endif
|
|
|
|
typedef struct _XR_Font_Surface XR_Font_Surface;
|
|
|
|
struct _XR_Font_Surface
|
|
{
|
|
Ximage_Info *xinf;
|
|
RGBA_Font_Glyph *fg;
|
|
int w, h;
|
|
Drawable draw;
|
|
Picture pic;
|
|
};
|
|
|
|
XR_Font_Surface *_xre_xlib_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg);
|
|
void _xre_xlib_font_surface_free(XR_Font_Surface *fs);
|
|
void _xre_xlib_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y);
|
|
|
|
#ifdef BUILD_ENGINE_XRENDER_XCB
|
|
XR_Font_Surface *_xre_xcb_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg);
|
|
void _xre_xcb_font_surface_free(XR_Font_Surface *fs);
|
|
void _xre_xcb_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y);
|
|
#endif
|
|
|
|
#endif
|