[fpc-pascal] Loading PNG files as OpenGL textures

Ryan Joseph ryan at thealchemistguild.com
Mon Oct 12 07:02:56 CEST 2015

> On Oct 12, 2015, at 10:57 AM, Anthony Walter <sysrpl at gmail.com> wrote:
> I tend to use OS core elements or well known open source libraries for a few reasons.
> 1) less code compiled and small programs
> 2) superior performance
> 3) more features
> Example: When loading hundreds of textures you bet the Apple Quartz graphics libs are faster and more reliable. Same goes to WIC on Windows and Cario on linux.

So your advice would be to keep my Apple libraries I use on Mac and something else for Windows? What would be the equivalent libraries on Windows for CGImage and CGBitmapContext be?

Loading PNG’s into a bitmap seems like a pretty thing for single unit but I could do the native route also if it was easier. I just wanted to get started on cross platform basically and I’m looking for the easiest strategy.

Here’s an example function to load a texture on Mac (given a CGImageRef you load from CGImageCreateWithURL). Pretty easy using Apple frameworks and I assume those would have some FPC RTL equivalents.

function GenerateTextureFromImage (image: CGImageRef): GLuint;
	textureWidth, textureHeight: integer;
	textureName: GLuint;
	bounds: CGRect;
	bitmapData: pointer;
	colorSpace: CGColorSpaceRef;
	context: CGContextRef;
	result := 0;
	// generate texture
	textureWidth := CGImageGetWidth(image);
	textureHeight := CGImageGetHeight(image);
	bounds := CGRectMake(0, 0, textureWidth, textureHeight);
	bitmapData := GetMem(textureHeight * (textureWidth * 4));
	if bitmapData <> nil then
			colorSpace := CGColorSpaceCreateDeviceRGB;
		  context := CGBitmapContextCreate(bitmapData, textureWidth, textureHeight, 8, 4 * textureWidth, colorSpace, kCGImageAlphaPremultipliedLast);

			if context <> nil then
					CGContextFlipVertically(context, bounds);
					CGContextClearRect(context, bounds);
					CGContextDrawImage(context, bounds, image);
					glGenTextures(1, @result);
					glBindTexture(GL_TEXTURE_2D, result);
					glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapData);

					//writeln('generated texture ', result, ' (', textureWidth, 'x', textureHeight,')');


	Ryan Joseph

More information about the fpc-pascal mailing list