summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Rusin <zack@ppc64.localdomain>2006-03-16 18:01:15 -0500
committerZack Rusin <zack@ppc64.localdomain>2006-03-16 18:01:15 -0500
commit17ea2271a74bd4f65bf32d2d6730194291a497c5 (patch)
treeb37757ee8486c332f14ec6bb43cfb878e1bddf06
parent36687060b972e8c6cf17b6e2486d88910383d19d (diff)
better version
-rw-r--r--main.cpp78
-rw-r--r--renderops.cpp82
-rw-r--r--renderops.h16
-rw-r--r--surface.cpp12
-rw-r--r--surface.h11
-rw-r--r--utils.cpp7
-rw-r--r--utils.h4
7 files changed, 103 insertions, 107 deletions
diff --git a/main.cpp b/main.cpp
index 7d415ad..f8fee5e 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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, &current_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);
}
diff --git a/surface.h b/surface.h
index 02d8e1f..c6ddb56 100644
--- a/surface.h
+++ b/surface.h
@@ -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
diff --git a/utils.cpp b/utils.cpp
index a229659..1d80e90 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -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;
diff --git a/utils.h b/utils.h
index fe9bd7e..c511471 100644
--- a/utils.h
+++ b/utils.h
@@ -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);