- while (!gDone&&!game.quit&&(!game.tryquit))
- {
- if (IsFocused())
- {
- gameFocused = true;
-
- // check windows messages
-
- game.deltah = 0;
- game.deltav = 0;
- SDL_Event e;
- if(!game.isWaiting()) {
- // message pump
- while( SDL_PollEvent( &e ) )
- {
- if( e.type == SDL_QUIT )
- {
- gDone=true;
- break;
- }
- sdlEventProc(e, game);
- }
- }
-
- // game
- DoUpdate(game);
- }
- else
- {
- if (gameFocused)
- {
- // allow game chance to pause
- gameFocused = false;
- DoUpdate(game);
- }
-
- // game is not in focus, give CPU time to other apps by waiting for messages instead of 'peeking'
- SDL_ActiveEvent evt;
- SDL_WaitEvent((SDL_Event*)&evt);
- if (evt.type == SDL_ACTIVEEVENT && evt.gain == 1)
- gameFocused = true;
- else if (evt.type == SDL_QUIT)
- gDone = true;
- }
- }
-
- regnow = game.registernow;
- }
- pgame = 0;
-
- CleanUp ();
-
- return 0;
- }
- catch (const std::exception& error)
- {
- CleanUp();
-
- std::string e = "Caught exception: ";
- e += error.what();
-
- LOG(e);
-
- MessageBox(g_windowHandle, error.what(), "ERROR", MB_OK | MB_ICONEXCLAMATION);
- }
-
- CleanUp();
-
- return -1;
-}
-
-
-
- // --------------------------------------------------------------------------
-
- extern int channels[100];
- extern OPENAL_SAMPLE * samp[100];
- extern OPENAL_STREAM * strm[20];
-
- extern "C" void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
- {
- const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
- if (currSample && currSample == samp[chan])
- {
- if (OPENAL_GetPaused(channels[chan]))
- {
- OPENAL_StopSound(channels[chan]);
- channels[chan] = OPENAL_FREE;
- }
- else if (OPENAL_IsPlaying(channels[chan]))
- {
- int loop_mode = OPENAL_GetLoopMode(channels[chan]);
- if (loop_mode & OPENAL_LOOP_OFF)
- {
- channels[chan] = OPENAL_FREE;
- }
- }
- }
- else
- {
- channels[chan] = OPENAL_FREE;
- }
-
- channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
- if (channels[chan] < 0)
- {
- channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
- }
- }
-
- extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
- {
- const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
- if (currSample && currSample == OPENAL_Stream_GetSample(sptr))
- {
- OPENAL_StopSound(channels[chan]);
- OPENAL_Stream_Stop(sptr);
- }
- else
- {
- OPENAL_Stream_Stop(sptr);
- channels[chan] = OPENAL_FREE;
- }
-
- channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
- if (channels[chan] < 0)
- {
- channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
- }
- }
-
-
- bool LoadImage(const char * fname, TGAImageRec & tex)
- {
- if ( tex.data == NULL )
- return false;
- else
- return load_image(fname, tex);
- }
-
- void ScreenShot(const char * fname)
- {
- save_image(fname);
- }
-
-
-
-static bool load_image(const char *file_name, TGAImageRec &tex)
-{
- const char *ptr = strrchr((char *)file_name, '.');
- if (ptr)
- {
- if (strcasecmp(ptr+1, "png") == 0)
- return load_png(file_name, tex);
- else if (strcasecmp(ptr+1, "jpg") == 0)
- return load_jpg(file_name, tex);
- }
-
- STUBBED("Unsupported image type");
- return false;
-}
-
-
-struct my_error_mgr {
- struct jpeg_error_mgr pub; /* "public" fields */
- jmp_buf setjmp_buffer; /* for return to caller */
-};
-typedef struct my_error_mgr * my_error_ptr;
-
-
-static void my_error_exit(j_common_ptr cinfo)
-{
- struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
- longjmp(err->setjmp_buffer, 1);
-}
-
-/* stolen from public domain example.c code in libjpg distribution. */
-static bool load_jpg(const char *file_name, TGAImageRec &tex)
-{
- struct jpeg_decompress_struct cinfo;
- struct my_error_mgr jerr;
- JSAMPROW buffer[1]; /* Output row buffer */
- int row_stride; /* physical row width in output buffer */
- FILE *infile = fopen(file_name, "rb");
-
- if (infile == NULL)
- return false;
-
- cinfo.err = jpeg_std_error(&jerr.pub);
- jerr.pub.error_exit = my_error_exit;
- if (setjmp(jerr.setjmp_buffer)) {
- jpeg_destroy_decompress(&cinfo);
- fclose(infile);
- return false;
- }
-
- jpeg_create_decompress(&cinfo);
- jpeg_stdio_src(&cinfo, infile);
- (void) jpeg_read_header(&cinfo, TRUE);
-
- cinfo.out_color_space = JCS_RGB;
- cinfo.quantize_colors = 0;
- (void) jpeg_calc_output_dimensions(&cinfo);
- (void) jpeg_start_decompress(&cinfo);
-
- row_stride = cinfo.output_width * cinfo.output_components;
- tex.sizeX = cinfo.output_width;
- tex.sizeY = cinfo.output_height;
- tex.bpp = 24;
-
- while (cinfo.output_scanline < cinfo.output_height) {
- buffer[0] = (JSAMPROW)(char *)tex.data +
- ((cinfo.output_height-1) - cinfo.output_scanline) * row_stride;
- (void) jpeg_read_scanlines(&cinfo, buffer, 1);
- }
-
- (void) jpeg_finish_decompress(&cinfo);
- jpeg_destroy_decompress(&cinfo);
- fclose(infile);
-
- return true;
-}
-
-
-/* stolen from public domain example.c code in libpng distribution. */
-static bool load_png(const char *file_name, TGAImageRec &tex)
-{
- bool hasalpha = false;
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL;
- png_uint_32 width, height;
- int bit_depth, color_type, interlace_type;
- png_byte **rows = NULL;
- bool retval = false;
- png_byte **row_pointers = NULL;
- FILE *fp = fopen(file_name, "rb");
-
- if (fp == NULL)
- return(NULL);
-
- png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (png_ptr == NULL)
- goto png_done;
-
- info_ptr = png_create_info_struct(png_ptr);
- if (info_ptr == NULL)
- goto png_done;
-
- if (setjmp(png_jmpbuf(png_ptr)))
- goto png_done;
-
- png_init_io(png_ptr, fp);
- png_read_png(png_ptr, info_ptr,
- PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING,
- NULL);
- png_get_IHDR(png_ptr, info_ptr, &width, &height,
- &bit_depth, &color_type, &interlace_type, NULL, NULL);
-
- if (bit_depth != 8) // transform SHOULD handle this...
- goto png_done;
-
- if (color_type & PNG_COLOR_MASK_PALETTE) // !!! FIXME?
- goto png_done;
-
- if ((color_type & PNG_COLOR_MASK_COLOR) == 0) // !!! FIXME?
- goto png_done;
-
- hasalpha = ((color_type & PNG_COLOR_MASK_ALPHA) != 0);
- row_pointers = png_get_rows(png_ptr, info_ptr);
- if (!row_pointers)
- goto png_done;
-
- if (!hasalpha)
- {
- png_byte *dst = tex.data;
- for (int i = height-1; i >= 0; i--)
- {
- png_byte *src = row_pointers[i];
- for (int j = 0; j < width; j++)
- {
- dst[0] = src[0];
- dst[1] = src[1];
- dst[2] = src[2];
- dst[3] = 0xFF;
- src += 3;
- dst += 4;