本文整理汇总了C++中SDL_RWread函数的典型用法代码示例。如果您正苦于以下问题:C++ SDL_RWread函数的具体用法?C++ SDL_RWread怎么用?C++ SDL_RWread使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了SDL_RWread函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _mm_RWopsReader_Get
static int _mm_RWopsReader_Get(MREADER* reader)
{
char buf;
if ( SDL_RWread(((MRWOPSREADER*)reader)->rw, &buf, 1, 1) != 1 ) return EOF;
else return (int)buf;
}
示例2: ldat_create
/* Open an SDL_RWops for reading */
LDAT *ldat_open_rw (SDL_RWops * rw)
{
char header[LDAT_MAGIC_LEN];
LDAT *newldat;
LDAT_Block *newblock;
Uint16 i, itemcount;
Uint8 idlen;
newldat = ldat_create ();
newldat->data = rw;
/* Read header */
SDL_RWread (newldat->data, header, 1, LDAT_MAGIC_LEN);
if (strncmp (header, "LDAT", 4)) {
fprintf (stderr,"Error: this is not an LDAT archive !\n");
return NULL;
}
if (header[4] != LDAT_MAJOR) {
fprintf (stderr, "Error: Unsupported version (%d.%d) !\n", header[4],
header[5]);
fprintf (stderr, "Latest supported version is %d.%d\n", LDAT_MAJOR,
LDAT_MINOR);
return NULL;
}
/* Read catalog */
if(Luola_ReadLE16 (newldat->data,&itemcount) == -1) {
fprintf(stderr,"Error occured while reading itemcount!\n");
}
for (i = 0; i < itemcount; i++) {
newblock = malloc (sizeof (LDAT_Block));
memset (newblock, 0, sizeof (LDAT_Block));
if (SDL_RWread (newldat->data, &idlen, 1, 1) == -1) {
fprintf (stderr, "(%d) Error occured while reading idlen!\n", i);
return NULL;
}
newblock->ID = malloc (idlen + 1);
if (SDL_RWread (newldat->data, newblock->ID, 1, idlen) == -1) {
fprintf (stderr, "(%d) Error occured while reading ID string!\n", i);
return NULL;
}
newblock->ID[idlen] = '\0';
if (Luola_ReadLE16(newldat->data, &newblock->index) == -1) {
fprintf (stderr, "(%d) Error occured while reading index number!\n", i);
return NULL;
}
if (Luola_ReadLE32(newldat->data, &newblock->pos) == -1) {
fprintf (stderr, "(%d) Error occured while reading position!\n", i);
return NULL;
}
if (Luola_ReadLE32(newldat->data, &newblock->size) == -1) {
fprintf (stderr, "(%d) Error occured while reading size!\n", i);
return NULL;
}
if (newldat->catalog == NULL)
newldat->catalog = newblock;
else {
newblock->prev = newldat->catalog;
newldat->catalog->next = newblock;
newldat->catalog = newblock;
}
}
newldat->catalog_size = SDL_RWtell (newldat->data) - LDAT_HEADER_LEN;
/* Rewing catalog */
while (newldat->catalog->prev)
newldat->catalog = newldat->catalog->prev;
return newldat;
}
示例3: sdl_read_func
static size_t sdl_read_func(void *ptr, size_t size, size_t nmemb, void *datasource)
{
return SDL_RWread((SDL_RWops*)datasource, ptr, size, nmemb);
}
示例4: ERROR
SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)
{
SDL_Surface *surface = NULL;
int width, height;
int maxval, y, bpl;
Uint8 *row;
Uint8 *buf = NULL;
char *error = NULL;
Uint8 magic[2];
int ascii;
enum { PBM, PGM, PPM } kind;
#define ERROR(s) do { error = (s); goto done; } while(0)
if ( !src ) {
/* The error message has been set in SDL_RWFromFile */
return NULL;
}
SDL_RWread(src, magic, 2, 1);
kind = magic[1] - '1';
ascii = 1;
if(kind >= 3) {
ascii = 0;
kind -= 3;
}
width = ReadNumber(src);
height = ReadNumber(src);
if(width <= 0 || height <= 0)
ERROR("Unable to read image width and height");
if(kind != PBM) {
maxval = ReadNumber(src);
if(maxval <= 0 || maxval > 255)
ERROR("unsupported PNM format");
} else
maxval = 255; /* never scale PBMs */
/* binary PNM allows just a single character of whitespace after
the last parameter, and we've already consumed it */
if(kind == PPM) {
/* 24-bit surface in R,G,B byte order */
surface = SDL_AllocSurface(SDL_SWSURFACE, width, height, 24,
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
0x000000ff, 0x0000ff00, 0x00ff0000,
#else
0x00ff0000, 0x0000ff00, 0x000000ff,
#endif
0);
} else {
/* load PBM/PGM as 8-bit indexed images */
surface = SDL_AllocSurface(SDL_SWSURFACE, width, height, 8,
0, 0, 0, 0);
}
if ( surface == NULL )
ERROR("Out of memory");
bpl = width * surface->format->BytesPerPixel;
if(kind == PGM) {
SDL_Color *c = surface->format->palette->colors;
int i;
for(i = 0; i < 256; i++)
c[i].r = c[i].g = c[i].b = i;
surface->format->palette->ncolors = 256;
} else if(kind == PBM) {
/* for some reason PBM has 1=black, 0=white */
SDL_Color *c = surface->format->palette->colors;
c[0].r = c[0].g = c[0].b = 255;
c[1].r = c[1].g = c[1].b = 0;
surface->format->palette->ncolors = 2;
bpl = (width + 7) >> 3;
buf = malloc(bpl);
if(buf == NULL)
ERROR("Out of memory");
}
示例5: SDL_RWread
size_t SDLRWops::read(void *ptr, size_t size, size_t num)
{
return SDL_RWread(rwops_, ptr, num, size);
}
示例6: SDL_RWtell
NativeMidiSong *native_midi_loadsong_RW(SDL_RWops *rw)
{
NativeMidiSong *retval = NULL;
void *buf = NULL;
int len = 0;
CFDataRef data = NULL;
if (SDL_RWseek(rw, 0, RW_SEEK_END) < 0)
goto fail;
len = SDL_RWtell(rw);
if (len < 0)
goto fail;
if (SDL_RWseek(rw, 0, RW_SEEK_SET) < 0)
goto fail;
buf = malloc(len);
if (buf == NULL)
goto fail;
if (SDL_RWread(rw, buf, len, 1) != 1)
goto fail;
retval = malloc(sizeof(NativeMidiSong));
if (retval == NULL)
goto fail;
memset(retval, '\0', sizeof (*retval));
if (NewMusicPlayer(&retval->player) != noErr)
goto fail;
if (NewMusicSequence(&retval->sequence) != noErr)
goto fail;
data = CFDataCreate(NULL, (const UInt8 *) buf, len);
if (data == NULL)
goto fail;
free(buf);
buf = NULL;
#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 /* this is deprecated, but works back to 10.3 */
if (MusicSequenceLoadSMFDataWithFlags(retval->sequence, data, 0) != noErr)
goto fail;
#else /* not deprecated, but requires 10.5 or later */
if (MusicSequenceFileLoadData(retval->sequence, data, 0, 0) != noErr)
goto fail;
#endif
CFRelease(data);
data = NULL;
if (GetSequenceLength(retval->sequence, &retval->endTime) != noErr)
goto fail;
if (MusicPlayerSetSequence(retval->player, retval->sequence) != noErr)
goto fail;
return retval;
fail:
if (retval) {
if (retval->sequence)
DisposeMusicSequence(retval->sequence);
if (retval->player)
DisposeMusicPlayer(retval->player);
free(retval);
}
if (data)
CFRelease(data);
if (buf)
free(buf);
return NULL;
}
示例7: loadSound
size_t THSoundArchive::getSoundDuration(size_t iIndex)
{
SDL_RWops *pFile = loadSound(iIndex);
if(!pFile)
return 0;
uint16_t iWaveAudioFormat = 0;
uint16_t iWaveChannelCount = 0;
uint32_t iWaveSampleRate = 0;
uint32_t iWaveByteRate = 0;
uint16_t iWaveBlockAlign = 0;
uint16_t iWaveBitsPerSample = 0;
uint32_t iWaveDataLength = 0;
// This is a very crude RIFF parser, but it does the job.
uint32_t iFourCC;
uint32_t iChunkLength;
for(;;)
{
if(SDL_RWread(pFile, &iFourCC, 4, 1) != 1)
break;
if(SDL_RWread(pFile, &iChunkLength, 4, 1) != 1)
break;
if(iFourCC == FOURCC('R','I','F','F') || iFourCC == FOURCC('L','I','S','T'))
{
if(iChunkLength >= 4)
{
if(SDL_RWread(pFile, &iFourCC, 4, 1) != 1)
break;
else
continue;
}
}
if(iFourCC == FOURCC('f','m','t',' ') && iChunkLength >= 16)
{
if(SDL_RWread(pFile, &iWaveAudioFormat, 2, 1) != 1)
break;
if(SDL_RWread(pFile, &iWaveChannelCount, 2, 1) != 1)
break;
if(SDL_RWread(pFile, &iWaveSampleRate, 4, 1) != 1)
break;
if(SDL_RWread(pFile, &iWaveByteRate, 4, 1) != 1)
break;
if(SDL_RWread(pFile, &iWaveBlockAlign, 2, 1) != 1)
break;
if(SDL_RWread(pFile, &iWaveBitsPerSample, 2, 1) != 1)
break;
iChunkLength -= 16;
}
//Finally:
if(iFourCC == FOURCC('d','a','t','a'))
{
iWaveDataLength = iChunkLength;
break;
}
if(SDL_RWseek(pFile, iChunkLength + (iChunkLength & 1), RW_SEEK_CUR) == -1) {
break;
}
}
SDL_RWclose(pFile);
if(iWaveAudioFormat != 1 || iWaveChannelCount == 0 || iWaveSampleRate == 0
|| iWaveDataLength == 0 || iWaveBitsPerSample == 0)
{
return 0;
}
#define mul64(a, b) (static_cast<uint64_t>(a) * static_cast<uint64_t>(b))
return static_cast<size_t>(mul64(iWaveDataLength, 8000) /
mul64(mul64(iWaveBitsPerSample, iWaveChannelCount), iWaveSampleRate));
#undef mul64
}
示例8: Sys_extError
void TR_Level::read_tr5_room(SDL_RWops * const src, tr5_room_t & room)
{
uint32_t room_data_size;
//uint32_t portal_offset;
uint32_t sector_data_offset;
uint32_t static_meshes_offset;
uint32_t layer_offset;
uint32_t vertices_offset;
uint32_t poly_offset;
uint32_t poly_offset2;
uint32_t vertices_size;
//uint32_t light_size;
SDL_RWops *newsrc = NULL;
uint32_t temp;
uint32_t i;
uint8_t *buffer;
if (read_bitu32(src) != 0x414C4558)
Sys_extError("read_tr5_room: 'XELA' not found");
room_data_size = read_bitu32(src);
buffer = new uint8_t[room_data_size];
if (SDL_RWread(src, buffer, 1, room_data_size) < room_data_size)
Sys_extError("read_tr5_room: room_data");
if ((newsrc = SDL_RWFromMem(buffer, room_data_size)) == NULL)
Sys_extError("read_tr5_room: SDL_RWFromMem");
room.intensity1 = 32767;
room.intensity2 = 32767;
room.light_mode = 0;
if (read_bitu32(newsrc) != 0xCDCDCDCD)
Sys_extWarn("read_tr5_room: seperator1 has wrong value");
/*portal_offset = */read_bit32(newsrc); // StartPortalOffset? // endSDOffset
sector_data_offset = read_bitu32(newsrc); // StartSDOffset
temp = read_bitu32(newsrc);
if ((temp != 0) && (temp != 0xCDCDCDCD))
Sys_extWarn("read_tr5_room: seperator2 has wrong value");
static_meshes_offset = read_bitu32(newsrc); // endPortalOffset
// static_meshes_offset or room_layer_offset
// read and change coordinate system
room.offset.x = (float)read_bit32(newsrc);
room.offset.y = read_bitu32(newsrc);
room.offset.z = (float)-read_bit32(newsrc);
room.y_bottom = (float)-read_bit32(newsrc);
room.y_top = (float)-read_bit32(newsrc);
room.num_zsectors = read_bitu16(newsrc);
room.num_xsectors = read_bitu16(newsrc);
room.light_colour.b = read_bitu8(newsrc) / 255.0f;
room.light_colour.g = read_bitu8(newsrc) / 255.0f;
room.light_colour.r = read_bitu8(newsrc) / 255.0f;
room.light_colour.a = read_bitu8(newsrc) / 255.0f;
room.num_lights = read_bitu16(newsrc);
if (room.num_lights > 512)
Sys_extWarn("read_tr5_room: num_lights > 512");
room.num_static_meshes = read_bitu16(newsrc);
if (room.num_static_meshes > 512)
Sys_extWarn("read_tr5_room: num_static_meshes > 512");
room.reverb_info = read_bitu8(newsrc);
room.alternate_group = read_bitu8(newsrc);
room.water_scheme = read_bitu16(newsrc);
if (read_bitu32(newsrc) != 0x00007FFF)
Sys_extWarn("read_tr5_room: filler1 has wrong value");
if (read_bitu32(newsrc) != 0x00007FFF)
Sys_extWarn("read_tr5_room: filler2 has wrong value");
if (read_bitu32(newsrc) != 0xCDCDCDCD)
Sys_extWarn("read_tr5_room: seperator4 has wrong value");
if (read_bitu32(newsrc) != 0xCDCDCDCD)
Sys_extWarn("read_tr5_room: seperator5 has wrong value");
if (read_bitu32(newsrc) != 0xFFFFFFFF)
Sys_extWarn("read_tr5_room: seperator6 has wrong value");
room.alternate_room = read_bit16(newsrc);
room.flags = read_bitu16(newsrc);
room.unknown_r1 = read_bitu32(newsrc);
room.unknown_r2 = read_bitu32(newsrc);
room.unknown_r3 = read_bitu32(newsrc);
temp = read_bitu32(newsrc);
if ((temp != 0) && (temp != 0xCDCDCDCD))
Sys_extWarn("read_tr5_room: seperator7 has wrong value");
room.unknown_r4a = read_bitu16(newsrc);
//.........这里部分代码省略.........
示例9: read_bitu32
void TR_Level::read_tr5_level(SDL_RWops * const src)
{
uint32_t i;
uint8_t *comp_buffer = NULL;
uint8_t *uncomp_buffer = NULL;
SDL_RWops *newsrc = NULL;
// Version
uint32_t file_version = read_bitu32(src);
if (file_version != 0x00345254)
Sys_extError("Wrong level version");
this->num_textiles = 0;
this->num_room_textiles = 0;
this->num_obj_textiles = 0;
this->num_bump_textiles = 0;
this->num_misc_textiles = 0;
this->read_32bit_textiles = false;
uint32_t uncomp_size;
uint32_t comp_size;
unsigned long size;
this->num_room_textiles = read_bitu16(src);
this->num_obj_textiles = read_bitu16(src);
this->num_bump_textiles = read_bitu16(src);
this->num_misc_textiles = 3;
this->num_textiles = this->num_room_textiles + this->num_obj_textiles + this->num_bump_textiles + this->num_misc_textiles;
uncomp_size = read_bitu32(src);
if (uncomp_size == 0)
Sys_extError("read_tr5_level: textiles32 uncomp_size == 0");
comp_size = read_bitu32(src);
if (comp_size > 0) {
uncomp_buffer = new uint8_t[uncomp_size];
this->textile32.resize( this->num_textiles );
comp_buffer = new uint8_t[comp_size];
if (SDL_RWread(src, comp_buffer, 1, comp_size) < comp_size)
Sys_extError("read_tr5_level: textiles32");
size = uncomp_size;
if (uncompress(uncomp_buffer, &size, comp_buffer, comp_size) != Z_OK)
Sys_extError("read_tr5_level: uncompress");
if (size != uncomp_size)
Sys_extError("read_tr5_level: uncompress size mismatch");
delete [] comp_buffer;
comp_buffer = NULL;
if ((newsrc = SDL_RWFromMem(uncomp_buffer, uncomp_size)) == NULL)
Sys_extError("read_tr5_level: SDL_RWFromMem");
for (i = 0; i < (this->num_textiles - this->num_misc_textiles); i++)
read_tr4_textile32(newsrc, this->textile32[i]);
SDL_RWclose(newsrc);
newsrc = NULL;
delete [] uncomp_buffer;
uncomp_buffer = NULL;
this->read_32bit_textiles = true;
}
uncomp_size = read_bitu32(src);
if (uncomp_size == 0)
Sys_extError("read_tr5_level: textiles16 uncomp_size == 0");
comp_size = read_bitu32(src);
if (comp_size > 0) {
if (this->textile32.empty()) {
uncomp_buffer = new uint8_t[uncomp_size];
this->textile16_count = this->num_textiles;
this->textile16 = (tr2_textile16_t*)malloc(this->textile16_count * sizeof(tr2_textile16_t));
comp_buffer = new uint8_t[comp_size];
if (SDL_RWread(src, comp_buffer, 1, comp_size) < comp_size)
Sys_extError("read_tr5_level: textiles16");
size = uncomp_size;
if (uncompress(uncomp_buffer, &size, comp_buffer, comp_size) != Z_OK)
Sys_extError("read_tr5_level: uncompress");
if (size != uncomp_size)
Sys_extError("read_tr5_level: uncompress size mismatch");
delete [] comp_buffer;
comp_buffer = NULL;
if ((newsrc = SDL_RWFromMem(uncomp_buffer, uncomp_size)) == NULL)
Sys_extError("read_tr5_level: SDL_RWFromMem");
for (i = 0; i < (this->num_textiles - this->num_misc_textiles); i++)
read_tr2_textile16(newsrc, this->textile16[i]);
SDL_RWclose(newsrc);
newsrc = NULL;
delete [] uncomp_buffer;
//.........这里部分代码省略.........
示例10: SDL_LoadBMP_RW
SDL_Surface *
SDL_LoadBMP_RW(SDL_RWops * src, int freesrc)
{
SDL_bool was_error;
Sint64 fp_offset = 0;
int bmpPitch;
int i, pad;
SDL_Surface *surface;
Uint32 Rmask = 0;
Uint32 Gmask = 0;
Uint32 Bmask = 0;
Uint32 Amask = 0;
SDL_Palette *palette;
Uint8 *bits;
Uint8 *top, *end;
SDL_bool topDown;
int ExpandBMP;
SDL_bool haveRGBMasks = SDL_FALSE;
SDL_bool haveAlphaMask = SDL_FALSE;
SDL_bool correctAlpha = SDL_FALSE;
/* The Win32 BMP file header (14 bytes) */
char magic[2];
/* Uint32 bfSize = 0; */
/* Uint16 bfReserved1 = 0; */
/* Uint16 bfReserved2 = 0; */
Uint32 bfOffBits = 0;
/* The Win32 BITMAPINFOHEADER struct (40 bytes) */
Uint32 biSize = 0;
Sint32 biWidth = 0;
Sint32 biHeight = 0;
/* Uint16 biPlanes = 0; */
Uint16 biBitCount = 0;
Uint32 biCompression = 0;
/* Uint32 biSizeImage = 0; */
/* Sint32 biXPelsPerMeter = 0; */
/* Sint32 biYPelsPerMeter = 0; */
Uint32 biClrUsed = 0;
/* Uint32 biClrImportant = 0; */
/* Make sure we are passed a valid data source */
surface = NULL;
was_error = SDL_FALSE;
if (src == NULL) {
was_error = SDL_TRUE;
goto done;
}
/* Read in the BMP file header */
fp_offset = SDL_RWtell(src);
SDL_ClearError();
if (SDL_RWread(src, magic, 1, 2) != 2) {
SDL_Error(SDL_EFREAD);
was_error = SDL_TRUE;
goto done;
}
if (SDL_strncmp(magic, "BM", 2) != 0) {
SDL_SetError("File is not a Windows BMP file");
was_error = SDL_TRUE;
goto done;
}
/* bfSize = */ SDL_ReadLE32(src);
/* bfReserved1 = */ SDL_ReadLE16(src);
/* bfReserved2 = */ SDL_ReadLE16(src);
bfOffBits = SDL_ReadLE32(src);
/* Read the Win32 BITMAPINFOHEADER */
biSize = SDL_ReadLE32(src);
if (biSize == 12) { /* really old BITMAPCOREHEADER */
biWidth = (Uint32) SDL_ReadLE16(src);
biHeight = (Uint32) SDL_ReadLE16(src);
/* biPlanes = */ SDL_ReadLE16(src);
biBitCount = SDL_ReadLE16(src);
biCompression = BI_RGB;
} else if (biSize >= 40) { /* some version of BITMAPINFOHEADER */
Uint32 headerSize;
biWidth = SDL_ReadLE32(src);
biHeight = SDL_ReadLE32(src);
/* biPlanes = */ SDL_ReadLE16(src);
biBitCount = SDL_ReadLE16(src);
biCompression = SDL_ReadLE32(src);
/* biSizeImage = */ SDL_ReadLE32(src);
/* biXPelsPerMeter = */ SDL_ReadLE32(src);
/* biYPelsPerMeter = */ SDL_ReadLE32(src);
biClrUsed = SDL_ReadLE32(src);
/* biClrImportant = */ SDL_ReadLE32(src);
/* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */
if (biSize == 64) {
/* ignore these extra fields. */
if (biCompression == BI_BITFIELDS) {
/* this value is actually huffman compression in this variant. */
SDL_SetError("Compressed BMP files not supported");
was_error = SDL_TRUE;
goto done;
}
} else {
/* This is complicated. If compression is BI_BITFIELDS, then
we have 3 DWORDS that specify the RGB masks. This is either
//.........这里部分代码省略.........
示例11: open_music
//.........这里部分代码省略.........
int MIX_string_equals(const char *str1, const char *str2)
{
while ( *str1 && *str2 ) {
if ( toupper((unsigned char)*str1) !=
toupper((unsigned char)*str2) )
break;
++str1;
++str2;
}
return (!*str1 && !*str2);
}
/* Load a music file */
Mix_Music *Mix_LoadMUS(const char *file)
{
char *ext;
Uint8 magic[5];
Mix_Music *music;
SDL_RWops *src; //maks
/* Figure out what kind of file this is */
/*fp = fopen(file, "rb"); //maks
if ( (fp == NULL) || !fread(magic, 4, 1, fp) ) {
if ( fp != NULL ) {
fclose(fp);
}
Mix_SetError("Couldn't read from '%s'", file);
return(NULL);
}
magic[4] = '\0';
fclose(fp);*/
src = SDL_RWFromFile(file, "rb"); //maks
if ( (src == NULL) || !SDL_RWread(src, magic, 4, 1) ) {
if ( src != NULL ) {
SDL_RWclose(src);
}
Mix_SetError("Couldn't read from '%s'", file);
return(NULL);
}
magic[4] = '\0';
SDL_RWclose(src);
/* Figure out the file extension, so we can determine the type */
ext = strrchr(file, '.');
if ( ext ) ++ext; /* skip the dot in the extension */
/* Allocate memory for the music structure */
music = (Mix_Music *)malloc(sizeof(Mix_Music));
if ( music == NULL ) {
Mix_SetError("Out of memory");
return(NULL);
}
music->error = 0;
#ifdef CMD_MUSIC
if ( music_cmd ) {
music->type = MUS_CMD;
music->data.cmd = MusicCMD_LoadSong(music_cmd, file);
if ( music->data.cmd == NULL ) {
music->error = 1;
}
} else
#endif
#ifdef WAV_MUSIC
/* WAVE files have the magic four bytes "RIFF"
示例12: cfg_OpenFile
// opens the file, returns NULL if it fails.
void* cfg_OpenFile( const char* fileName )
{
if( SDL_strlen( fileName ) >= ( FILE_PATH_LEN - 1 ) ) {
llog( LOG_ERROR, "Configuration file path too long" );
return NULL;
}
CFGFile* newFile = (CFGFile*)mem_Allocate( sizeof( CFGFile ) );
if( newFile == NULL ) {
llog( LOG_INFO, "Unable to open configuration file." );
return NULL;
}
newFile->sbAttributes = NULL;
SDL_strlcpy( newFile->filePath, fileName, FILE_PATH_LEN - 1 );
newFile->filePath[FILE_PATH_LEN-1] = 0;
SDL_RWops* rwopsFile = SDL_RWFromFile( fileName, "r" );
if( rwopsFile == NULL ) {
// file doesn't exist, just create a new empty configuration file to use
return newFile;
}
// TODO: change this so everything is happening in place and there are no allocations
// parse what this configuration file currently has in it
char buffer[READ_BUFFER_SIZE];
size_t numRead;
char* fileText = NULL;
llog( LOG_INFO, "Stream size: %i", (int)SDL_RWsize( rwopsFile ) );
while( ( numRead = SDL_RWread( rwopsFile, (void*)buffer, sizeof( char ), sizeof( buffer ) ) ) != 0 ) {
char* c = sb_Add( fileText, (int)numRead );
for( size_t i = 0; i < numRead; ++i ) {
*c++ = buffer[i];
}
}
sb_Push( fileText, 0 ); // make this c-string compatible
// got the entire file text, now tokenize and parse
// only tokens we're worried about are '=' and '/r/n'
// everything before the '=' is the attribute name, everything
// after is the attribute value, all white space should be cut
// off of each end
int gettingAttrName = 1;
const char* delimiters = "\f\v\t =\r\n";
char* token = strtok( fileText, delimiters );
CFGAttribute attr;
while( token != NULL ) {
// cut off white space, don't care about preserving memory
if( gettingAttrName ) {
SDL_strlcpy( attr.fileName, token, sizeof( attr.fileName ) - 1 );
attr.fileName[sizeof( attr.fileName ) - 1] = 0;
gettingAttrName = 0;
} else {
attr.value = SDL_atoi( token );
sb_Push( newFile->sbAttributes, attr );
llog( LOG_INFO, "New attribute: %s %i", attr.fileName, attr.value );
gettingAttrName = 1;
}
token = strtok( NULL, delimiters );
}
sb_Release( fileText );
SDL_RWclose( rwopsFile );
return newFile;
}
示例13: main
//.........这里部分代码省略.........
fprintf(stderr, "The -fps option requires an argument [from 1 to 1000], default is 12.\n");
return -1;
}
} else
if ((strcmp(argv[1], "-help") == 0 ) || (strcmp(argv[1], "-h") == 0))
{
PrintUsage(argv[0]);
return 0;
} else
{
fprintf(stderr, "Unrecognized option: %s.\n", argv[1]);
return -1;
}
break;
}
RawMooseData=(Uint8*)malloc(MOOSEFRAME_SIZE * MOOSEFRAMES_COUNT);
if (RawMooseData==NULL)
{
fprintf(stderr, "Can't allocate memory for movie !\n");
free(RawMooseData);
return 1;
}
/* load the trojan moose images */
handle=SDL_RWFromFile("moose.dat", "rb");
if (handle==NULL)
{
fprintf(stderr, "Can't find the file moose.dat !\n");
free(RawMooseData);
return 2;
}
SDL_RWread(handle, RawMooseData, MOOSEFRAME_SIZE, MOOSEFRAMES_COUNT);
SDL_RWclose(handle);
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0)
{
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
free(RawMooseData);
return 3;
}
atexit(SDL_Quit);
/* Set video mode */
if ( (screen=SDL_SetVideoMode(MOOSEPIC_W*scale, MOOSEPIC_H*scale, 0, SDL_RESIZABLE | SDL_SWSURFACE)) == NULL )
{
fprintf(stderr, "Couldn't set video mode: %s\n", 0, SDL_GetError());
free(RawMooseData);
return 4;
}
/* Set the window manager title bar */
SDL_WM_SetCaption("SDL test overlay: running moose", "testoverlay2");
for (i=0; i<MOOSEFRAMES_COUNT; i++)
{
MooseFrame[i]=SDL_CreateRGBSurfaceFrom(RawMooseData+i*MOOSEFRAME_SIZE, MOOSEPIC_W,
MOOSEPIC_H, 8, MOOSEPIC_W, 0, 0, 0, 0);
if (MooseFrame[i]==NULL)
{
fprintf(stderr, "Couldn't create SDL_Surfaces:%s\n", 0, SDL_GetError());
free(RawMooseData);
return 5;
}
示例14: read_next_frame
/* Reads the next frame from the file. Returns true on success or
false on failure. */
static int
read_next_frame(mad_data *mp3_mad) {
if (mp3_mad->stream.buffer == NULL ||
mp3_mad->stream.error == MAD_ERROR_BUFLEN) {
size_t read_size;
size_t remaining;
unsigned char *read_start;
/* There might be some bytes in the buffer left over from last
time. If so, move them down and read more bytes following
them. */
if (mp3_mad->stream.next_frame != NULL) {
remaining = mp3_mad->stream.bufend - mp3_mad->stream.next_frame;
memmove(mp3_mad->input_buffer, mp3_mad->stream.next_frame, remaining);
read_start = mp3_mad->input_buffer + remaining;
read_size = MAD_INPUT_BUFFER_SIZE - remaining;
} else {
read_size = MAD_INPUT_BUFFER_SIZE;
read_start = mp3_mad->input_buffer;
remaining = 0;
}
/* Now read additional bytes from the input file. */
read_size = SDL_RWread(mp3_mad->rw, read_start, 1, read_size);
if (read_size <= 0) {
if ((mp3_mad->status & (MS_input_eof | MS_input_error)) == 0) {
if (read_size == 0) {
mp3_mad->status |= MS_input_eof;
} else {
mp3_mad->status |= MS_input_error;
}
/* At the end of the file, we must stuff MAD_BUFFER_GUARD
number of 0 bytes. */
memset(read_start + read_size, 0, MAD_BUFFER_GUARD);
read_size += MAD_BUFFER_GUARD;
}
}
/* Now feed those bytes into the libmad stream. */
mad_stream_buffer(&mp3_mad->stream, mp3_mad->input_buffer,
read_size + remaining);
mp3_mad->stream.error = MAD_ERROR_NONE;
}
/* Now ask libmad to extract a frame from the data we just put in
its buffer. */
if (mad_frame_decode(&mp3_mad->frame, &mp3_mad->stream)) {
if (MAD_RECOVERABLE(mp3_mad->stream.error)) {
return 0;
} else if (mp3_mad->stream.error == MAD_ERROR_BUFLEN) {
return 0;
} else {
mp3_mad->status |= MS_decode_error;
return 0;
}
}
mp3_mad->frames_read++;
mad_timer_add(&mp3_mad->next_frame_start, mp3_mad->frame.header.duration);
return 1;
}
示例15: SDL_GameControllerAddMappingsFromRW
/*
* Add or update an entry into the Mappings Database
*/
int
SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw)
{
const char *platform = SDL_GetPlatform();
int controllers = 0;
char *buf, *line, *line_end, *tmp, *comma, line_platform[64];
size_t db_size, platform_len;
if (rw == NULL) {
return SDL_SetError("Invalid RWops");
}
db_size = (size_t)SDL_RWsize(rw);
buf = (char *)SDL_malloc(db_size + 1);
if (buf == NULL) {
if (freerw) {
SDL_RWclose(rw);
}
return SDL_SetError("Could not allocate space to read DB into memory");
}
if (SDL_RWread(rw, buf, db_size, 1) != 1) {
if (freerw) {
SDL_RWclose(rw);
}
SDL_free(buf);
return SDL_SetError("Could not read DB");
}
if (freerw) {
SDL_RWclose(rw);
}
buf[db_size] = '\0';
line = buf;
while (line < buf + db_size) {
line_end = SDL_strchr(line, '\n');
if (line_end != NULL) {
*line_end = '\0';
} else {
line_end = buf + db_size;
}
/* Extract and verify the platform */
tmp = SDL_strstr(line, SDL_CONTROLLER_PLATFORM_FIELD);
if (tmp != NULL) {
tmp += SDL_strlen(SDL_CONTROLLER_PLATFORM_FIELD);
comma = SDL_strchr(tmp, ',');
if (comma != NULL) {
platform_len = comma - tmp + 1;
if (platform_len + 1 < SDL_arraysize(line_platform)) {
SDL_strlcpy(line_platform, tmp, platform_len);
if (SDL_strncasecmp(line_platform, platform, platform_len) == 0 &&
SDL_GameControllerAddMapping(line) > 0) {
controllers++;
}
}
}
}
line = line_end + 1;
}
SDL_free(buf);
return controllers;
}