Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

Moogle

Loading textures from resources...

This topic is 5969 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Yes, how do you do this? I dont like NeHes BMP loading routine. It makes me dizzy. I think resources are the best way of putting BMPs into your program and any help would be greatly appricheated.

Share this post


Link to post
Share on other sites
Advertisement
I do not know if that is a joke but why should putting the images in a resource file be a good alternative? Only BMPs without alpha channels, pack options, probably more complicated code, ... and does not Windows put some kind of limitations on resource files?

Share this post


Link to post
Share on other sites
NeHe also has a TGA loader. And if you don''t like that either, use a free image loader library. Myself, I use the Intel JPEG Library and my own TGA loader, but there are some very nice libraries out there that can load any kind of image format.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Moogle: You can use LoadImage() for BMPs, both for files and resources. To access resource data in some other file format, check out FindResource(), LoadResource(), LockResource() and FreeResource(). PaintLib (www.paintlib.de) is a free image library that supports loding images from resources.

Obelix: Why would it be a joke? Reading data from a resource isn''t much more complicated than reading data from a file. Where did you get the idea that only BMPs can be put in a resource?

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Try glpng. It''s very easy to use.
In my opinion png is the best format.It is compressed and can store alpha-values.


http://www.wyatt100.freeserve.co.uk/download.htm

Share this post


Link to post
Share on other sites
quote:
I do not know if that is a joke but why should putting the images in a resource file be a good alternative? Only BMPs without alpha channels, pack options, probably more complicated code, ... and does not Windows put some kind of limitations on resource files?


A splash screen image.



Beer - the love catalyst
good ol'' homepage

Share this post


Link to post
Share on other sites
I do not want to be unfriendly but I can not take the Windows resoure file alternative seriously. If you have a bitmap file can you load it and get the the raw data, width, height and type in one function call.
Doing the same thing with resource files would involve extra steps. Where did the Anonymous Poster get the idea that creating the resource file and calling FindResource(), LoadResource(), LockResource(), FreeResource() and using an extra library for loading images from resources is not much more complicated?
I may of course be wrong about, among other things, the support for bitmaps with alpha channels. I guess that you can have any binary data but how easy is it to use? (creating/loading)

I also think that many libraries helps you in the job of uploading it to the card.

For some reason does Dredge-Master quote me and responds "A splash screen image."

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Obelix: sorry if I sounded a bit grumpy yesterday, I had a really bad hangover.
As for resource bitmaps not being a serious alternative, well it is. Trust me.

Oh yeah, login name... maybe I''ll get one of those...

Share this post


Link to post
Share on other sites
Here is how I do it- Takes a string name to an image and loads it from the resource. You''ll need to heavily modify this code, since I pulled it right from my engine.

  

