imlib2_view: Enable grabbing/viewing drawables
This commit is contained in:
parent
1471e92f62
commit
5ab0fa77f1
|
@ -13,9 +13,9 @@
|
|||
Display *disp;
|
||||
|
||||
static int debug = 0;
|
||||
static int verbose = 0;
|
||||
static Window win;
|
||||
static Pixmap pm = 0;
|
||||
static int depth;
|
||||
static int image_width = 0, image_height = 0;
|
||||
static int window_width = 0, window_height = 0;
|
||||
static Imlib_Image bg_im = NULL;
|
||||
|
@ -24,6 +24,8 @@ static char opt_cache = 0;
|
|||
static char opt_scale = 0;
|
||||
static double opt_scale_x = 1.;
|
||||
static double opt_scale_y = 1.;
|
||||
static double opt_sgrab_x = 1.;
|
||||
static double opt_sgrab_y = 1.;
|
||||
static char opt_progress_granularity = 10;
|
||||
static char opt_progress_print = 0;
|
||||
static int opt_progress_delay = 0;
|
||||
|
@ -38,15 +40,16 @@ static int opt_progress_delay = 0;
|
|||
|
||||
#define HELP \
|
||||
"Usage:\n" \
|
||||
" imlib2_view [OPTIONS] FILE...\n" \
|
||||
" imlib2_view [OPTIONS] {FILE | XID}...\n" \
|
||||
"OPTIONS:\n" \
|
||||
" -c : Enable image caching\n" \
|
||||
" -d : Enable debug\n" \
|
||||
" -g N: Set progress granularity to N%% (default 10(%%))\n" \
|
||||
" -l N: Introduce N ms delay in progress callback (default 0)\n" \
|
||||
" -p : Print info in progress callback (default no)\n" \
|
||||
" -s S: Set scaling factor to S (default 1.0)\n" \
|
||||
" -v : Increase verbosity\n"
|
||||
" -c : Enable image caching\n" \
|
||||
" -d : Enable debug\n" \
|
||||
" -g N : Set progress granularity to N%% (default 10(%%))\n" \
|
||||
" -l N : Introduce N ms delay in progress callback (default 0)\n" \
|
||||
" -p : Print info in progress callback (default no)\n" \
|
||||
" -s Sx[,Sy] : Set render x/y scaling factors to Sx,Sy (default 1.0)\n" \
|
||||
" -S Sx[,Sy] : Set grab x/y scaling factors to Sx,Sy (default 1.0)\n" \
|
||||
" -v : Increase verbosity\n"
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
|
@ -117,7 +120,8 @@ progress(Imlib_Image im, char percent, int update_x, int update_y,
|
|||
|
||||
if (pm)
|
||||
XFreePixmap(disp, pm);
|
||||
pm = XCreatePixmap(disp, win, window_width, window_height, depth);
|
||||
pm = XCreatePixmap(disp, win, window_width, window_height,
|
||||
DefaultDepth(disp, DefaultScreen(disp)));
|
||||
imlib_context_set_drawable(pm);
|
||||
if (bg_im)
|
||||
{
|
||||
|
@ -176,18 +180,62 @@ progress(Imlib_Image im, char percent, int update_x, int update_y,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static Imlib_Image
|
||||
load_image(int no, const char *name)
|
||||
{
|
||||
Imlib_Image im;
|
||||
char *ptr;
|
||||
Drawable draw;
|
||||
|
||||
Vprintf("Show %d: '%s'\n", no, name);
|
||||
|
||||
image_width = 0; /* Force redraw in progress() */
|
||||
|
||||
draw = strtoul(name, &ptr, 0);
|
||||
if (*ptr != '\0')
|
||||
draw = 0;
|
||||
|
||||
if (draw)
|
||||
{
|
||||
Window rr;
|
||||
int x, y;
|
||||
unsigned int w, h, bw;
|
||||
unsigned int wo, ho;
|
||||
unsigned int depth;
|
||||
int get_alpha = 1;
|
||||
|
||||
XGetGeometry(disp, draw, &rr, &x, &y, &w, &h, &bw, &depth);
|
||||
|
||||
imlib_context_set_drawable(draw);
|
||||
|
||||
Vprintf("Drawable: %#lx: x,y: %d,%d wxh=%ux%u bw=%u depth=%u\n",
|
||||
draw, x, y, w, h, bw, depth);
|
||||
|
||||
wo = w * opt_sgrab_x;
|
||||
ho = h * opt_sgrab_y;
|
||||
im = imlib_create_scaled_image_from_drawable(None, 0, 0, w, h, wo, ho,
|
||||
1, (get_alpha) ? 1 : 0);
|
||||
|
||||
progress(im, 100, 0, 0, wo, ho);
|
||||
}
|
||||
else
|
||||
{
|
||||
im = imlib_load_image(name);
|
||||
}
|
||||
|
||||
return im;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
Imlib_Image *im;
|
||||
char *file;
|
||||
int no, inc;
|
||||
int verbose;
|
||||
|
||||
verbose = 0;
|
||||
|
||||
while ((opt = getopt(argc, argv, "cdg:l:ps:v")) != -1)
|
||||
while ((opt = getopt(argc, argv, "cdg:l:ps:S:v")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
|
@ -208,7 +256,16 @@ main(int argc, char **argv)
|
|||
break;
|
||||
case 's': /* Scale (window size wrt. image size) */
|
||||
opt_scale = 1;
|
||||
opt_scale_x = opt_scale_y = atof(optarg);
|
||||
opt_scale_y = 0.f;
|
||||
sscanf(optarg, "%lf,%lf", &opt_scale_x, &opt_scale_y);
|
||||
if (opt_scale_y == 0.f)
|
||||
opt_scale_y = opt_scale_x;
|
||||
break;
|
||||
case 'S': /* Scale on grab */
|
||||
opt_sgrab_y = 0.f;
|
||||
sscanf(optarg, "%lf,%lf", &opt_sgrab_x, &opt_sgrab_y);
|
||||
if (opt_sgrab_y == 0.f)
|
||||
opt_sgrab_y = opt_sgrab_x;
|
||||
break;
|
||||
case 'v':
|
||||
verbose += 1;
|
||||
|
@ -235,8 +292,6 @@ main(int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
depth = DefaultDepth(disp, DefaultScreen(disp));
|
||||
|
||||
win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 10, 10,
|
||||
0, 0, 0);
|
||||
XSelectInput(disp, win, KeyPressMask | ButtonPressMask | ButtonReleaseMask |
|
||||
|
@ -260,10 +315,7 @@ main(int argc, char **argv)
|
|||
fprintf(stderr, "No loadable image\n");
|
||||
exit(0);
|
||||
}
|
||||
file = argv[no];
|
||||
Vprintf("Show %d: '%s'\n", no, file);
|
||||
image_width = 0;
|
||||
im = imlib_load_image(file);
|
||||
im = load_image(no, argv[no]);
|
||||
}
|
||||
|
||||
imlib_context_set_image(im);
|
||||
|
@ -403,15 +455,12 @@ main(int argc, char **argv)
|
|||
inc = 1;
|
||||
continue;
|
||||
}
|
||||
file = argv[no2];
|
||||
Vprintf("Show %d: '%s'\n", no2, file);
|
||||
if (no2 == no)
|
||||
break;
|
||||
image_width = 0;
|
||||
im2 = imlib_load_image(file);
|
||||
im2 = load_image(no2, argv[no2]);
|
||||
if (!im2)
|
||||
{
|
||||
Vprintf("*** Error loading image: %s\n", file);
|
||||
Vprintf("*** Error loading image: %s\n", argv[no2]);
|
||||
continue;
|
||||
}
|
||||
zoom = 1.0;
|
||||
|
|
Loading…
Reference in New Issue