On Tue, 1 Apr 2003, Carsten Haitzler wrote:
> On Mon, 31 Mar 2003 17:13:58 -0500 "Josh Davis" <[EMAIL PROTECTED]> babbled:
>
> > I am trying to create an XImage, but after the function call to
> > XCreateImage(), my XImage pointer's value is 0. I really don't know much
> > about Xlib. I want to create an XImage for image data that I already have.
> >
> > Can someone give me a list of steps to follow that lead to a properly
> > created XImage?
> >
> > I am currently getting the WindowAttributes from the root window and passing
> > its Visual* to the XCreateImage() function, while guessing at some of the
> > other values. The image data that I have is for a 24-bit image. I assume
> > that I should put the data into a contiguous char array. Below is the
> > relevant portion of my code...
> > --------------------------------------
> > const int DEPTH = 24;
>
> try DEPTH=32 (24 isn't really allowed)
Careful Carsten. Don't mix up your terminology.
You can create an Ximage in any depth the server supports:
depth 1, bits_per_pixel 1, scanline_pad 32
depth 4, bits_per_pixel 8, scanline_pad 32
depth 8, bits_per_pixel 8, scanline_pad 32
depth 15, bits_per_pixel 16, scanline_pad 32
depth 16, bits_per_pixel 16, scanline_pad 32
depth 24, bits_per_pixel 32, scanline_pad 32
depth 32, bits_per_pixel 32, scanline_pad 32
The point is that depth != bitsPerPixel. If you're going
to Put an XImage into a Window, the depths of the Window and
XImage must match, and since there aren't any depth 32 Windows,
he most certainly wants a depth 24 XImage. But according to
the pixmap formats, depth 24 is 32 bits per pixel.
Mark.
>
> > const int WIDTH = 100;
> > const int HEIGHT = 100;
> > const int FORMAT = ZPixmap;
> > const int OFFSET = 0;
> > const int BITMAP_PAD = 0;
> > const int BYTES_PER_LINE = (WIDTH * 3);
>
> try this:
> XImage *
> my_new_ximage(Display *display, Visual *visual, int width, int height, void
> *data)
> {
> /* this creates an ximage of the same depth as the specified visual */
> /* NOTE: Ximages must have pixels aligned to 8, 16 or 32bit boundaries. */
> /* 24bit (ie 3 bytes per pixel) is not valid and must be padded out to 32 */
> /* bits per pixel (4 bytes). The red, greeb and blue masks for your visual */
> /* will let you know what parst of the pixel are used for which color or */
> /* are padding. You really should use XPutPixel(ximage, x, y, value); to */
> /* set pixels if you want to not have portability problems. */
> /* If you don't you need to be VERY careful how you address the data of */
> /* the XImage *./
> XImage *ximage;
> XVisualInfo visualinfo, *visualinfo_return;
> int number_return;
>
> if ((width < 1) || (height < 1) || (!display) || (!visual)) return NULL;
> visualinfo.visualid = visual->visualid;
> visualinfo_return = XGetVisualInfo(display, VisualIDMask, &visualid,
> &number_return);
> /* no pointer return. abort */
> if (!visualinfo_return) return NULL;
> /* should only return 1 visual with that id */
> if (number_return != 1) return NULL;
>
> ximage = XCreateImage(display, visual, visualinfo_return[0].depth, ZPixmap,
> data, width, height, 32, 0);
> return ximage;
> }
>
> read the comments above. you can't do what you are doing as XImages cant be
> 24bit. you will have to either work with your data in 32 bit or have a 24bit to
> 32 bit converter. Also note that if you aren't running 32bpp (or 24bpp) you
> can't just make 32bit XImages and have X do the color conversion fro you - you
> need to handle each bit depth yourself. So if the server is running 16bpp or
> 15bpp or 8bpp or even monochrome this will simply not work. This is why there
> are many libraries and toolkits that handle this work for you.
>
> Several:
> Imlib2
> SDL
> GTK+ (Gdk)
> Qt
> and others... I'll leave it to you to do the research, or do the hard work all
> yourself. :)
>
> > const int IMAGE_BYTES = WIDTH * HEIGHT * 3;
> >
> > XWindowAttributes* rootWindowAttributes = new XWindowAttributes;
> >
> > Visual* visual = rootWindowAttributes->visual;
> >
> > char* data = new char[IMAGE_BYTES];
> >
> > XImage* xImage = XCreateImage(display,
> > visual,
> > DEPTH,
> > FORMAT,
> > OFFSET,
> > data,
> > WIDTH,
> > HEIGHT,
> > BITMAP_PAD,
> > BYTES_PER_LINE);
> > --------------------------------------
> >
> > Josh Davis
> >
> >
> > _________________________________________________________________
> > Protect your PC - get McAfee.com VirusScan Online
> > http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963
> >
> > _______________________________________________
> > Devel mailing list
> > [EMAIL PROTECTED]
> > http://XFree86.Org/mailman/listinfo/devel
>
>
> --
> --------------- Codito, ergo sum - "I code, therefore I am" --------------------
> The Rasterman (Carsten Haitzler) [EMAIL PROTECTED]
> [EMAIL PROTECTED]
> Mobile Phone: +61 (0)413 451 899 Home Phone: 02 9698 8615
> _______________________________________________
> Devel mailing list
> [EMAIL PROTECTED]
> http://XFree86.Org/mailman/listinfo/devel
>
_______________________________________________
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel