chapman@lll-crg.llnl.gov (Carol Chapman) (02/17/90)
I am using X11R3 and Athena widgets on a SUN 3/110 running O/S 4.0.3.
I have hacked Clauss Strauch's xsnap.c code so that a user may select
a portion of the screen with the mouse, and a pixmap of that area is
returned. I then use XGetImage to store an image of that pixmap, then
I use XGetPixel to copy each pixmap value to 4 separate locations in a
data array, then I use XCreateImage to create a new "zoomed" image
twice the size of the original image. This is stored in a Core widget
and displayed in a popup window. Something is going wrong -> the
image is appearing at a 90 degree angle from how it should appear,
plus it's backwards and sometimes extra garbage appears! A definite
problem!
For both the original image and the zoomed image, the XImage
structures are set as follows: xoffset = 0, format = ZPixmap,
byte_order = 1, bitmap_unit = 8, bitmap_bit_order = 1, bitmap_pad = 8,
depth = 8, bits_per_pixel = 8. These are all the default values,
except for bitmap_unit and bitmap_pad which default to 32 and which I
am resetting to 8.
Can anyone give me any advice as to what I'm doing wrong and/or how to
do this correctly? Relevant portions of my code are included below
for anyone interested.
thank you,
carol chapman (chapman@lll-crg.llnl.gov)
----------------------------------------------------------------------
window_to_zoom = XtWindow(toplevel);
orig_gc_values.subwindow_mode = IncludeInferiors;
orig_gc_valuemask = GCSubwindowMode;
orig_gc = XCreateGC(disp, window_to_zoom, orig_gc_valuemask,
&orig_gc_values);
XGrabServer(disp);
XSync(disp, 0);
orig_pixmap = get_pixmap_region(window_to_zoom, orig_gc, orig_width,
orig_height);
XUngrabServer(disp); /* ungrab the server */
orig_image = XGetImage(disp, orig_pixmap, 0, 0,
*orig_width, *orig_height, AllPlanes, ZPixmap);
orig_image->bitmap_unit = 8;
orig_image->bitmap_pad = 8;
.
.
.
/* set zoomed image width, height and total area */
zoom_width = 2 * orig_width;
zoom_height = 2 * orig_height;
zoom_size = zoom_width * zoom_height;
zoom_ptr = (unsigned char *) calloc(zoom_size, sizeof(unsigned char));
temp_ptr = zoom_ptr; /* let temp_ptr point at beginning of zoom_ptr */
/* fill the area pointed to by zoom_ptr with correct pixel values */
for (row = 0; row < orig_height; row++)
/* for every row of orig_image */
for (col = 0; col < orig_width; col++) {
/* for every column of orig_image */
pix_value = XGetPixel(orig_image, row, col);
if (pix_value > 255)
pix_value = 255;
*temp_ptr = (unsigned char) pix_value;
*(temp_ptr + 1) = (unsigned char) pix_value;
*(temp_ptr + zoom_width) = (unsigned char) pix_value;
*(temp_ptr + zoom_width + 1) = (unsigned char) pix_value;
temp_ptr += 2;
} /* of for */
XDestroyImage(orig_image);
num_args = 0; /* reset */
XtSetArg(args[num_args], XtNborderWidth, 0); num_args++;
XtSetArg(args[num_args], XtNheight, zoom_height); num_args++;
XtSetArg(args[num_args], XtNwidth, zoom_width); num_args++;
if (zoom_core != NULL) /* the widget already exists */ {
XtSetValues(zoom_core, args, num_args);
XtManageChild(zoom_core);
} /* of if */
else /* create the widget */
zoom_core = XtCreateManagedWidget("zoomCore", widgetClass,
zoom_viewport, args, num_args);
zoom_image = XCreateImage(disp, vis, depth, ZPixmap, 0, zoom_ptr,
zoom_width, zoom_height, BitmapPad(disp),
zoom_width);
zoom_image->bitmap_unit = 8;
zoom_image->bitmap_pad = 8;
XtPopup(popup_zoom_shell);
win = XtWindow(zoom_core);
zoom_gc = XtGetGC(zoom_core, GCForeground | GCBackground,
&gc_values);
zoom_pixmap = XCreatePixmap(disp, win, zoom_width, zoom_height, depth);
XSetWindowBackgroundPixmap(disp, win, zoom_pixmap);
XPutImage(disp, zoom_pixmap, zoom_gc, zoom_image, 0, 0, 0, 0,
zoom_width, zoom_height);
XClearWindow(disp, win);
cfree((unsigned char *) zoom_ptr);
.
.
.rws@EXPO.LCS.MIT.EDU (Bob Scheifler) (03/01/90)
Something is going wrong -> the
image is appearing at a 90 degree angle from how it should appear,
You are doing
pix_value = XGetPixel(orig_image, row, col);
but it's really XGetPixel(ximage, x, y); you have the args reversed.
plus it's backwards and sometimes extra garbage appears!
You are arbitrarily smashing bitmap_unit and bitmap_pad; that's not
a reasonable thing to do for the source image.