Delphi, PNG and OpenGL

Started by
6 comments, last by idinev 15 years, 10 months ago
In your opinion, using Delphi, what would be the best method of parsing PNG image files with the intention of creating OpenGL textures out of them? I would prefer that the result didn't involve convoluted code or an external DLL, since I was planning on putting the parsing code into a utility library anyway. I'm struggling to import libPNG into Delphi because I lack the means to compile the C code into OBJ files that Delphi can read, since I cannot import a LIB file through any obvious means; the ones that Microsoft Visual C++ create are of the wrong format, and I'm having problems telling Borland's C-Builder where all the source files are located.
Advertisement
I think I'd try GraphicEx first.
I did find this in the past, but I disregarded it quite quickly because the licence, the Mozilla Public Licence, is incompatible with the GNU Lesser General Public Licence (which is what I was planning to release my utility library under), any advice on this front? Saying that though, the licence alone shouldn't be a reason to disregard source code, so I'll take a look.

P.S. Sorry for posting this thread under the wrong board; I've reported to a moderator to move it to a more appropriate board.

ADDENDUM: Just spotted something that I overlooked... Section 13 of the Mozilla Public Licence does allow portions of code to be linked into the GNU GPL, but I'm not certain about the GNU LGPL.

[Edited by - WaterCrane on June 15, 2008 5:14:29 PM]
Moved to the OpenGL forum as it appears the question is API specific.
Jeromy Walsh
Sr. Tools & Engine Programmer | Software Engineer
Microsoft Windows Phone Team
Chronicles of Elyria (An In-development MMORPG)
GameDevelopedia.com - Blog & Tutorials
GDNet Mentoring: XNA Workshop | C# Workshop | C++ Workshop
"The question is not how far, the question is do you possess the constitution, the depth of faith, to go as far as is needed?" - Il Duche, Boondock Saints
Much appreciated!

I'll start exploring GraphicEx; if I do use the code, I will give credit to the author, but exactly how much code can I use under the GNU Lesser Public Licence over the Mozilla Public Licence? Section 13 is a little vague. I will be very grateful if anyone is able to clarify for me.
While I find out about the legal details surrounding GraphicEx, I'm wondering if it's possible to use SDL to load PNG files for OpenGL texture use. I haven't properly explored it yet, so I should probably do that before asking this question, but is it possible to use SDL for that, or is it too closely tied with DirectX (at least on Windows) for that to be practical?

ADDENDUM: I'm sorry if I appear to be a bit anti-DirectX.
You can use the OLE IPicture to load jpg/png/bmp/gif/tga.

#include "olectl.h"static char* LoadTexture_JPG(const char* fName,int &wid,int &hei,int &BytesPP){	//----[ read data ]-------------------------------------[	FILE* f1 = fopen(fName,"rb"); if(!f1)return 0;	fseek(f1,0,SEEK_END);	int DataSize = ftell(f1); fseek(f1,0,SEEK_SET);	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,DataSize);	fread(GlobalLock(hGlobal),1,DataSize,f1);	GlobalUnlock(hGlobal);	fclose(f1);	//------------------------------------------------------/	LPSTREAM pstm;	CreateStreamOnHGlobal(hGlobal,1,&pstm);	IPicture* PictuBaka;	HBITMAP hBmp;	if(OleLoadPicture( pstm, DataSize,0,IID_IPicture,(LPVOID*)&PictuBaka)){		pstm->Release();		GlobalFree(hGlobal);		return 0;	}	if(PictuBaka->get_Handle((OLE_HANDLE*)&hBmp)){		PictuBaka->Release();		pstm->Release();		GlobalFree(hGlobal);		return 0;	}	BITMAP bi;	GetObject(hBmp,sizeof(BITMAP),&bi);		wid = bi.bmWidth;	hei = bi.bmHeight;	BytesPP=3;	char* data = (char*)xmalloc(wid*hei*3);	BITMAPINFOHEADER hdr1;	memset(&hdr1,0,sizeof(hdr1));	hdr1.biSize=sizeof(BITMAPINFOHEADER);	hdr1.biWidth=wid;	hdr1.biHeight=hei;	hdr1.biPlanes=1;	hdr1.biBitCount=24;	hdr1.biCompression=BI_RGB;	hdr1.biSizeImage=wid*hei*3;	HDC dc = CreateCompatibleDC(GetDC(0));	GetDIBits(dc,hBmp,0,hei,data,(LPBITMAPINFO)&hdr1,DIB_RGB_COLORS);	DeleteObject(hBmp);	DeleteObject(dc);	PictuBaka->Release();	pstm->Release();	GlobalFree(hGlobal);	//-----[ make BGR to RGB ]------------[	{		char* esi = data;		int i = wid*hei;		if(BytesPP==3){			while(i--){				char c1 = esi[0];				char c2 = esi[2];				esi[0] = c2;				esi[2] = c1;				esi+=3;			}		}	}	//------------------------------------/		return data;}


I'm not sure how to get the alpha-channel, though.
Uff, scratch that - the above code only loads JPG. IPicture can't handle png or even tga. GDI+ can.

This topic is closed to new replies.

Advertisement