Using JPEG in OpenGL

I was wondering if someone could show me an example of using JPEGs in
OpenGL. I have Downloaded the NeHe Files, and am trying to modify them to
use JPEG instead of BMPs. By the way I am using linux, so I cant use any
windows files. I will post the code that I am trying to modify, this is as
it is downloaded, I have modify anything yet. I can get this to compile,
but once I try to modify it, it doesnt want to work. and I think it is
because it trys to use windows files. And yes I know that this code does
nothing but open the window. Just wondering if someone could help me add
to it so it draws a quad, and maps a JPEG to it. and if I could make the
quad from the width * hieght of the JPEG. I am asking alot I think, but I
am stump I dont know what else to do. Thanks

/*

  • This code was created by Jeff Molofee '99
  • (ported to Linux/SDL by Ti Leggett '01)*
  • If you’ve found this code useful, please let me know.
  • Visit Jeff at http://nehe.gamedev.net/
  • or for port-specific comments, questions, bugreports etc.
  • email to leggett at eecs.tulane.edu
    */

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include “SDL.h”

/* screen width, height, and bit depth */
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SCREEN_BPP 16

/* Setup our booleans */
#define TRUE 1
#define FALSE 0

/* This is our SDL surface */
SDL_Surface *surface;

/* function to release/destroy our resources and restoring the old desktop /
void Quit( int returnCode )
{
/
clean up the window */
SDL_Quit( );

/* and exit appropriately */
exit( returnCode );

}

/* function to reset our viewport after a window resize /
int resizeWindow( int width, int height )
{
/
Height / width ration */
GLfloat ratio;

/* Protect against a divide by zero */
if ( height == 0 )
height = 1;

ratio = ( GLfloat )width / ( GLfloat )height;

/* Setup our viewport. */
glViewport( 0, 0, ( GLint )width, ( GLint )height );

/* change to the projection matrix and set our viewing volume. */
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );

/* Set our perspective */
gluPerspective( 45.0f, ratio, 0.1f, 100.0f );

/* Make sure we're chaning the model view and not the projection */
glMatrixMode( GL_MODELVIEW );

/* Reset The View */
glLoadIdentity( );

return( TRUE );

}

/* function to handle key press events */
void handleKeyPress( SDL_keysym keysym )
{
switch ( keysym->sym )
{
case SDLK_ESCAPE:
/
ESC key was pressed /
Quit( 0 );
break;
case SDLK_F1:
/
F1 key was pressed
* this toggles fullscreen mode
*/
SDL_WM_ToggleFullScreen( surface );
break;
default:
break;
}

return;

}

/* general OpenGL initialization function */
int initGL( GLvoid )
{

/* Enable smooth shading */
glShadeModel( GL_SMOOTH );

/* Set the background black */
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );

/* Depth buffer setup */
glClearDepth( 1.0f );

/* Enables Depth Testing */
glEnable( GL_DEPTH_TEST );

/* The Type Of Depth Test To Do */
glDepthFunc( GL_LEQUAL );

/* Really Nice Perspective Calculations */
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

return( TRUE );

}

/* Here goes our drawing code /
int drawGLScene( GLvoid )
{
/
These are to calculate our fps */
static GLint T0 = 0;
static GLint Frames = 0;

/* Clear The Screen And The Depth Buffer */
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity( );

/* Draw it to the screen */
SDL_GL_SwapBuffers( );

/* Gather our frames per second */
Frames++;
{
GLint t = SDL_GetTicks();
if (t - T0 >= 5000) {
    GLfloat seconds = (t - T0) / 1000.0;
    GLfloat fps = Frames / seconds;
    printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
    T0 = t;
    Frames = 0;
}
}

return( TRUE );

}

