Skip to content

Commit

Permalink
Added support for XV thumbnail images
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Feb 4, 2006
1 parent 289761a commit abc6540
Show file tree
Hide file tree
Showing 7 changed files with 199 additions and 20 deletions.
2 changes: 2 additions & 0 deletions CHANGES
@@ -1,4 +1,6 @@
1.2.5:
Sam Lantinga - Sat Feb 4 15:17:44 PST 2006
* Added support for XV thumbnail images
Gautier Portet - Fri, 19 Mar 2004 17:35:12 +0100
* Added support for 32-bit BMP files with alpha

Expand Down
13 changes: 7 additions & 6 deletions IMG.c
Expand Up @@ -41,15 +41,16 @@ static struct {
/* keep magicless formats first */
{ "TGA", NULL, IMG_LoadTGA_RW },
{ "BMP", IMG_isBMP, IMG_LoadBMP_RW },
{ "PNM", IMG_isPNM, IMG_LoadPNM_RW }, /* P[BGP]M share code */
{ "XPM", IMG_isXPM, IMG_LoadXPM_RW },
{ "XCF", IMG_isXCF, IMG_LoadXCF_RW },
{ "PCX", IMG_isPCX, IMG_LoadPCX_RW },
{ "GIF", IMG_isGIF, IMG_LoadGIF_RW },
{ "JPG", IMG_isJPG, IMG_LoadJPG_RW },
{ "TIF", IMG_isTIF, IMG_LoadTIF_RW },
{ "LBM", IMG_isLBM, IMG_LoadLBM_RW },
{ "PNG", IMG_isPNG, IMG_LoadPNG_RW }
{ "PCX", IMG_isPCX, IMG_LoadPCX_RW },
{ "PNG", IMG_isPNG, IMG_LoadPNG_RW },
{ "PNM", IMG_isPNM, IMG_LoadPNM_RW }, /* P[BGP]M share code */
{ "TIF", IMG_isTIF, IMG_LoadTIF_RW },
{ "XCF", IMG_isXCF, IMG_LoadXCF_RW },
{ "XPM", IMG_isXPM, IMG_LoadXPM_RW },
{ "XV", IMG_isXV, IMG_LoadXV_RW }
};

const SDL_version *IMG_Linked_Version(void)
Expand Down
3 changes: 2 additions & 1 deletion IMG_pnm.c
Expand Up @@ -57,6 +57,7 @@ int IMG_isPNM(SDL_RWops *src)
* P4 PBM, binary format
* P5 PGM, binary format
* P6 PPM, binary format
* P7 PAM, a general wrapper for PNM data
*/
if ( magic[0] == 'P' && magic[1] >= '1' && magic[1] <= '6' ) {
is_PNM = 1;
Expand Down Expand Up @@ -114,7 +115,7 @@ SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)
char *error = NULL;
Uint8 magic[2];
int ascii;
enum { PBM, PGM, PPM } kind;
enum { PBM, PGM, PPM, PAM } kind;

#define ERROR(s) do { error = (s); goto done; } while(0)

Expand Down
166 changes: 166 additions & 0 deletions IMG_xv.c
@@ -0,0 +1,166 @@
/*
SDL_image: An example image loading library for use with SDL
Copyright (C) 1999-2004 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/

/* $Id$ */

/* This is a generic "format not supported" image framework */

#include <stdio.h>
#include <string.h>

#include "SDL_image.h"

#ifdef LOAD_XV

static int get_line(SDL_RWops *src, char *line, int size)
{
while ( size > 0 ) {
if ( SDL_RWread(src, line, 1, 1) <= 0 ) {
return -1;
}
if ( *line == '\r' ) {
continue;
}
if ( *line == '\n' ) {
*line = '\0';
return 0;
}
++line;
--size;
}
/* Out of space for the line */
return -1;
}

static int get_header(SDL_RWops *src, int *w, int *h)
{
char line[1024];

*w = 0;
*h = 0;

/* Check the header magic */
if ( (get_line(src, line, sizeof(line)) < 0) ||
(memcmp(line, "P7 332", 6) != 0) ) {
return -1;
}

/* Read the header */
while ( get_line(src, line, sizeof(line)) == 0 ) {
if ( memcmp(line, "#BUILTIN:", 9) == 0 ) {
/* Builtin image, no data */
break;
}
if ( memcmp(line, "#END_OF_COMMENTS", 16) == 0 ) {
if ( get_line(src, line, sizeof(line)) == 0 ) {
sscanf(line, "%d %d", w, h);
if ( *w >= 0 && *h >= 0 ) {
return 0;
}
}
break;
}
}
/* No image data */
return -1;
}

