- // Struktur, die unabhängig vom Grafikformat alle
- // benötigten Daten des Bildes enthält:
- typedef struct
- {
- unsigned short sizeX; // Breite
- unsigned short sizeY; // Höhe
- unsigned short sizeZ; // Farbtiefe
- unsigned short pitch; // Zeilenlänge
- unsigned char *data; // Zeiger auf Pixeldaten
- } TImage;
- // ------------------------------------------------------------
- TImage *ImageLoad (char *filename)
- // ImageLoad legt dynamisch eine TImage-Struktur an,
- // lädt das Bild hinein und liefert einen Zeiger
- // auf die Struktur zurück
- {
- TImage *final;
- SDL_Surface* sdlImage;
- int x, y;
- unsigned char *sdldata;
- #if defined (HAVE_SDL) // compilieren, falls SDL vorhanden
- sdlImage = IMG_Load (filename);
- final = (TImage *) malloc (sizeof (TImage)); // Speicher für die TImage-Struktur allokieren:
- // Grafikparameter übertragen:
- final->sizeX = sdlImage->w;
- final->sizeY = sdlImage->h;
- final->sizeZ = sdlImage->format->BytesPerPixel;
- final->pitch = sdlImage->pitch;
- // Speicher für die Pixeldaten allokieren:
- final->data = (unsigned char *) malloc (final->pitch * final->sizeY * sizeof (unsigned char));
- // SDL-Surface sperren, falls erforderlich
- if (SDL_MUSTLOCK(sdlImage)) {
- if (SDL_LockSurface (sdlImage) < 0) return NULL;
- }
- // Pixeldaten in die Struktur schaufeln, hier vertikal gespiegelt:
- sdldata = sdlImage->pixels;
- for (y=0; y <final->sizeY; y++) {
- for (x=0; x < final->pitch; x++) {
- final->data [y * final->pitch + x] = sdldata[(final->sizeY-1-y) * final->pitch + x];
- }
- }
- // SDL-Surface wieder aufschließen und frei geben
- if (SDL_MUSTLOCK (sdlImage)) SDL_UnlockSurface (sdlImage);
- SDL_FreeSurface (sdlImage);
- // Rückgabewert: Zeiger auf TImage-Struktur
- return final;
- #else
- // ohne SDL auskommen, andere Methoden
- #endif
- }
- // ------------------------------------------------------------
- GLuint LoadTexture (char *filename)
- {
- TImage *texImage;
- GLuint texid;
- // Image laden und Zeiger auf TImage-Struktur holen:
- texImage = ImageLoad (filename);
- glGenTextures (1, &texid);
- glBindTexture (GL_TEXTURE_2D, texid);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
- glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- // bei sizeZ = 3 wird GL_RGB übergeben, sonst GL_RGBA
- gluBuild2DMipmaps (GL_TEXTURE_2D,
- texImage->sizeZ,
- texImage->sizeX,
- texImage->sizeY,
- texImage->sizeZ == 3 ? GL_RGB : GL_RGBA,
- GL_UNSIGNED_BYTE,
- texImage->data);
- free (texImage->data);
- free (texImage);
- return texid;
- }