int main( int argc, char *argv )
{
/
Flags to pass to SDL_SetVideoMode /
int videoFlags;
/
main loop variable /
int done = FALSE;
/
used to collect events /
SDL_Event event;
/
this holds some info about our display */
const SDL_VideoInfo videoInfo;
/
whether or not the window is active */
int isActive = TRUE;

/* initialize SDL */
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
    fprintf( stderr, "Video initialization failed: %s\n",
	     SDL_GetError( ) );
    Quit( 1 );
}

/* Fetch the video info */
videoInfo = SDL_GetVideoInfo( );

if ( !videoInfo )
{
    fprintf( stderr, "Video query failed: %s\n",
	     SDL_GetError( ) );
    Quit( 1 );
}

/* the flags to pass to SDL_SetVideoMode */
videoFlags  = SDL_OPENGL;          /* Enable OpenGL in SDL */
videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
videoFlags |= SDL_HWPALETTE;       /* Store the palette in hardware */
videoFlags |= SDL_RESIZABLE;       /* Enable window resizing */

/* This checks to see if surfaces can be stored in memory */
if ( videoInfo->hw_available )
videoFlags |= SDL_HWSURFACE;
else
videoFlags |= SDL_SWSURFACE;

/* This checks if hardware blits can be done */
if ( videoInfo->blit_hw )
videoFlags |= SDL_HWACCEL;

/* Sets up OpenGL double buffering */
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

/* get a SDL surface */
surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,
			videoFlags );

/* Verify there is a surface */
if ( !surface )
{
    fprintf( stderr,  "Video mode set failed: %s\n", SDL_GetError( ) );
    Quit( 1 );
}

/* initialize OpenGL */
if ( initGL( ) == FALSE )
{
    fprintf( stderr, "Could not initialize OpenGL.\n" );
    Quit( 1 );
}

/* Resize the initial window */
resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT );

/* wait for events */
while ( !done )
{
    /* handle the events in the queue */

    while ( SDL_PollEvent( &event ) )
	{
	    switch( event.type )
		{
		case SDL_ACTIVEEVENT:
		    /* Something's happend with our focus
		     * If we lost focus or we are iconified, we
		     * shouldn't draw the screen
		     */
		    if ( event.active.gain == 0 )
			isActive = FALSE;
		    else
			isActive = TRUE;
		    break;
		case SDL_VIDEORESIZE:
		    /* handle resize event */
		    surface = SDL_SetVideoMode( event.resize.w,
						event.resize.h,
						16, videoFlags );
		    if ( !surface )
			{
			    fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) );
			    Quit( 1 );
			}
		    resizeWindow( event.resize.w, event.resize.h );
		    break;
		case SDL_KEYDOWN:
		    /* handle key presses */
		    handleKeyPress( &event.key.keysym );
		    break;
		case SDL_QUIT:
		    /* handle quit requests */
		    done = TRUE;
		    break;
		default:
		    break;
		}
	}

    /* draw the scene */
    if ( isActive )
	drawGLScene( );
}

/* clean ourselves up and exit */
Quit( 0 );

/* Should never get here */
return( 0 );

}

hi Tim, i use SDL_Image so i can load tga, bmp, png, jpg, gif etc files
without having to code a loader for each file type. Its pretty cool stuff,
you just tell SDL_Image the file name and it loads it for you and gives it
to you in an SDL surface which can easily be made into an OpenGL texture.

http://www.libsdl.org/projects/SDL_image/

enjoy!> ----- Original Message -----

From: t.a.johnson@verizon.net (Tim)
To:
Sent: Saturday, May 10, 2003 5:47 PM
Subject: [SDL] Using JPEG in OpenGL

I was wondering if someone could show me an example of using JPEGs in
OpenGL. I have Downloaded the NeHe Files, and am trying to modify them to
use JPEG instead of BMPs. By the way I am using linux, so I cant use any
windows files. I will post the code that I am trying to modify, this is as
it is downloaded, I have modify anything yet. I can get this to compile,
but once I try to modify it, it doesnt want to work. and I think it is
because it trys to use windows files. And yes I know that this code does
nothing but open the window. Just wondering if someone could help me add
to it so it draws a quad, and maps a JPEG to it. and if I could make the
quad from the width * hieght of the JPEG. I am asking alot I think, but I
am stump I dont know what else to do. Thanks

