diff options
author | Zack Rusin <zack@ppc64.localdomain> | 2006-03-16 18:01:15 -0500 |
---|---|---|
committer | Zack Rusin <zack@ppc64.localdomain> | 2006-03-16 18:01:15 -0500 |
commit | 17ea2271a74bd4f65bf32d2d6730194291a497c5 (patch) | |
tree | b37757ee8486c332f14ec6bb43cfb878e1bddf06 | |
parent | 36687060b972e8c6cf17b6e2486d88910383d19d (diff) |
better version
-rw-r--r-- | main.cpp | 78 | ||||
-rw-r--r-- | renderops.cpp | 82 | ||||
-rw-r--r-- | renderops.h | 16 | ||||
-rw-r--r-- | surface.cpp | 12 | ||||
-rw-r--r-- | surface.h | 11 | ||||
-rw-r--r-- | utils.cpp | 7 | ||||
-rw-r--r-- | utils.h | 4 |
7 files changed, 103 insertions, 107 deletions
@@ -21,10 +21,8 @@ int win_w = 320; int win_h = 320; -Display *disp = NULL; -Window win; -RenderOp current_op; -int transformations = 0; +Display *disp = NULL; +Window win; RenderOp all_render_ops[] = { @@ -69,32 +67,24 @@ RenderOp all_render_ops[] = { {NULL, 0, 0} }; -PictureFactory picture_factories[] = { - {"PictStandardARGB32", ARGB32Creator}, - {"PictStandardRGB24", RGB24Creator}, - {"PictStandardA8", A8Creator}, - {"PictStandardA4", A4Creator}, - {"PictStandardA1", A1Creator} -}; - XRenderSurf *surf_win = NULL; -XRenderSurf *surf_off = NULL; -XRenderSurf *surf_img = NULL; void -test_oper(void) +test_oper(int op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst) { int x, y; - x = rand() % (surf_win->w - (surf_img->w/2)); - y = rand() % (surf_win->h - (surf_img->h/2)); - xrender_surf_blend(disp, current_op.op, - surf_img, surf_win, x, y, surf_img->w, surf_img->h); + x = rand() % (surf_win->w - (src->w/2)); + y = rand() % (surf_win->h - (src->h/2)); + xrender_surf_blend(disp, op, src, mask, dst, + 0, 0, 0, 0, x, y, src->w, src->h); } void main_loop(void) { + RenderOp current_op; + /* printf query filters */ printf("Available XRENDER filters:\n"); { @@ -102,16 +92,12 @@ main_loop(void) XFilters *flt; flt = XRenderQueryFilters(disp, win); - for (i = 0; i < flt->nfilter; i++) printf("%s\n", flt->filter[i]); + for (i = 0; i < flt->nfilter; ++i) + printf("\t%s\n", flt->filter[i]); } - printf("Setup...\n"); /* setup */ surf_win = xrender_surf_adopt(disp, win, DefaultVisual(disp, DefaultScreen(disp)), win_w, win_h); - surf_off = xrender_surf_new(disp, win, DefaultVisual(disp, DefaultScreen(disp)), win_w, win_h, 0); - surf_img = xrender_surf_new(disp, win, DefaultVisual(disp, DefaultScreen(disp)), 128, 128, 1); populate_from_file(disp, surf_win, ":/res/images/bg1.jpg"); - populate_from_file(disp, surf_off, ":/res/images/kde_gear_64.png"); - populate_from_file(disp, surf_img, ":/res/images/kde_gear_64.png"); // Create a background tile pixmap QPixmap bg( 40, 40 ); @@ -124,54 +110,35 @@ main_loop(void) // Change the repeat setting for the bg pixmap so it tiles, and clear the window with it XRenderPictureAttributes pa; pa.repeat = true; - XRenderChangePicture(QX11Info::display(), bg.x11PictureHandle(), CPRepeat, &pa ); - XRenderComposite(QX11Info::display(), PictOpSrc, bg.x11PictureHandle(), None, + XRenderChangePicture(disp, bg.x11PictureHandle(), CPRepeat, &pa ); + XRenderComposite(disp, PictOpSrc, bg.x11PictureHandle(), None, surf_win->pic, 0, 0, 0, 0, 0, 0, win_w, win_h); XFlush(disp); int i = 0; current_op = all_render_ops[i++]; + int numberOfScenarios = 0; + TestScenario *scenarios = create_test_scenarios(disp, win, win_w, win_h, &numberOfScenarios); while (current_op.name) { - char buf[256]; - snprintf(buf, 255, "'%s' ", current_op.name); - time_test(buf, test_oper); - current_op = all_render_ops[i++]; - XSync(disp, False); - - // Change the repeat setting for the bg pixmap so it tiles, and clear the window with it - XRenderPictureAttributes pa; - pa.repeat = true; - XRenderChangePicture(QX11Info::display(), bg.x11PictureHandle(), CPRepeat, &pa ); - XRenderComposite(QX11Info::display(), PictOpSrc, bg.x11PictureHandle(), None, - surf_win->pic, 0, 0, 0, 0, 0, 0, win_w, win_h); + printf("Test: %s\n", current_op.name); + for (int j = 0; j < numberOfScenarios; ++j) { + time_test(scenarios[j].name, test_oper, ¤t_op, + scenarios[j].src, scenarios[j].mask, scenarios[j].dst); + } - srand(7); - } - - transformations = 1; - i = 0; - current_op = all_render_ops[i++]; - while (current_op.name) - { - char buf[256]; - snprintf(buf, 255, "'%s (transformation)' ", current_op.name); - xrender_surf_prepare(disp, surf_img, surf_img->w, surf_img->h, transformations, - SurfaceBilinear); - time_test(buf, test_oper); current_op = all_render_ops[i++]; XSync(disp, False); // Change the repeat setting for the bg pixmap so it tiles, and clear the window with it XRenderPictureAttributes pa; pa.repeat = true; - XRenderChangePicture(QX11Info::display(), bg.x11PictureHandle(), CPRepeat, &pa ); - XRenderComposite(QX11Info::display(), PictOpSrc, bg.x11PictureHandle(), None, + XRenderChangePicture(disp, bg.x11PictureHandle(), CPRepeat, &pa ); + XRenderComposite(disp, PictOpSrc, bg.x11PictureHandle(), None, surf_win->pic, 0, 0, 0, 0, 0, 0, win_w, win_h); srand(7); } - XSync(disp, False); } @@ -189,3 +156,4 @@ main(int argc, char **argv) main_loop(); return 0; } + diff --git a/renderops.cpp b/renderops.cpp index 562734a..2160a7d 100644 --- a/renderops.cpp +++ b/renderops.cpp @@ -1,42 +1,58 @@ #include <QX11Info> #include "renderops.h" +#include "surface.h" +#include "utils.h" #include <X11/extensions/Xrender.h> +#include <stdlib.h> +#include <string.h> -Picture ARGB32Creator(int w, int h) -{ - XRenderPictFormat *fmt = XRenderFindStandardFormat(QX11Info::display(), PictStandardARGB32); - XRenderPictureAttributes att; - - Drawable draw = XCreatePixmap(QX11Info::display(), draw, w, h, fmt->depth); - att.dither = 1; - att.component_alpha = 1; - att.repeat = 0; - return XRenderCreatePicture(QX11Info::display(), draw, fmt, - CPRepeat | CPDither | CPComponentAlpha, &att); -} - - -Picture RGB24Creator(int w, int h) -{ - return ARGB32Creator(w, h); -} - - -Picture A8Creator(int w, int h) -{ - return ARGB32Creator(w, h); -} - - -Picture A4Creator(int w, int h) -{ - return ARGB32Creator(w, h); -} - +extern XRenderSurf *surf_win; -Picture A1Creator(int w, int h) +TestScenario * create_test_scenarios(Display *disp, Window win, int w, int h, int *number) { - return ARGB32Creator(w, h); + TestScenario *scenarios; + + *number = 3; + + scenarios = (TestScenario*)malloc(sizeof(TestScenario) * (*number)); + + /*********************************/ + scenarios[0].name = strdup("Plain"); + //scenerio[0].dst = xrender_surf_adopt(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + // win_w, win_h); + scenarios[0].dst = surf_win; + scenarios[0].mask = 0; + scenarios[0].src = xrender_surf_new(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + 128, 128, 1); + populate_from_file(disp, scenarios[0].dst, ":/res/images/bg1.jpg"); + populate_from_file(disp, scenarios[0].src, ":/res/images/kde_gear_64.png"); + + /*********************************/ + scenarios[1].name = strdup("Transformation"); + //scenerios[1].dst = xrender_surf_adopt(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + // win_w, win_h); + scenarios[1].dst = surf_win; + scenarios[1].mask = 0; + scenarios[1].src = xrender_surf_new(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + 128, 128, 1); + populate_from_file(disp, scenarios[1].dst, ":/res/images/bg1.jpg"); + populate_from_file(disp, scenarios[1].src, ":/res/images/kde_gear_64.png"); + xrender_surf_prepare(disp, scenarios[1].src, scenarios[1].src->w, scenarios[1].src->h, 1, + SurfaceNone); + + /*********************************/ + scenarios[2].name = strdup("Transformation/Bilinear filter"); + //scenerio[2].dst = xrender_surf_adopt(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + // win_w, win_h); + scenarios[2].dst = surf_win; + scenarios[2].mask = 0; + scenarios[2].src = xrender_surf_new(disp, win, DefaultVisual(disp, DefaultScreen(disp)), + 128, 128, 1); + populate_from_file(disp, scenarios[2].dst, ":/res/images/bg1.jpg"); + populate_from_file(disp, scenarios[2].src, ":/res/images/kde_gear_64.png"); + xrender_surf_prepare(disp, scenarios[2].src, scenarios[2].src->w, scenarios[2].src->h, 1, + SurfaceBilinear); + return scenarios; } diff --git a/renderops.h b/renderops.h index 07f9b8d..0dbcf8b 100644 --- a/renderops.h +++ b/renderops.h @@ -1,6 +1,7 @@ #ifndef RENDEROPS_H #define RENDEROPS_H +#include "surface.h" #include <X11/extensions/Xrender.h> struct RenderOp @@ -10,17 +11,14 @@ struct RenderOp int baseOp; }; -typedef Picture (*PictureCreator)(int, int); -struct PictureFactory +struct TestScenario { - const char *format; - PictureCreator creator; + char *name; + XRenderSurf *src; + XRenderSurf *dst; + XRenderSurf *mask; }; -Picture ARGB32Creator(int w, int h); -Picture RGB24Creator(int w, int h); -Picture A8Creator(int w, int h); -Picture A4Creator(int w, int h); -Picture A1Creator(int w, int h); +TestScenario *create_test_scenarios(Display *disp, Window win, int w, int h, int *number); #endif diff --git a/surface.cpp b/surface.cpp index f3182b2..159ae21 100644 --- a/surface.cpp +++ b/surface.cpp @@ -123,9 +123,13 @@ xrender_surf_prepare(Display *disp, XRenderSurf *src, int w, int h, } } -void -xrender_surf_blend(Display *disp, int op, XRenderSurf *src, XRenderSurf *dst, - int x, int y, int w, int h) +void xrender_surf_blend(Display *disp, int op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst, + int src_x, int src_y, + int mask_x, int mask_y, + int dst_x, int dst_y, + unsigned int width, unsigned int height) { - XRenderComposite(disp, op, src->pic, None, dst->pic, 0, 0, 0, 0, x, y, w, h); + + XRenderComposite(disp, op, src->pic, mask ? mask->pic : None, dst->pic, src_x, src_y, + mask_x, mask_y, dst_x, dst_y, width, height); } @@ -30,7 +30,14 @@ void xrender_surf_populate(Display *disp, XRenderSurf *rs, int w, int h, const QImage &img_data); void xrender_surf_prepare(Display *disp, XRenderSurf *src, int w, int h, int transformations, SurfaceFilter filter); -void xrender_surf_blend(Display *disp, int op, XRenderSurf *src, XRenderSurf *dst, - int x, int y, int w, int h); +void xrender_surf_blend(Display *disp, int op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height); #endif @@ -35,7 +35,8 @@ get_time(void) void -time_test(char *description, void (*func) (void)) +time_test(char *description, void (*func) (int op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst), + RenderOp *op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst) { double t1, t2, t; int i; @@ -43,10 +44,10 @@ time_test(char *description, void (*func) (void)) char buf[51]; snprintf(buf, 50, "%s%s", description, FILLER); - printf("Test: %s", buf); + printf("\t\t %s", buf); t1 = get_time(); for (i = 0; i < REPS; ++i) - func(); + func(op->op, src, mask, dst); XSync(QX11Info::display(), False); t2 = get_time(); t = t2 - t1; @@ -2,6 +2,7 @@ #define UTILS_H #include "surface.h" +#include "renderops.h" #include <X11/Xlib.h> @@ -10,7 +11,8 @@ //#define REPS 256 double get_time(void); -void time_test(char *description, void (*func) (void)); +void time_test(char *description, void (*func)(int op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst), + RenderOp *op, XRenderSurf *src, XRenderSurf *mask, XRenderSurf *dst); void populate_from_file(Display *disp, XRenderSurf *rs, const char *file); void setup_window(void); |