legacy-imlib2/test/main.c

1378 lines
53 KiB
C

#include <X11/Xlib.h>
#include <X11/extensions/XShm.h>
#include <X11/Xutil.h>
#include <X11/extensions/shape.h>
#include <X11/Xatom.h>
#include <X11/Xos.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <locale.h>
/*
#include <sys/time.h>
#include "common.h"
#include "image.h"
#include "rend.h"
#include "rgba.h"
#include "ximage.h"
#include "color.h"
*/
#include "Imlib2.h"
Display *disp;
Window win;
Visual *vis;
Colormap cm;
int depth;
void progress(Imlib_Image * im, char percent, int update_x,
int update_y, int update_w, int update_h);
void
progress(Imlib_Image * im, char percent,
int update_x, int update_y, int update_w, int update_h)
{
imlib_context_set_display(disp);
imlib_context_set_visual(vis);
imlib_context_set_colormap(cm);
imlib_context_set_drawable(win);
imlib_context_set_dither(0);
imlib_context_set_blend(0);
imlib_context_set_color_modifier(NULL);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_image(im);
imlib_render_image_part_on_drawable_at_size(update_x, update_y,
update_w, update_h,
update_x, update_y,
update_w, update_h);
}
int
main(int argc, char **argv)
{
int i, j;
Imlib_Image *im = NULL;
int sec1, usec1, sec2, usec2;
int pixels = 0;
struct timeval timev;
double sec;
char *file = NULL;
char *fon = NULL, *str = NULL;
int root = 0;
int scale = 0;
int w = 20;
int h = 20;
int aa = 0;
int dith = 0;
int loop = 0;
int blend = 1;
int interactive = 1;
int blendtest = 0;
int filter = 0;
int pol = 0;
int rotate = 0;
int rottest = 0;
int scaleup = 0;
int scaleboth = 0;
int origone = 0;
int bump_map_to_point = 0;
Imlib_Color_Modifier colormod = 0;
ImlibPolygon poly, poly2, poly3;
int textdir = IMLIB_TEXT_TO_RIGHT;
int xfdtest = 0;
int xfdcachetest = 0;
char *xfdfname = NULL;
int xfdloop = 1;
/* now we'll set the locale */
setlocale(LC_ALL, "");
if (!XSupportsLocale())
setlocale(LC_ALL, "C");
XSetLocaleModifiers("");
setlocale(LC_ALL, NULL);
/**
* Parse all the command line arguments
*/
if ((argc > 1) && (!strcmp(argv[1], "-help")))
{
printf("Imlib2 program test. (Imlib v2.0.0.4)\n");
printf("usage: imlib2 [options] [file]\n");
printf("options are:\n");
printf("-help\t\tDisplays this help.\n");
printf("-root\t\tDraw in the root window.\n");
printf("-smooth\t\tWhen scaling images scale with anti-aliasing.\n");
printf("-up\t\tWhen doing scal test scale up, not down.\n");
printf("-both\t\tScale horizontally AND vertically in scale test.\n");
printf
("-orig\t\tKeep original width and height in each pass of scale test.\n");
printf("-blend\t\tBlending test.\n");
printf("-dither\t\tTurn dithering on for depths < 24bpp\n");
printf("-colormod <r> <g> <b> <a>\t\tSet up color mod tables\n");
printf("-scale\t\tScale test.\n");
printf("-noloop\t\tDont loop - timing test.\n");
printf
("-rotate\t\tAlso rotate background image with mouse in interative test.\n");
printf("-size <w> <h>\t\tScale from w x h down in scaling test.\n"); // require parameters w / h
printf("-maxcolors <n>\t\tLimit color allocation count to n colors.\n"); // require parameter nb colors
printf
("-text\t\tDisplays the text following this option. Need a loaded font.\n");
printf
("-font\t\tLoads a font. The parameter must follow the police_name/size format. Example: loading the grunge font at size 18 is : grunge/18.\n\t\tThe XFD font also can be specified. Ex. 'notepad/32,-*--24-*'.\n");
printf("-poly\t\tPerforms a poly test\n");
printf("The following options requires a file to work properly.\n");
printf("-textdir\t\tText Direction. 0: L to R, 1: R to L\n");
printf(" 2: U to D, 3: D to U, 4: angle\n");
printf("-xfdtest\t\tXFD Font queue test.\n");
printf
("-xfdcachetest <f> [<l>]\t\tXFD tFont cache test.\n\t\tThe file f is drawn l times\n");
printf("-blast\t\tDisplays the file.\n");
printf("-loop\t\tScales down the image.\n");
printf("-blendtest\tPerforms a blending test on the file.\n");
printf("-rotatetest\tPerforms a rotate test on the file.\n");
printf
("-filter\t\tPerforms filtering. Possible filters are,\n\t\t\t1:Blur filter, 2:Sharpen filter, 3:Color blur filter, \n\t\t\t4:Emboss filter, 5:Grayscale filter, 6:Saturation filter,\n\t\t\t7:Edge detection filter.\n");
printf("-bmp2pt\t\tPerformas Bump Mapping to a point\n");
return 0;
}
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "-root"))
root = 1;
else if (!strcmp(argv[i], "-smooth"))
aa = 1;
else if (!strcmp(argv[i], "-blast"))
interactive = 0;
else if (!strcmp(argv[i], "-loop"))
{
interactive = 0;
loop = 1;
}
else if (!strcmp(argv[i], "-up"))
scaleup = 1;
else if (!strcmp(argv[i], "-both"))
scaleboth = 1;
else if (!strcmp(argv[i], "-bmp2pt"))
bump_map_to_point = 1;
else if (!strcmp(argv[i], "-orig"))
origone = 1;
else if (!strcmp(argv[i], "-blend"))
blend = 1;
else if (!strcmp(argv[i], "-poly"))
pol = 1;
else if (!strcmp(argv[i], "-blendtest"))
{
blendtest = 1;
interactive = 0;
}
else if (!strcmp(argv[i], "-colormod"))
{
DATA8 rt[256], gt[256], bt[256], at[256];
double rm, gm, bm, am;
int j;
/*\ Setup color mod tables \ */
if (!colormod)
colormod = imlib_create_color_modifier();
imlib_context_set_color_modifier(colormod);
rm = strtod(argv[++i], 0);
gm = strtod(argv[++i], 0);
bm = strtod(argv[++i], 0);
am = strtod(argv[++i], 0);
imlib_get_color_modifier_tables(rt, gt, bt, at);
for (j = 0x100; --j >= 0;)
{
rt[j] = ((double)rt[j]) * rm;
gt[j] = ((double)gt[j]) * gm;
bt[j] = ((double)bt[j]) * bm;
at[j] = ((double)at[j]) * am;
}
imlib_set_color_modifier_tables(rt, gt, bt, at);
}
else if (!strcmp(argv[i], "-dither"))
dith = 1;
else if (!strcmp(argv[i], "-scale"))
scale = 1;
else if (!strcmp(argv[i], "-noloop"))
loop = 0;
else if (!strcmp(argv[i], "-size"))
{
i++;
w = atoi(argv[i++]);
h = atoi(argv[i]);
}
else if (!strcmp(argv[i], "-maxcolors"))
{
i++;
imlib_set_color_usage(atoi(argv[i]));
}
else if (!strcmp(argv[i], "-font"))
{
i++;
fon = argv[i];
}
else if (!strcmp(argv[i], "-text"))
{
i++;
str = argv[i];
}
else if (!strcmp(argv[i], "-xfdtest"))
xfdtest = 1;
else if (!strcmp(argv[i], "-xfdcachetest"))
{
xfdcachetest = 1;
i++;
xfdfname = argv[i];
i++;
if (i < argc)
xfdloop = atoi(argv[i]);
}
else if (!strcmp(argv[i], "-textdir"))
{
i++;
textdir = atoi(argv[i]);
}
else if (!strcmp(argv[i], "-rotate"))
rotate = 1;
else if (!strcmp(argv[i], "-filter"))
{
filter = atoi(argv[++i]);
interactive = 0;
}
else if (!strcmp(argv[i], "-rotatetest"))
{
rottest = 1;
interactive = 0;
}
else
file = argv[i];
}
/**
* Initialization according to options
*/
printf("init\n");
/**
* First tests to determine which rendering task to perform
*/
if (!blendtest)
{
disp = XOpenDisplay(NULL);
vis = DefaultVisual(disp, DefaultScreen(disp));
depth = DefaultDepth(disp, DefaultScreen(disp));
cm = DefaultColormap(disp, DefaultScreen(disp));
/* nasty - using imlib internal function.. but it makes benchmarks fair */
if (!interactive)
__imlib_SetMaxXImageCount(disp, 3);
if (root)
win = DefaultRootWindow(disp);
else
{
win =
XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 10,
10, 0, 0, 0);
XSelectInput(disp, win,
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask
| PointerMotionMask | ExposureMask);
}
}
if (!interactive)
{
printf("load %s\n", file);
im = imlib_load_image_immediately(file);
if (!im)
{
printf("load failed\n");
exit(0);
}
imlib_context_set_image(im);
w = imlib_image_get_width();
h = imlib_image_get_height();
printf("image %i x %i\n", w, h);
}
if (!blendtest)
{
if (!root)
{
if (scaleup)
XResizeWindow(disp, win, w * 4, h * 4);
else if (scaleboth)
XResizeWindow(disp, win, w * 2, h * 2);
else
XResizeWindow(disp, win, w, h);
XMapWindow(disp, win);
}
if (scale)
{
Window d;
int dd;
XGetGeometry(disp, win, &d, &dd, &dd, &dd, &dd, &dd, &dd);
}
XSync(disp, False);
}
/**
* Start rendering
*/
printf("rend\n");
if (!blendtest)
{
imlib_context_set_display(disp);
imlib_context_set_visual(vis);
imlib_context_set_colormap(cm);
imlib_context_set_drawable(win);
}
imlib_context_set_anti_alias(aa);
imlib_context_set_dither(dith);
imlib_context_set_blend(blend);
imlib_context_set_color_modifier(NULL);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_image(im);
gettimeofday(&timev, NULL);
sec1 = (int)timev.tv_sec; /* and stores it so we can time outselves */
usec1 = (int)timev.tv_usec; /* we will use this to vary speed of rot */
poly = imlib_polygon_new();
imlib_polygon_add_point(poly, 400, 50);
imlib_polygon_add_point(poly, 450, 100);
imlib_polygon_add_point(poly, 350, 100);
poly2 = imlib_polygon_new();
imlib_polygon_add_point(poly2, 400, 150);
imlib_polygon_add_point(poly2, 450, 200);
imlib_polygon_add_point(poly2, 350, 200);
poly3 = imlib_polygon_new();
imlib_polygon_add_point(poly3, 400, 250);
imlib_polygon_add_point(poly3, 450, 300);
imlib_polygon_add_point(poly3, 350, 300);
#define A90 (3.141592654 / 2)
if (pol)
{
Imlib_Image im_bg, im;
int w, h;
int i;
double a, points[8][2];
if (file)
im_bg = imlib_load_image(file);
else
im_bg = imlib_load_image("test_images/bg.png");
imlib_context_set_image(im_bg);
w = imlib_image_get_width();
h = imlib_image_get_height();
XResizeWindow(disp, win, w, h);
XSync(disp, False);
im = imlib_create_image(w, h);
srand(time(NULL));
for (i = 0; i < 8; i++)
{
points[i][0] = (rand() % w) - (w / 2);
points[i][1] = (rand() % h) - (h / 2);
}
a = 0.0;
for (;;)
{
imlib_context_set_image(im);
imlib_blend_image_onto_image(im_bg, 0, 0, 0, w, h, 0, 0, w, h);
poly = imlib_polygon_new();
for (i = 0; i < 8; i++)
{
double xx, yy;
xx = (w / 2) +
(cos(a) * points[i][0]) + (cos(a + A90) * points[i][1]);
yy = (h / 2) +
(sin(a) * points[i][0]) + (sin(a + A90) * points[i][1]);
imlib_polygon_add_point(poly, xx, yy);
}
printf("draw angle %3.3f\n", a);
imlib_context_set_color(255, 255, 255, 100);
imlib_image_fill_polygon(poly);
imlib_context_set_color(0, 0, 0, 20);
imlib_image_draw_polygon(poly, 1);
imlib_polygon_free(poly);
imlib_render_image_on_drawable(0, 0);
a += 0.05;
}
}
if (loop)
{
printf("loop\n");
// first test
if (scaleup)
{
printf("scale up\n");
for (i = 0; i < w * 3; i += 8)
{
if (!blendtest)
{
Imlib_Image im_tmp;
im_tmp = imlib_create_cropped_scaled_image(0, 0, w, h,
w + i,
(((w +
i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
}
imlib_context_set_image(im);
}
else
{
Imlib_Image im_tmp;
im_tmp = imlib_create_cropped_scaled_image(0, 0, w, h,
w + i,
(((w +
i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_free_image();
}
imlib_context_set_image(im);
}
pixels += (w + i) * (((w + i) * h) / w);
}
}
// else if // second
else if (scaleboth)
{
if (origone)
{
for (i = 0; i < w * 2; i += 4)
{
if (!blendtest)
{
Imlib_Image im_tmp;
im_tmp =
imlib_create_cropped_scaled_image(0, 0, w, h, w,
(((i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
}
imlib_context_set_image(im);
}
else
{
Imlib_Image im_tmp;
im_tmp =
imlib_create_cropped_scaled_image(0, 0, w, h, w,
(((i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_free_image();
}
imlib_context_set_image(im);
}
XSync(disp, False);
pixels += (2 * w - i) * (((i) * h) / w);
}
for (i = 0; i < w * 2; i += 4)
{
if (!blendtest)
imlib_render_image_on_drawable_at_size(0, 0,
2 * w - i, h);
else
{
Imlib_Image im_tmp;
im_tmp =
imlib_create_cropped_scaled_image(0, 0, w, h,
2 * w - i, h);
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_free_image();
}
imlib_context_set_image(im);
}
pixels += (2 * w - i) * h;
}
}
else
{
for (i = 0; i < w * 2; i += 4)
{
if (!blendtest)
imlib_render_image_on_drawable_at_size(0, 0,
2 * w - i,
(((i) * h) /
w));
else
{
Imlib_Image im_tmp;
im_tmp =
imlib_create_cropped_scaled_image(0, 0, w, h,
2 * w - i,
(((i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_free_image();
}
imlib_context_set_image(im);
}
pixels += w * (((i) * h) / w);
}
}
}
else
{
printf("scale down 0 -> %i incriment by 1\n", w);
for (i = 0; i < w; i++)
{
if (!blendtest)
imlib_render_image_on_drawable_at_size(0, 0,
w - i,
(((w -
i) * h) / w));
else
{
Imlib_Image im_tmp;
im_tmp = imlib_create_cropped_scaled_image(0, 0, w, h,
w - i,
(((w -
i) * h) /
w));
if (im_tmp)
{
imlib_context_set_image(im_tmp);
imlib_free_image();
}
imlib_context_set_image(im);
}
pixels += (w + i) * (((w + i) * h) / w);
}
}
}
// last test
/* else if (scaleboth)
* {
* for (i = 0; i < w * 2; i+= 1)
* {
* if (!blendtest)
* imlib_render_image_on_drawable_at_size(0, 0,
* 2 * w - i, (((i) * h) / w));
* else
* {
* Imlib_Image im_tmp;
* im_tmp = imlib_create_cropped_scaled_image(0, 0, w, h,
* 2 * w - i, (((i) * h) / w));
* if (im_tmp)
* {
* imlib_context_set_image(im_tmp);
* imlib_free_image();
* }
* imlib_context_set_image(im);
* }
* pixels += (2 * w - i) * (((i) * h) / w);
* }
* }
* } */// end if loop
else if (blendtest)
{
Imlib_Image im2;
im2 = imlib_create_image(w, h);
imlib_context_set_image(im2);
w = imlib_image_get_width();
h = imlib_image_get_height();
imlib_context_set_image(im2);
imlib_context_set_color_modifier(colormod);
for (i = 0; i < 256; i++)
{
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
pixels += (w * h);
}
}
else if (rottest)
{
int w, h;
double i;
imlib_context_set_image(im);
imlib_render_image_on_drawable(0, 0);
w = imlib_image_get_width();
h = imlib_image_get_height();
printf("rotating inside %dx%d frame\n", w, h);
imlib_context_set_blend(1);
imlib_context_set_image(imlib_create_image(w, h));
for (i = 0; i < 1; i += 0.01)
{
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
imlib_context_set_color_modifier(colormod);
imlib_blend_image_onto_image_at_angle(im, 0, 0, 0, w, h,
0, h * i,
w * (1 - i), -(h * i));
imlib_context_set_color_modifier(NULL);
imlib_render_image_on_drawable(0, 0);
pixels += w * h;
}
for (i = 0; i < 1; i += 0.01)
{
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
imlib_context_set_color_modifier(colormod);
imlib_context_set_operation(IMLIB_OP_ADD);
imlib_blend_image_onto_image_at_angle(im, 0, 0, 0, w, h,
w * i, h,
-(w * i), h * (i - 1));
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_render_image_on_drawable(0, 0);
pixels += w * h;
}
for (i = 0; i < 1; i += 0.01)
{
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
imlib_context_set_color_modifier(colormod);
imlib_context_set_operation(IMLIB_OP_SUBTRACT);
imlib_blend_image_onto_image_at_angle(im, 0, 0, 0, w, h,
w, h * (1 - i),
w * (i - 1), h * i);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_render_image_on_drawable(0, 0);
pixels += w * h;
}
for (i = 0; i < 1; i += 0.01)
{
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
imlib_context_set_color_modifier(colormod);
imlib_context_set_operation(IMLIB_OP_RESHADE);
imlib_blend_image_onto_image_at_angle(im, 0, 0, 0, w, h,
w * (1 - i), 0,
w * i, h * (1 - i));
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_render_image_on_drawable(0, 0);
pixels += w * h;
}
imlib_free_image();
}
else if (filter)
{
imlib_context_set_filter(imlib_create_filter(0));
switch (filter)
{
default:
case 1:
/*\ Blur filter \ */
imlib_filter_set(0, 0, 0, 8, 8, 8);
imlib_filter_set(-1, 0, 0, 4, 4, 4);
imlib_filter_set(0, -1, 0, 4, 4, 4);
imlib_filter_set(1, 0, 0, 4, 4, 4);
imlib_filter_set(0, 1, 0, 4, 4, 4);
imlib_filter_set(-2, 0, 0, 1, 1, 1);
imlib_filter_set(0, -2, 0, 1, 1, 1);
imlib_filter_set(2, 0, 0, 1, 1, 1);
imlib_filter_set(0, 2, 0, 1, 1, 1);
imlib_filter_set(-1, -1, 0, 1, 1, 1);
imlib_filter_set(-1, 1, 0, 1, 1, 1);
imlib_filter_set(1, -1, 0, 1, 1, 1);
imlib_filter_set(1, 1, 0, 1, 1, 1);
break;
case 2:
/*\ Sharpen filter \ */
imlib_filter_set(0, 0, 0, 5, 5, 5);
imlib_filter_set(-1, 0, 0, -1, -1, -1);
imlib_filter_set(0, -1, 0, -1, -1, -1);
imlib_filter_set(1, 0, 0, -1, -1, -1);
imlib_filter_set(0, 1, 0, -1, -1, -1);
break;
case 3:
/*\ Color blur filter \ */
imlib_filter_set(0, 0, 0, 3, 3, 3);
imlib_filter_set(-1, -1, 0, 1, 0, 0);
imlib_filter_set(1, -1, 0, 0, 1, 0);
imlib_filter_set(0, 1, 0, 0, 0, 1);
break;
case 4:
/*\ Emboss filter \ */
imlib_filter_set_red(-1, -1, 0, -1, -1, -1);
imlib_filter_set_red(0, 0, 0, 1, 1, 1);
imlib_filter_set_green(-1, -1, 0, -1, -1, -1);
imlib_filter_set_green(0, 0, 0, 1, 1, 1);
imlib_filter_set_blue(-1, -1, 0, -1, -1, -1);
imlib_filter_set_blue(0, 0, 0, 1, 1, 1);
imlib_filter_constants(0, 768, 768, 768);
imlib_filter_divisors(0, 6, 6, 6);
break;
case 5:
/*\ Grayscale filter \ */
imlib_filter_set_red(0, 0, 0, 80, 1, 1);
imlib_filter_set_green(0, 0, 0, 1, 80, 1);
imlib_filter_set_blue(0, 0, 0, 1, 1, 80);
break;
case 6:
/*\ Saturation filter \ */
imlib_filter_set_red(0, 0, 0, 80, -1, -1);
imlib_filter_set_green(0, 0, 0, -1, 80, -1);
imlib_filter_set_blue(0, 0, 0, -1, -1, 80);
break;
case 7:
/*\ Edge detection filter \ */
imlib_filter_set(-1, -1, 0, -1, -1, -1);
imlib_filter_set(-1, 0, 0, -3, -3, -3);
imlib_filter_set(-1, 1, 0, -1, -1, -1);
imlib_filter_set(0, -1, 0, -3, -3, -3);
imlib_filter_set(0, 0, 0, 16, 16, 16);
imlib_filter_set(0, 1, 0, -3, -3, -3);
imlib_filter_set(1, -1, 0, -1, -1, -1);
imlib_filter_set(1, 0, 0, -3, -3, -3);
imlib_filter_set(1, 1, 0, -1, -1, -1);
imlib_filter_divisors(0, 3, 3, 3);
}
pixels = 0;
imlib_render_image_on_drawable_at_size(0, 0, w, h);
for (i = 0; i < w; i++)
{
imlib_image_filter();
imlib_render_image_on_drawable_at_size(0, 0, w, h);
pixels += w * h;
}
imlib_free_filter();
}
else if (interactive)
{
int wo, ho, px, py, first = 1;
Imlib_Image im_bg, im_sh1, im_sh2, im_sh3, im_ic[13], im_tmp;
/* Imlib_Border border; */
Imlib_Updates up = NULL;
int x, y, i, j;
XEvent ev;
Imlib_Font fn = NULL;
struct font_hdr {
int type;
struct font_hdr *next;
char *name;
int ref;
XFontSet xfontset;
int font_count;
XFontStruct **font_struct;
char **font_name;
int ascent;
int descent;
int max_ascent;
int max_descent;
int max_width;
struct font_hdr *ttf;
} *f, *f1, *f2, *f3, *f4;
/* "ARIAL/30" "COMIC/30" "IMPACT/30" "Prole/30" "Proteron/30" */
/* "TIMES/30" "badacid/30" "bajoran/30" "bigfish/30" */
imlib_add_path_to_font_path("./ttfonts");
if (xfdtest)
{
printf("Font Cache test start\n");
f = imlib_load_font("notepad/10");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
imlib_context_set_font((Imlib_Font) f);
printf
("\t\t ascent=%d, descent=%d, max_ascent=%d, max_descent=%d\n",
imlib_get_font_ascent(), imlib_get_font_descent(),
imlib_get_maximum_font_ascent(),
imlib_get_maximum_font_descent());
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
printf("\n");
f = imlib_load_font("-*-fixed-*--14-*");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
imlib_context_set_font((Imlib_Font) f);
printf
("\t\t ascent=%d, descent=%d, max_ascent=%d, max_descent=%d\n",
imlib_get_font_ascent(), imlib_get_font_descent(),
imlib_get_maximum_font_ascent(),
imlib_get_maximum_font_descent());
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
printf("\n");
f1 = imlib_load_font("notepad/10");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f1, f1->next, f1->type, f1->ref, f1->name);
f2 = imlib_load_font("-*-fixed-*--14-*");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f2, f2->next, f2->type, f2->ref, f2->name);
f3 = imlib_load_font("notepad/10,-*-fixed-*--14-*");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f3, f3->next, f3->type, f3->ref, f3->name);
f = f3->ttf;
printf(" f->ttf: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
f4 = imlib_load_font("notepad/10,-*-fixed-*--14-*");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f4, f4->next, f4->type, f4->ref, f4->name);
f = f4->ttf;
printf(" f->ttf: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
printf("\n");
imlib_context_set_font((Imlib_Font) f4);
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f4, f4->next, f4->type, f4->ref, f4->name);
f = f4->ttf;
printf(" f->ttf: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
imlib_context_set_font((Imlib_Font) f1);
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f1, f1->next, f1->type, f1->ref, f1->name);
imlib_context_set_font((Imlib_Font) f2);
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f2, f2->next, f2->type, f2->ref, f2->name);
imlib_context_set_font((Imlib_Font) f3);
imlib_free_font();
printf("imlib_free_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f3, f3->next, f3->type, f3->ref, f3->name);
f = f3->ttf;
printf(" f->ttf: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
printf("\n");
imlib_flush_font_cache();
printf("imlib_flush_font_cache: \n");
printf("\n");
f1 = imlib_load_font("notepad/10,-*-fixed-*--14-*");
printf("imlib_load_font: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f1, f1->next, f1->type, f1->ref, f1->name);
f = f1->ttf;
printf(" f->ttf: f=%x, next=%8x, type=%d, ref=%d, '%s'\n",
f, f->next, f->type, f->ref, f->name);
imlib_context_set_font((Imlib_Font) f1);
printf
("\t\t ascent=%d, descent=%d, max_ascent=%d, max_descent=%d\n",
imlib_get_font_ascent(), imlib_get_font_descent(),
imlib_get_maximum_font_ascent(),
imlib_get_maximum_font_descent());
printf("Font Cache test end\n");
}
if (fon)
{
fn = imlib_load_font(fon);
if (xfdtest)
{
int i;
f = fn;
if (fn != NULL && f->type & 2)
for (i = 0; i < f->font_count; i++)
printf("xfont%d: %s\n", i, f->font_name[i]);
}
imlib_context_set_font(fn);
if (!fn)
fon = NULL;
}
imlib_context_set_progress_function(NULL);
imlib_context_set_progress_granularity(0);
if (file)
im_bg = imlib_load_image(file);
else
im_bg = imlib_load_image("test_images/bg.png");
imlib_context_set_image(im_bg);
im_tmp = imlib_clone_image();
w = imlib_image_get_width();
h = imlib_image_get_height();
wo = w;
ho = h;
w *= 1;
h *= 1;
XResizeWindow(disp, win, w, h);
XSync(disp, False);
im = imlib_create_image(w, h);
imlib_set_cache_size(4 * 1024 * 1024);
i = 0;
up = imlib_update_append_rect(up, 0, 0, w, h);
x = -9999;
y = -9999;
while (1)
{
px = x;
py = y;
do
{
XNextEvent(disp, &ev);
switch (ev.type)
{
case Expose:
up = imlib_update_append_rect(up,
ev.xexpose.x,
ev.xexpose.y,
ev.xexpose.width,
ev.xexpose.height);
break;
case ButtonRelease:
if (fon)
{
imlib_context_set_font(fn);
imlib_free_font();
}
exit(0);
break;
case MotionNotify:
x = ev.xmotion.x;
y = ev.xmotion.y;
default:
break;
}
}
while (XPending(disp));
im_sh1 = imlib_load_image("test_images/sh1.png");
im_sh2 = imlib_load_image("test_images/sh2.png");
im_sh3 = imlib_load_image("test_images/sh3.png");
im_ic[0] = imlib_load_image("test_images/audio.png");
im_ic[1] = imlib_load_image("test_images/folder.png");
im_ic[2] = imlib_load_image("test_images/mush.png");
im_ic[3] = imlib_load_image("test_images/paper.png");
im_ic[4] = imlib_load_image("test_images/mail.png");
im_ic[5] = imlib_load_image("test_images/calc.png");
im_ic[6] = imlib_load_image("test_images/cal.png");
im_ic[7] = imlib_load_image("test_images/stop.png");
im_ic[8] = imlib_load_image("test_images/globe.png");
im_ic[9] = imlib_load_image("test_images/menu.png");
im_ic[10] = imlib_load_image("test_images/tnt.png");
im_ic[11] = imlib_load_image("test_images/bulb.png");
im_ic[12] = imlib_load_image("test_images/lock.png");
imlib_context_set_image(im);
if (first)
{
imlib_blend_image_onto_image(im_bg, 0,
0, 0, w, h, 0, 0, w, h);
first = 0;
}
else if (rotate)
{
Imlib_Image rotim;
double s, c;
int x1, y1, x2, y2, w, h;
w = imlib_image_get_width();
h = imlib_image_get_height();
s = sin(6.2831853 * (double)y / (double)h);
c = cos(6.2831853 * (double)y / (double)h);
x1 = (w - w * c + h * s) / 2;
y1 = (h - h * c - w * s) / 2;
x2 = (w + w * c - h * s) / 2;
y2 = (h + h * c + w * s) / 2;
imlib_context_set_blend(1);
imlib_blend_image_onto_image_at_angle(im_bg, 0,
0, 0,
imlib_image_get_width(),
imlib_image_get_height
(), x1, y1, x2, y2);
up = imlib_update_append_rect(up, 0, 0,
imlib_image_get_width(),
imlib_image_get_height());
}
/*
if( bump_map_to_point )
imlib_apply_filter("bump_map_point(x=[],y=[],map=test_images/bulb.png);", &x, &y );
else
imlib_apply_filter("bump_map(x=[],y=[],map=test_images/bulb.png);", &x, &y );
*/
up = imlib_update_append_rect(up, 0, 0,
imlib_image_get_width(),
imlib_image_get_height());
{
Imlib_Updates uu;
imlib_context_set_cliprect(0, 0, 0, 0);
imlib_context_set_color(255, 255, 255, 255);
uu = imlib_image_draw_line(200, 200, x, y, 1);
up = imlib_updates_append_updates(up, uu);
/* test ellipses */
imlib_context_set_color(255, 255, 255, 255);
imlib_image_draw_ellipse(50, 250, 30, 40);
imlib_image_fill_ellipse(50, 300, 30, 40);
imlib_image_draw_rectangle(120, 245, 70, 70);
up = imlib_update_append_rect(up, 120, 245, 70, 70);
imlib_image_draw_ellipse(160, 280, 50, 20);
imlib_context_set_cliprect(120, 245, 70, 70);
imlib_context_set_color(255, 55, 55, 255);
imlib_image_draw_ellipse(160, 280, 50, 20);
/* test line clipping */
imlib_context_set_cliprect(0, 0, 0, 0);
imlib_image_draw_rectangle(50, 50, 100, 100);
up = imlib_update_append_rect(up, 50, 50, 100, 100);
imlib_context_set_color(255, 255, 255, 255);
uu = imlib_image_draw_line(0, 0, 200, 200, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(305, 25, 20, 200, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(100, 5, 100, 205, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(275, 5, 20, 100, 1);
up = imlib_updates_append_updates(up, uu);
imlib_context_set_color(255, 55, 55, 255);
imlib_context_set_cliprect(50, 50, 100, 100);
uu = imlib_image_draw_line(0, 0, 200, 200, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(305, 25, 20, 200, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(100, 5, 100, 205, 1);
up = imlib_updates_append_updates(up, uu);
uu = imlib_image_draw_line(275, 5, 20, 100, 1);
up = imlib_updates_append_updates(up, uu);
/* test rectangle clipping */
imlib_context_set_color(255, 255, 255, 255);
imlib_context_set_cliprect(0, 0, 0, 0);
imlib_image_draw_rectangle(70, 90, 20, 20);
imlib_image_draw_rectangle(115, 70, 60, 30);
imlib_image_draw_rectangle(30, 120, 50, 50);
imlib_context_set_color(255, 55, 55, 255);
imlib_context_set_cliprect(50, 50, 100, 100);
imlib_image_draw_rectangle(70, 90, 20, 20);
up = imlib_update_append_rect(up, 70, 90, 20, 20);
imlib_image_draw_rectangle(115, 70, 60, 30);
up = imlib_update_append_rect(up, 115, 70, 60, 30);
imlib_image_draw_rectangle(30, 120, 50, 50);
up = imlib_update_append_rect(up, 30, 120, 50, 50);
imlib_context_set_cliprect(0, 0, 0, 0);
/* test polygons */
imlib_context_set_color(255, 0, 0, 128);
imlib_image_fill_polygon(poly);
imlib_context_set_color(255, 255, 255, 255);
imlib_image_draw_polygon(poly2, 0);
imlib_image_draw_polygon(poly3, 1);
imlib_image_draw_rectangle(380, 260, 50, 50);
imlib_context_set_color(255, 55, 55, 255);
imlib_context_set_cliprect(380, 260, 50, 50);
imlib_image_fill_polygon(poly3);
imlib_context_set_cliprect(0, 0, 0, 0);
}
{
static Imlib_Color_Range rg = NULL;
if (!rg)
{
rg = imlib_create_color_range();
imlib_context_set_color_range(rg);
imlib_context_set_color(255, 255, 255, 255);
imlib_add_color_to_color_range(0);
imlib_context_set_color(255, 255, 160, 255);
imlib_add_color_to_color_range(1);
imlib_context_set_color(255, 160, 120, 255);
imlib_add_color_to_color_range(1);
imlib_context_set_color(255, 80, 100, 128);
imlib_add_color_to_color_range(1);
imlib_context_set_color(32, 48, 80, 0);
imlib_add_color_to_color_range(1);
}
imlib_context_set_operation(IMLIB_OP_RESHADE);
imlib_image_fill_color_range_rectangle(60, 60, 256, 256,
(double)x);
up = imlib_update_append_rect(up, 60, 60, 256, 256);
imlib_context_set_operation(IMLIB_OP_COPY);
}
if (xfdcachetest)
{
int l;
int retw, reth, tx, ty, nx, ny;
int secs, usecs, sece, usece;
FILE *f;
char buf[129];
f = fopen(xfdfname, "r");
if (!f)
{
printf("file %s can not be opened!\n", file);
exit(-1);
}
tx = ty = 0;
imlib_context_set_color(255, 255, 255, 255);
gettimeofday(&timev, NULL);
secs = (int)timev.tv_sec;
usecs = (int)timev.tv_usec;
l = xfdloop;
while (l)
{
fseek(f, 0, SEEK_SET);
while (fgets(buf, 128, f))
{
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
imlib_text_draw_with_return_metrics(tx, ty, buf,
&retw, &reth,
&nx, &ny);
up = imlib_update_append_rect(up, tx, ty, retw,
reth);
ty += ny;
if (ty > h)
ty = 0;
}
l--;
}
gettimeofday(&timev, NULL);
sece = (int)timev.tv_sec;
usece = (int)timev.tv_usec;
{
double t1, t2;
t1 = (double)secs + ((double)usecs / 1000000);
t2 = (double)sece + ((double)usece / 1000000);
sec = t2 - t1;
}
printf("%3.3f sec\n", sec);
}
else if (fon)
{
int retw, reth, tx, ty, nx, ny, cx, cy, cw,
ch, cp;
int cx2, cy2, cw2, ch2;
if (!str)
str = "This is a test string";
tx = ty = 50;
for (i = 0; i < 16; i++)
{
int al;
imlib_context_set_direction(textdir);
if (textdir == IMLIB_TEXT_TO_ANGLE)
{
double an = (double)i / 10.0;
imlib_context_set_angle(an);
}
al = (15 - i) * 16;
if (al > 255)
al = 255;
imlib_context_set_color(255, 255, 255, al);
imlib_text_draw_with_return_metrics(tx, ty, str,
&retw, &reth,
&nx, &ny);
up = imlib_update_append_rect(up, tx, ty, retw, reth);
switch (textdir)
{
case IMLIB_TEXT_TO_RIGHT:
case IMLIB_TEXT_TO_LEFT:
case IMLIB_TEXT_TO_ANGLE:
ty += ny;
break;
case IMLIB_TEXT_TO_DOWN:
case IMLIB_TEXT_TO_UP:
tx += nx;
break;
}
}
cp = imlib_text_get_index_and_location(str, x - 50, y - 50,
&cx, &cy, &cw, &ch);
if (cp >= 0)
{
char tmp[16];
int len;
len = mblen(str + cp, MB_CUR_MAX);
if (len < 0)
len = 1;
strncpy(tmp, str + cp, len);
tmp[len] = '\0';
printf("over char %s : cp=%d cx=%d cy=%d cw=%d ch=%d : ",
tmp, cp, cx, cy, cw, ch);
imlib_text_get_location_at_index(str, cp, &cx2, &cy2,
&cw2, &ch2);
printf("cx2=%d cy2=%d cw2=%d ch2=%d \n",
cx2, cy2, cw2, ch2);
}
}
imlib_context_set_blend(1);
if ((px != x) || (py != y))
{
for (j = 0; j < 32; j++)
{
for (i = 0; i < 32; i++)
{
int ic, iw, ih, ww, hh;
ic = ((j * 32) + i) % 13;
imlib_context_set_image(im_ic[ic]);
iw = imlib_image_get_width();
ih = imlib_image_get_height();
ww = iw;
hh = ih;
up = imlib_update_append_rect(up, x + (i * iw * 2),
y + (j * ih * 2), ww,
hh);
up = imlib_update_append_rect(up, px + (i * iw * 2),
py + (j * ih * 2), ww,
hh);
imlib_context_set_image(im);
imlib_blend_image_onto_image(im_ic[ic], 0,
0, 0, iw, ih,
x + (i * iw * 2),
y + (j * ih * 2),
ww, hh);
}
}
}
/*
imlib_apply_filter( "tint(x=200,y=200,w=300,h=100,alpha=100,red=155,green=25,blue=25);"\
"tint(green=20,red=20,blue=20,alpha=200,x=30,y=30);" \
"tint(green=40,red=40,blue=240,alpha=60,x=50,y=150,h=200);" );
*/
imlib_blend_image_onto_image(im_sh1, 0, 0, 0, 50, 50, 0, 0, 50,
50);
up = imlib_update_append_rect(up, 0, 0, 50, 50);
imlib_blend_image_onto_image(im_sh2, 0, 0, 0, 50, 50, 50, 0,
w - 50, 50);
up = imlib_update_append_rect(up, 50, 0, w - 50, 50);
imlib_blend_image_onto_image(im_sh3, 0, 0, 0, 50, 50, 0, 50, 50,
h - 50);
up = imlib_update_append_rect(up, 0, 50, 50, h - 50);
up = imlib_updates_merge_for_rendering(up, w, h);
imlib_context_set_blend(0);
imlib_render_image_updates_on_drawable(up, 0, 0);
if ((px != x) || (py != y))
{
Imlib_Updates u;
u = up;
while (u)
{
int ux, uy, uw, uh;
imlib_updates_get_coordinates(u, &ux, &uy, &uw, &uh);
imlib_blend_image_onto_image(im_bg, 0,
ux, uy, uw, uh,
ux, uy, uw, uh);
u = imlib_updates_get_next(u);
}
}
imlib_updates_free(up);
up = NULL;
imlib_context_set_image(im_sh1);
imlib_free_image();
imlib_context_set_image(im_sh1);
imlib_free_image();
imlib_context_set_image(im_sh1);
imlib_free_image();
imlib_context_set_image(im_ic[0]);
imlib_free_image();
imlib_context_set_image(im_ic[1]);
imlib_free_image();
imlib_context_set_image(im_ic[2]);
imlib_free_image();
imlib_context_set_image(im_ic[3]);
imlib_free_image();
}
}
else
{
printf("blast test\n");
pixels = 0;
imlib_context_set_color_modifier(colormod);
for (i = 0; i < w; i++)
{
imlib_render_image_on_drawable_at_size(0, 0, w, h);
pixels += w * h;
}
}
/**
* Determine horse power of your video card driver
*/
gettimeofday(&timev, NULL);
sec2 = (int)timev.tv_sec; /* and stores it so we can time outselves */
usec2 = (int)timev.tv_usec; /* we will use this to vary speed of rot */
printf("done\n");
{
double t1, t2;
t1 = (double)sec1 + ((double)usec1 / 1000000);
t2 = (double)sec2 + ((double)usec2 / 1000000);
sec = t2 - t1;
}
printf("%3.3f sec, %3.3f M pixels (%i)\n", sec, (double)pixels / 1000000,
pixels);
printf("%3.3f Mpixels / sec\n", (double)(pixels) / (sec * 1000000));
return 0;
}