Hi,
Well, I could create a bitmap with an alpha channel on the fly. However, I do not know what to do with it.
Basically, here is what the function is supposed to do:
Create a bitmap in memory with a certain text.
Render that bitmap in an OpenGL context. The background for the bitmap should be transparant. The text should retain its original color.
So, here is how I generate the text
HDC desktop = ::GetDC(NULL);
HDC hdc = ::CreateCompatibleDC(desktop);
HFONT font = CreateFont(-70,0,0,0,400,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,DEFAULT_PITCH, “Arial”);
HFONT ff = (HFONT) SelectObject(hdc,font);
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,0xff0000);
BITMAPV5HEADER bi;
ZeroMemory(&bi,sizeof(BITMAPV5HEADER));
bi.bV5Size = sizeof(BITMAPV5HEADER);
bi.bV5Width = mysize.cx;
bi.bV5Height = mysize.cy;
bi.bV5Planes = 1;
bi.bV5BitCount = 32;
bi.bV5Compression = BI_BITFIELDS;
// The following mask specification specifies a supported 32 BPP
// alpha format for Windows XP.
bi.bV5RedMask = 0x00FF0000;
bi.bV5GreenMask = 0x0000FF00;
bi.bV5BlueMask = 0x000000FF;
bi.bV5AlphaMask = 0xFF000000;
if (bitmap)
DeleteObject(bitmap);
// Create bitmap
bitmap = CreateDIBSection(desktop, (BITMAPINFO *)(&bi), DIB_RGB_COLORS, &bits, 0, 0);
HGDIOBJ oldThing = SelectObject(hdc,bitmap);
HFONT oldFont = (HFONT) SelectObject(hdc,font);
// write out anti-aliased text
TextOut(hdc,0,0,str,strlen(str));
// unselect & release everything
SelectObject(hdc,oldFont);
SelectObject(hdc,oldThing);
DeleteObject(font);
DeleteDC(hdc);
::ReleaseDC(NULL,desktop);
// Now I can go through the image and set the alpha channel
lpdwPixel = (DWORD *)bits;
for (long x=0;x less than mysize.cx;x++)
for (long y=0;y less than mysize.cy;y++)
{
//
if ((*lpdwPixel & 0x00FFFFFF) == 0)
{
// Set alpha bit to 0.
*lpdwPixel &= 0x00FFFFFF;
}
else
{
// Clear the alpha bits
*lpdwPixel &= 0x00FFFFFF;
// Set the alpha bits to 0xFF
*lpdwPixel |= 0xFF000000;
}
lpdwPixel++;
}
Now, with OpenGL I do the following:
glEnable(G_ALPHA_TEST);
glAlphaFunc(GL_GREATER ,GL_ZERO);
glDrawPixels(mysize.cx, mysize.cy, GL_BGRA_EXT, GL_UNSIGNED_BYTE, bits);
This does what it’s supposed to do. But the anti-aliasing is gone now for the text. Does anyone know how I can get around that!
Thanks,
xarg