[comp.windows.x] Second try: color frame buffer tile padding--bug or feature?

ado@elsie.UUCP (Arthur David Olson) (02/26/89)

The only response I received to an earlier posting of these questions still
leaves me stumped (see below), so I'm trying again.

XV11R3's "cfbPadPixmap" function (in "cfbpixmap.c") pads narrow tiling
Pixmaps if 32 is an even multiple of their widths.  This means that if you
	1.  create a "narrow" Pixmap with a call such as
		tile = XCreatePixmap(display, window, 1, 16, 8);
	2.  fill the Pixmap with some desired data
	3.  associate the Pixmap with a GC with a call such as
		XSetTile(display, tiling_gc, tile)
	4.  use the GC to tile a region
and then try to
	1.  refill the Pixmap with new data
	2.  reassociate the Pixmap with a GC to update the tiling
you're in trouble--you will presumably only rewrite the first
column of a Pixmap that's been widened to 32 columns, so the tiling will be
done differently from what I (at least) would expect.

(I've attached sample code that, when run, shows what the situation is.
If you put the code in a file named "try.c" and then
	cc try.c -lX11 -o try
note how the correct output you get from typing the command
	try +
differs from the output you get when you type
	try
unadorned.)

Two questions.  Is this behavior documented somewhere that I missed?
And should it be considered a bug?  A response to my earlier posting of
these questions pointed out that the X protocol specification says
	Storing a pixmap in a gcontext might or might not result in a copy
	being made.  If the pixmap is later used as the destination for a
	graphics request, the change might or might not be reflected in the
	gcontext.  If the pixmap is used s[i]multaneously in a graphics request
	as both a destination and as a tile or stipple, the results are not
	defined.
But should the above passage serve as a clue to me that the size of the
pixmap can be changed?

If you have answers, I'd appreciate hearing from you by electronic mail.
-- 
	Arthur David Olson    ado@ncifcrf.gov    ADO is a trademark of Ampex.

#include "X11/Xlib.h"

int
main(argc, argv)
char *	argv[];
{
	register GC		default_gc;
	register Display *	display;
	register int		i;
	register Window		root_window;
	register int		screen_number;
	register Pixmap		tile;
	register GC		tiling_gc;
	register Window		window;

	display = XOpenDisplay((char *) 0);
	XSynchronize(display, 1);
	root_window = XDefaultRootWindow(display);
	screen_number = XDefaultScreen(display);
	default_gc = XDefaultGC(display, screen_number);
	window = XCreateSimpleWindow(display, root_window,
		0, 0, 100, 100, 0, (unsigned long) 0, (unsigned long) 0);
	XMapWindow(display, window);
	(void) getchar();

	tiling_gc = XCreateGC(display, window, 0, (XGCValues *) 0);
	XCopyGC(display, default_gc, (unsigned long) ~0, tiling_gc);
	XSetFillStyle(display, tiling_gc, FillTiled);

	tile = XCreatePixmap(display, window, 1, 100, 8);

	XSetTile(display, tiling_gc, tile);
	XFillRectangle(display, window, tiling_gc, 0, 0, 1, 1);
	for (i = 0; i < 100; ++i)
		if (((i / 4) % 2) == 0)
			XDrawPoint(display, tile, default_gc, 0, i);
	XSetTile(display, tiling_gc, tile);
	XFillRectangle(display, window, tiling_gc, 0, 0, 100, 100);
	(void) getchar();
	return 0;
}