Dont see why your strechdraw functions don't work, should only be as simple as this:

[pascal]
procedure TPHXImage.StrechDraw(X, Y, W, H: Integer);
begin
glPushAttrib(GL_ENABLE_BIT or GL_COLOR_BUFFER_BIT or GL_CURRENT_BIT );
glEnable (GL_TEXTURE_2D);
glEnable (GL_BLEND);
glDisable (GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, FTexture);

glPushMatrix();
glScalef(W / Width, H / Height, 1);
glTranslated(X,Y,0);
glCallList(FDisplayList);
glPopMatrix();


glPopAttrib();
end;

procedure TPHXImage.StrechDraw(X, Y, W, H: Integer; PatternIndex: Cardinal);
begin
glPushAttrib(GL_ENABLE_BIT or GL_COLOR_BUFFER_BIT or GL_CURRENT_BIT );
glEnable (GL_TEXTURE_2D);
glEnable (GL_BLEND);
glDisable (GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, FTexture);

glPushMatrix();
glScalef(W / PatternWidth, H / PatternHeight, 1);
glTranslated(X,Y,0);
glCallList(FDisplayList+PatternIndex+1);
glPopMatrix();


glPopAttrib();
end;
[/pascal]

And yeah, custom frame support would be good, probably just need to look something like this ?

[pascal]
TPHXFrame = class
DisplayList: glUint;
Image : TPHXImage
PatternX : Integer;
PatternY: Integer
PatternWidth : Integer;
PatternHeight: Integer
end
[/pascal]

And btw, dont mess with the DisplayList property of the image class, you will break alot of code if you do so

Nice to hear about the tuts