/* See if an image is contained in a data source */
int IMG_isXV(SDL_RWops *src)
{
int start;
int is_XV;
int w, h;

start = SDL_RWtell(src);
is_XV = 0;
if ( get_header(src, &w, &h) == 0 ) {
is_XV = 1;
}
SDL_RWseek(src, start, SEEK_SET);
return(is_XV);
}

/* Load a XV thumbnail image from an SDL datasource */
SDL_Surface *IMG_LoadXV_RW(SDL_RWops *src)
{
int start;
const char *error = NULL;
SDL_Surface *surface = NULL;
int w, h;
Uint8 *pixels;

if ( !src ) {
/* The error message has been set in SDL_RWFromFile */
return NULL;
}
start = SDL_RWtell(src);

/* Read the header */
if ( get_header(src, &w, &h) < 0 ) {
error = "Unsupported image format";
goto done;
}

/* Create the 3-3-2 indexed palette surface */
surface = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8, 0xe0, 0x1c, 0x03, 0);
if ( surface == NULL ) {
error = "Out of memory";
goto done;
}

/* Load the image data */
for ( pixels = (Uint8 *)surface->pixels; h > 0; --h ) {
if ( SDL_RWread(src, pixels, w, 1) <= 0 ) {
error = "Couldn't read image data";
goto done;
}
pixels += surface->pitch;
}

done:
if ( error ) {
SDL_RWseek(src, start, SEEK_SET);
if ( surface ) {
SDL_FreeSurface(surface);
surface = NULL;
}
IMG_SetError(error);
}
return surface;
}

#else

/* See if an image is contained in a data source */
int IMG_isXV(SDL_RWops *src)
{
return(0);
}

/* Load a XXX type image from an SDL datasource */
SDL_Surface *IMG_LoadXV_RW(SDL_RWops *src)
{
return(NULL);
}

#endif /* LOAD_XV */
3 changes: 2 additions & 1 deletion Makefile.am
Expand Up @@ -18,7 +18,8 @@ libSDL_image_la_SOURCES = \
IMG_tga.c \
IMG_tif.c \
IMG_xcf.c \
IMG_xpm.c
IMG_xpm.c \
IMG_xv.c

EXTRA_DIST = \
CHANGES \
Expand Down
26 changes: 14 additions & 12 deletions SDL_image.h
Expand Up @@ -78,28 +78,30 @@ extern DECLSPEC int SDLCALL IMG_InvertAlpha(int on);

/* Functions to detect a file type, given a seekable source */
extern DECLSPEC int SDLCALL IMG_isBMP(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPNM(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isXPM(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isXCF(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPCX(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isGIF(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isJPG(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isTIF(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPNG(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isLBM(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPCX(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPNG(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isPNM(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isTIF(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isXCF(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isXPM(SDL_RWops *src);
extern DECLSPEC int SDLCALL IMG_isXV(SDL_RWops *src);

/* Individual loading functions */
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadBMP_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXPM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXCF_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPCX_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadGIF_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadJPG_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTIF_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadLBM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPCX_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNG_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadPNM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTGA_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadLBM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadTIF_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXCF_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXPM_RW(SDL_RWops *src);
extern DECLSPEC SDL_Surface * SDLCALL IMG_LoadXV_RW(SDL_RWops *src);

extern DECLSPEC SDL_Surface * SDLCALL IMG_ReadXPMFromArray(char **xpm);

Expand Down
6 changes: 6 additions & 0 deletions configure.in
Expand Up @@ -184,6 +184,12 @@ AC_ARG_ENABLE(xpm,
if test x$enable_xpm = xyes; then
CFLAGS="$CFLAGS -DLOAD_XPM"
fi
AC_ARG_ENABLE(xv,
[ --enable-xv support loading XV thumbnail images [default=yes]],
, enable_xv=yes)
if test x$enable_xv = xyes; then
CFLAGS="$CFLAGS -DLOAD_XV"
fi
AC_SUBST(IMG_LIBS)

# Finally create all the generated files
Expand Down

0 comments on commit abc6540

Please sign in to comment.