/*

  • This code was created by Jeff Molofee '99
  • (ported to Linux/SDL by Ti Leggett '01)
  • If you’ve found this code useful, please let me know.
  • Visit Jeff at http://nehe.gamedev.net/
  • or for port-specific comments, questions, bugreports etc.
  • email to leggett at eecs.tulane.edu
    */

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include “SDL.h”

/* screen width, height, and bit depth */
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define SCREEN_BPP 16

/* Setup our booleans */
#define TRUE 1
#define FALSE 0

/* This is our SDL surface */
SDL_Surface *surface;

/* function to release/destroy our resources and restoring the old desktop
/
void Quit( int returnCode )
{
/
clean up the window */
SDL_Quit( );

/* and exit appropriately */
exit( returnCode );

}

/* function to reset our viewport after a window resize /
int resizeWindow( int width, int height )
{
/
Height / width ration */
GLfloat ratio;

/* Protect against a divide by zero */
if ( height == 0 )

height = 1;

ratio = ( GLfloat )width / ( GLfloat )height;

/* Setup our viewport. */
glViewport( 0, 0, ( GLint )width, ( GLint )height );

/* change to the projection matrix and set our viewing volume. */
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );

/* Set our perspective */
gluPerspective( 45.0f, ratio, 0.1f, 100.0f );

/* Make sure we're chaning the model view and not the projection */
glMatrixMode( GL_MODELVIEW );

/* Reset The View */
glLoadIdentity( );

return( TRUE );

}

/* function to handle key press events */
void handleKeyPress( SDL_keysym keysym )
{
switch ( keysym->sym )
{
case SDLK_ESCAPE:
/
ESC key was pressed /
Quit( 0 );
break;
case SDLK_F1:
/
F1 key was pressed
* this toggles fullscreen mode
*/
SDL_WM_ToggleFullScreen( surface );
break;
default:
break;
}

return;

}

/* general OpenGL initialization function */
int initGL( GLvoid )
{

/* Enable smooth shading */
glShadeModel( GL_SMOOTH );

/* Set the background black */
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );

/* Depth buffer setup */
glClearDepth( 1.0f );

/* Enables Depth Testing */
glEnable( GL_DEPTH_TEST );

/* The Type Of Depth Test To Do */
glDepthFunc( GL_LEQUAL );

/* Really Nice Perspective Calculations */
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

return( TRUE );

}

/* Here goes our drawing code /
int drawGLScene( GLvoid )
{
/
These are to calculate our fps */
static GLint T0 = 0;
static GLint Frames = 0;

/* Clear The Screen And The Depth Buffer */
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity( );

/* Draw it to the screen */
SDL_GL_SwapBuffers( );

/* Gather our frames per second */
Frames++;
{

GLint t = SDL_GetTicks();
if (t - T0 >= 5000) {
GLfloat seconds = (t - T0) / 1000.0;
GLfloat fps = Frames / seconds;
printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
T0 = t;
Frames = 0;
}
}

return( TRUE );

}

int main( int argc, char *argv )
{
/
Flags to pass to SDL_SetVideoMode /
int videoFlags;
/
main loop variable /
int done = FALSE;
/
used to collect events /
SDL_Event event;
/
this holds some info about our display */
const SDL_VideoInfo videoInfo;
/
whether or not the window is active */
int isActive = TRUE;

/* initialize SDL */
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )

{
fprintf( stderr, “Video initialization failed: %s\n”,
SDL_GetError( ) );
Quit( 1 );
}

/* Fetch the video info */
videoInfo = SDL_GetVideoInfo( );

if ( !videoInfo )

