Brian Hulley wrote:
> Hi -
> You could try something like:
>> import Foreign.Ptr
> import Foreign.C.String
>> bmp <- withCAString "C:\1.bmp" $ bitmap (Size (100,100)) (Vertex2 0 0)
> (Vertex2 0 0)
>> and if that doesn't work try withCString or withCWString. I'm
> assuming that the Ptr a in the docs is supposed to be a pointer to a
> null terminated C string hence withCAString should hopefully work.
> I'd also compile with -fffi (if you're using ghc)
>> (I haven't tried it myself so someone else might have a better answer)
Sorry I shouldn't have replied when I hadn't even tried it myself ;-)
I don't think it is nearly so easy to display a bitmap from an image on
file. If you look at the online version of the OpenGL redbook here
http://www.rush3d.com/reference/opengl-redbook-1.1/chapter08.html the
example C code for glBitmap is:
GLubyte rasters[24] = {
0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xc0, 0x00, 0xff, 0x00, 0xff, 0x00, 0xc0, 0x00,
0xc0, 0x00, 0xc0, 0x00, 0xff, 0xc0, 0xff, 0xc0};
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glRasterPos2i (20.5, 20.5);
glBitmap(10, 12, 0.0, 0.0, 12.0, 0.0, rasters);
glBitmap(10, 12, 0.0, 0.0, 12.0, 0.0, rasters);
glBitmap(10, 12, 0.0, 0.0, 12.0, 0.0, rasters);
glFlush();
}
and the explanation which follows suggests that the Ptr a in the HOpenGL
bitmap function is a pointer to the raw bytes containing the bitmap image,
not a pointer to the filename, and that the bitmap function actually
displays a bitmap immediately at the current raster position rather than
creating a texture for later use.
You can create an array of raw bytes in memory by using eg newArray from
Foreign.Marshal.Array, then pass the pointer to your display callback to use
in the call to bitmap.
The best place to get more info (eg about how to load bmp files) would be
the HOpenGL mailing list. A link to it is on the HOpenGL page at
http://haskell.org/HOpenGL/
Apologies for any confusion caused by my earlier rather ignorant post! ;-)
Good luck -
Brian.