int rcrTexture::LoadRES(LPSTR n)
{
HBITMAP hBmp;
hBmp = (HBITMAP)LoadImage(_rc_GlobalInterface.lpEngineSettings->hInstance,n,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
if (hBmp == NULL)
{
rcEmit("TEXLOAD:: Failed on load of Image %s !\n",n);
return 0;
}

BITMAPINFO BInfo;
ZeroMemory(&BInfo,sizeof(BITMAPINFO));
BInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
// okay fix0r the bitmap

if (GetDIBits(_rc_GlobalInterface.lpEngineSettings->hDC,hBmp,0,1,NULL,&BInfo,DIB_RGB_COLORS) == 0)
{
rcEmit("TEXLOAD:: Failed on info call #1 [ GetDIBits() ] of Image %s !\n",n);
return 0;
}

if (CreateBitImage(&BInfo,hBmp) == 0) return 0;

DeleteObject(hBmp);

return 1;
}



The image this returns is NOT MAPPED to the screens bitdepth, cause that would suck if it was low- heh. So I wrote my own function to map all bitmaps into 32bit RGBAs, CreateBitImage().

  
int rcrTexture::CreateBitImage(BITMAPINFO *p,HBITMAP hBmp)
{
BITMAPINFO *bmi;

bmi = (BITMAPINFO*)new char[256*4 + sizeof(BITMAPINFOHEADER)];
memcpy (bmi,p,sizeof(BITMAPINFOHEADER));

// ok allocate the bitmap

rcBitmap.dwHeight = abs(p->bmiHeader.biHeight);
rcBitmap.dwWidth = abs(p->bmiHeader.biWidth);
rcBitmap.dwFormat = RCFORMAT_RGBA;
rcBitmap.lpBitmap = new unsigned char[rcBitmap.dwWidth * rcBitmap.dwHeight * 4];

BYTE *pIn;

pIn = new BYTE[rcBitmap.dwWidth * rcBitmap.dwHeight * 4];

if (GetDIBits(_rc_GlobalInterface.lpEngineSettings->hDC,hBmp,0,rcBitmap.dwHeight,pIn,bmi,DIB_RGB_COLORS) == 0)
{
rcEmit("TEXLOAD:: Failed on translation #2 [ GetDIBits() ] of Image!\n");
return 0;
}

// ok loaded the image and pulled the bits- now we need to color adjust

if (bmi->bmiHeader.biBitCount <= 8)
{
// It''s palleted, so do the conversion

int NumColors;

if (bmi->bmiHeader.biBitCount == 1) NumColors = 2;
if (bmi->bmiHeader.biBitCount == 4) NumColors = 16;
if (bmi->bmiHeader.biBitCount == 8) NumColors = 256;

BYTE *pelOut = rcBitmap.lpBitmap, *pelIn = pIn;
DWORD dwPixelCount = rcBitmap.dwWidth * rcBitmap.dwHeight;

switch (NumColors)
{
case 2:
break;
while (dwPixelCount)
{
// ok eight pels per byte- so lets do it

BYTE pos, x;

pos = 1;
while ((pos <= 8) && (dwPixelCount))
{
x = *pelIn & (1 << pos);
pelOut[0] = bmi->bmiColors[x].rgbRed;
pelOut[1] = bmi->bmiColors[x].rgbGreen;
pelOut[2] = bmi->bmiColors[x].rgbBlue;
pelOut[3] = 255;
pelOut += 1;
dwPixelCount--;
pos++;
}
pelIn += 1;
}
break;
case 16:
while (dwPixelCount)
{
// ok two pels per byte- so lets do it

BYTE x;

x = *pelIn & 0xF;
pelOut[0] = bmi->bmiColors[x].rgbRed;
pelOut[1] = bmi->bmiColors[x].rgbGreen;
pelOut[2] = bmi->bmiColors[x].rgbBlue;
pelOut[3] = 255;
pelOut += 4;
dwPixelCount--;

if (dwPixelCount)
{
x = (*pelIn & 0xF0) >> 4;
pelOut[0] = bmi->bmiColors[x].rgbRed;
pelOut[1] = bmi->bmiColors[x].rgbGreen;
pelOut[2] = bmi->bmiColors[x].rgbBlue;
pelOut[3] = 255;
pelOut += 4;
dwPixelCount--;
}

pelIn += 1;
}

break;
case 256:
// ok step through the bytes, filling in the proper color data

while (dwPixelCount)
{
pelOut[0] = bmi->bmiColors[*pelIn].rgbRed;
pelOut[1] = bmi->bmiColors[*pelIn].rgbGreen;
pelOut[2] = bmi->bmiColors[*pelIn].rgbBlue;
pelOut[3] = 255;
pelOut += 4;
pelIn += 1;
dwPixelCount--;
}
break;
}
} else if (p->bmiHeader.biBitCount == 24)
{
// okay we just need to pad the alphas

BYTE *pelOut = rcBitmap.lpBitmap, *pelIn = pIn;
DWORD dwPixelCount = rcBitmap.dwWidth * rcBitmap.dwHeight;

while (dwPixelCount)
{
pelOut[3] = 255;
pelOut[2] = pelIn[0];
pelOut[1] = pelIn[1];
pelOut[0] = pelIn[2];
pelOut += 4;
pelIn += 3;
dwPixelCount--;
}
} else if (p->bmiHeader.biBitCount == 32)
{
// okay we just need to swap the red and blue

BYTE *pelOut = rcBitmap.lpBitmap, *pelIn = pIn;
DWORD dwPixelCount = rcBitmap.dwWidth * rcBitmap.dwHeight;
while (dwPixelCount)
{
pelOut[0] = pelIn[0];
pelOut[1] = pelIn[1];
pelOut[2] = pelIn[2];
pelOut[3] = 255;//pelIn[3];

pelOut += 4;
pelIn += 4;
dwPixelCount--;
}
}

delete [] pIn;
delete [] bmi;
return 1;
}


Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!