{
fprintf( stderr, “Video query failed: %s\n”,
SDL_GetError( ) );
Quit( 1 );
}

/* the flags to pass to SDL_SetVideoMode */
videoFlags  = SDL_OPENGL;          /* Enable OpenGL in SDL */
videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
videoFlags |= SDL_HWPALETTE;       /* Store the palette in hardware */
videoFlags |= SDL_RESIZABLE;       /* Enable window resizing */

/* This checks to see if surfaces can be stored in memory */
if ( videoInfo->hw_available )

videoFlags |= SDL_HWSURFACE;
else
videoFlags |= SDL_SWSURFACE;

/* This checks if hardware blits can be done */
if ( videoInfo->blit_hw )

videoFlags |= SDL_HWACCEL;

/* Sets up OpenGL double buffering */
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

/* get a SDL surface */
surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,

videoFlags );

/* Verify there is a surface */
if ( !surface )

{
fprintf( stderr, “Video mode set failed: %s\n”, SDL_GetError( ) );
Quit( 1 );
}

/* initialize OpenGL */
if ( initGL( ) == FALSE )

{
fprintf( stderr, “Could not initialize OpenGL.\n” );
Quit( 1 );
}

/* Resize the initial window */
resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT );

/* wait for events */
while ( !done )

{
/* handle the events in the queue */

while ( SDL_PollEvent( &event ) )

{
switch( event.type )
{
case SDL_ACTIVEEVENT:
/* Something’s happend with our focus
* If we lost focus or we are iconified, we
* shouldn’t draw the screen
/
if ( event.active.gain == 0 )
isActive = FALSE;
else
isActive = TRUE;
break;
case SDL_VIDEORESIZE:
/
handle resize event /
surface = SDL_SetVideoMode( event.resize.w,
event.resize.h,
16, videoFlags );
if ( !surface )
{
fprintf( stderr, “Could not get a surface after resize: %s\n”,
SDL_GetError( ) );
Quit( 1 );
}
resizeWindow( event.resize.w, event.resize.h );
break;
case SDL_KEYDOWN:
/
handle key presses /
handleKeyPress( &event.key.keysym );
break;
case SDL_QUIT:
/
handle quit requests */
done = TRUE;
break;
default:
break;
}
}

/* draw the scene */
if ( isActive )

drawGLScene( );
}

/* clean ourselves up and exit */
Quit( 0 );

/* Should never get here */
return( 0 );

}


SDL mailing list
SDL at libsdl.org
http://www.libsdl.org/mailman/listinfo/sdl

But I have notice that it only works on JPEGs of a certain size ie 1616,
32
32, etc what if I have a JPEG that is 137pxl wide and 873 High?

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1On Monday 12 May 2003 06:37, Tim wrote:

But I have notice that it only works on JPEGs of a certain size ie 1616,
32
32, etc what if I have a JPEG that is 137pxl wide and 873 High?

That doesn’t have anything to do with the fact that it’s a JPEG.
There’s a golden rule in OpenGL that sizes of textures must be powers of
two. So a texture size of 16x128 is okay, but 96x96 is not.
If you images that don’t match this size, you’ve basically got two options:

    • if you need to tile the image, just stretch it to fit into an OpenGL
      texture
    • otherwise, load the image into a texture that is big enough and leave the
      remaining space empty (black or white or whatever). You could try to
      combine several non-power-of-two images into one texture to save some video
      memory. I’ve got code to do this in RTTS. Have a look at
      http://www.rtts.org/source/hal_sdlgl.cpp.html, search for “piclump”,
      especially PL_Alloc().

cu,
Nicolai
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD8DBQE+wOhhsxPozBga0lwRAsCtAKCqtVj9UEMdHyHEY9Ci29WhkD82IACdG/UO
x/D8z6/3MrRw0GyelbYdxE8=
=Js0D
-----END PGP SIGNATURE-----