summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2017-01-21 15:18:31 -0500
committerFranklin Wei <git@fwei.tk>2017-12-23 21:01:26 -0500
commita855d6202536ff28e5aae4f22a0f31d8f5b325d0 (patch)
tree8c75f224dd64ed360505afa8843d016b0d75000b
parent01c6dcf6c7b9bb1ad2fa0450f99bacc5f3d3e04b (diff)
downloadrockbox-a855d6202536ff28e5aae4f22a0f31d8f5b325d0.tar.gz
rockbox-a855d6202536ff28e5aae4f22a0f31d8f5b325d0.tar.bz2
rockbox-a855d6202536ff28e5aae4f22a0f31d8f5b325d0.zip
Port of Duke Nukem 3D
This ports Fabien Sanglard's Chocolate Duke to run on a version of SDL for Rockbox. Change-Id: I8f2c4c78af19de10c1633ed7bb7a997b43256dd9
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/SOURCES5
-rw-r--r--apps/plugins/SUBDIRS3
-rw-r--r--apps/plugins/duke3d.c31
-rw-r--r--apps/plugins/lib/stdio_compat.c50
-rw-r--r--apps/plugins/lib/stdio_compat.h6
-rw-r--r--apps/plugins/sdl/COPYING458
-rw-r--r--apps/plugins/sdl/CREDITS94
-rw-r--r--apps/plugins/sdl/NOTES5
-rw-r--r--apps/plugins/sdl/README51
-rw-r--r--apps/plugins/sdl/README-SDL.txt13
-rw-r--r--apps/plugins/sdl/README.Porting56
-rw-r--r--apps/plugins/sdl/SDL_image/CHANGES198
-rw-r--r--apps/plugins/sdl/SDL_image/COPYING20
-rw-r--r--apps/plugins/sdl/SDL_image/IMG.c214
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_bmp.c848
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_gif.c625
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_jpg.c495
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_lbm.c503
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_pcx.c276
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_png.c584
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_pnm.c258
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_tga.c336
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_tif.c298
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_webp.c295
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_xcf.c824
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_xpm.c514
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_xv.c165
-rw-r--r--apps/plugins/sdl/SDL_image/IMG_xxx.c87
-rw-r--r--apps/plugins/sdl/SDL_image/README40
-rw-r--r--apps/plugins/sdl/SDL_image/showimage.c216
-rw-r--r--apps/plugins/sdl/SDL_mixer/CHANGES348
-rw-r--r--apps/plugins/sdl/SDL_mixer/COPYING20
-rw-r--r--apps/plugins/sdl/SDL_mixer/Makefile.in133
-rw-r--r--apps/plugins/sdl/SDL_mixer/README43
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_flac.c177
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_flac.h66
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.c87
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.h57
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_mod.c275
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_mod.h62
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_mp3.c171
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_mp3.h47
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_ogg.c131
-rw-r--r--apps/plugins/sdl/SDL_mixer/dynamic_ogg.h53
-rw-r--r--apps/plugins/sdl/SDL_mixer/effect_position.c1615
-rw-r--r--apps/plugins/sdl/SDL_mixer/effect_stereoreverse.c117
-rw-r--r--apps/plugins/sdl/SDL_mixer/effects_internal.c121
-rw-r--r--apps/plugins/sdl/SDL_mixer/effects_internal.h60
-rw-r--r--apps/plugins/sdl/SDL_mixer/fluidsynth.c219
-rw-r--r--apps/plugins/sdl/SDL_mixer/fluidsynth.h51
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_aiff.c247
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_aiff.h31
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_flac.c338
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_flac.h31
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_ogg.c159
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_ogg.h31
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_voc.c458
-rw-r--r--apps/plugins/sdl/SDL_mixer/load_voc.h36
-rw-r--r--apps/plugins/sdl/SDL_mixer/mixer.c1484
-rw-r--r--apps/plugins/sdl/SDL_mixer/music.c1599
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_cmd.c241
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_cmd.h62
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_flac.c593
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_flac.h90
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_mad.c325
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_mad.h72
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_mod.c346
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_mod.h62
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_modplug.c239
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_modplug.h42
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_ogg.c230
-rw-r--r--apps/plugins/sdl/SDL_mixer/music_ogg.h75
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi.h38
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_common.c409
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_common.h63
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_haiku.cpp281
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_mac.c644
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_macosx.c322
-rw-r--r--apps/plugins/sdl/SDL_mixer/native_midi/native_midi_win32.c312
-rw-r--r--apps/plugins/sdl/SDL_mixer/playmus.c234
-rw-r--r--apps/plugins/sdl/SDL_mixer/playwave.c497
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/COPYING127
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/FAQ112
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/README57
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/common.c238
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/common.h39
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/config.h229
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/ctrlmode.c26
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/ctrlmode.h74
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/filter.c187
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/filter.h23
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/instrum.c1018
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/instrum.h168
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/mix.c847
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/mix.h11
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/output.c122
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/output.h60
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/playmidi.c1746
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/playmidi.h160
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/readmidi.c1065
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/readmidi.h18
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/resample.c730
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/resample.h10
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/sdl_a.c19
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/sdl_c.c136
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/tables.c1111
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/tables.h35
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/timidity.c359
-rw-r--r--apps/plugins/sdl/SDL_mixer/timidity/timidity.h20
-rw-r--r--apps/plugins/sdl/SDL_mixer/wavestream.c521
-rw-r--r--apps/plugins/sdl/SDL_mixer/wavestream.h60
-rw-r--r--apps/plugins/sdl/SOURCES129
-rw-r--r--apps/plugins/sdl/SOURCES.duke41
-rw-r--r--apps/plugins/sdl/include/SDL.h101
-rw-r--r--apps/plugins/sdl/include/SDL_active.h63
-rw-r--r--apps/plugins/sdl/include/SDL_audio.h284
-rw-r--r--apps/plugins/sdl/include/SDL_byteorder.h29
-rw-r--r--apps/plugins/sdl/include/SDL_cdrom.h202
-rw-r--r--apps/plugins/sdl/include/SDL_config.h47
-rw-r--r--apps/plugins/sdl/include/SDL_config.h.default45
-rw-r--r--apps/plugins/sdl/include/SDL_config.h.in312
-rw-r--r--apps/plugins/sdl/include/SDL_config_dreamcast.h106
-rw-r--r--apps/plugins/sdl/include/SDL_config_macos.h112
-rw-r--r--apps/plugins/sdl/include/SDL_config_macosx.h150
-rw-r--r--apps/plugins/sdl/include/SDL_config_minimal.h62
-rw-r--r--apps/plugins/sdl/include/SDL_config_nds.h115
-rw-r--r--apps/plugins/sdl/include/SDL_config_os2.h141
-rw-r--r--apps/plugins/sdl/include/SDL_config_rockbox.h198
-rw-r--r--apps/plugins/sdl/include/SDL_config_symbian.h146
-rw-r--r--apps/plugins/sdl/include/SDL_config_win32.h183
-rw-r--r--apps/plugins/sdl/include/SDL_copying.h22
-rw-r--r--apps/plugins/sdl/include/SDL_cpuinfo.h69
-rw-r--r--apps/plugins/sdl/include/SDL_endian.h224
-rw-r--r--apps/plugins/sdl/include/SDL_error.h72
-rw-r--r--apps/plugins/sdl/include/SDL_events.h356
-rw-r--r--apps/plugins/sdl/include/SDL_getenv.h28
-rw-r--r--apps/plugins/sdl/include/SDL_image.h138
-rw-r--r--apps/plugins/sdl/include/SDL_joystick.h187
-rw-r--r--apps/plugins/sdl/include/SDL_keyboard.h135
-rw-r--r--apps/plugins/sdl/include/SDL_keysym.h326
-rw-r--r--apps/plugins/sdl/include/SDL_loadso.h78
-rw-r--r--apps/plugins/sdl/include/SDL_main.h106
-rw-r--r--apps/plugins/sdl/include/SDL_mixer.h634
-rw-r--r--apps/plugins/sdl/include/SDL_mouse.h143
-rw-r--r--apps/plugins/sdl/include/SDL_mutex.h177
-rw-r--r--apps/plugins/sdl/include/SDL_name.h11
-rw-r--r--apps/plugins/sdl/include/SDL_opengl.h6570
-rw-r--r--apps/plugins/sdl/include/SDL_platform.h114
-rw-r--r--apps/plugins/sdl/include/SDL_quit.h55
-rw-r--r--apps/plugins/sdl/include/SDL_rwops.h155
-rw-r--r--apps/plugins/sdl/include/SDL_stdinc.h620
-rw-r--r--apps/plugins/sdl/include/SDL_syswm.h226
-rw-r--r--apps/plugins/sdl/include/SDL_thread.h115
-rw-r--r--apps/plugins/sdl/include/SDL_timer.h125
-rw-r--r--apps/plugins/sdl/include/SDL_types.h28
-rw-r--r--apps/plugins/sdl/include/SDL_version.h91
-rw-r--r--apps/plugins/sdl/include/SDL_video.h951
-rw-r--r--apps/plugins/sdl/include/begin_code.h196
-rw-r--r--apps/plugins/sdl/include/close_code.h46
-rw-r--r--apps/plugins/sdl/include/doxyfile946
-rw-r--r--apps/plugins/sdl/include/stdio.h4
-rw-r--r--apps/plugins/sdl/main.c301
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/Makefile693
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/Makefile.am3
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/Makefile.in693
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/build.h320
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/cache.c225
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/cache.h34
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/display.c1949
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/display.h110
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/draw.c919
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/draw.h105
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/dummy_multi.c16
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/ChangeLog177
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/LICENSE7
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/README15
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/callbacks.h27
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/enet.h592
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/list.h43
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/protocol.h198
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/time.h18
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/types.h13
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/unix.h40
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/utility.h12
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/enet/include/win32.h57
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/engine.c9349
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/engine.h164
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/filesystem.c877
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/filesystem.h49
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/fixedPoint_math.c54
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/fixedPoint_math.h167
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/icon.c168
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/icon.h5
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/macos_compat.h62
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/mmulti.c1707
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/mmulti.cpp1213
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/mmulti_stable.cpp1211
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/mmulti_stable.h19
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/mmulti_unstable.h19
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/multi.c1176
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/network.c222
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/network.h33
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/platform.h38
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/rockbox_compat.h67
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/tiles.c386
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/tiles.h73
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/unix_compat.h67
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/win32_compat.h106
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/windows/inttypes.h305
-rw-r--r--apps/plugins/sdl/progs/duke3d/Engine/src/windows/stdint.h247
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/DbgHelp.h2437
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/Makefile942
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/Makefile.am14
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/Makefile.in942
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/_functio.h174
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/_rts.h54
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/actors.c7157
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/animlib.c352
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/animlib.h155
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/Makefile546
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/Makefile.am4
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/Makefile.in546
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_al_midi.h174
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_blaster.h133
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_guswave.h164
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_midi.h290
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_multivc.h318
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_pas16.h250
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/_sndscap.h136
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/adlibfx.c552
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/adlibfx.h80
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/al_midi.c1510
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/al_midi.h58
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/assert.h49
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/awe32.c540
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/awe32.h58
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/blaster.c2330
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/blaster.h148
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/ctaweapi.h352
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/debugio.c251
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/debugio.h30
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dma.c379
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dma.h83
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dpmi.c250
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dpmi.h86
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dsl.c231
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/dsl.h28
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/fx_man.c1058
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/fx_man.h140
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gmtimbre.c290
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c283
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gusmidi.c561
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gusmidi.h59
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/guswave.c1773
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/guswave.h75
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/interrup.h50
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/irq.c325
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/irq.h54
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/leetimbr.c290
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/linklist.h118
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/ll_man.c173
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/ll_man.h76
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/memcheck.h20
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/midi.c2265
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/midi.h98
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mpu401.c451
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mpu401.h61
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/multivoc.c3404
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/multivoc.h130
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/music.c1035
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/music.h99
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mv_mix.asm505
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mv_mix.c483
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mv_mix16.asm524
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mvreverb.asm181
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/mvreverb.c312
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/myprint.c310
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/myprint.h43
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/newgf1.h431
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/nodpmi.c166
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/nomusic.c115
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/pas16.c1924
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/pas16.h81
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/pitch.c258
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/pitch.h47
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/sndcards.h55
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/sndscape.c1661
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/sndscape.h73
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/sndsrc.c658
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/sndsrc.h70
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/standard.h72
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/task_man.c976
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/task_man.h68
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/user.c100
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/user.h38
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/usrhooks.c84
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/usrhooks.h57
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/audiolib/util.h13
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/config.c897
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/config.h46
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/console.c630
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/console.h19
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/control.c930
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/control.h265
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/cvar_defs.c357
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/cvar_defs.h43
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/cvars.c53
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/cvars.h29
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/develop.h65
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/duke3d.h695
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/dukerockbox.h94
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/dukeunix.h100
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/dukewin.h86
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/dummy_audiolib.c215
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/file_lib.h260
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/funct.h593
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/function.h106
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/game.c10966
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/game.h8
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/gamedef.c3316
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/gamedefs.h131
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/global.c931
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/global.h80
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/joystick.h19
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/keyboard.c441
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/keyboard.h224
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/menues.c4707
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/midi/sdl_midi.c191
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/mouse.h51
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/names.h754
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/player.c4462
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/premap.c1728
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/premap.h17
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/rts.c240
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/rts.h84
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/scriplib.c1065
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/scriplib.h373
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/sector.c3249
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/sounddebugdefs.h8
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/soundefs.h1233
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/sounds.c681
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/sounds.h62
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/types.h101
-rw-r--r--apps/plugins/sdl/progs/duke3d/Game/src/util_lib.h77
-rw-r--r--apps/plugins/sdl/redefines.txt469
-rw-r--r--apps/plugins/sdl/sdl.make56
-rw-r--r--apps/plugins/sdl/src/SDL.c350
-rw-r--r--apps/plugins/sdl/src/SDL_error.c238
-rw-r--r--apps/plugins/sdl/src/SDL_error_c.h58
-rw-r--r--apps/plugins/sdl/src/SDL_fatal.c134
-rw-r--r--apps/plugins/sdl/src/SDL_fatal.h28
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audio.c707
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audio_c.h35
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audiocvt.c1510
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audiodev.c179
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audiodev_c.h26
-rw-r--r--apps/plugins/sdl/src/audio/SDL_audiomem.h25
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer.c264
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_MMX.c207
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_MMX.h17
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_MMX_VC.c183
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_MMX_VC.h38
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_m68k.c210
-rw-r--r--apps/plugins/sdl/src/audio/SDL_mixer_m68k.h36
-rw-r--r--apps/plugins/sdl/src/audio/SDL_sysaudio.h189
-rw-r--r--apps/plugins/sdl/src/audio/SDL_wave.c596
-rw-r--r--apps/plugins/sdl/src/audio/SDL_wave.h62
-rw-r--r--apps/plugins/sdl/src/audio/alsa/SDL_alsa_audio.c619
-rw-r--r--apps/plugins/sdl/src/audio/alsa/SDL_alsa_audio.h48
-rw-r--r--apps/plugins/sdl/src/audio/arts/SDL_artsaudio.c362
-rw-r--r--apps/plugins/sdl/src/audio/arts/SDL_artsaudio.h60
-rw-r--r--apps/plugins/sdl/src/audio/baudio/SDL_beaudio.cc225
-rw-r--r--apps/plugins/sdl/src/audio/baudio/SDL_beaudio.h39
-rw-r--r--apps/plugins/sdl/src/audio/bsd/SDL_bsdaudio.c404
-rw-r--r--apps/plugins/sdl/src/audio/bsd/SDL_bsdaudio.h58
-rw-r--r--apps/plugins/sdl/src/audio/dart/SDL_dart.c441
-rw-r--r--apps/plugins/sdl/src/audio/dart/SDL_dart.h63
-rw-r--r--apps/plugins/sdl/src/audio/dc/SDL_dcaudio.c246
-rw-r--r--apps/plugins/sdl/src/audio/dc/SDL_dcaudio.h41
-rw-r--r--apps/plugins/sdl/src/audio/dc/aica.c271
-rw-r--r--apps/plugins/sdl/src/audio/dc/aica.h40
-rw-r--r--apps/plugins/sdl/src/audio/disk/SDL_diskaudio.c186
-rw-r--r--apps/plugins/sdl/src/audio/disk/SDL_diskaudio.h41
-rw-r--r--apps/plugins/sdl/src/audio/dma/SDL_dmaaudio.c455
-rw-r--r--apps/plugins/sdl/src/audio/dma/SDL_dmaaudio.h59
-rw-r--r--apps/plugins/sdl/src/audio/dmedia/SDL_irixaudio.c242
-rw-r--r--apps/plugins/sdl/src/audio/dmedia/SDL_irixaudio.h45
-rw-r--r--apps/plugins/sdl/src/audio/dsp/SDL_dspaudio.c340
-rw-r--r--apps/plugins/sdl/src/audio/dsp/SDL_dspaudio.h53
-rw-r--r--apps/plugins/sdl/src/audio/dummy/SDL_dummyaudio.c156
-rw-r--r--apps/plugins/sdl/src/audio/dummy/SDL_dummyaudio.h40
-rw-r--r--apps/plugins/sdl/src/audio/esd/SDL_esdaudio.c323
-rw-r--r--apps/plugins/sdl/src/audio/esd/SDL_esdaudio.h57
-rw-r--r--apps/plugins/sdl/src/audio/macosx/SDL_coreaudio.c291
-rw-r--r--apps/plugins/sdl/src/audio/macosx/SDL_coreaudio.h45
-rw-r--r--apps/plugins/sdl/src/audio/macrom/SDL_romaudio.c496
-rw-r--r--apps/plugins/sdl/src/audio/macrom/SDL_romaudio.h50
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio.c215
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio.h121
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_dma8.c357
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_dma8.h85
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_gsxb.c436
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_gsxb.h104
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_it.S386
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_mcsn.c405
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_mcsn.h59
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_stfa.c326
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_stfa.h97
-rw-r--r--apps/plugins/sdl/src/audio/mint/SDL_mintaudio_xbios.c490
-rw-r--r--apps/plugins/sdl/src/audio/mme/SDL_mmeaudio.c264
-rw-r--r--apps/plugins/sdl/src/audio/mme/SDL_mmeaudio.h51
-rw-r--r--apps/plugins/sdl/src/audio/nas/SDL_nasaudio.c423
-rw-r--r--apps/plugins/sdl/src/audio/nas/SDL_nasaudio.h62
-rw-r--r--apps/plugins/sdl/src/audio/nds/SDL_ndsaudio.c335
-rw-r--r--apps/plugins/sdl/src/audio/nds/SDL_ndsaudio.h40
-rw-r--r--apps/plugins/sdl/src/audio/nds/sound9.c61
-rw-r--r--apps/plugins/sdl/src/audio/nds/soundcommon.h80
-rw-r--r--apps/plugins/sdl/src/audio/nto/SDL_nto_audio.c507
-rw-r--r--apps/plugins/sdl/src/audio/nto/SDL_nto_audio.h68
-rw-r--r--apps/plugins/sdl/src/audio/paudio/SDL_paudio.c511
-rw-r--r--apps/plugins/sdl/src/audio/paudio/SDL_paudio.h57
-rw-r--r--apps/plugins/sdl/src/audio/pulse/SDL_pulseaudio.c570
-rw-r--r--apps/plugins/sdl/src/audio/pulse/SDL_pulseaudio.h73
-rw-r--r--apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.c271
-rw-r--r--apps/plugins/sdl/src/audio/rockbox/SDL_rockboxaudio.h50
-rw-r--r--apps/plugins/sdl/src/audio/sun/SDL_sunaudio.c432
-rw-r--r--apps/plugins/sdl/src/audio/sun/SDL_sunaudio.h55
-rw-r--r--apps/plugins/sdl/src/audio/symbian/SDL_epocaudio.cpp614
-rw-r--r--apps/plugins/sdl/src/audio/symbian/SDL_epocaudio.h37
-rw-r--r--apps/plugins/sdl/src/audio/symbian/streamplayer.cpp279
-rw-r--r--apps/plugins/sdl/src/audio/symbian/streamplayer.h89
-rw-r--r--apps/plugins/sdl/src/audio/ums/SDL_umsaudio.c547
-rw-r--r--apps/plugins/sdl/src/audio/ums/SDL_umsaudio.h50
-rw-r--r--apps/plugins/sdl/src/audio/windib/SDL_dibaudio.c322
-rw-r--r--apps/plugins/sdl/src/audio/windib/SDL_dibaudio.h49
-rw-r--r--apps/plugins/sdl/src/audio/windx5/SDL_dx5audio.c705
-rw-r--r--apps/plugins/sdl/src/audio/windx5/SDL_dx5audio.h55
-rw-r--r--apps/plugins/sdl/src/audio/windx5/directx.h81
-rw-r--r--apps/plugins/sdl/src/cdrom/SDL_cdrom.c341
-rw-r--r--apps/plugins/sdl/src/cdrom/SDL_syscdrom.h76
-rw-r--r--apps/plugins/sdl/src/cdrom/aix/SDL_syscdrom.c660
-rw-r--r--apps/plugins/sdl/src/cdrom/beos/SDL_syscdrom.cc410
-rw-r--r--apps/plugins/sdl/src/cdrom/bsdi/SDL_syscdrom.c542
-rw-r--r--apps/plugins/sdl/src/cdrom/dc/SDL_syscdrom.c167
-rw-r--r--apps/plugins/sdl/src/cdrom/dummy/SDL_syscdrom.c41
-rw-r--r--apps/plugins/sdl/src/cdrom/freebsd/SDL_syscdrom.c406
-rw-r--r--apps/plugins/sdl/src/cdrom/linux/SDL_syscdrom.c564
-rw-r--r--apps/plugins/sdl/src/cdrom/macos/SDL_syscdrom.c525
-rw-r--r--apps/plugins/sdl/src/cdrom/macos/SDL_syscdrom_c.h140
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/AudioFilePlayer.c360
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/AudioFilePlayer.h178
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/AudioFileReaderThread.c610
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/CDPlayer.c636
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/CDPlayer.h69
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/SDLOSXCAGuard.c199
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/SDLOSXCAGuard.h116
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/SDL_syscdrom.c514
-rw-r--r--apps/plugins/sdl/src/cdrom/macosx/SDL_syscdrom_c.h136
-rw-r--r--apps/plugins/sdl/src/cdrom/mint/SDL_syscdrom.c317
-rw-r--r--apps/plugins/sdl/src/cdrom/openbsd/SDL_syscdrom.c416
-rw-r--r--apps/plugins/sdl/src/cdrom/os2/SDL_syscdrom.c393
-rw-r--r--apps/plugins/sdl/src/cdrom/osf/SDL_syscdrom.c444
-rw-r--r--apps/plugins/sdl/src/cdrom/qnx/SDL_syscdrom.c551
-rw-r--r--apps/plugins/sdl/src/cdrom/win32/SDL_syscdrom.c386
-rw-r--r--apps/plugins/sdl/src/cpuinfo/SDL_cpuinfo.c499
-rw-r--r--apps/plugins/sdl/src/events/SDL_active.c95
-rw-r--r--apps/plugins/sdl/src/events/SDL_events.c501
-rw-r--r--apps/plugins/sdl/src/events/SDL_events_c.h83
-rw-r--r--apps/plugins/sdl/src/events/SDL_expose.c51
-rw-r--r--apps/plugins/sdl/src/events/SDL_keyboard.c614
-rw-r--r--apps/plugins/sdl/src/events/SDL_mouse.c268
-rw-r--r--apps/plugins/sdl/src/events/SDL_quit.c124
-rw-r--r--apps/plugins/sdl/src/events/SDL_resize.c71
-rw-r--r--apps/plugins/sdl/src/events/SDL_sysevents.h46
-rw-r--r--apps/plugins/sdl/src/file/SDL_rwops.c681
-rw-r--r--apps/plugins/sdl/src/hermes/COPYING.LIB438
-rw-r--r--apps/plugins/sdl/src/hermes/HeadMMX.h100
-rw-r--r--apps/plugins/sdl/src/hermes/HeadX86.h186
-rw-r--r--apps/plugins/sdl/src/hermes/README13
-rw-r--r--apps/plugins/sdl/src/hermes/common.inc9
-rw-r--r--apps/plugins/sdl/src/hermes/mmx_main.asm74
-rw-r--r--apps/plugins/sdl/src/hermes/mmxp2_32.asm405
-rw-r--r--apps/plugins/sdl/src/hermes/x86_main.asm75
-rw-r--r--apps/plugins/sdl/src/hermes/x86p_16.asm490
-rw-r--r--apps/plugins/sdl/src/hermes/x86p_32.asm1044
-rw-r--r--apps/plugins/sdl/src/joystick/SDL_joystick.c606
-rw-r--r--apps/plugins/sdl/src/joystick/SDL_joystick_c.h38
-rw-r--r--apps/plugins/sdl/src/joystick/SDL_sysjoystick.h82
-rw-r--r--apps/plugins/sdl/src/joystick/beos/SDL_bejoystick.cc237
-rw-r--r--apps/plugins/sdl/src/joystick/bsd/SDL_sysjoystick.c608
-rw-r--r--apps/plugins/sdl/src/joystick/darwin/SDL_sysjoystick.c842
-rw-r--r--apps/plugins/sdl/src/joystick/dc/SDL_sysjoystick.c193
-rw-r--r--apps/plugins/sdl/src/joystick/dummy/SDL_sysjoystick.c83
-rw-r--r--apps/plugins/sdl/src/joystick/linux/SDL_sysjoystick.c1218
-rw-r--r--apps/plugins/sdl/src/joystick/macos/SDL_sysjoystick.c320
-rw-r--r--apps/plugins/sdl/src/joystick/mint/SDL_sysjoystick.c826
-rw-r--r--apps/plugins/sdl/src/joystick/nds/SDL_sysjoystick.c150
-rw-r--r--apps/plugins/sdl/src/joystick/riscos/SDL_sysjoystick.c176
-rw-r--r--apps/plugins/sdl/src/joystick/win32/SDL_mmjoystick.c407
-rw-r--r--apps/plugins/sdl/src/loadso/beos/SDL_sysloadso.c72
-rw-r--r--apps/plugins/sdl/src/loadso/dlopen/SDL_sysloadso.c69
-rw-r--r--apps/plugins/sdl/src/loadso/dummy/SDL_sysloadso.c50
-rw-r--r--apps/plugins/sdl/src/loadso/macos/SDL_sysloadso.c106
-rw-r--r--apps/plugins/sdl/src/loadso/macosx/SDL_dlcompat.c1407
-rw-r--r--apps/plugins/sdl/src/loadso/mint/SDL_sysloadso.c62
-rw-r--r--apps/plugins/sdl/src/loadso/os2/SDL_sysloadso.c71
-rw-r--r--apps/plugins/sdl/src/loadso/win32/SDL_sysloadso.c139
-rw-r--r--apps/plugins/sdl/src/main/beos/SDL_BeApp.cc111
-rw-r--r--apps/plugins/sdl/src/main/beos/SDL_BeApp.h33
-rw-r--r--apps/plugins/sdl/src/main/dummy/SDL_dummy_main.c13
-rw-r--r--apps/plugins/sdl/src/main/macos/SDL.r1
-rw-r--r--apps/plugins/sdl/src/main/macos/SDL.shlib.r1
-rw-r--r--apps/plugins/sdl/src/main/macos/SDL_main.c610
-rw-r--r--apps/plugins/sdl/src/main/macos/SIZE.r1
-rw-r--r--apps/plugins/sdl/src/main/macos/exports/Makefile39
-rw-r--r--apps/plugins/sdl/src/main/macos/exports/SDL.x1
-rw-r--r--apps/plugins/sdl/src/main/macos/exports/gendef.pl43
-rw-r--r--apps/plugins/sdl/src/main/macosx/Info.plist.in24
-rw-r--r--apps/plugins/sdl/src/main/macosx/SDLMain.h16
-rw-r--r--apps/plugins/sdl/src/main/macosx/SDLMain.m381
-rw-r--r--apps/plugins/sdl/src/main/macosx/SDLMain.nib/classes.nib12
-rw-r--r--apps/plugins/sdl/src/main/macosx/SDLMain.nib/info.nib12
-rw-r--r--apps/plugins/sdl/src/main/macosx/SDLMain.nib/objects.nibbin0 -> 1701 bytes
-rw-r--r--apps/plugins/sdl/src/main/macosx/info.nib1
-rw-r--r--apps/plugins/sdl/src/main/qtopia/SDL_qtopia_main.cc47
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA1/SDL_main.cpp152
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA2/SDL_main.cpp1035
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA2/sdlexe.cpp809
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA2/sdllib.cpp12
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA2/vectorbuffer.cpp62
-rw-r--r--apps/plugins/sdl/src/main/symbian/EKA2/vectorbuffer.h240
-rw-r--r--apps/plugins/sdl/src/main/win32/SDL_win32_main.c402
-rw-r--r--apps/plugins/sdl/src/main/win32/version.rc38
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_getenv.c247
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_iconv.c881
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_malloc.c5111
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_qsort.c443
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_stdlib.c620
-rw-r--r--apps/plugins/sdl/src/stdlib/SDL_string.c1248
-rw-r--r--apps/plugins/sdl/src/thread/SDL_systhread.h52
-rw-r--r--apps/plugins/sdl/src/thread/SDL_thread.c300
-rw-r--r--apps/plugins/sdl/src/thread/SDL_thread_c.h66
-rw-r--r--apps/plugins/sdl/src/thread/beos/SDL_syssem.c142
-rw-r--r--apps/plugins/sdl/src/thread/beos/SDL_systhread.c96
-rw-r--r--apps/plugins/sdl/src/thread/beos/SDL_systhread_c.h31
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_syscond.c215
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_syscond_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_sysmutex.c122
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_sysmutex_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_syssem.c173
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_syssem_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_systhread.c60
-rw-r--r--apps/plugins/sdl/src/thread/dc/SDL_systhread_c.h24
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_syscond.c215
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_sysmutex.c129
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_sysmutex_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_syssem.c211
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_systhread.c54
-rw-r--r--apps/plugins/sdl/src/thread/generic/SDL_systhread_c.h25
-rw-r--r--apps/plugins/sdl/src/thread/irix/SDL_syssem.c219
-rw-r--r--apps/plugins/sdl/src/thread/irix/SDL_systhread.c85
-rw-r--r--apps/plugins/sdl/src/thread/irix/SDL_systhread_c.h27
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_syscond.c215
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_syscond_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_sysmutex.c108
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_syssem.c192
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_systhread.c108
-rw-r--r--apps/plugins/sdl/src/thread/os2/SDL_systhread_c.h28
-rw-r--r--apps/plugins/sdl/src/thread/pth/SDL_syscond.c164
-rw-r--r--apps/plugins/sdl/src/thread/pth/SDL_sysmutex.c87
-rw-r--r--apps/plugins/sdl/src/thread/pth/SDL_sysmutex_c.h31
-rw-r--r--apps/plugins/sdl/src/thread/pth/SDL_systhread.c103
-rw-r--r--apps/plugins/sdl/src/thread/pth/SDL_systhread_c.h31
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_syscond.c155
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_sysmutex.c153
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_sysmutex_c.h31
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_syssem.c190
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_systhread.c120
-rw-r--r--apps/plugins/sdl/src/thread/pthread/SDL_systhread_c.h26
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_syscond.c160
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_sysmutex.c153
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_sysmutex_c.h34
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_syssem.c203
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_systhread.c144
-rw-r--r--apps/plugins/sdl/src/thread/riscos/SDL_systhread_c.h34
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_syscond.c215
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_sysmutex.c120
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_sysmutex_c.h23
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_syssem.c170
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_systhread.c89
-rw-r--r--apps/plugins/sdl/src/thread/rockbox/SDL_systhread_c.h24
-rw-r--r--apps/plugins/sdl/src/thread/symbian/SDL_sysmutex.cpp130
-rw-r--r--apps/plugins/sdl/src/thread/symbian/SDL_syssem.cpp214
-rw-r--r--apps/plugins/sdl/src/thread/symbian/SDL_systhread.cpp146
-rw-r--r--apps/plugins/sdl/src/thread/symbian/SDL_systhread_c.h30
-rw-r--r--apps/plugins/sdl/src/thread/win32/SDL_sysmutex.c95
-rw-r--r--apps/plugins/sdl/src/thread/win32/SDL_syssem.c164
-rw-r--r--apps/plugins/sdl/src/thread/win32/SDL_systhread.c162
-rw-r--r--apps/plugins/sdl/src/thread/win32/SDL_systhread_c.h28
-rw-r--r--apps/plugins/sdl/src/thread/win32/win_ce_semaphore.c216
-rw-r--r--apps/plugins/sdl/src/thread/win32/win_ce_semaphore.h22
-rw-r--r--apps/plugins/sdl/src/timer/SDL_systimer.h40
-rw-r--r--apps/plugins/sdl/src/timer/SDL_timer.c285
-rw-r--r--apps/plugins/sdl/src/timer/SDL_timer_c.h46
-rw-r--r--apps/plugins/sdl/src/timer/beos/SDL_systimer.c95
-rw-r--r--apps/plugins/sdl/src/timer/dc/SDL_systimer.c100
-rw-r--r--apps/plugins/sdl/src/timer/dummy/SDL_systimer.c91
-rw-r--r--apps/plugins/sdl/src/timer/macos/FastTimes.c352
-rw-r--r--apps/plugins/sdl/src/timer/macos/FastTimes.h27
-rw-r--r--apps/plugins/sdl/src/timer/macos/SDL_MPWtimer.c152
-rw-r--r--apps/plugins/sdl/src/timer/macos/SDL_systimer.c186
-rw-r--r--apps/plugins/sdl/src/timer/mint/SDL_systimer.c149
-rw-r--r--apps/plugins/sdl/src/timer/mint/SDL_vbltimer.S228
-rw-r--r--apps/plugins/sdl/src/timer/mint/SDL_vbltimer_s.h35
-rw-r--r--apps/plugins/sdl/src/timer/nds/SDL_systimer.c73
-rw-r--r--apps/plugins/sdl/src/timer/os2/SDL_systimer.c227
-rw-r--r--apps/plugins/sdl/src/timer/riscos/SDL_systimer.c233
-rw-r--r--apps/plugins/sdl/src/timer/rockbox/SDL_systimer.c117
-rw-r--r--apps/plugins/sdl/src/timer/symbian/SDL_systimer.cpp114
-rw-r--r--apps/plugins/sdl/src/timer/unix/SDL_systimer.c240
-rw-r--r--apps/plugins/sdl/src/timer/win32/SDL_systimer.c160
-rw-r--r--apps/plugins/sdl/src/timer/wince/SDL_systimer.c198
-rw-r--r--apps/plugins/sdl/src/video/SDL_RLEaccel.c1941
-rw-r--r--apps/plugins/sdl/src/video/SDL_RLEaccel_c.h31
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit.c360
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit.h528
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit_0.c471
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit_1.c523
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit_A.c2873
-rw-r--r--apps/plugins/sdl/src/video/SDL_blit_N.c2492
-rw-r--r--apps/plugins/sdl/src/video/SDL_bmp.c549
-rw-r--r--apps/plugins/sdl/src/video/SDL_cursor.c758
-rw-r--r--apps/plugins/sdl/src/video/SDL_cursor_c.h73
-rw-r--r--apps/plugins/sdl/src/video/SDL_gamma.c233
-rw-r--r--apps/plugins/sdl/src/video/SDL_glfuncs.h341
-rw-r--r--apps/plugins/sdl/src/video/SDL_leaks.h31
-rw-r--r--apps/plugins/sdl/src/video/SDL_pixels.c626
-rw-r--r--apps/plugins/sdl/src/video/SDL_pixels_c.h46
-rw-r--r--apps/plugins/sdl/src/video/SDL_stretch.c358
-rw-r--r--apps/plugins/sdl/src/video/SDL_stretch_c.h29
-rw-r--r--apps/plugins/sdl/src/video/SDL_surface.c941
-rw-r--r--apps/plugins/sdl/src/video/SDL_sysvideo.h427
-rw-r--r--apps/plugins/sdl/src/video/SDL_video.c1978
-rw-r--r--apps/plugins/sdl/src/video/SDL_yuv.c150
-rw-r--r--apps/plugins/sdl/src/video/SDL_yuv_mmx.c428
-rw-r--r--apps/plugins/sdl/src/video/SDL_yuv_sw.c1299
-rw-r--r--apps/plugins/sdl/src/video/SDL_yuv_sw_c.h37
-rw-r--r--apps/plugins/sdl/src/video/SDL_yuvfuncs.h37
-rw-r--r--apps/plugins/sdl/src/video/Xext/README10
-rw-r--r--apps/plugins/sdl/src/video/Xext/XME/xme.c410
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xinerama/Xinerama.c324
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xv/Xv.c1151
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xv/Xvlibint.h81
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xxf86dga/XF86DGA.c721
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xxf86dga/XF86DGA2.c993
-rw-r--r--apps/plugins/sdl/src/video/Xext/Xxf86vm/XF86VMode.c1226
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/Xext.h50
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/Xinerama.h46
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/Xv.h129
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/Xvlib.h433
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/Xvproto.h604
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/extutil.h226
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/panoramiXext.h52
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/panoramiXproto.h192
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86dga.h265
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86dga1.h169
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86dga1str.h194
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86dgastr.h344
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86vmode.h314
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xf86vmstr.h546
-rw-r--r--apps/plugins/sdl/src/video/Xext/extensions/xme.h45
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aaevents.c202
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aaevents_c.h35
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aamouse.c35
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aamouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aavideo.c388
-rw-r--r--apps/plugins/sdl/src/video/aalib/SDL_aavideo.h66
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p.S452
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ataric2p_s.h75
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ataridevmouse.c159
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ataridevmouse_c.h42
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarieddi.S42
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarieddi_s.h54
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarievents.c234
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarievents_c.h52
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarigl.c1086
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarigl_c.h109
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarikeys.h140
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarimxalloc.c52
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarimxalloc_c.h37
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_atarisuper.h61
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_biosevents.c131
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_biosevents_c.h42
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_gemdosevents.c132
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_gemdosevents_c.h42
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ikbdevents.c124
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ikbdevents_c.h42
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt.S404
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_ikbdinterrupt_s.h61
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_xbiosevents.c155
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_xbiosevents_c.h48
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_xbiosinterrupt.S212
-rw-r--r--apps/plugins/sdl/src/video/ataricommon/SDL_xbiosinterrupt_s.h52
-rw-r--r--apps/plugins/sdl/src/video/blank_cursor.h33
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_BView.h116
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_BWin.h290
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_lowvideo.h58
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysevents.cc415
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysevents_c.h31
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysmouse.cc153
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysmouse_c.h33
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysvideo.cc841
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_syswm.cc92
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_syswm_c.h32
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysyuv.cc314
-rw-r--r--apps/plugins/sdl/src/video/bwindow/SDL_sysyuv.h73
-rw-r--r--apps/plugins/sdl/src/video/caca/SDL_cacaevents.c101
-rw-r--r--apps/plugins/sdl/src/video/caca/SDL_cacaevents_c.h35
-rw-r--r--apps/plugins/sdl/src/video/caca/SDL_cacavideo.c304
-rw-r--r--apps/plugins/sdl/src/video/caca/SDL_cacavideo.h76
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcevents.c152
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcevents_c.h33
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcmouse.c35
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcmouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcvideo.c445
-rw-r--r--apps/plugins/sdl/src/video/dc/SDL_dcvideo.h42
-rw-r--r--apps/plugins/sdl/src/video/default_cursor.h116
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgaevents.c163
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgaevents_c.h28
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgamouse.c35
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgamouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgavideo.c1101
-rw-r--r--apps/plugins/sdl/src/video/dga/SDL_dgavideo.h124
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_events.c219
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_events.h29
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_keys.h135
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_video.c1171
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_video.h62
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_yuv.c290
-rw-r--r--apps/plugins/sdl/src/video/directfb/SDL_DirectFB_yuv.h38
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullevents.c45
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullevents_c.h33
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullmouse.c33
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullmouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullvideo.c239
-rw-r--r--apps/plugins/sdl/src/video/dummy/SDL_nullvideo.h40
-rw-r--r--apps/plugins/sdl/src/video/e_log.h140
-rw-r--r--apps/plugins/sdl/src/video/e_pow.h302
-rw-r--r--apps/plugins/sdl/src/video/e_sqrt.h493
-rw-r--r--apps/plugins/sdl/src/video/fbcon/3dfx_mmio.h56
-rw-r--r--apps/plugins/sdl/src/video/fbcon/3dfx_regs.h83
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fb3dfx.c215
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fb3dfx.h29
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbelo.c442
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbelo.h55
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbevents.c1254
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbevents_c.h38
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbkeys.h139
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbmatrox.c280
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbmatrox.h29
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbmouse.c33
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbmouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbriva.c222
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbriva.h36
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbvideo.c1982
-rw-r--r--apps/plugins/sdl/src/video/fbcon/SDL_fbvideo.h200
-rw-r--r--apps/plugins/sdl/src/video/fbcon/matrox_mmio.h51
-rw-r--r--apps/plugins/sdl/src/video/fbcon/matrox_regs.h376
-rw-r--r--apps/plugins/sdl/src/video/fbcon/riva_mmio.h449
-rw-r--r--apps/plugins/sdl/src/video/fbcon/riva_regs.h43
-rw-r--r--apps/plugins/sdl/src/video/gapi/SDL_gapivideo.c1287
-rw-r--r--apps/plugins/sdl/src/video/gapi/SDL_gapivideo.h160
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemevents.c375
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemevents_c.h33
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemmouse.c205
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemmouse_c.h34
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemvideo.c1337
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemvideo.h191
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemwm.c116
-rw-r--r--apps/plugins/sdl/src/video/gem/SDL_gemwm_c.h37
-rw-r--r--apps/plugins/sdl/src/video/ggi/SDL_ggievents.c264
-rwxr-xr-xapps/plugins/sdl/src/video/ggi/SDL_ggievents_c.h29
-rw-r--r--apps/plugins/sdl/src/video/ggi/SDL_ggikeys.h135
-rw-r--r--apps/plugins/sdl/src/video/ggi/SDL_ggimouse.c32
-rwxr-xr-xapps/plugins/sdl/src/video/ggi/SDL_ggimouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/ggi/SDL_ggivideo.c378
-rw-r--r--apps/plugins/sdl/src/video/ggi/SDL_ggivideo.h48
-rw-r--r--apps/plugins/sdl/src/video/ipod/SDL_ipodvideo.c733
-rw-r--r--apps/plugins/sdl/src/video/ipod/SDL_ipodvideo.h38
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_lowvideo.h102
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macevents.c746
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macevents_c.h32
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macgl.c197
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macgl_c.h47
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_mackeys.h140
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macmouse.c129
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macmouse_c.h34
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macwm.c442
-rw-r--r--apps/plugins/sdl/src/video/maccommon/SDL_macwm_c.h41
-rw-r--r--apps/plugins/sdl/src/video/macdsp/SDL_dspvideo.c1422
-rw-r--r--apps/plugins/sdl/src/video/macdsp/SDL_dspvideo.h54
-rw-r--r--apps/plugins/sdl/src/video/macrom/SDL_romvideo.c745
-rw-r--r--apps/plugins/sdl/src/video/macrom/SDL_romvideo.h29
-rw-r--r--apps/plugins/sdl/src/video/math_private.h173
-rw-r--r--apps/plugins/sdl/src/video/mmx.h704
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxevents.c382
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxevents_c.h32
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nximage.c230
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nximage_c.h35
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxmodes.c84
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxmodes_c.h34
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxmouse.c79
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxmouse_c.h29
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxvideo.c544
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxvideo.h96
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxwm.c61
-rw-r--r--apps/plugins/sdl/src/video/nanox/SDL_nxwm_c.h32
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsevents.c83
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsevents_c.h51
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsmouse.c34
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsmouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsvideo.c500
-rw-r--r--apps/plugins/sdl/src/video/nds/SDL_ndsvideo.h61
-rw-r--r--apps/plugins/sdl/src/video/os2fslib/SDL_os2fslib.c3018
-rw-r--r--apps/plugins/sdl/src/video/os2fslib/SDL_os2fslib.h71
-rw-r--r--apps/plugins/sdl/src/video/os2fslib/SDL_vkeys.h74
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_events.c624
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_events_c.h37
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_gl.c406
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_gl.h41
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_image.c1059
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_image_c.h59
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_modes.c390
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_modes_c.h43
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_mouse.c220
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_mouse_c.h39
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_video.c648
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_video.h157
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_wm.c118
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_ph_wm_c.h37
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_phyuv.c504
-rw-r--r--apps/plugins/sdl/src/video/photon/SDL_phyuv_c.h62
-rw-r--r--apps/plugins/sdl/src/video/picogui/SDL_pgevents.c117
-rw-r--r--apps/plugins/sdl/src/video/picogui/SDL_pgevents_c.h37
-rw-r--r--apps/plugins/sdl/src/video/picogui/SDL_pgvideo.c364
-rw-r--r--apps/plugins/sdl/src/video/picogui/SDL_pgvideo.h50
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsevents.c977
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsevents_c.h38
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gskeys.h139
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsmouse.c146
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsmouse_c.h37
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsvideo.c689
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsvideo.h95
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsyuv.c461
-rw-r--r--apps/plugins/sdl/src/video/ps2gs/SDL_gsyuv_c.h37
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3events.c44
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3events_c.h41
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3video.c621
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3video.h165
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3yuv.c340
-rw-r--r--apps/plugins/sdl/src/video/ps3/SDL_ps3yuv_c.h44
-rw-r--r--apps/plugins/sdl/src/video/ps3/spulibs/Makefile83
-rw-r--r--apps/plugins/sdl/src/video/ps3/spulibs/bilin_scaler.c2050
-rw-r--r--apps/plugins/sdl/src/video/ps3/spulibs/fb_writer.c193
-rw-r--r--apps/plugins/sdl/src/video/ps3/spulibs/spu_common.h108
-rw-r--r--apps/plugins/sdl/src/video/ps3/spulibs/yuv2rgb_converter.c629
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_QPEApp.cc63
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_QPEApp.h33
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_QWin.cc527
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_QWin.h110
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_lowvideo.h65
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_sysevents.cc269
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_sysevents_c.h31
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_sysmouse.cc56
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_sysmouse_c.h32
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_sysvideo.cc403
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_syswm.cc35
-rw-r--r--apps/plugins/sdl/src/video/qtopia/SDL_syswm_c.h28
-rw-r--r--apps/plugins/sdl/src/video/quartz/CGS.h84
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzEvents.m1063
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzGL.m292
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzKeys.h146
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzVideo.h229
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzVideo.m1689
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzWM.h27
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzWM.m444
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzWindow.h51
-rw-r--r--apps/plugins/sdl/src/video/quartz/SDL_QuartzWindow.m231
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosASM.S116
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosFullScreenVideo.c777
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosevents.c549
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosevents_c.h34
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosmouse.c371
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosmouse_c.h44
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscossprite.c265
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscostask.c350
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscostask.h39
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosvideo.c316
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_riscosvideo.h62
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_wimppoll.c330
-rw-r--r--apps/plugins/sdl/src/video/riscos/SDL_wimpvideo.c501
-rw-r--r--apps/plugins/sdl/src/video/rockbox/SDL_rockboxvideo.c793
-rw-r--r--apps/plugins/sdl/src/video/rockbox/SDL_rockboxvideo.h44
-rw-r--r--apps/plugins/sdl/src/video/rockbox/keymaps_extra.h40
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgaevents.c412
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgaevents_c.h35
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgamouse.c33
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgamouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgavideo.c584
-rw-r--r--apps/plugins/sdl/src/video/svga/SDL_svgavideo.h58
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA1/SDL_epocevents.cpp626
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA1/SDL_epocvideo.cpp1356
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA1/SDL_epocvideo.h34
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/SDL_epocevents.cpp521
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/SDL_epocvideo.cpp594
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/SDL_epocvideo.h51
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/dsa.cpp1505
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/dsa_new.cpp1443
-rw-r--r--apps/plugins/sdl/src/video/symbian/EKA2/dsa_old.cpp1075
-rw-r--r--apps/plugins/sdl/src/video/symbian/SDL_epocevents_c.h60
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglevents.c299
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglevents_c.h155
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglmouse.c56
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglmouse_c.h32
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglvideo.c624
-rw-r--r--apps/plugins/sdl/src/video/vgl/SDL_vglvideo.h65
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_lowvideo.h152
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_sysevents.c855
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_sysmouse.c259
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_sysmouse_c.h33
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_syswm.c297
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_syswm_c.h35
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_wingl.c659
-rw-r--r--apps/plugins/sdl/src/video/wincommon/SDL_wingl_c.h135
-rw-r--r--apps/plugins/sdl/src/video/wincommon/wmmsg.h1030
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_dibevents.c704
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_dibevents_c.h35
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_dibvideo.c1323
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_dibvideo.h59
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_gapidibvideo.h56
-rw-r--r--apps/plugins/sdl/src/video/windib/SDL_vkeys.h75
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5events.c1005
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5events_c.h37
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5video.c2537
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5video.h61
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5yuv.c296
-rw-r--r--apps/plugins/sdl/src/video/windx5/SDL_dx5yuv_c.h38
-rw-r--r--apps/plugins/sdl/src/video/windx5/directx.h97
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsevents.c233
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsevents_c.h36
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsmouse.c33
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsmouse_c.h26
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsvideo.c609
-rw-r--r--apps/plugins/sdl/src/video/wscons/SDL_wsconsvideo.h76
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11dga.c90
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11dga_c.h33
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11dyn.c222
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11dyn.h93
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11events.c1414
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11events_c.h34
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11gamma.c142
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11gamma_c.h32
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11gl.c577
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11gl_c.h99
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11image.c316
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11image_c.h38
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11modes.c1143
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11modes_c.h43
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11mouse.c288
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11mouse_c.h33
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11sym.h201
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11video.c1571
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11video.h214
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11wm.c434
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11wm_c.h34
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11yuv.c538
-rw-r--r--apps/plugins/sdl/src/video/x11/SDL_x11yuv_c.h41
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios.c1116
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios.h111
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_blowup.c77
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_blowup.h86
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_centscreen.c104
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_centscreen.h114
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_milan.c106
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_milan.h129
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_sb3.c83
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_sb3.h82
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_tveille.c63
-rw-r--r--apps/plugins/sdl/src/video/xbios/SDL_xbios_tveille.h64
-rw-r--r--apps/plugins/sdl/wrappers.c1343
-rw-r--r--firmware/common/vuprintf.c3
-rw-r--r--firmware/export/config.h4
-rw-r--r--manual/plugins/main.tex2
994 files changed, 336924 insertions, 15 deletions
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 1b5bb9a87b..652a0b3a8e 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -26,6 +26,7 @@ dice,games
dict,apps
disktidy,apps
doom,games
+duke3d,games
euroconverter,apps
fft,demos
fire,demos
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 4576fb7334..ea0173a56d 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -74,6 +74,11 @@ iriverify.c
/* Overlays loaders */
+#if defined(HAVE_LCD_COLOR) && \
+ (!defined(LCD_STRIDEFORMAT) || (LCD_STRIDEFORMAT != VERTICAL_STRIDE))
+duke3d.c
+#endif
+
#if PLUGIN_BUFFER_SIZE <= 0x20000 && defined(HAVE_LCD_BITMAP)
#if CONFIG_KEYPAD != ONDIO_PAD && CONFIG_KEYPAD != SANSA_M200_PAD \
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index 56ac665e40..aa63c3c94b 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -12,10 +12,11 @@ clock
/* For all targets with a bitmap display */
#ifdef HAVE_LCD_BITMAP
-/* XWorld only supports color horizontal stride LCDs /for now/ ;) */
+/* color horizontal-stride LCDs */
#if defined(HAVE_LCD_COLOR) && \
(!defined(LCD_STRIDEFORMAT) || (LCD_STRIDEFORMAT != VERTICAL_STRIDE))
xworld
+sdl
puzzles
#endif
diff --git a/apps/plugins/duke3d.c b/apps/plugins/duke3d.c
new file mode 100644
index 0000000000..6e1c6f0b01
--- /dev/null
+++ b/apps/plugins/duke3d.c
@@ -0,0 +1,31 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2017 Franklin Wei
+ *
+ * Duke3D stub loader.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "plugin.h"
+
+#include "lib/overlay.h"
+
+/* this is the plugin entry point */
+enum plugin_status plugin_start(const void* parameter)
+{
+ return run_overlay(parameter, PLUGIN_GAMES_DIR "/duke3d.ovl", "Duke3D");
+}
diff --git a/apps/plugins/lib/stdio_compat.c b/apps/plugins/lib/stdio_compat.c
index d2b8f9bbc7..957dd0ddc1 100644
--- a/apps/plugins/lib/stdio_compat.c
+++ b/apps/plugins/lib/stdio_compat.c
@@ -20,12 +20,16 @@
#include "plugin.h"
#include "stdio_compat.h"
+#include "errno.h"
static _FILE_ __file__[MAX_STDIO_FILES] = {
{-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0},
- {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0}
+ {-1,-1,0},{-1,-1,0},{-1,-1,0},{-1,-1,0},
+ {-1,-1,0},{-1,-1,0},{-1,-1,0}
};
+_FILE_ *_stdout_ = NULL, *_stderr_ = NULL;
+
_FILE_ *_fopen_(const char *path, const char *mode)
{
_FILE_ *f = __file__;
@@ -34,13 +38,16 @@ _FILE_ *_fopen_(const char *path, const char *mode)
int i;
/* look for free slot */
- for (i=0; i<MAX_OPEN_FILES; i++, f++)
+ for (i=0; i<MAX_STDIO_FILES; i++, f++)
if (f->fd == -1)
break;
/* no empty slots */
if (i == MAX_STDIO_FILES)
+ {
+ rb->splash(HZ, "no open slots");
return NULL;
+ }
if (*mode != 'r')
{
@@ -72,10 +79,14 @@ _FILE_ *_fopen_(const char *path, const char *mode)
}
- fd = rb->open(path, flags);
+ fd = rb->open(path, flags, 0666);
- if (fd == -1)
+ if (fd < 0)
+ {
+ //extern int errno;
+ //rb->splashf(HZ*2, "open of %s failed (%d)", path, errno);
return NULL;
+ }
/* initialize */
f->fd = fd;
@@ -97,23 +108,40 @@ size_t _fread_(void *ptr, size_t size, size_t nmemb, _FILE_ *stream)
if (ret < (ssize_t)(size*nmemb))
stream->error = -1;
-
- return ret;
+ return ret / size;
}
size_t _fwrite_(const void *ptr, size_t size, size_t nmemb, _FILE_ *stream)
{
- ssize_t ret = rb->write(stream->fd, ptr, size*nmemb);
+ if(stream)
+ {
+ ssize_t ret = rb->write(stream->fd, ptr, size*nmemb);
- if (ret < (ssize_t)(size*nmemb))
- stream->error = -1;
+ if (ret < (ssize_t)(size*nmemb))
+ stream->error = -1;
- return ret;
+ return ret / size;
+ }
+#if 1
+ else
+ {
+ char buf[10];
+ rb->snprintf(buf, 10, "%%%ds", size*nmemb);
+ rb->splashf(HZ, buf, ptr);
+ return size * nmemb;
+ }
+#endif
}
int _fseek_(_FILE_ *stream, long offset, int whence)
{
- return rb->lseek(stream->fd, offset, whence);
+ if(rb->lseek(stream->fd, offset, whence) >= 0)
+ return 0;
+ else
+ {
+ rb->splashf(HZ, "lseek() failed: %d fd:%d", errno, stream->fd);
+ return -1;
+ }
}
long _ftell_(_FILE_ *stream)
diff --git a/apps/plugins/lib/stdio_compat.h b/apps/plugins/lib/stdio_compat.h
index bb37940296..27ccfcf521 100644
--- a/apps/plugins/lib/stdio_compat.h
+++ b/apps/plugins/lib/stdio_compat.h
@@ -20,7 +20,7 @@
#include <stddef.h>
-#define MAX_STDIO_FILES 8
+#define MAX_STDIO_FILES 11
#undef FILE
#define FILE _FILE_
@@ -42,6 +42,8 @@
#define ferror _ferror_
#define feof _feof_
#define fprintf _fprintf_
+#define stdout _stdout_
+#define stderr _stderr_
typedef struct {
int fd;
@@ -49,6 +51,8 @@ typedef struct {
int error;
} _FILE_;
+extern _FILE_ *_stdout_, *_stderr_;
+
_FILE_ *_fopen_(const char *path, const char *mode);
int _fclose_(_FILE_ *stream);
int _fflush_(_FILE_ *stream);
diff --git a/apps/plugins/sdl/COPYING b/apps/plugins/sdl/COPYING
new file mode 100644
index 0000000000..2cba2ac74c
--- /dev/null
+++ b/apps/plugins/sdl/COPYING
@@ -0,0 +1,458 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/apps/plugins/sdl/CREDITS b/apps/plugins/sdl/CREDITS
new file mode 100644
index 0000000000..efdcfa4d71
--- /dev/null
+++ b/apps/plugins/sdl/CREDITS
@@ -0,0 +1,94 @@
+
+Simple DirectMedia Layer CREDITS
+Thanks to everyone who made this possible, including:
+
+* Cliff Matthews, for giving me a reason to start this project. :)
+ -- Executor rocks! *grin*
+
+* Scott Call, for making a home for SDL on the 'Net... Thanks! :)
+
+* The Linux Fund, C Magazine, Educational Technology Resources Inc.,
+ Gareth Noyce, Jesse Pavel, Keith Kitchin, Jeremy Horvath, Thomas Nicholson,
+ Hans-Peter Gygax, the Eternal Lands Development Team, Lars Brubaker,
+ and Phoenix Kokido for financial contributions
+
+* Gaëtan de Menten for writing the PHP and SQL behind the SDL website
+
+* Tim Jones for the new look of the SDL website
+
+* Marco Kraus for setting up SDL merchandise
+
+* Martin Donlon for his work on the SDL Documentation Project
+
+* Ryan Gordon for helping everybody out and keeping the dream alive. :)
+
+* IBM R&D Lab for their PS3 SPE video acceleration code
+
+* Mattias Engdegård, for help with the Solaris port and lots of other help
+
+* Max Watson, Matt Slot, and Kyle for help with the MacOS Classic port
+
+* Stan Shebs, for the initial Mac OS X port
+
+* Eric Wing, Max Horn, and Darrell Walisser for unflagging work on the Mac OS X port
+
+* Patrick Trainor, Jim Boucher, and Mike Gorchak for the QNX Neutrino port
+
+* Carsten Griwodz for the AIX port
+
+* Gabriele Greco, for the Amiga port
+
+* Patrice Mandin, for the Atari port
+
+* Hannu Viitala for the EPOC port
+
+* Marcus Mertama for the S60 port.
+
+* Peter Valchev for nagging me about the OpenBSD port until I got it right. :)
+
+* Kent B Mein, for a place to do the IRIX port
+
+* Ash, for a place to do the OSF/1 Alpha port
+
+* David Sowsy, for help with the BeOS port
+
+* Eugenia Loli, for endless work on porting SDL games to BeOS
+
+* Jon Taylor for the GGI front-end
+
+* Paulus Esterhazy, for the Visual C++ testing and libraries
+
+* Brenda Tantzen, for Metrowerks CodeWarrior on MacOS
+
+* Chris Nentwich, for the Hermes assembly blitters
+
+* Michael Vance and Jim Kutter for the X11 OpenGL support
+
+* Stephane Peter, for the AAlib front-end and multi-threaded timer idea.
+
+* Jon Atkins for SDL_image, SDL_mixer and SDL_net documentation
+
+* Peter Wiklund, for the 1998 winning SDL logo,
+ and Arto Hamara, Steven Wong, and Kent Mein for other logo entries.
+
+* Arne Claus, for the 2004 winning SDL logo,
+ and Shandy Brown, Jac, Alex Lyman, Mikkel Gjoel, #Guy, Jonas Hartmann,
+ Daniel Liljeberg, Ronald Sowa, DocD, Pekka Jaervinen, Patrick Avella,
+ Erkki Kontilla, Levon Gavalian, Hal Emerich, David Wiktorsson,
+ S. Schury and F. Hufsky, Ciska de Ruyver, Shredweat, Tyler Montbriand,
+ Martin Andersson, Merlyn Wysard, Fernando Ibanez, David Miller,
+ Andre Bommele, lovesby.com, Francisco Camenforte Torres, and David Igreja
+ for other logo entries.
+
+* Bob Pendleton and David Olofson for being long time contributors to
+ the SDL mailing list.
+
+* Everybody at Loki Software, Inc. for their great contributions!
+
+ And a big hand to everyone else who gave me appreciation, advice,
+ and suggestions, especially the good folks on the SDL mailing list.
+
+THANKS! :)
+
+ -- Sam Lantinga <slouken@libsdl.org>
+
diff --git a/apps/plugins/sdl/NOTES b/apps/plugins/sdl/NOTES
new file mode 100644
index 0000000000..96b90462a6
--- /dev/null
+++ b/apps/plugins/sdl/NOTES
@@ -0,0 +1,5 @@
+- SDL sources are mostly untouched, only some minor tweaks to make it build
+- SDL_image only builds XPM support, edit SDL_config_rockbox.h to change
+- Only video and "keyboard" drivers are implemented, sound and threading are a WIP
+- Video may not work under all pixel formats, please tell me if it doesn't!
+- Ported SDL would conflict with hosted platform's SDL, if present. Worked around by using objcopy --redefine-syms
diff --git a/apps/plugins/sdl/README b/apps/plugins/sdl/README
new file mode 100644
index 0000000000..9899f95a14
--- /dev/null
+++ b/apps/plugins/sdl/README
@@ -0,0 +1,51 @@
+See NOTES for Rockbox-specific porting notes.
+The original README is below:
+
+ Simple DirectMedia Layer
+
+ (SDL)
+
+ Version 1.2
+
+---
+http://www.libsdl.org/
+
+This is the Simple DirectMedia Layer, a general API that provides low
+level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
+and 2D framebuffer across multiple platforms.
+
+The current version supports Linux, Windows CE/95/98/ME/XP/Vista, BeOS,
+MacOS Classic, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,
+and QNX. The code contains support for Dreamcast, Atari, AIX, OSF/Tru64,
+RISC OS, SymbianOS, Nintendo DS, and OS/2, but these are not officially
+supported.
+
+SDL is written in C, but works with C++ natively, and has bindings to
+several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
+Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP,
+Pike, Pliant, Python, Ruby, and Smalltalk.
+
+This library is distributed under GNU LGPL version 2, which can be
+found in the file "COPYING". This license allows you to use SDL
+freely in commercial programs as long as you link with the dynamic
+library.
+
+The best way to learn how to use SDL is to check out the header files in
+the "include" subdirectory and the programs in the "test" subdirectory.
+The header files and test programs are well commented and always up to date.
+More documentation is available in HTML format in "docs/index.html", and
+a documentation wiki is available online at:
+ http://www.libsdl.org/cgi/docwiki.cgi
+
+The test programs in the "test" subdirectory are in the public domain.
+
+Frequently asked questions are answered online:
+ http://www.libsdl.org/faq.php
+
+If you need help with the library, or just want to discuss SDL related
+issues, you can join the developers mailing list:
+ http://www.libsdl.org/mailing-list.php
+
+Enjoy!
+ Sam Lantinga (slouken@libsdl.org)
+
diff --git a/apps/plugins/sdl/README-SDL.txt b/apps/plugins/sdl/README-SDL.txt
new file mode 100644
index 0000000000..4d36ca9dce
--- /dev/null
+++ b/apps/plugins/sdl/README-SDL.txt
@@ -0,0 +1,13 @@
+
+Please distribute this file with the SDL runtime environment:
+
+The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library
+designed to make it easy to write multi-media software, such as games and
+emulators.
+
+The Simple DirectMedia Layer library source code is available from:
+http://www.libsdl.org/
+
+This library is distributed under the terms of the GNU LGPL license:
+http://www.gnu.org/copyleft/lesser.html
+
diff --git a/apps/plugins/sdl/README.Porting b/apps/plugins/sdl/README.Porting
new file mode 100644
index 0000000000..df619934f0
--- /dev/null
+++ b/apps/plugins/sdl/README.Porting
@@ -0,0 +1,56 @@
+
+* Porting To A New Platform
+
+ The first thing you have to do when porting to a new platform, is look at
+include/SDL_platform.h and create an entry there for your operating system.
+The standard format is __PLATFORM__, where PLATFORM is the name of the OS.
+Ideally SDL_platform.h will be able to auto-detect the system it's building
+on based on C preprocessor symbols.
+
+There are two basic ways of building SDL at the moment:
+
+1. The "UNIX" way: ./configure; make; make install
+
+ If you have a GNUish system, then you might try this. Edit configure.in,
+ take a look at the large section labelled:
+ "Set up the configuration based on the target platform!"
+ Add a section for your platform, and then re-run autogen.sh and build!
+
+2. Using an IDE:
+
+ If you're using an IDE or other non-configure build system, you'll probably
+ want to create a custom SDL_config.h for your platform. Edit SDL_config.h,
+ add a section for your platform, and create a custom SDL_config_{platform}.h,
+ based on SDL_config.h.minimal and SDL_config.h.in
+
+ Add the top level include directory to the header search path, and then add
+ the following sources to the project:
+ src/*.c
+ src/audio/*.c
+ src/cdrom/*.c
+ src/cpuinfo/*.c
+ src/events/*.c
+ src/file/*.c
+ src/joystick/*.c
+ src/stdlib/*.c
+ src/thread/*.c
+ src/timer/*.c
+ src/video/*.c
+ src/audio/disk/*.c
+ src/video/dummy/*.c
+ src/joystick/dummy/*.c
+ src/cdrom/dummy/*.c
+ src/thread/generic/*.c
+ src/timer/dummy/*.c
+ src/loadso/dummy/*.c
+
+
+Once you have a working library without any drivers, you can go back to each
+of the major subsystems and start implementing drivers for your platform.
+
+If you have any questions, don't hesitate to ask on the SDL mailing list:
+ http://www.libsdl.org/mailing-list.php
+
+Enjoy!
+ Sam Lantinga (slouken@libsdl.org)
+
diff --git a/apps/plugins/sdl/SDL_image/CHANGES b/apps/plugins/sdl/SDL_image/CHANGES
new file mode 100644
index 0000000000..afaa520ebb
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/CHANGES
@@ -0,0 +1,198 @@
+1.2.12:
+Sam Lantinga - Thu Jan 19 23:18:09 EST 2012
+ * Fixed regression in 1.2.11 loading 8-bit PNG images with libpng
+
+1.2.11:
+Sam Lantinga - Sat Jan 14 17:54:38 EST 2012
+ * Fixed loading 8-bit PNG images on Mac OS X
+Sam Lantinga - Sat Dec 31 09:35:40 EST 2011
+ * SDL_image is now under the zlib license
+Michael Bonfils - Mon Nov 28 21:46:00 EST 2011
+ * Added WEBP image support
+Thomas Klausner - Wed Jan 19 19:31:25 PST 2011
+ * Fixed compiling with libpng 1.4
+Sam Lantinga - Mon Jan 10 12:09:57 2011 -0800
+ * Added Android.mk to build on the Android platform
+Sam Lantinga - Mon May 10 22:42:53 PDT 2010
+ * Fixed loading HAM6 images with stencil mask
+Mark Tucker - Fri, 27 Nov 2009 12:38:21 -0500
+ * Fixed bug loading 15 and 16 bit BMP images
+
+1.2.10:
+Sam Lantinga - Sat Nov 14 11:22:14 PST 2009
+ * Fixed bug loading multiple images
+
+1.2.9:
+Sam Lantinga - Tue Nov 10 00:29:20 PST 2009
+ * Fixed alpha premultiplication on Mac OS X and iPhone OS
+Sam Lantinga - Sun Nov 8 07:52:11 PST 2009
+ * Fixed checking for IMG_Init() return value in image loaders
+
+1.2.8:
+Sam Lantinga - Sun Oct 4 13:12:54 PDT 2009
+ * Added support for uncompressed PCX files
+Mason Wheeler - 2009-06-10 06:29:45 PDT
+ * Added IMG_Init()/IMG_Quit() to prevent constantly loading and unloading DLLs
+Couriersud - Mon, 12 Jan 2009 17:21:13 -0800
+ * Added support for ICO and CUR image files
+Eric Wing - Fri, 2 Jan 2009 02:01:16 -0800
+ * Added ImageIO loading infrastructure for Mac OS X
+ * Added UIImage loading infrastructure for iPhone / iPod Touch
+
+1.2.7:
+Sam Lantinga - Sun Nov 2 15:08:27 PST 2008
+ * Fixed buffer overflow in BMP loading code, discovered by j00ru//vx
+Sam Lantinga - Fri Dec 28 08:34:54 PST 2007
+ * Fixed buffer overflow in GIF loading code, discovered by Michael Skladnikiewicz
+
+1.2.6:
+Sam lantinga - Wed Jul 18 00:30:32 PDT 2007
+ * Improved detection of libjpeg, libpng, and libtiff at configure time
+ * PNG and TIFF images are correctly identified even if dynamic libraries
+ to load them aren't available.
+ * Fixed loading of TIFF images using libtiff 3.6
+Sam Lantinga - Thu Jul 5 07:52:35 2007
+ * Fixed static linking with libjpeg
+Michael Koch - Tue Feb 13 10:09:17 2007
+ * Fixed crash in IMG_ReadXPMFromArray()
+
+1.2.5:
+Maurizio Monge - Sun May 14 13:57:32 PDT 2006
+ * Fixed loading BMP palettes at unusual offsets
+Sam Lantinga - Thu May 11 21:51:19 PDT 2006
+ * Added support for dynamically loading libjpeg, libpng, and libtiff.
+Sam Lantinga - Sun Apr 30 01:48:40 PDT 2006
+ * Added gcc-fat.sh for generating Universal binaries on Mac OS X
+ * Updated libtool support to version 1.5.22
+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
+
+1.2.4:
+Pierre G. Richard - Fri, 30 Jul 2004 11:13:11 +0000 (UTC)
+ * Added support for RLE encoded BMP files
+Marc Le Douarain - Fri, 26 Dec 2003 18:23:42 +0100
+ * Added EHB and HAM mode support to the ILBM loader
+Sam Lantinga - Wed Nov 19 00:23:44 PST 2003
+ * Updated libtool support for new mingw32 DLL build process
+Holger Schemel - Mon, 04 Aug 2003 21:50:52 +0200
+ * Fixed crash loading certain PCX images
+Kyle Davenport - Sat, 19 Apr 2003 17:13:31 -0500
+ * Added .la files to the development RPM, fixing RPM build on RedHat 8
+
+1.2.3:
+Ryan C. Gordon - Sat, 8 Feb 2003 09:36:33 -0500
+ * Fixed memory leak with non-seekable SDL_RWops
+Marc Le Douarain - Sun, 22 Dec 2002 22:59:51 +0100
+ * Added 24-bit support to the ILBM format loader
+Sam Lantinga - Sun Oct 20 20:55:46 PDT 2002
+ * Added shared library support for MacOS X
+Pete Shinners - Thu Jun 20 10:05:54 PDT 2002
+ * The JPEG loader can now load EXIF format JPEG images
+Dag-Erling Smorgrav - Thu May 2 19:09:48 PDT 2002
+ * The XCF loader now ignores invisible layers and channels
+
+1.2.2:
+Sam Lantinga - Sat Apr 13 07:49:47 PDT 2002
+ * Updated autogen.sh for new versions of automake
+ * Specify the SDL API calling convention (C by default)
+Mattias Engdegård - Fri Dec 28 17:54:31 PST 2001
+ * Worked around exit() in the jpeg image library
+
+1.2.1:
+Mattias Engdegård - Tue Nov 20 08:08:53 PST 2001
+ * Fixed transparency in the GIF loading code
+Daniel Morais - Sun Sep 23 16:32:13 PDT 2001
+ * Added support for the IFF (LBM) image format
+Sam Lantinga - Sun Aug 19 01:51:44 PDT 2001
+ * Added Project Builder projects for building MacOS X framework
+Mattias Engdegård - Tue Jul 31 04:32:29 PDT 2001
+ * Fixed transparency in 8-bit PNG files
+Mattias Engdegård - Sat Apr 28 11:30:22 PDT 2001
+ * Added support for loading XPM image data directly
+Paul Jenner - Sat, 14 Apr 2001 09:20:38 -0700 (PDT)
+ * Added support for building RPM directly from tar archive
+
+1.2.0:
+Sam Lantinga - Wed Apr 4 12:42:20 PDT 2001
+ * Synchronized release version with SDL 1.2.0
+
+1.1.1:
+Berni - Wed Mar 7 09:18:02 PST 2001
+ * Added initial GIMP XCF support (disabled by default)
+Mattias Engdegård - Wed Mar 7 09:01:49 PST 2001
+ * Added general PNM (PPM/PGM/PBM) support
+Mattias Engdegård - Sun Mar 4 14:23:42 PST 2001
+ * Fixed bugs in PPM support, added ASCII PPM support
+Mattias Engdegård - Fri Mar 2 14:48:09 PST 2001
+ * Cleaned up some compiler warnings
+Mattias Engdegård - Tue Feb 27 12:44:43 PST 2001
+ * Improved the PCX loading code
+ * Modified showimage to set hardware palette for 8-bit displays
+Robert Stein - Thu, 22 Feb 2001 14:26:19 -0600
+ * Improved the PPM loading code
+Sam Lantinga - Tue Jan 30 14:24:06 PST 2001
+ * Modified showimage to accept multiple images on the command line
+Sam Lantinga - Mon Dec 18 02:49:29 PST 2000
+ * Added a Visual C++ project including JPEG and PNG loading support
+Mattias Engdegård - Wed Dec 6 10:00:07 PST 2000
+ * Improved the XPM loading code
+
+1.1.0:
+Sam Lantinga - Wed Nov 29 00:46:27 PST 2000
+ * Added XPM file format support
+ Supports color, greyscale, and mono XPMs with and without transparency
+Mattias Engdegård - Thu, 2 Nov 2000 23:23:17 +0100 (MET)
+ * Fixed array overrun when loading an unsupported format
+ * Minor compilation fixes for various platforms
+
+1.0.10:
+Mattias Engdegård - Wed Aug 9 20:32:22 MET DST 2000
+ * Removed the alpha flipping, made IMG_InvertAlpha() a noop
+ * Fixed nonexisting PCX alpha support
+ * Some TIFF bugfixes
+ * PNG greyscale images are loaded as 8bpp with a greyscale palette
+Ray Kelm - Fri, 04 Aug 2000 20:58:00 -0400
+ * Added support for cross-compiling Windows DLL from Linux
+
+1.0.9:
+Mattias Engdegård - Sat Jul 1 17:57:37 PDT 2000
+ * PNG loader properly sets the colorkey on 8-bit transparent images
+Mattias Engdegård - Sat Jul 1 13:24:47 PDT 2000
+ * Fixed a bug in PCX detection
+ * Added support for TGA files
+ * showimage shows a checker background for transparent images
+
+1.0.8:
+Mark Baker - Tue May 30 12:20:00 PDT 2000
+ * Added TIFF format loading support
+
+1.0.7:
+Mattias Engdegård - Sat May 27 14:18:33 PDT 2000
+ * Added fixes for loading images on big-endian systems
+
+1.0.6:
+Sam Lantinga - Sat Apr 29 10:18:32 PDT 2000
+ * showimage puts the name of the image in the title bar caption
+Sam Lantinga - Sat Apr 29 10:05:58 PDT 2000
+ * Removed pitch check, since PNG already loads to a list of row pointers
+
+1.0.5:
+Sam Lantinga - Sun Apr 23 14:41:32 PDT 2000
+ * Added support for GIF transparency
+Sam Lantinga - Wed Apr 12 14:39:20 PDT 2000
+ * Fixed memory heap crash on NT using PNG images
+Matt Campbell - Thu, 13 Apr 2000 13:29:17 -0700
+ * Fixed PNG detection on some Linux systems
+
+1.0.4:
+Sam Lantinga - Tue Feb 1 13:33:53 PST 2000
+ * Cleaned up for Visual C++
+ * Added Visual C++ project file
+
+1.0.3:
+Sam Lantinga - Wed Jan 19 22:10:52 PST 2000
+ * Added CHANGES
+ * Added rpm spec file contributed by Hakan Tandogan
+ * Changed the name of the example program from "show" to "showimage"
diff --git a/apps/plugins/sdl/SDL_image/COPYING b/apps/plugins/sdl/SDL_image/COPYING
new file mode 100644
index 0000000000..4e93f208ea
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/COPYING
@@ -0,0 +1,20 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
diff --git a/apps/plugins/sdl/SDL_image/IMG.c b/apps/plugins/sdl/SDL_image/IMG.c
new file mode 100644
index 0000000000..58707671d8
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG.c
@@ -0,0 +1,214 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* A simple library to load images of various formats as SDL surfaces */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "SDL_image.h"
+
+#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+/* Table of image detection and loading functions */
+static struct {
+ char *type;
+ int (SDLCALL *is)(SDL_RWops *src);
+ SDL_Surface *(SDLCALL *load)(SDL_RWops *src);
+} supported[] = {
+ /* keep magicless formats first */
+ { "TGA", NULL, IMG_LoadTGA_RW },
+ { "CUR", IMG_isCUR, IMG_LoadCUR_RW },
+ { "ICO", IMG_isICO, IMG_LoadICO_RW },
+ { "BMP", IMG_isBMP, IMG_LoadBMP_RW },
+ { "GIF", IMG_isGIF, IMG_LoadGIF_RW },
+ { "JPG", IMG_isJPG, IMG_LoadJPG_RW },
+ { "LBM", IMG_isLBM, IMG_LoadLBM_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 },
+ { "WEBP", IMG_isWEBP, IMG_LoadWEBP_RW },
+};
+
+const SDL_version *IMG_Linked_Version(void)
+{
+ static SDL_version linked_version;
+ SDL_IMAGE_VERSION(&linked_version);
+ return(&linked_version);
+}
+
+extern int IMG_InitJPG();
+extern void IMG_QuitJPG();
+extern int IMG_InitPNG();
+extern void IMG_QuitPNG();
+extern int IMG_InitTIF();
+extern void IMG_QuitTIF();
+
+extern int IMG_InitWEBP();
+extern void IMG_QuitWEBP();
+
+static int initialized = 0;
+
+int IMG_Init(int flags)
+{
+ int result = 0;
+
+ if (flags & IMG_INIT_JPG) {
+ if ((initialized & IMG_INIT_JPG) || IMG_InitJPG() == 0) {
+ result |= IMG_INIT_JPG;
+ }
+ }
+ if (flags & IMG_INIT_PNG) {
+ if ((initialized & IMG_INIT_PNG) || IMG_InitPNG() == 0) {
+ result |= IMG_INIT_PNG;
+ }
+ }
+ if (flags & IMG_INIT_TIF) {
+ if ((initialized & IMG_INIT_TIF) || IMG_InitTIF() == 0) {
+ result |= IMG_INIT_TIF;
+ }
+ }
+ if (flags & IMG_INIT_WEBP) {
+ if ((initialized & IMG_INIT_WEBP) || IMG_InitWEBP() == 0) {
+ result |= IMG_INIT_WEBP;
+ }
+ }
+ initialized |= result;
+
+ return (initialized);
+}
+
+void IMG_Quit()
+{
+ if (initialized & IMG_INIT_JPG) {
+ IMG_QuitJPG();
+ }
+ if (initialized & IMG_INIT_PNG) {
+ IMG_QuitPNG();
+ }
+ if (initialized & IMG_INIT_TIF) {
+ IMG_QuitTIF();
+ }
+ if (initialized & IMG_INIT_WEBP) {
+ IMG_QuitWEBP();
+ }
+ initialized = 0;
+}
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+/* Load an image from a file */
+SDL_Surface *IMG_Load(const char *file)
+{
+ SDL_RWops *src = SDL_RWFromFile(file, "rb");
+ char *ext = strrchr(file, '.');
+ if(ext) {
+ ext++;
+ }
+ if(!src) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ return IMG_LoadTyped_RW(src, 1, ext);
+}
+#endif
+
+/* Load an image from an SDL datasource (for compatibility) */
+SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc)
+{
+ return IMG_LoadTyped_RW(src, freesrc, NULL);
+}
+
+/* Portable case-insensitive string compare function */
+static int IMG_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 an image from an SDL datasource, optionally specifying the type */
+SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type)
+{
+ int i;
+ SDL_Surface *image;
+
+ /* Make sure there is something to do.. */
+ if ( src == NULL ) {
+ IMG_SetError("Passed a NULL data source");
+ return(NULL);
+ }
+
+ /* See whether or not this data source can handle seeking */
+ if ( SDL_RWseek(src, 0, RW_SEEK_CUR) < 0 ) {
+ IMG_SetError("Can't seek in this data source");
+ if(freesrc)
+ SDL_RWclose(src);
+ return(NULL);
+ }
+
+ /* Detect the type of image being loaded */
+ image = NULL;
+ for ( i=0; i < ARRAYSIZE(supported); ++i ) {
+ if(supported[i].is) {
+ if(!supported[i].is(src))
+ {
+ continue;
+ }
+ } else {
+ /* magicless format */
+ if(!type
+ || !IMG_string_equals(type, supported[i].type))
+ continue;
+ }
+#ifdef DEBUG_IMGLIB
+ fprintf(stderr, "IMGLIB: Loading image as %s\n",
+ supported[i].type);
+#endif
+ image = supported[i].load(src);
+ if(freesrc)
+ SDL_RWclose(src);
+ return image;
+ }
+
+ if ( freesrc ) {
+ SDL_RWclose(src);
+ }
+ IMG_SetError("Unsupported image format");
+ return NULL;
+}
+
+/* Invert the alpha of a surface for use with OpenGL
+ This function is a no-op and only kept for backwards compatibility.
+ */
+int IMG_InvertAlpha(int on)
+{
+ return 1;
+}
diff --git a/apps/plugins/sdl/SDL_image/IMG_bmp.c b/apps/plugins/sdl/SDL_image/IMG_bmp.c
new file mode 100644
index 0000000000..b3c7580bbf
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_bmp.c
@@ -0,0 +1,848 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a BMP image file loading framework */
+/* ICO/CUR file support is here as well since it uses similar internal
+ * representation */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_BMP
+
+/* See if an image is contained in a data source */
+int IMG_isBMP(SDL_RWops *src)
+{
+ int start;
+ int is_BMP;
+ char magic[2];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_BMP = 0;
+ if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
+ if ( strncmp(magic, "BM", 2) == 0 ) {
+ is_BMP = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_BMP);
+}
+
+static int IMG_isICOCUR(SDL_RWops *src, int type)
+{
+ int start;
+ int is_ICOCUR;
+
+ /* The Win32 ICO file header (14 bytes) */
+ Uint16 bfReserved;
+ Uint16 bfType;
+ Uint16 bfCount;
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_ICOCUR = 0;
+ bfReserved = SDL_ReadLE16(src);
+ bfType = SDL_ReadLE16(src);
+ bfCount = SDL_ReadLE16(src);
+ if ((bfReserved == 0) && (bfType == type) && (bfCount != 0))
+ is_ICOCUR = 1;
+ SDL_RWseek(src, start, RW_SEEK_SET);
+
+ return (is_ICOCUR);
+}
+
+int IMG_isICO(SDL_RWops *src)
+{
+ return IMG_isICOCUR(src, 1);
+}
+
+int IMG_isCUR(SDL_RWops *src)
+{
+ return IMG_isICOCUR(src, 2);
+}
+
+#include "SDL_error.h"
+#include "SDL_video.h"
+#include "SDL_endian.h"
+
+/* Compression encodings for BMP files */
+#ifndef BI_RGB
+#define BI_RGB 0
+#define BI_RLE8 1
+#define BI_RLE4 2
+#define BI_BITFIELDS 3
+#endif
+
+static int readRlePixels(SDL_Surface * surface, SDL_RWops * src, int isRle8)
+{
+ /*
+ | Sets the surface pixels from src. A bmp image is upside down.
+ */
+ int pitch = surface->pitch;
+ int height = surface->h;
+ Uint8 *start = (Uint8 *)surface->pixels;
+ Uint8 *end = start + (height*pitch);
+ Uint8 *bits = end-pitch, *spot;
+ int ofs = 0;
+ Uint8 ch;
+ Uint8 needsPad;
+
+#define COPY_PIXEL(x) spot = &bits[ofs++]; if(spot >= start && spot < end) *spot = (x)
+
+ for (;;) {
+ if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;
+ /*
+ | encoded mode starts with a run length, and then a byte
+ | with two colour indexes to alternate between for the run
+ */
+ if ( ch ) {
+ Uint8 pixel;
+ if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;
+ if ( isRle8 ) { /* 256-color bitmap, compressed */
+ do {
+ COPY_PIXEL(pixel);
+ } while (--ch);
+ } else { /* 16-color bitmap, compressed */
+ Uint8 pixel0 = pixel >> 4;
+ Uint8 pixel1 = pixel & 0x0F;
+ for (;;) {
+ COPY_PIXEL(pixel0); /* even count, high nibble */
+ if (!--ch) break;
+ COPY_PIXEL(pixel1); /* odd count, low nibble */
+ if (!--ch) break;
+ }
+ }
+ } else {
+ /*
+ | A leading zero is an escape; it may signal the end of the bitmap,
+ | a cursor move, or some absolute data.
+ | zero tag may be absolute mode or an escape
+ */
+ if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;
+ switch (ch) {
+ case 0: /* end of line */
+ ofs = 0;
+ bits -= pitch; /* go to previous */
+ break;
+ case 1: /* end of bitmap */
+ return 0; /* success! */
+ case 2: /* delta */
+ if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;
+ ofs += ch;
+ if ( !SDL_RWread(src, &ch, 1, 1) ) return 1;
+ bits -= (ch * pitch);
+ break;
+ default: /* no compression */
+ if (isRle8) {
+ needsPad = ( ch & 1 );
+ do {
+ Uint8 pixel;
+ if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;
+ COPY_PIXEL(pixel);
+ } while (--ch);
+ } else {
+ needsPad = ( ((ch+1)>>1) & 1 ); /* (ch+1)>>1: bytes size */
+ for (;;) {
+ Uint8 pixel;
+ if ( !SDL_RWread(src, &pixel, 1, 1) ) return 1;
+ COPY_PIXEL(pixel >> 4);
+ if (!--ch) break;
+ COPY_PIXEL(pixel & 0x0F);
+ if (!--ch) break;
+ }
+ }
+ /* pad at even boundary */
+ if ( needsPad && !SDL_RWread(src, &ch, 1, 1) ) return 1;
+ break;
+ }
+ }
+ }
+}
+
+static SDL_Surface *LoadBMP_RW (SDL_RWops *src, int freesrc)
+{
+ SDL_bool was_error;
+ long fp_offset;
+ int bmpPitch;
+ int i, pad;
+ SDL_Surface *surface;
+ Uint32 Rmask;
+ Uint32 Gmask;
+ Uint32 Bmask;
+ Uint32 Amask;
+ SDL_Palette *palette;
+ Uint8 *bits;
+ Uint8 *top, *end;
+ SDL_bool topDown;
+ int ExpandBMP;
+
+ /* The Win32 BMP file header (14 bytes) */
+ char magic[2];
+ Uint32 bfSize;
+ Uint16 bfReserved1;
+ Uint16 bfReserved2;
+ Uint32 bfOffBits;
+
+ /* The Win32 BITMAPINFOHEADER struct (40 bytes) */
+ Uint32 biSize;
+ Sint32 biWidth;
+ Sint32 biHeight;
+ Uint16 biPlanes;
+ Uint16 biBitCount;
+ Uint32 biCompression;
+ Uint32 biSizeImage;
+ Sint32 biXPelsPerMeter;
+ Sint32 biYPelsPerMeter;
+ Uint32 biClrUsed;
+ Uint32 biClrImportant;
+
+ /* 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 ( strncmp(magic, "BM", 2) != 0 ) {
+ IMG_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 ) {
+ biWidth = (Uint32)SDL_ReadLE16(src);
+ biHeight = (Uint32)SDL_ReadLE16(src);
+ biPlanes = SDL_ReadLE16(src);
+ biBitCount = SDL_ReadLE16(src);
+ biCompression = BI_RGB;
+ biSizeImage = 0;
+ biXPelsPerMeter = 0;
+ biYPelsPerMeter = 0;
+ biClrUsed = 0;
+ biClrImportant = 0;
+ } else {
+ 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);
+ }
+ if (biHeight < 0) {
+ topDown = SDL_TRUE;
+ biHeight = -biHeight;
+ } else {
+ topDown = SDL_FALSE;
+ }
+
+ /* Check for read error */
+ if ( strcmp(SDL_GetError(), "") != 0 ) {
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */
+ switch (biBitCount) {
+ case 1:
+ case 4:
+ ExpandBMP = biBitCount;
+ biBitCount = 8;
+ break;
+ default:
+ ExpandBMP = 0;
+ break;
+ }
+
+ /* RLE4 and RLE8 BMP compression is supported */
+ Rmask = Gmask = Bmask = Amask = 0;
+ switch (biCompression) {
+ case BI_RGB:
+ /* If there are no masks, use the defaults */
+ if ( bfOffBits == (14+biSize) ) {
+ /* Default values for the BMP format */
+ switch (biBitCount) {
+ case 15:
+ case 16:
+ Rmask = 0x7C00;
+ Gmask = 0x03E0;
+ Bmask = 0x001F;
+ break;
+ case 24:
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ Rmask = 0x000000FF;
+ Gmask = 0x0000FF00;
+ Bmask = 0x00FF0000;
+#else
+ Rmask = 0x00FF0000;
+ Gmask = 0x0000FF00;
+ Bmask = 0x000000FF;
+#endif
+ break;
+ case 32:
+ Amask = 0xFF000000;
+ Rmask = 0x00FF0000;
+ Gmask = 0x0000FF00;
+ Bmask = 0x000000FF;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ /* Fall through -- read the RGB masks */
+
+ default:
+ switch (biBitCount) {
+ case 15:
+ case 16:
+ Rmask = SDL_ReadLE32(src);
+ Gmask = SDL_ReadLE32(src);
+ Bmask = SDL_ReadLE32(src);
+ break;
+ case 32:
+ Rmask = SDL_ReadLE32(src);
+ Gmask = SDL_ReadLE32(src);
+ Bmask = SDL_ReadLE32(src);
+ Amask = SDL_ReadLE32(src);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+
+ /* Create a compatible surface, note that the colors are RGB ordered */
+ surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
+ biWidth, biHeight, biBitCount, Rmask, Gmask, Bmask, Amask);
+ if ( surface == NULL ) {
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Load the palette, if any */
+ palette = (surface->format)->palette;
+ if ( palette ) {
+ if ( SDL_RWseek(src, fp_offset+14+biSize, RW_SEEK_SET) < 0 ) {
+ SDL_Error(SDL_EFSEEK);
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /*
+ | guich: always use 1<<bpp b/c some bitmaps can bring wrong information
+ | for colorsUsed
+ */
+ /* if ( biClrUsed == 0 ) { */
+ biClrUsed = 1 << biBitCount;
+ /* } */
+ if ( biSize == 12 ) {
+ for ( i = 0; i < (int)biClrUsed; ++i ) {
+ SDL_RWread(src, &palette->colors[i].b, 1, 1);
+ SDL_RWread(src, &palette->colors[i].g, 1, 1);
+ SDL_RWread(src, &palette->colors[i].r, 1, 1);
+ palette->colors[i].unused = 0;
+ }
+ } else {
+ for ( i = 0; i < (int)biClrUsed; ++i ) {
+ SDL_RWread(src, &palette->colors[i].b, 1, 1);
+ SDL_RWread(src, &palette->colors[i].g, 1, 1);
+ SDL_RWread(src, &palette->colors[i].r, 1, 1);
+ SDL_RWread(src, &palette->colors[i].unused, 1, 1);
+ }
+ }
+ palette->ncolors = biClrUsed;
+ }
+
+ /* Read the surface pixels. Note that the bmp image is upside down */
+ if ( SDL_RWseek(src, fp_offset+bfOffBits, RW_SEEK_SET) < 0 ) {
+ SDL_Error(SDL_EFSEEK);
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ if ((biCompression == BI_RLE4) || (biCompression == BI_RLE8)) {
+ was_error = readRlePixels(surface, src, biCompression == BI_RLE8);
+ if (was_error) IMG_SetError("Error reading from BMP");
+ goto done;
+ }
+ top = (Uint8 *)surface->pixels;
+ end = (Uint8 *)surface->pixels+(surface->h*surface->pitch);
+ switch (ExpandBMP) {
+ case 1:
+ bmpPitch = (biWidth + 7) >> 3;
+ pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);
+ break;
+ case 4:
+ bmpPitch = (biWidth + 1) >> 1;
+ pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0);
+ break;
+ default:
+ pad = ((surface->pitch%4) ?
+ (4-(surface->pitch%4)) : 0);
+ break;
+ }
+ if ( topDown ) {
+ bits = top;
+ } else {
+ bits = end - surface->pitch;
+ }
+ while ( bits >= top && bits < end ) {
+ switch (ExpandBMP) {
+ case 1:
+ case 4: {
+ Uint8 pixel = 0;
+ int shift = (8-ExpandBMP);
+ for ( i=0; i<surface->w; ++i ) {
+ if ( i%(8/ExpandBMP) == 0 ) {
+ if ( !SDL_RWread(src, &pixel, 1, 1) ) {
+ IMG_SetError(
+ "Error reading from BMP");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ }
+ *(bits+i) = (pixel>>shift);
+ pixel <<= ExpandBMP;
+ } }
+ break;
+
+ default:
+ if ( SDL_RWread(src, bits, 1, surface->pitch)
+ != surface->pitch ) {
+ SDL_Error(SDL_EFREAD);
+ was_error = SDL_TRUE;
+ goto done;
+ }
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ /* Byte-swap the pixels if needed. Note that the 24bpp
+ case has already been taken care of above. */
+ switch(biBitCount) {
+ case 15:
+ case 16: {
+ Uint16 *pix = (Uint16 *)bits;
+ for(i = 0; i < surface->w; i++)
+ pix[i] = SDL_Swap16(pix[i]);
+ break;
+ }
+
+ case 32: {
+ Uint32 *pix = (Uint32 *)bits;
+ for(i = 0; i < surface->w; i++)
+ pix[i] = SDL_Swap32(pix[i]);
+ break;
+ }
+ }
+#endif
+ break;
+ }
+ /* Skip padding bytes, ugh */
+ if ( pad ) {
+ Uint8 padbyte;
+ for ( i=0; i<pad; ++i ) {
+ SDL_RWread(src, &padbyte, 1, 1);
+ }
+ }
+ if ( topDown ) {
+ bits += surface->pitch;
+ } else {
+ bits -= surface->pitch;
+ }
+ }
+done:
+ if ( was_error ) {
+ if ( src ) {
+ SDL_RWseek(src, fp_offset, RW_SEEK_SET);
+ }
+ if ( surface ) {
+ SDL_FreeSurface(surface);
+ }
+ surface = NULL;
+ }
+ if ( freesrc && src ) {
+ SDL_RWclose(src);
+ }
+ return(surface);
+}
+
+static Uint8
+SDL_Read8(SDL_RWops * src)
+{
+ Uint8 value;
+
+ SDL_RWread(src, &value, 1, 1);
+ return (value);
+}
+
+static SDL_Surface *
+LoadICOCUR_RW(SDL_RWops * src, int type, int freesrc)
+{
+ SDL_bool was_error;
+ long fp_offset;
+ int bmpPitch;
+ int i, pad;
+ SDL_Surface *surface;
+ Uint32 Rmask;
+ Uint32 Gmask;
+ Uint32 Bmask;
+ Uint8 *bits;
+ int ExpandBMP;
+ int maxCol = 0;
+ int icoOfs = 0;
+ Uint32 palette[256];
+
+ /* The Win32 ICO file header (14 bytes) */
+ Uint16 bfReserved;
+ Uint16 bfType;
+ Uint16 bfCount;
+
+ /* The Win32 BITMAPINFOHEADER struct (40 bytes) */
+ Uint32 biSize;
+ Sint32 biWidth;
+ Sint32 biHeight;
+ Uint16 biPlanes;
+ Uint16 biBitCount;
+ Uint32 biCompression;
+ Uint32 biSizeImage;
+ Sint32 biXPelsPerMeter;
+ Sint32 biYPelsPerMeter;
+ Uint32 biClrUsed;
+ Uint32 biClrImportant;
+
+ /* 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 ICO file header */
+ fp_offset = SDL_RWtell(src);
+ SDL_ClearError();
+
+ bfReserved = SDL_ReadLE16(src);
+ bfType = SDL_ReadLE16(src);
+ bfCount = SDL_ReadLE16(src);
+ if ((bfReserved != 0) || (bfType != type) || (bfCount == 0)) {
+ IMG_SetError("File is not a Windows %s file", type == 1 ? "ICO" : "CUR");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Read the Win32 Icon Directory */
+ for (i = 0; i < bfCount; i++) {
+ /* Icon Directory Entries */
+ int bWidth = SDL_Read8(src); /* Uint8, but 0 = 256 ! */
+ int bHeight = SDL_Read8(src); /* Uint8, but 0 = 256 ! */
+ int bColorCount = SDL_Read8(src); /* Uint8, but 0 = 256 ! */
+ Uint8 bReserved = SDL_Read8(src);
+ Uint16 wPlanes = SDL_ReadLE16(src);
+ Uint16 wBitCount = SDL_ReadLE16(src);
+ Uint32 dwBytesInRes = SDL_ReadLE32(src);
+ Uint32 dwImageOffset = SDL_ReadLE32(src);
+
+ if (!bWidth)
+ bWidth = 256;
+ if (!bHeight)
+ bHeight = 256;
+ if (!bColorCount)
+ bColorCount = 256;
+
+ //printf("%dx%d@%d - %08x\n", bWidth, bHeight, bColorCount, dwImageOffset);
+ if (bColorCount > maxCol) {
+ maxCol = bColorCount;
+ icoOfs = dwImageOffset;
+ //printf("marked\n");
+ }
+ }
+
+ /* Advance to the DIB Data */
+ if (SDL_RWseek(src, icoOfs, RW_SEEK_SET) < 0) {
+ SDL_Error(SDL_EFSEEK);
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Read the Win32 BITMAPINFOHEADER */
+ biSize = SDL_ReadLE32(src);
+ if (biSize == 40) {
+ 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);
+ } else {
+ IMG_SetError("Unsupported ICO bitmap format");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Check for read error */
+ if (SDL_strcmp(SDL_GetError(), "") != 0) {
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* We don't support any BMP compression right now */
+ switch (biCompression) {
+ case BI_RGB:
+ /* Default values for the BMP format */
+ switch (biBitCount) {
+ case 1:
+ case 4:
+ ExpandBMP = biBitCount;
+ biBitCount = 8;
+ break;
+ case 8:
+ ExpandBMP = 8;
+ break;
+ case 32:
+ Rmask = 0x00FF0000;
+ Gmask = 0x0000FF00;
+ Bmask = 0x000000FF;
+ ExpandBMP = 0;
+ break;
+ default:
+ IMG_SetError("ICO file with unsupported bit count");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ break;
+ default:
+ IMG_SetError("Compressed ICO files not supported");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Create a RGBA surface */
+ biHeight = biHeight >> 1;
+ //printf("%d x %d\n", biWidth, biHeight);
+ surface =
+ SDL_CreateRGBSurface(0, biWidth, biHeight, 32, 0x00FF0000,
+ 0x0000FF00, 0x000000FF, 0xFF000000);
+ if (surface == NULL) {
+ was_error = SDL_TRUE;
+ goto done;
+ }
+
+ /* Load the palette, if any */
+ //printf("bc %d bused %d\n", biBitCount, biClrUsed);
+ if (biBitCount <= 8) {
+ if (biClrUsed == 0) {
+ biClrUsed = 1 << biBitCount;
+ }
+ for (i = 0; i < (int) biClrUsed; ++i) {
+ SDL_RWread(src, &palette[i], 4, 1);
+ }
+ }
+
+ /* Read the surface pixels. Note that the bmp image is upside down */
+ bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);
+ switch (ExpandBMP) {
+ case 1:
+ bmpPitch = (biWidth + 7) >> 3;
+ pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
+ break;
+ case 4:
+ bmpPitch = (biWidth + 1) >> 1;
+ pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
+ break;
+ case 8:
+ bmpPitch = biWidth;
+ pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
+ break;
+ default:
+ bmpPitch = biWidth * 4;
+ pad = 0;
+ break;
+ }
+ while (bits > (Uint8 *) surface->pixels) {
+ bits -= surface->pitch;
+ switch (ExpandBMP) {
+ case 1:
+ case 4:
+ case 8:
+ {
+ Uint8 pixel = 0;
+ int shift = (8 - ExpandBMP);
+ for (i = 0; i < surface->w; ++i) {
+ if (i % (8 / ExpandBMP) == 0) {
+ if (!SDL_RWread(src, &pixel, 1, 1)) {
+ IMG_SetError("Error reading from ICO");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ }
+ *((Uint32 *) bits + i) = (palette[pixel >> shift]);
+ pixel <<= ExpandBMP;
+ }
+ }
+ break;
+
+ default:
+ if (SDL_RWread(src, bits, 1, surface->pitch)
+ != surface->pitch) {
+ SDL_Error(SDL_EFREAD);
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ break;
+ }
+ /* Skip padding bytes, ugh */
+ if (pad) {
+ Uint8 padbyte;
+ for (i = 0; i < pad; ++i) {
+ SDL_RWread(src, &padbyte, 1, 1);
+ }
+ }
+ }
+ /* Read the mask pixels. Note that the bmp image is upside down */
+ bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);
+ ExpandBMP = 1;
+ bmpPitch = (biWidth + 7) >> 3;
+ pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
+ while (bits > (Uint8 *) surface->pixels) {
+ Uint8 pixel = 0;
+ int shift = (8 - ExpandBMP);
+
+ bits -= surface->pitch;
+ for (i = 0; i < surface->w; ++i) {
+ if (i % (8 / ExpandBMP) == 0) {
+ if (!SDL_RWread(src, &pixel, 1, 1)) {
+ IMG_SetError("Error reading from ICO");
+ was_error = SDL_TRUE;
+ goto done;
+ }
+ }
+ *((Uint32 *) bits + i) |= ((pixel >> shift) ? 0 : 0xFF000000);
+ pixel <<= ExpandBMP;
+ }
+ /* Skip padding bytes, ugh */
+ if (pad) {
+ Uint8 padbyte;
+ for (i = 0; i < pad; ++i) {
+ SDL_RWread(src, &padbyte, 1, 1);
+ }
+ }
+ }
+ done:
+ if (was_error) {
+ if (src) {
+ SDL_RWseek(src, fp_offset, RW_SEEK_SET);
+ }
+ if (surface) {
+ SDL_FreeSurface(surface);
+ }
+ surface = NULL;
+ }
+ if (freesrc && src) {
+ SDL_RWclose(src);
+ }
+ return (surface);
+}
+
+/* Load a BMP type image from an SDL datasource */
+SDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src)
+{
+ return(LoadBMP_RW(src, 0));
+}
+
+/* Load a ICO type image from an SDL datasource */
+SDL_Surface *IMG_LoadICO_RW(SDL_RWops *src)
+{
+ return(LoadICOCUR_RW(src, 1, 0));
+}
+
+/* Load a CUR type image from an SDL datasource */
+SDL_Surface *IMG_LoadCUR_RW(SDL_RWops *src)
+{
+ return(LoadICOCUR_RW(src, 2, 0));
+}
+
+#else
+
+/* See if an image is contained in a data source */
+int IMG_isBMP(SDL_RWops *src)
+{
+ return(0);
+}
+
+int IMG_isICO(SDL_RWops *src)
+{
+ return(0);
+}
+
+int IMG_isCUR(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a BMP type image from an SDL datasource */
+SDL_Surface *IMG_LoadBMP_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+/* Load a BMP type image from an SDL datasource */
+SDL_Surface *IMG_LoadCUR_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+/* Load a BMP type image from an SDL datasource */
+SDL_Surface *IMG_LoadICO_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_BMP */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_gif.c b/apps/plugins/sdl/SDL_image/IMG_gif.c
new file mode 100644
index 0000000000..de93fa7718
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_gif.c
@@ -0,0 +1,625 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a GIF image file loading framework */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_GIF
+
+/* See if an image is contained in a data source */
+int IMG_isGIF(SDL_RWops *src)
+{
+ int start;
+ int is_GIF;
+ char magic[6];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_GIF = 0;
+ if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
+ if ( (strncmp(magic, "GIF", 3) == 0) &&
+ ((memcmp(magic + 3, "87a", 3) == 0) ||
+ (memcmp(magic + 3, "89a", 3) == 0)) ) {
+ is_GIF = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_GIF);
+}
+
+/* Code from here to end of file has been adapted from XPaint: */
+/* +-------------------------------------------------------------------+ */
+/* | Copyright 1990, 1991, 1993 David Koblas. | */
+/* | Copyright 1996 Torsten Martinsen. | */
+/* | Permission to use, copy, modify, and distribute this software | */
+/* | and its documentation for any purpose and without fee is hereby | */
+/* | granted, provided that the above copyright notice appear in all | */
+/* | copies and that both that copyright notice and this permission | */
+/* | notice appear in supporting documentation. This software is | */
+/* | provided "as is" without express or implied warranty. | */
+/* +-------------------------------------------------------------------+ */
+
+/* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */
+#define USED_BY_SDL
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef USED_BY_SDL
+/* Changes to work with SDL:
+
+ Include SDL header file
+ Use SDL_Surface rather than xpaint Image structure
+ Define SDL versions of RWSetMsg(), ImageNewCmap() and ImageSetCmap()
+*/
+#include "SDL.h"
+
+#define Image SDL_Surface
+#define RWSetMsg IMG_SetError
+#define ImageNewCmap(w, h, s) SDL_AllocSurface(SDL_SWSURFACE,w,h,8,0,0,0,0)
+#define ImageSetCmap(s, i, R, G, B) do { \
+ s->format->palette->colors[i].r = R; \
+ s->format->palette->colors[i].g = G; \
+ s->format->palette->colors[i].b = B; \
+ } while (0)
+/* * * * * */
+
+#else
+
+/* Original XPaint sources */
+
+#include "image.h"
+#include "rwTable.h"
+
+#define SDL_RWops FILE
+#define SDL_RWclose fclose
+
+#endif /* USED_BY_SDL */
+
+
+#define MAXCOLORMAPSIZE 256
+
+#define TRUE 1
+#define FALSE 0
+
+#define CM_RED 0
+#define CM_GREEN 1
+#define CM_BLUE 2
+
+#define MAX_LWZ_BITS 12
+
+#define INTERLACE 0x40
+#define LOCALCOLORMAP 0x80
+#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
+
+#define ReadOK(file,buffer,len) SDL_RWread(file, buffer, len, 1)
+
+#define LM_to_uint(a,b) (((b)<<8)|(a))
+
+static struct {
+ unsigned int Width;
+ unsigned int Height;
+ unsigned char ColorMap[3][MAXCOLORMAPSIZE];
+ unsigned int BitPixel;
+ unsigned int ColorResolution;
+ unsigned int Background;
+ unsigned int AspectRatio;
+ int GrayScale;
+} GifScreen;
+
+static struct {
+ int transparent;
+ int delayTime;
+ int inputFlag;
+ int disposal;
+} Gif89;
+
+static int ReadColorMap(SDL_RWops * src, int number,
+ unsigned char buffer[3][MAXCOLORMAPSIZE], int *flag);
+static int DoExtension(SDL_RWops * src, int label);
+static int GetDataBlock(SDL_RWops * src, unsigned char *buf);
+static int GetCode(SDL_RWops * src, int code_size, int flag);
+static int LWZReadByte(SDL_RWops * src, int flag, int input_code_size);
+static Image *ReadImage(SDL_RWops * src, int len, int height, int,
+ unsigned char cmap[3][MAXCOLORMAPSIZE],
+ int gray, int interlace, int ignore);
+
+Image *
+IMG_LoadGIF_RW(SDL_RWops *src)
+{
+ int start;
+ unsigned char buf[16];
+ unsigned char c;
+ unsigned char localColorMap[3][MAXCOLORMAPSIZE];
+ int grayScale;
+ int useGlobalColormap;
+ int bitPixel;
+ int imageCount = 0;
+ char version[4];
+ int imageNumber = 1;
+ Image *image = NULL;
+
+ if ( src == NULL ) {
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if (!ReadOK(src, buf, 6)) {
+ RWSetMsg("error reading magic number");
+ goto done;
+ }
+ if (strncmp((char *) buf, "GIF", 3) != 0) {
+ RWSetMsg("not a GIF file");
+ goto done;
+ }
+ memcpy(version, (char *) buf + 3, 3);
+ version[3] = '\0';
+
+ if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) {
+ RWSetMsg("bad version number, not '87a' or '89a'");
+ goto done;
+ }
+ Gif89.transparent = -1;
+ Gif89.delayTime = -1;
+ Gif89.inputFlag = -1;
+ Gif89.disposal = 0;
+
+ if (!ReadOK(src, buf, 7)) {
+ RWSetMsg("failed to read screen descriptor");
+ goto done;
+ }
+ GifScreen.Width = LM_to_uint(buf[0], buf[1]);
+ GifScreen.Height = LM_to_uint(buf[2], buf[3]);
+ GifScreen.BitPixel = 2 << (buf[4] & 0x07);
+ GifScreen.ColorResolution = (((buf[4] & 0x70) >> 3) + 1);
+ GifScreen.Background = buf[5];
+ GifScreen.AspectRatio = buf[6];
+
+ if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */
+ if (ReadColorMap(src, GifScreen.BitPixel, GifScreen.ColorMap,
+ &GifScreen.GrayScale)) {
+ RWSetMsg("error reading global colormap");
+ goto done;
+ }
+ }
+ do {
+ if (!ReadOK(src, &c, 1)) {
+ RWSetMsg("EOF / read error on image data");
+ goto done;
+ }
+ if (c == ';') { /* GIF terminator */
+ if (imageCount < imageNumber) {
+ RWSetMsg("only %d image%s found in file",
+ imageCount, imageCount > 1 ? "s" : "");
+ goto done;
+ }
+ }
+ if (c == '!') { /* Extension */
+ if (!ReadOK(src, &c, 1)) {
+ RWSetMsg("EOF / read error on extention function code");
+ goto done;
+ }
+ DoExtension(src, c);
+ continue;
+ }
+ if (c != ',') { /* Not a valid start character */
+ continue;
+ }
+ ++imageCount;
+
+ if (!ReadOK(src, buf, 9)) {
+ RWSetMsg("couldn't read left/top/width/height");
+ goto done;
+ }
+ useGlobalColormap = !BitSet(buf[8], LOCALCOLORMAP);
+
+ bitPixel = 1 << ((buf[8] & 0x07) + 1);
+
+ if (!useGlobalColormap) {
+ if (ReadColorMap(src, bitPixel, localColorMap, &grayScale)) {
+ RWSetMsg("error reading local colormap");
+ goto done;
+ }
+ image = ReadImage(src, LM_to_uint(buf[4], buf[5]),
+ LM_to_uint(buf[6], buf[7]),
+ bitPixel, localColorMap, grayScale,
+ BitSet(buf[8], INTERLACE),
+ imageCount != imageNumber);
+ } else {
+ image = ReadImage(src, LM_to_uint(buf[4], buf[5]),
+ LM_to_uint(buf[6], buf[7]),
+ GifScreen.BitPixel, GifScreen.ColorMap,
+ GifScreen.GrayScale, BitSet(buf[8], INTERLACE),
+ imageCount != imageNumber);
+ }
+ } while (image == NULL);
+
+#ifdef USED_BY_SDL
+ if ( Gif89.transparent >= 0 ) {
+ SDL_SetColorKey(image, SDL_SRCCOLORKEY, Gif89.transparent);
+ }
+#endif
+
+done:
+ if ( image == NULL ) {
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ }
+ return image;
+}
+
+static int
+ReadColorMap(SDL_RWops *src, int number,
+ unsigned char buffer[3][MAXCOLORMAPSIZE], int *gray)
+{
+ int i;
+ unsigned char rgb[3];
+ int flag;
+
+ flag = TRUE;
+
+ for (i = 0; i < number; ++i) {
+ if (!ReadOK(src, rgb, sizeof(rgb))) {
+ RWSetMsg("bad colormap");
+ return 1;
+ }
+ buffer[CM_RED][i] = rgb[0];
+ buffer[CM_GREEN][i] = rgb[1];
+ buffer[CM_BLUE][i] = rgb[2];
+ flag &= (rgb[0] == rgb[1] && rgb[1] == rgb[2]);
+ }
+
+#if 0
+ if (flag)
+ *gray = (number == 2) ? PBM_TYPE : PGM_TYPE;
+ else
+ *gray = PPM_TYPE;
+#else
+ *gray = 0;
+#endif
+
+ return FALSE;
+}
+
+static int
+DoExtension(SDL_RWops *src, int label)
+{
+ static unsigned char buf[256];
+ char *str;
+
+ switch (label) {
+ case 0x01: /* Plain Text Extension */
+ str = "Plain Text Extension";
+ break;
+ case 0xff: /* Application Extension */
+ str = "Application Extension";
+ break;
+ case 0xfe: /* Comment Extension */
+ str = "Comment Extension";
+ while (GetDataBlock(src, (unsigned char *) buf) != 0)
+ ;
+ return FALSE;
+ case 0xf9: /* Graphic Control Extension */
+ str = "Graphic Control Extension";
+ (void) GetDataBlock(src, (unsigned char *) buf);
+ Gif89.disposal = (buf[0] >> 2) & 0x7;
+ Gif89.inputFlag = (buf[0] >> 1) & 0x1;
+ Gif89.delayTime = LM_to_uint(buf[1], buf[2]);
+ if ((buf[0] & 0x1) != 0)
+ Gif89.transparent = buf[3];
+
+ while (GetDataBlock(src, (unsigned char *) buf) != 0)
+ ;
+ return FALSE;
+ default:
+ str = (char *)buf;
+ sprintf(str, "UNKNOWN (0x%02x)", label);
+ break;
+ }
+
+ while (GetDataBlock(src, (unsigned char *) buf) != 0)
+ ;
+
+ return FALSE;
+}
+
+static int ZeroDataBlock = FALSE;
+
+static int
+GetDataBlock(SDL_RWops *src, unsigned char *buf)
+{
+ unsigned char count;
+
+ if (!ReadOK(src, &count, 1)) {
+ /* pm_message("error in getting DataBlock size" ); */
+ return -1;
+ }
+ ZeroDataBlock = count == 0;
+
+ if ((count != 0) && (!ReadOK(src, buf, count))) {
+ /* pm_message("error in reading DataBlock" ); */
+ return -1;
+ }
+ return count;
+}
+
+static int
+GetCode(SDL_RWops *src, int code_size, int flag)
+{
+ static unsigned char buf[280];
+ static int curbit, lastbit, done, last_byte;
+ int i, j, ret;
+ unsigned char count;
+
+ if (flag) {
+ curbit = 0;
+ lastbit = 0;
+ done = FALSE;
+ return 0;
+ }
+ if ((curbit + code_size) >= lastbit) {
+ if (done) {
+ if (curbit >= lastbit)
+ RWSetMsg("ran off the end of my bits");
+ return -1;
+ }
+ buf[0] = buf[last_byte - 2];
+ buf[1] = buf[last_byte - 1];
+
+ if ((count = GetDataBlock(src, &buf[2])) == 0)
+ done = TRUE;
+
+ last_byte = 2 + count;
+ curbit = (curbit - lastbit) + 16;
+ lastbit = (2 + count) * 8;
+ }
+ ret = 0;
+ for (i = curbit, j = 0; j < code_size; ++i, ++j)
+ ret |= ((buf[i / 8] & (1 << (i % 8))) != 0) << j;
+
+ curbit += code_size;
+
+ return ret;
+}
+
+static int
+LWZReadByte(SDL_RWops *src, int flag, int input_code_size)
+{
+ static int fresh = FALSE;
+ int code, incode;
+ static int code_size, set_code_size;
+ static int max_code, max_code_size;
+ static int firstcode, oldcode;
+ static int clear_code, end_code;
+ static int table[2][(1 << MAX_LWZ_BITS)];
+ static int stack[(1 << (MAX_LWZ_BITS)) * 2], *sp;
+ register int i;
+
+ /* Fixed buffer overflow found by Michael Skladnikiewicz */
+ if (input_code_size > MAX_LWZ_BITS)
+ return -1;
+
+ if (flag) {
+ set_code_size = input_code_size;
+ code_size = set_code_size + 1;
+ clear_code = 1 << set_code_size;
+ end_code = clear_code + 1;
+ max_code_size = 2 * clear_code;
+ max_code = clear_code + 2;
+
+ GetCode(src, 0, TRUE);
+
+ fresh = TRUE;
+
+ for (i = 0; i < clear_code; ++i) {
+ table[0][i] = 0;
+ table[1][i] = i;
+ }
+ for (; i < (1 << MAX_LWZ_BITS); ++i)
+ table[0][i] = table[1][0] = 0;
+
+ sp = stack;
+
+ return 0;
+ } else if (fresh) {
+ fresh = FALSE;
+ do {
+ firstcode = oldcode = GetCode(src, code_size, FALSE);
+ } while (firstcode == clear_code);
+ return firstcode;
+ }
+ if (sp > stack)
+ return *--sp;
+
+ while ((code = GetCode(src, code_size, FALSE)) >= 0) {
+ if (code == clear_code) {
+ for (i = 0; i < clear_code; ++i) {
+ table[0][i] = 0;
+ table[1][i] = i;
+ }
+ for (; i < (1 << MAX_LWZ_BITS); ++i)
+ table[0][i] = table[1][i] = 0;
+ code_size = set_code_size + 1;
+ max_code_size = 2 * clear_code;
+ max_code = clear_code + 2;
+ sp = stack;
+ firstcode = oldcode = GetCode(src, code_size, FALSE);
+ return firstcode;
+ } else if (code == end_code) {
+ int count;
+ unsigned char buf[260];
+
+ if (ZeroDataBlock)
+ return -2;
+
+ while ((count = GetDataBlock(src, buf)) > 0)
+ ;
+
+ if (count != 0) {
+ /*
+ * pm_message("missing EOD in data stream (common occurence)");
+ */
+ }
+ return -2;
+ }
+ incode = code;
+
+ if (code >= max_code) {
+ *sp++ = firstcode;
+ code = oldcode;
+ }
+ while (code >= clear_code) {
+ *sp++ = table[1][code];
+ if (code == table[0][code])
+ RWSetMsg("circular table entry BIG ERROR");
+ code = table[0][code];
+ }
+
+ *sp++ = firstcode = table[1][code];
+
+ if ((code = max_code) < (1 << MAX_LWZ_BITS)) {
+ table[0][code] = oldcode;
+ table[1][code] = firstcode;
+ ++max_code;
+ if ((max_code >= max_code_size) &&
+ (max_code_size < (1 << MAX_LWZ_BITS))) {
+ max_code_size *= 2;
+ ++code_size;
+ }
+ }
+ oldcode = incode;
+
+ if (sp > stack)
+ return *--sp;
+ }
+ return code;
+}
+
+static Image *
+ReadImage(SDL_RWops * src, int len, int height, int cmapSize,
+ unsigned char cmap[3][MAXCOLORMAPSIZE],
+ int gray, int interlace, int ignore)
+{
+ Image *image;
+ unsigned char c;
+ int i, v;
+ int xpos = 0, ypos = 0, pass = 0;
+
+ /*
+ ** Initialize the compression routines
+ */
+ if (!ReadOK(src, &c, 1)) {
+ RWSetMsg("EOF / read error on image data");
+ return NULL;
+ }
+ if (LWZReadByte(src, TRUE, c) < 0) {
+ RWSetMsg("error reading image");
+ return NULL;
+ }
+ /*
+ ** If this is an "uninteresting picture" ignore it.
+ */
+ if (ignore) {
+ while (LWZReadByte(src, FALSE, c) >= 0)
+ ;
+ return NULL;
+ }
+ image = ImageNewCmap(len, height, cmapSize);
+
+ for (i = 0; i < cmapSize; i++)
+ ImageSetCmap(image, i, cmap[CM_RED][i],
+ cmap[CM_GREEN][i], cmap[CM_BLUE][i]);
+
+ while ((v = LWZReadByte(src, FALSE, c)) >= 0) {
+#ifdef USED_BY_SDL
+ ((Uint8 *)image->pixels)[xpos + ypos * image->pitch] = v;
+#else
+ image->data[xpos + ypos * len] = v;
+#endif
+ ++xpos;
+ if (xpos == len) {
+ xpos = 0;
+ if (interlace) {
+ switch (pass) {
+ case 0:
+ case 1:
+ ypos += 8;
+ break;
+ case 2:
+ ypos += 4;
+ break;
+ case 3:
+ ypos += 2;
+ break;
+ }
+
+ if (ypos >= height) {
+ ++pass;
+ switch (pass) {
+ case 1:
+ ypos = 4;
+ break;
+ case 2:
+ ypos = 2;
+ break;
+ case 3:
+ ypos = 1;
+ break;
+ default:
+ goto fini;
+ }
+ }
+ } else {
+ ++ypos;
+ }
+ }
+ if (ypos >= height)
+ break;
+ }
+
+ fini:
+
+ return image;
+}
+
+#else
+
+/* See if an image is contained in a data source */
+int IMG_isGIF(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a GIF type image from an SDL datasource */
+SDL_Surface *IMG_LoadGIF_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_GIF */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_jpg.c b/apps/plugins/sdl/SDL_image/IMG_jpg.c
new file mode 100644
index 0000000000..7484ab1bbb
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_jpg.c
@@ -0,0 +1,495 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a JPEG image file loading framework */
+
+#include <stdio.h>
+#include <string.h>
+#include <setjmp.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_JPG
+
+#include <jpeglib.h>
+
+#ifdef JPEG_TRUE /* MinGW version of jpeg-8.x renamed TRUE to JPEG_TRUE etc. */
+ typedef JPEG_boolean boolean;
+ #define TRUE JPEG_TRUE
+ #define FALSE JPEG_FALSE
+#endif
+
+/* Define this for fast loading and not as good image quality */
+/*#define FAST_JPEG*/
+
+/* Define this for quicker (but less perfect) JPEG identification */
+#define FAST_IS_JPEG
+
+static struct {
+ int loaded;
+ void *handle;
+ void (*jpeg_calc_output_dimensions) (j_decompress_ptr cinfo);
+ void (*jpeg_CreateDecompress) (j_decompress_ptr cinfo, int version, size_t structsize);
+ void (*jpeg_destroy_decompress) (j_decompress_ptr cinfo);
+ boolean (*jpeg_finish_decompress) (j_decompress_ptr cinfo);
+ int (*jpeg_read_header) (j_decompress_ptr cinfo, boolean require_image);
+ JDIMENSION (*jpeg_read_scanlines) (j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines);
+ boolean (*jpeg_resync_to_restart) (j_decompress_ptr cinfo, int desired);
+ boolean (*jpeg_start_decompress) (j_decompress_ptr cinfo);
+ struct jpeg_error_mgr * (*jpeg_std_error) (struct jpeg_error_mgr * err);
+} lib;
+
+#ifdef LOAD_JPG_DYNAMIC
+int IMG_InitJPG()
+{
+ if ( lib.loaded == 0 ) {
+ lib.handle = SDL_LoadObject(LOAD_JPG_DYNAMIC);
+ if ( lib.handle == NULL ) {
+ return -1;
+ }
+ lib.jpeg_calc_output_dimensions =
+ (void (*) (j_decompress_ptr))
+ SDL_LoadFunction(lib.handle, "jpeg_calc_output_dimensions");
+ if ( lib.jpeg_calc_output_dimensions == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_CreateDecompress =
+ (void (*) (j_decompress_ptr, int, size_t))
+ SDL_LoadFunction(lib.handle, "jpeg_CreateDecompress");
+ if ( lib.jpeg_CreateDecompress == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_destroy_decompress =
+ (void (*) (j_decompress_ptr))
+ SDL_LoadFunction(lib.handle, "jpeg_destroy_decompress");
+ if ( lib.jpeg_destroy_decompress == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_finish_decompress =
+ (boolean (*) (j_decompress_ptr))
+ SDL_LoadFunction(lib.handle, "jpeg_finish_decompress");
+ if ( lib.jpeg_finish_decompress == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_read_header =
+ (int (*) (j_decompress_ptr, boolean))
+ SDL_LoadFunction(lib.handle, "jpeg_read_header");
+ if ( lib.jpeg_read_header == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_read_scanlines =
+ (JDIMENSION (*) (j_decompress_ptr, JSAMPARRAY, JDIMENSION))
+ SDL_LoadFunction(lib.handle, "jpeg_read_scanlines");
+ if ( lib.jpeg_read_scanlines == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_resync_to_restart =
+ (boolean (*) (j_decompress_ptr, int))
+ SDL_LoadFunction(lib.handle, "jpeg_resync_to_restart");
+ if ( lib.jpeg_resync_to_restart == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_start_decompress =
+ (boolean (*) (j_decompress_ptr))
+ SDL_LoadFunction(lib.handle, "jpeg_start_decompress");
+ if ( lib.jpeg_start_decompress == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.jpeg_std_error =
+ (struct jpeg_error_mgr * (*) (struct jpeg_error_mgr *))
+ SDL_LoadFunction(lib.handle, "jpeg_std_error");
+ if ( lib.jpeg_std_error == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitJPG()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ SDL_UnloadObject(lib.handle);
+ }
+ --lib.loaded;
+}
+#else
+int IMG_InitJPG()
+{
+ if ( lib.loaded == 0 ) {
+ lib.jpeg_calc_output_dimensions = jpeg_calc_output_dimensions;
+ lib.jpeg_CreateDecompress = jpeg_CreateDecompress;
+ lib.jpeg_destroy_decompress = jpeg_destroy_decompress;
+ lib.jpeg_finish_decompress = jpeg_finish_decompress;
+ lib.jpeg_read_header = jpeg_read_header;
+ lib.jpeg_read_scanlines = jpeg_read_scanlines;
+ lib.jpeg_resync_to_restart = jpeg_resync_to_restart;
+ lib.jpeg_start_decompress = jpeg_start_decompress;
+ lib.jpeg_std_error = jpeg_std_error;
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitJPG()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ }
+ --lib.loaded;
+}
+#endif /* LOAD_JPG_DYNAMIC */
+
+/* See if an image is contained in a data source */
+int IMG_isJPG(SDL_RWops *src)
+{
+ int start;
+ int is_JPG;
+ int in_scan;
+ Uint8 magic[4];
+
+ /* This detection code is by Steaphan Greene <stea@cs.binghamton.edu> */
+ /* Blame me, not Sam, if this doesn't work right. */
+ /* And don't forget to report the problem to the the sdl list too! */
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_JPG = 0;
+ in_scan = 0;
+ if ( SDL_RWread(src, magic, 2, 1) ) {
+ if ( (magic[0] == 0xFF) && (magic[1] == 0xD8) ) {
+ is_JPG = 1;
+ while (is_JPG == 1) {
+ if(SDL_RWread(src, magic, 1, 2) != 2) {
+ is_JPG = 0;
+ } else if( (magic[0] != 0xFF) && (in_scan == 0) ) {
+ is_JPG = 0;
+ } else if( (magic[0] != 0xFF) || (magic[1] == 0xFF) ) {
+ /* Extra padding in JPEG (legal) */
+ /* or this is data and we are scanning */
+ SDL_RWseek(src, -1, RW_SEEK_CUR);
+ } else if(magic[1] == 0xD9) {
+ /* Got to end of good JPEG */
+ break;
+ } else if( (in_scan == 1) && (magic[1] == 0x00) ) {
+ /* This is an encoded 0xFF within the data */
+ } else if( (magic[1] >= 0xD0) && (magic[1] < 0xD9) ) {
+ /* These have nothing else */
+ } else if(SDL_RWread(src, magic+2, 1, 2) != 2) {
+ is_JPG = 0;
+ } else {
+ /* Yes, it's big-endian */
+ Uint32 start;
+ Uint32 size;
+ Uint32 end;
+ start = SDL_RWtell(src);
+ size = (magic[2] << 8) + magic[3];
+ end = SDL_RWseek(src, size-2, RW_SEEK_CUR);
+ if ( end != start + size - 2 ) is_JPG = 0;
+ if ( magic[1] == 0xDA ) {
+ /* Now comes the actual JPEG meat */
+#ifdef FAST_IS_JPEG
+ /* Ok, I'm convinced. It is a JPEG. */
+ break;
+#else
+ /* I'm not convinced. Prove it! */
+ in_scan = 1;
+#endif
+ }
+ }
+ }
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_JPG);
+}
+
+#define INPUT_BUFFER_SIZE 4096
+typedef struct {
+ struct jpeg_source_mgr pub;
+
+ SDL_RWops *ctx;
+ Uint8 buffer[INPUT_BUFFER_SIZE];
+} my_source_mgr;
+
+/*
+ * Initialize source --- called by jpeg_read_header
+ * before any data is actually read.
+ */
+static void init_source (j_decompress_ptr cinfo)
+{
+ /* We don't actually need to do anything */
+ return;
+}
+
+/*
+ * Fill the input buffer --- called whenever buffer is emptied.
+ */
+static boolean fill_input_buffer (j_decompress_ptr cinfo)
+{
+ my_source_mgr * src = (my_source_mgr *) cinfo->src;
+ int nbytes;
+
+ nbytes = SDL_RWread(src->ctx, src->buffer, 1, INPUT_BUFFER_SIZE);
+ if (nbytes <= 0) {
+ /* Insert a fake EOI marker */
+ src->buffer[0] = (Uint8) 0xFF;
+ src->buffer[1] = (Uint8) JPEG_EOI;
+ nbytes = 2;
+ }
+ src->pub.next_input_byte = src->buffer;
+ src->pub.bytes_in_buffer = nbytes;
+
+ return TRUE;
+}
+
+
+/*
+ * Skip data --- used to skip over a potentially large amount of
+ * uninteresting data (such as an APPn marker).
+ *
+ * Writers of suspendable-input applications must note that skip_input_data
+ * is not granted the right to give a suspension return. If the skip extends
+ * beyond the data currently in the buffer, the buffer can be marked empty so
+ * that the next read will cause a fill_input_buffer call that can suspend.
+ * Arranging for additional bytes to be discarded before reloading the input
+ * buffer is the application writer's problem.
+ */
+static void skip_input_data (j_decompress_ptr cinfo, long num_bytes)
+{
+ my_source_mgr * src = (my_source_mgr *) cinfo->src;
+
+ /* Just a dumb implementation for now. Could use fseek() except
+ * it doesn't work on pipes. Not clear that being smart is worth
+ * any trouble anyway --- large skips are infrequent.
+ */
+ if (num_bytes > 0) {
+ while (num_bytes > (long) src->pub.bytes_in_buffer) {
+ num_bytes -= (long) src->pub.bytes_in_buffer;
+ (void) src->pub.fill_input_buffer(cinfo);
+ /* note we assume that fill_input_buffer will never
+ * return FALSE, so suspension need not be handled.
+ */
+ }
+ src->pub.next_input_byte += (size_t) num_bytes;
+ src->pub.bytes_in_buffer -= (size_t) num_bytes;
+ }
+}
+
+/*
+ * Terminate source --- called by jpeg_finish_decompress
+ * after all data has been read.
+ */
+static void term_source (j_decompress_ptr cinfo)
+{
+ /* We don't actually need to do anything */
+ return;
+}
+
+/*
+ * Prepare for input from a stdio stream.
+ * The caller must have already opened the stream, and is responsible
+ * for closing it after finishing decompression.
+ */
+static void jpeg_SDL_RW_src (j_decompress_ptr cinfo, SDL_RWops *ctx)
+{
+ my_source_mgr *src;
+
+ /* The source object and input buffer are made permanent so that a series
+ * of JPEG images can be read from the same file by calling jpeg_stdio_src
+ * only before the first one. (If we discarded the buffer at the end of
+ * one image, we'd likely lose the start of the next one.)
+ * This makes it unsafe to use this manager and a different source
+ * manager serially with the same JPEG object. Caveat programmer.
+ */
+ if (cinfo->src == NULL) { /* first time for this JPEG object? */
+ cinfo->src = (struct jpeg_source_mgr *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ sizeof(my_source_mgr));
+ src = (my_source_mgr *) cinfo->src;
+ }
+
+ src = (my_source_mgr *) cinfo->src;
+ src->pub.init_source = init_source;
+ src->pub.fill_input_buffer = fill_input_buffer;
+ src->pub.skip_input_data = skip_input_data;
+ src->pub.resync_to_restart = lib.jpeg_resync_to_restart; /* use default method */
+ src->pub.term_source = term_source;
+ src->ctx = ctx;
+ src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
+ src->pub.next_input_byte = NULL; /* until buffer loaded */
+}
+
+struct my_error_mgr {
+ struct jpeg_error_mgr errmgr;
+ jmp_buf escape;
+};
+
+static void my_error_exit(j_common_ptr cinfo)
+{
+ struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err;
+ longjmp(err->escape, 1);
+}
+
+static void output_no_message(j_common_ptr cinfo)
+{
+ /* do nothing */
+}
+
+/* Load a JPEG type image from an SDL datasource */
+SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)
+{
+ int start;
+ struct jpeg_decompress_struct cinfo;
+ JSAMPROW rowptr[1];
+ SDL_Surface *volatile surface = NULL;
+ struct my_error_mgr jerr;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if ( !IMG_Init(IMG_INIT_JPG) ) {
+ return NULL;
+ }
+
+ /* Create a decompression structure and load the JPEG header */
+ cinfo.err = lib.jpeg_std_error(&jerr.errmgr);
+ jerr.errmgr.error_exit = my_error_exit;
+ jerr.errmgr.output_message = output_no_message;
+ if(setjmp(jerr.escape)) {
+ /* If we get here, libjpeg found an error */
+ lib.jpeg_destroy_decompress(&cinfo);
+ if ( surface != NULL ) {
+ SDL_FreeSurface(surface);
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ IMG_SetError("JPEG loading error");
+ return NULL;
+ }
+
+ lib.jpeg_create_decompress(&cinfo);
+ jpeg_SDL_RW_src(&cinfo, src);
+ lib.jpeg_read_header(&cinfo, TRUE);
+
+ if(cinfo.num_components == 4) {
+ /* Set 32-bit Raw output */
+ cinfo.out_color_space = JCS_CMYK;
+ cinfo.quantize_colors = FALSE;
+ lib.jpeg_calc_output_dimensions(&cinfo);
+
+ /* Allocate an output surface to hold the image */
+ surface = SDL_AllocSurface(SDL_SWSURFACE,
+ cinfo.output_width, cinfo.output_height, 32,
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+ 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
+#else
+ 0x0000FF00, 0x00FF0000, 0xFF000000, 0x000000FF);
+#endif
+ } else {
+ /* Set 24-bit RGB output */
+ cinfo.out_color_space = JCS_RGB;
+ cinfo.quantize_colors = FALSE;
+#ifdef FAST_JPEG
+ cinfo.scale_num = 1;
+ cinfo.scale_denom = 1;
+ cinfo.dct_method = JDCT_FASTEST;
+ cinfo.do_fancy_upsampling = FALSE;
+#endif
+ lib.jpeg_calc_output_dimensions(&cinfo);
+
+ /* Allocate an output surface to hold the image */
+ surface = SDL_AllocSurface(SDL_SWSURFACE,
+ cinfo.output_width, cinfo.output_height, 24,
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+ 0x0000FF, 0x00FF00, 0xFF0000,
+#else
+ 0xFF0000, 0x00FF00, 0x0000FF,
+#endif
+ 0);
+ }
+
+ if ( surface == NULL ) {
+ lib.jpeg_destroy_decompress(&cinfo);
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ IMG_SetError("Out of memory");
+ return NULL;
+ }
+
+ /* Decompress the image */
+ lib.jpeg_start_decompress(&cinfo);
+ while ( cinfo.output_scanline < cinfo.output_height ) {
+ rowptr[0] = (JSAMPROW)(Uint8 *)surface->pixels +
+ cinfo.output_scanline * surface->pitch;
+ lib.jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1);
+ }
+ lib.jpeg_finish_decompress(&cinfo);
+ lib.jpeg_destroy_decompress(&cinfo);
+
+ return(surface);
+}
+
+#else
+
+int IMG_InitJPG()
+{
+ IMG_SetError("JPEG images are not supported");
+ return(-1);
+}
+
+void IMG_QuitJPG()
+{
+}
+
+/* See if an image is contained in a data source */
+int IMG_isJPG(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a JPEG type image from an SDL datasource */
+SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_JPG */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_lbm.c b/apps/plugins/sdl/SDL_image/IMG_lbm.c
new file mode 100644
index 0000000000..f475c60cf9
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_lbm.c
@@ -0,0 +1,503 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* This is a ILBM image file loading framework
+ Load IFF pictures, PBM & ILBM packing methods, with or without stencil
+ Written by Daniel Morais ( Daniel AT Morais DOT com ) in September 2001.
+ 24 bits ILBM files support added by Marc Le Douarain (http://www.multimania.com/mavati)
+ in December 2002.
+ EHB and HAM (specific Amiga graphic chip modes) support added by Marc Le Douarain
+ (http://www.multimania.com/mavati) in December 2003.
+ Stencil and colorkey fixes by David Raulo (david.raulo AT free DOT fr) in February 2004.
+ Buffer overflow fix in RLE decompression by David Raulo in January 2008.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "SDL_endian.h"
+#include "SDL_image.h"
+
+#ifdef LOAD_LBM
+
+
+#define MAXCOLORS 256
+
+/* Structure for an IFF picture ( BMHD = Bitmap Header ) */
+
+typedef struct
+{
+ Uint16 w, h; /* width & height of the bitmap in pixels */
+ Sint16 x, y; /* screen coordinates of the bitmap */
+ Uint8 planes; /* number of planes of the bitmap */
+ Uint8 mask; /* mask type ( 0 => no mask ) */
+ Uint8 tcomp; /* compression type */
+ Uint8 pad1; /* dummy value, for padding */
+ Uint16 tcolor; /* transparent color */
+ Uint8 xAspect, /* pixel aspect ratio */
+ yAspect;
+ Sint16 Lpage; /* width of the screen in pixels */
+ Sint16 Hpage; /* height of the screen in pixels */
+} BMHD;
+
+int IMG_isLBM( SDL_RWops *src )
+{
+ int start;
+ int is_LBM;
+ Uint8 magic[4+4+4];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_LBM = 0;
+ if ( SDL_RWread( src, magic, sizeof(magic), 1 ) )
+ {
+ if ( !memcmp( magic, "FORM", 4 ) &&
+ ( !memcmp( magic + 8, "PBM ", 4 ) ||
+ !memcmp( magic + 8, "ILBM", 4 ) ) )
+ {
+ is_LBM = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return( is_LBM );
+}
+
+SDL_Surface *IMG_LoadLBM_RW( SDL_RWops *src )
+{
+ int start;
+ SDL_Surface *Image;
+ Uint8 id[4], pbm, colormap[MAXCOLORS*3], *MiniBuf, *ptr, count, color, msk;
+ Uint32 size, bytesloaded, nbcolors;
+ Uint32 i, j, bytesperline, nbplanes, stencil, plane, h;
+ Uint32 remainingbytes;
+ Uint32 width;
+ BMHD bmhd;
+ char *error;
+ Uint8 flagHAM,flagEHB;
+
+ Image = NULL;
+ error = NULL;
+ MiniBuf = NULL;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if ( !SDL_RWread( src, id, 4, 1 ) )
+ {
+ error="error reading IFF chunk";
+ goto done;
+ }
+
+ /* Should be the size of the file minus 4+4 ( 'FORM'+size ) */
+ if ( !SDL_RWread( src, &size, 4, 1 ) )
+ {
+ error="error reading IFF chunk size";
+ goto done;
+ }
+
+ /* As size is not used here, no need to swap it */
+
+ if ( memcmp( id, "FORM", 4 ) != 0 )
+ {
+ error="not a IFF file";
+ goto done;
+ }
+
+ if ( !SDL_RWread( src, id, 4, 1 ) )
+ {
+ error="error reading IFF chunk";
+ goto done;
+ }
+
+ pbm = 0;
+
+ /* File format : PBM=Packed Bitmap, ILBM=Interleaved Bitmap */
+ if ( !memcmp( id, "PBM ", 4 ) ) pbm = 1;
+ else if ( memcmp( id, "ILBM", 4 ) )
+ {
+ error="not a IFF picture";
+ goto done;
+ }
+
+ nbcolors = 0;
+
+ memset( &bmhd, 0, sizeof( BMHD ) );
+ flagHAM = 0;
+ flagEHB = 0;
+
+ while ( memcmp( id, "BODY", 4 ) != 0 )
+ {
+ if ( !SDL_RWread( src, id, 4, 1 ) )
+ {
+ error="error reading IFF chunk";
+ goto done;
+ }
+
+ if ( !SDL_RWread( src, &size, 4, 1 ) )
+ {
+ error="error reading IFF chunk size";
+ goto done;
+ }
+
+ bytesloaded = 0;
+
+ size = SDL_SwapBE32( size );
+
+ if ( !memcmp( id, "BMHD", 4 ) ) /* Bitmap header */
+ {
+ if ( !SDL_RWread( src, &bmhd, sizeof( BMHD ), 1 ) )
+ {
+ error="error reading BMHD chunk";
+ goto done;
+ }
+
+ bytesloaded = sizeof( BMHD );
+
+ bmhd.w = SDL_SwapBE16( bmhd.w );
+ bmhd.h = SDL_SwapBE16( bmhd.h );
+ bmhd.x = SDL_SwapBE16( bmhd.x );
+ bmhd.y = SDL_SwapBE16( bmhd.y );
+ bmhd.tcolor = SDL_SwapBE16( bmhd.tcolor );
+ bmhd.Lpage = SDL_SwapBE16( bmhd.Lpage );
+ bmhd.Hpage = SDL_SwapBE16( bmhd.Hpage );
+ }
+
+ if ( !memcmp( id, "CMAP", 4 ) ) /* palette ( Color Map ) */
+ {
+ if ( !SDL_RWread( src, &colormap, size, 1 ) )
+ {
+ error="error reading CMAP chunk";
+ goto done;
+ }
+
+ bytesloaded = size;
+ nbcolors = size / 3;
+ }
+
+ if ( !memcmp( id, "CAMG", 4 ) ) /* Amiga ViewMode */
+ {
+ Uint32 viewmodes;
+ if ( !SDL_RWread( src, &viewmodes, sizeof(viewmodes), 1 ) )
+ {
+ error="error reading CAMG chunk";
+ goto done;
+ }
+
+ bytesloaded = size;
+ viewmodes = SDL_SwapBE32( viewmodes );
+ if ( viewmodes & 0x0800 )
+ flagHAM = 1;
+ if ( viewmodes & 0x0080 )
+ flagEHB = 1;
+ }
+
+ if ( memcmp( id, "BODY", 4 ) )
+ {
+ if ( size & 1 ) ++size; /* padding ! */
+ size -= bytesloaded;
+ /* skip the remaining bytes of this chunk */
+ if ( size ) SDL_RWseek( src, size, RW_SEEK_CUR );
+ }
+ }
+
+ /* compute some usefull values, based on the bitmap header */
+
+ width = ( bmhd.w + 15 ) & 0xFFFFFFF0; /* Width in pixels modulo 16 */
+
+ bytesperline = ( ( bmhd.w + 15 ) / 16 ) * 2;
+
+ nbplanes = bmhd.planes;
+
+ if ( pbm ) /* File format : 'Packed Bitmap' */
+ {
+ bytesperline *= 8;
+ nbplanes = 1;
+ }
+
+ stencil = (bmhd.mask & 1); /* There is a mask ( 'stencil' ) */
+
+ /* Allocate memory for a temporary buffer ( used for
+ decompression/deinterleaving ) */
+
+ MiniBuf = (void *)malloc( bytesperline * (nbplanes + stencil) );
+ if ( MiniBuf == NULL )
+ {
+ error="no enough memory for temporary buffer";
+ goto done;
+ }
+
+ if ( ( Image = SDL_CreateRGBSurface( SDL_SWSURFACE, width, bmhd.h, (bmhd.planes==24 || flagHAM==1)?24:8, 0, 0, 0, 0 ) ) == NULL )
+ goto done;
+
+ if ( bmhd.mask & 2 ) /* There is a transparent color */
+ SDL_SetColorKey( Image, SDL_SRCCOLORKEY, bmhd.tcolor );
+
+ /* Update palette informations */
+
+ /* There is no palette in 24 bits ILBM file */
+ if ( nbcolors>0 && flagHAM==0 )
+ {
+ /* FIXME: Should this include the stencil? See comment below */
+ int nbrcolorsfinal = 1 << (nbplanes + stencil);
+ ptr = &colormap[0];
+
+ for ( i=0; i<nbcolors; i++ )
+ {
+ Image->format->palette->colors[i].r = *ptr++;
+ Image->format->palette->colors[i].g = *ptr++;
+ Image->format->palette->colors[i].b = *ptr++;
+ }
+
+ /* Amiga EHB mode (Extra-Half-Bright) */
+ /* 6 bitplanes mode with a 32 colors palette */
+ /* The 32 last colors are the same but divided by 2 */
+ /* Some Amiga pictures save 64 colors with 32 last wrong colors, */
+ /* they shouldn't !, and here we overwrite these 32 bad colors. */
+ if ( (nbcolors==32 || flagEHB ) && (1<<bmhd.planes)==64 )
+ {
+ nbcolors = 64;
+ ptr = &colormap[0];
+ for ( i=32; i<64; i++ )
+ {
+ Image->format->palette->colors[i].r = (*ptr++)/2;
+ Image->format->palette->colors[i].g = (*ptr++)/2;
+ Image->format->palette->colors[i].b = (*ptr++)/2;
+ }
+ }
+
+ /* If nbcolors < 2^nbplanes, repeat the colormap */
+ /* This happens when pictures have a stencil mask */
+ if ( nbrcolorsfinal > (1<<bmhd.planes) ) {
+ nbrcolorsfinal = (1<<bmhd.planes);
+ }
+ for ( i=nbcolors; i < (Uint32)nbrcolorsfinal; i++ )
+ {
+ Image->format->palette->colors[i].r = Image->format->palette->colors[i%nbcolors].r;
+ Image->format->palette->colors[i].g = Image->format->palette->colors[i%nbcolors].g;
+ Image->format->palette->colors[i].b = Image->format->palette->colors[i%nbcolors].b;
+ }
+ if ( !pbm )
+ Image->format->palette->ncolors = nbrcolorsfinal;
+ }
+
+ /* Get the bitmap */
+
+ for ( h=0; h < bmhd.h; h++ )
+ {
+ /* uncompress the datas of each planes */
+
+ for ( plane=0; plane < (nbplanes+stencil); plane++ )
+ {
+ ptr = MiniBuf + ( plane * bytesperline );
+
+ remainingbytes = bytesperline;
+
+ if ( bmhd.tcomp == 1 ) /* Datas are compressed */
+ {
+ do
+ {
+ if ( !SDL_RWread( src, &count, 1, 1 ) )
+ {
+ error="error reading BODY chunk";
+ goto done;
+ }
+
+ if ( count & 0x80 )
+ {
+ count ^= 0xFF;
+ count += 2; /* now it */
+
+ if ( ( count > remainingbytes ) || !SDL_RWread( src, &color, 1, 1 ) )
+ {
+ error="error reading BODY chunk";
+ goto done;
+ }
+ memset( ptr, color, count );
+ }
+ else
+ {
+ ++count;
+
+ if ( ( count > remainingbytes ) || !SDL_RWread( src, ptr, count, 1 ) )
+ {
+ error="error reading BODY chunk";
+ goto done;
+ }
+ }
+
+ ptr += count;
+ remainingbytes -= count;
+
+ } while ( remainingbytes > 0 );
+ }
+ else
+ {
+ if ( !SDL_RWread( src, ptr, bytesperline, 1 ) )
+ {
+ error="error reading BODY chunk";
+ goto done;
+ }
+ }
+ }
+
+ /* One line has been read, store it ! */
+
+ ptr = Image->pixels;
+ if ( nbplanes==24 || flagHAM==1 )
+ ptr += h * width * 3;
+ else
+ ptr += h * width;
+
+ if ( pbm ) /* File format : 'Packed Bitmap' */
+ {
+ memcpy( ptr, MiniBuf, width );
+ }
+ else /* We have to un-interlace the bits ! */
+ {
+ if ( nbplanes!=24 && flagHAM==0 )
+ {
+ size = ( width + 7 ) / 8;
+
+ for ( i=0; i < size; i++ )
+ {
+ memset( ptr, 0, 8 );
+
+ for ( plane=0; plane < (nbplanes + stencil); plane++ )
+ {
+ color = *( MiniBuf + i + ( plane * bytesperline ) );
+ msk = 0x80;
+
+ for ( j=0; j<8; j++ )
+ {
+ if ( ( plane + j ) <= 7 ) ptr[j] |= (Uint8)( color & msk ) >> ( 7 - plane - j );
+ else ptr[j] |= (Uint8)( color & msk ) << ( plane + j - 7 );
+
+ msk >>= 1;
+ }
+ }
+ ptr += 8;
+ }
+ }
+ else
+ {
+ Uint32 finalcolor = 0;
+ size = ( width + 7 ) / 8;
+ /* 24 bitplanes ILBM : R0...R7,G0...G7,B0...B7 */
+ /* or HAM (6 bitplanes) or HAM8 (8 bitplanes) modes */
+ for ( i=0; i<width; i=i+8 )
+ {
+ Uint8 maskBit = 0x80;
+ for ( j=0; j<8; j++ )
+ {
+ Uint32 pixelcolor = 0;
+ Uint32 maskColor = 1;
+ Uint8 dataBody;
+ for ( plane=0; plane < nbplanes; plane++ )
+ {
+ dataBody = MiniBuf[ plane*size+i/8 ];
+ if ( dataBody&maskBit )
+ pixelcolor = pixelcolor | maskColor;
+ maskColor = maskColor<<1;
+ }
+ /* HAM : 12 bits RGB image (4 bits per color component) */
+ /* HAM8 : 18 bits RGB image (6 bits per color component) */
+ if ( flagHAM )
+ {
+ switch( pixelcolor>>(nbplanes-2) )
+ {
+ case 0: /* take direct color from palette */
+ finalcolor = colormap[ pixelcolor*3 ] + (colormap[ pixelcolor*3+1 ]<<8) + (colormap[ pixelcolor*3+2 ]<<16);
+ break;
+ case 1: /* modify only blue component */
+ finalcolor = finalcolor&0x00FFFF;
+ finalcolor = finalcolor | (pixelcolor<<(16+(10-nbplanes)));
+ break;
+ case 2: /* modify only red component */
+ finalcolor = finalcolor&0xFFFF00;
+ finalcolor = finalcolor | pixelcolor<<(10-nbplanes);
+ break;
+ case 3: /* modify only green component */
+ finalcolor = finalcolor&0xFF00FF;
+ finalcolor = finalcolor | (pixelcolor<<(8+(10-nbplanes)));
+ break;
+ }
+ }
+ else
+ {
+ finalcolor = pixelcolor;
+ }
+ if ( SDL_BYTEORDER == SDL_LIL_ENDIAN )
+ {
+ *ptr++ = (Uint8)(finalcolor>>16);
+ *ptr++ = (Uint8)(finalcolor>>8);
+ *ptr++ = (Uint8)(finalcolor);
+ }
+ else
+ {
+ *ptr++ = (Uint8)(finalcolor);
+ *ptr++ = (Uint8)(finalcolor>>8);
+ *ptr++ = (Uint8)(finalcolor>>16);
+ }
+
+ maskBit = maskBit>>1;
+ }
+ }
+ }
+ }
+ }
+
+done:
+
+ if ( MiniBuf ) free( MiniBuf );
+
+ if ( error )
+ {
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ if ( Image ) {
+ SDL_FreeSurface( Image );
+ Image = NULL;
+ }
+ IMG_SetError( error );
+ }
+
+ return( Image );
+}
+
+#else /* LOAD_LBM */
+
+/* See if an image is contained in a data source */
+int IMG_isLBM(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load an IFF type image from an SDL datasource */
+SDL_Surface *IMG_LoadLBM_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_LBM */
diff --git a/apps/plugins/sdl/SDL_image/IMG_pcx.c b/apps/plugins/sdl/SDL_image/IMG_pcx.c
new file mode 100644
index 0000000000..f62eac1268
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_pcx.c
@@ -0,0 +1,276 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * PCX file reader:
+ * Supports:
+ * 1..4 bits/pixel in multiplanar format (1 bit/plane/pixel)
+ * 8 bits/pixel in single-planar format (8 bits/plane/pixel)
+ * 24 bits/pixel in 3-plane format (8 bits/plane/pixel)
+ *
+ * (The <8bpp formats are expanded to 8bpp surfaces)
+ *
+ * Doesn't support:
+ * single-planar packed-pixel formats other than 8bpp
+ * 4-plane 32bpp format with a fourth "intensity" plane
+ */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "SDL_endian.h"
+
+#include "SDL_image.h"
+
+#ifdef LOAD_PCX
+
+struct PCXheader {
+ Uint8 Manufacturer;
+ Uint8 Version;
+ Uint8 Encoding;
+ Uint8 BitsPerPixel;
+ Sint16 Xmin, Ymin, Xmax, Ymax;
+ Sint16 HDpi, VDpi;
+ Uint8 Colormap[48];
+ Uint8 Reserved;
+ Uint8 NPlanes;
+ Sint16 BytesPerLine;
+ Sint16 PaletteInfo;
+ Sint16 HscreenSize;
+ Sint16 VscreenSize;
+ Uint8 Filler[54];
+};
+
+/* See if an image is contained in a data source */
+int IMG_isPCX(SDL_RWops *src)
+{
+ int start;
+ int is_PCX;
+ const int ZSoft_Manufacturer = 10;
+ const int PC_Paintbrush_Version = 5;
+ const int PCX_Uncompressed_Encoding = 0;
+ const int PCX_RunLength_Encoding = 1;
+ struct PCXheader pcxh;
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_PCX = 0;
+ if ( SDL_RWread(src, &pcxh, sizeof(pcxh), 1) == 1 ) {
+ if ( (pcxh.Manufacturer == ZSoft_Manufacturer) &&
+ (pcxh.Version == PC_Paintbrush_Version) &&
+ (pcxh.Encoding == PCX_RunLength_Encoding ||
+ pcxh.Encoding == PCX_Uncompressed_Encoding) ) {
+ is_PCX = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_PCX);
+}
+
+/* Load a PCX type image from an SDL datasource */
+SDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src)
+{
+ int start;
+ struct PCXheader pcxh;
+ Uint32 Rmask;
+ Uint32 Gmask;
+ Uint32 Bmask;
+ Uint32 Amask;
+ SDL_Surface *surface = NULL;
+ int width, height;
+ int y, bpl;
+ Uint8 *row, *buf = NULL;
+ char *error = NULL;
+ int bits, src_bits;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if ( ! SDL_RWread(src, &pcxh, sizeof(pcxh), 1) ) {
+ error = "file truncated";
+ goto done;
+ }
+ pcxh.Xmin = SDL_SwapLE16(pcxh.Xmin);
+ pcxh.Ymin = SDL_SwapLE16(pcxh.Ymin);
+ pcxh.Xmax = SDL_SwapLE16(pcxh.Xmax);
+ pcxh.Ymax = SDL_SwapLE16(pcxh.Ymax);
+ pcxh.BytesPerLine = SDL_SwapLE16(pcxh.BytesPerLine);
+
+ /* Create the surface of the appropriate type */
+ width = (pcxh.Xmax - pcxh.Xmin) + 1;
+ height = (pcxh.Ymax - pcxh.Ymin) + 1;
+ Rmask = Gmask = Bmask = Amask = 0;
+ src_bits = pcxh.BitsPerPixel * pcxh.NPlanes;
+ if((pcxh.BitsPerPixel == 1 && pcxh.NPlanes >= 1 && pcxh.NPlanes <= 4)
+ || (pcxh.BitsPerPixel == 8 && pcxh.NPlanes == 1)) {
+ bits = 8;
+ } else if(pcxh.BitsPerPixel == 8 && pcxh.NPlanes == 3) {
+ bits = 24;
+ if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {
+ Rmask = 0x000000FF;
+ Gmask = 0x0000FF00;
+ Bmask = 0x00FF0000;
+ } else {
+ Rmask = 0xFF0000;
+ Gmask = 0x00FF00;
+ Bmask = 0x0000FF;
+ }
+ } else {
+ error = "unsupported PCX format";
+ goto done;
+ }
+ surface = SDL_AllocSurface(SDL_SWSURFACE, width, height,
+ bits, Rmask, Gmask, Bmask, Amask);
+ if ( surface == NULL )
+ goto done;
+
+ bpl = pcxh.NPlanes * pcxh.BytesPerLine;
+ if (bpl > surface->pitch) {
+ error = "bytes per line is too large (corrupt?)";
+ }
+ buf = malloc(bpl);
+ row = surface->pixels;
+ for ( y=0; y<surface->h; ++y ) {
+ /* decode a scan line to a temporary buffer first */
+ int i, count = 0;
+ Uint8 ch;
+ Uint8 *dst = (src_bits == 8) ? row : buf;
+ if ( pcxh.Encoding == 0 ) {
+ if(!SDL_RWread(src, dst, bpl, 1)) {
+ error = "file truncated";
+ goto done;
+ }
+ } else {
+ for(i = 0; i < bpl; i++) {
+ if(!count) {
+ if(!SDL_RWread(src, &ch, 1, 1)) {
+ error = "file truncated";
+ goto done;
+ }
+ if( (ch & 0xc0) == 0xc0) {
+ count = ch & 0x3f;
+ if(!SDL_RWread(src, &ch, 1, 1)) {
+ error = "file truncated";
+ goto done;
+ }
+ } else
+ count = 1;
+ }
+ dst[i] = ch;
+ count--;
+ }
+ }
+
+ if(src_bits <= 4) {
+ /* expand planes to 1 byte/pixel */
+ Uint8 *src = buf;
+ int plane;
+ for(plane = 0; plane < pcxh.NPlanes; plane++) {
+ int i, j, x = 0;
+ for(i = 0; i < pcxh.BytesPerLine; i++) {
+ Uint8 byte = *src++;
+ for(j = 7; j >= 0; j--) {
+ unsigned bit = (byte >> j) & 1;
+ /* skip padding bits */
+ if (i * 8 + j >= width)
+ continue;
+ row[x++] |= bit << plane;
+ }
+ }
+ }
+ } else if(src_bits == 24) {
+ /* de-interlace planes */
+ Uint8 *src = buf;
+ int plane;
+ for(plane = 0; plane < pcxh.NPlanes; plane++) {
+ int x;
+ dst = row + plane;
+ for(x = 0; x < width; x++) {
+ *dst = *src++;
+ dst += pcxh.NPlanes;
+ }
+ }
+ }
+
+ row += surface->pitch;
+ }
+
+ if(bits == 8) {
+ SDL_Color *colors = surface->format->palette->colors;
+ int nc = 1 << src_bits;
+ int i;
+
+ surface->format->palette->ncolors = nc;
+ if(src_bits == 8) {
+ Uint8 ch;
+ /* look for a 256-colour palette */
+ do {
+ if ( !SDL_RWread(src, &ch, 1, 1)) {
+ error = "file truncated";
+ goto done;
+ }
+ } while ( ch != 12 );
+
+ for(i = 0; i < 256; i++) {
+ SDL_RWread(src, &colors[i].r, 1, 1);
+ SDL_RWread(src, &colors[i].g, 1, 1);
+ SDL_RWread(src, &colors[i].b, 1, 1);
+ }
+ } else {
+ for(i = 0; i < nc; i++) {
+ colors[i].r = pcxh.Colormap[i * 3];
+ colors[i].g = pcxh.Colormap[i * 3 + 1];
+ colors[i].b = pcxh.Colormap[i * 3 + 2];
+ }
+ }
+ }
+
+done:
+ free(buf);
+ if ( error ) {
+ SDL_RWseek(src, start, RW_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_isPCX(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a PCX type image from an SDL datasource */
+SDL_Surface *IMG_LoadPCX_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_PCX */
diff --git a/apps/plugins/sdl/SDL_image/IMG_png.c b/apps/plugins/sdl/SDL_image/IMG_png.c
new file mode 100644
index 0000000000..93c7ee5dfd
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_png.c
@@ -0,0 +1,584 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a PNG image file loading framework */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_PNG
+
+/*=============================================================================
+ File: SDL_png.c
+ Purpose: A PNG loader and saver for the SDL library
+ Revision:
+ Created by: Philippe Lavoie (2 November 1998)
+ lavoie@zeus.genie.uottawa.ca
+ Modified by:
+
+ Copyright notice:
+ Copyright (C) 1998 Philippe Lavoie
+
+ 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
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Comments: The load and save routine are basically the ones you can find
+ in the example.c file from the libpng distribution.
+
+ Changes:
+ 5/17/99 - Modified to use the new SDL data sources - Sam Lantinga
+
+=============================================================================*/
+
+#include "SDL_endian.h"
+
+#ifdef macintosh
+#define MACOS
+#endif
+#include <png.h>
+
+/* Check for the older version of libpng */
+#if (PNG_LIBPNG_VER_MAJOR == 1) && (PNG_LIBPNG_VER_MINOR < 4)
+#define LIBPNG_VERSION_12
+#endif
+
+static struct {
+ int loaded;
+ void *handle;
+ png_infop (*png_create_info_struct) (png_structp png_ptr);
+ png_structp (*png_create_read_struct) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn);
+ void (*png_destroy_read_struct) (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr);
+ png_uint_32 (*png_get_IHDR) (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method);
+ png_voidp (*png_get_io_ptr) (png_structp png_ptr);
+ png_byte (*png_get_channels) (png_structp png_ptr, png_infop info_ptr);
+ png_uint_32 (*png_get_PLTE) (png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette);
+ png_uint_32 (*png_get_tRNS) (png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values);
+ png_uint_32 (*png_get_valid) (png_structp png_ptr, png_infop info_ptr, png_uint_32 flag);
+ void (*png_read_image) (png_structp png_ptr, png_bytepp image);
+ void (*png_read_info) (png_structp png_ptr, png_infop info_ptr);
+ void (*png_read_update_info) (png_structp png_ptr, png_infop info_ptr);
+ void (*png_set_expand) (png_structp png_ptr);
+ void (*png_set_gray_to_rgb) (png_structp png_ptr);
+ void (*png_set_packing) (png_structp png_ptr);
+ void (*png_set_read_fn) (png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn);
+ void (*png_set_strip_16) (png_structp png_ptr);
+ int (*png_sig_cmp) (png_bytep sig, png_size_t start, png_size_t num_to_check);
+#ifndef LIBPNG_VERSION_12
+ jmp_buf* (*png_set_longjmp_fn) (png_structp, png_longjmp_ptr, size_t);
+#endif
+} lib;
+
+#ifdef LOAD_PNG_DYNAMIC
+int IMG_InitPNG()
+{
+ if ( lib.loaded == 0 ) {
+ lib.handle = SDL_LoadObject(LOAD_PNG_DYNAMIC);
+ if ( lib.handle == NULL ) {
+ return -1;
+ }
+ lib.png_create_info_struct =
+ (png_infop (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_create_info_struct");
+ if ( lib.png_create_info_struct == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_create_read_struct =
+ (png_structp (*) (png_const_charp, png_voidp, png_error_ptr, png_error_ptr))
+ SDL_LoadFunction(lib.handle, "png_create_read_struct");
+ if ( lib.png_create_read_struct == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_destroy_read_struct =
+ (void (*) (png_structpp, png_infopp, png_infopp))
+ SDL_LoadFunction(lib.handle, "png_destroy_read_struct");
+ if ( lib.png_destroy_read_struct == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_IHDR =
+ (png_uint_32 (*) (png_structp, png_infop, png_uint_32 *, png_uint_32 *, int *, int *, int *, int *, int *))
+ SDL_LoadFunction(lib.handle, "png_get_IHDR");
+ if ( lib.png_get_IHDR == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_channels =
+ (png_byte (*) (png_structp, png_infop))
+ SDL_LoadFunction(lib.handle, "png_get_channels");
+ if ( lib.png_get_channels == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_io_ptr =
+ (png_voidp (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_get_io_ptr");
+ if ( lib.png_get_io_ptr == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_PLTE =
+ (png_uint_32 (*) (png_structp, png_infop, png_colorp *, int *))
+ SDL_LoadFunction(lib.handle, "png_get_PLTE");
+ if ( lib.png_get_PLTE == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_tRNS =
+ (png_uint_32 (*) (png_structp, png_infop, png_bytep *, int *, png_color_16p *))
+ SDL_LoadFunction(lib.handle, "png_get_tRNS");
+ if ( lib.png_get_tRNS == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_get_valid =
+ (png_uint_32 (*) (png_structp, png_infop, png_uint_32))
+ SDL_LoadFunction(lib.handle, "png_get_valid");
+ if ( lib.png_get_valid == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_read_image =
+ (void (*) (png_structp, png_bytepp))
+ SDL_LoadFunction(lib.handle, "png_read_image");
+ if ( lib.png_read_image == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_read_info =
+ (void (*) (png_structp, png_infop))
+ SDL_LoadFunction(lib.handle, "png_read_info");
+ if ( lib.png_read_info == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_read_update_info =
+ (void (*) (png_structp, png_infop))
+ SDL_LoadFunction(lib.handle, "png_read_update_info");
+ if ( lib.png_read_update_info == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_set_expand =
+ (void (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_set_expand");
+ if ( lib.png_set_expand == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_set_gray_to_rgb =
+ (void (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_set_gray_to_rgb");
+ if ( lib.png_set_gray_to_rgb == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_set_packing =
+ (void (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_set_packing");
+ if ( lib.png_set_packing == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_set_read_fn =
+ (void (*) (png_structp, png_voidp, png_rw_ptr))
+ SDL_LoadFunction(lib.handle, "png_set_read_fn");
+ if ( lib.png_set_read_fn == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_set_strip_16 =
+ (void (*) (png_structp))
+ SDL_LoadFunction(lib.handle, "png_set_strip_16");
+ if ( lib.png_set_strip_16 == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.png_sig_cmp =
+ (int (*) (png_bytep, png_size_t, png_size_t))
+ SDL_LoadFunction(lib.handle, "png_sig_cmp");
+ if ( lib.png_sig_cmp == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+#ifndef LIBPNG_VERSION_12
+ lib.png_set_longjmp_fn =
+ (jmp_buf * (*) (png_structp, png_longjmp_ptr, size_t))
+ SDL_LoadFunction(lib.handle, "png_set_longjmp_fn");
+ if ( lib.png_set_longjmp_fn == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+#endif
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitPNG()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ SDL_UnloadObject(lib.handle);
+ }
+ --lib.loaded;
+}
+#else
+int IMG_InitPNG()
+{
+ if ( lib.loaded == 0 ) {
+ lib.png_create_info_struct = png_create_info_struct;
+ lib.png_create_read_struct = png_create_read_struct;
+ lib.png_destroy_read_struct = png_destroy_read_struct;
+ lib.png_get_IHDR = png_get_IHDR;
+ lib.png_get_channels = png_get_channels;
+ lib.png_get_io_ptr = png_get_io_ptr;
+ lib.png_get_PLTE = png_get_PLTE;
+ lib.png_get_tRNS = png_get_tRNS;
+ lib.png_get_valid = png_get_valid;
+ lib.png_read_image = png_read_image;
+ lib.png_read_info = png_read_info;
+ lib.png_read_update_info = png_read_update_info;
+ lib.png_set_expand = png_set_expand;
+ lib.png_set_gray_to_rgb = png_set_gray_to_rgb;
+ lib.png_set_packing = png_set_packing;
+ lib.png_set_read_fn = png_set_read_fn;
+ lib.png_set_strip_16 = png_set_strip_16;
+ lib.png_sig_cmp = png_sig_cmp;
+#ifndef LIBPNG_VERSION_12
+ lib.png_set_longjmp_fn = png_set_longjmp_fn;
+#endif
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitPNG()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ }
+ --lib.loaded;
+}
+#endif /* LOAD_PNG_DYNAMIC */
+
+/* See if an image is contained in a data source */
+int IMG_isPNG(SDL_RWops *src)
+{
+ int start;
+ int is_PNG;
+ Uint8 magic[4];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_PNG = 0;
+ if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {
+ if ( magic[0] == 0x89 &&
+ magic[1] == 'P' &&
+ magic[2] == 'N' &&
+ magic[3] == 'G' ) {
+ is_PNG = 1;
+ }
+ else
+ rb->splashf(HZ, "magic is %4s", magic);
+ }
+ else
+ {
+ rb->splashf(HZ, "read() failed!");
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_PNG);
+}
+
+/* Load a PNG type image from an SDL datasource */
+static void png_read_data(png_structp ctx, png_bytep area, png_size_t size)
+{
+ SDL_RWops *src;
+
+ src = (SDL_RWops *)lib.png_get_io_ptr(ctx);
+ SDL_RWread(src, area, size, 1);
+}
+SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)
+{
+ int start;
+ const char *error;
+ SDL_Surface *volatile surface;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_uint_32 width, height;
+ int bit_depth, color_type, interlace_type, num_channels;
+ Uint32 Rmask;
+ Uint32 Gmask;
+ Uint32 Bmask;
+ Uint32 Amask;
+ SDL_Palette *palette;
+ png_bytep *volatile row_pointers;
+ int row, i;
+ volatile int ckey = -1;
+ png_color_16 *transv;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if ( !IMG_Init(IMG_INIT_PNG) ) {
+ return NULL;
+ }
+
+ /* Initialize the data we will clean up when we're done */
+ error = NULL;
+ png_ptr = NULL; info_ptr = NULL; row_pointers = NULL; surface = NULL;
+
+ /* Create the PNG loading context structure */
+ png_ptr = lib.png_create_read_struct(PNG_LIBPNG_VER_STRING,
+ NULL,NULL,NULL);
+ if (png_ptr == NULL){
+ error = "Couldn't allocate memory for PNG file or incompatible PNG dll";
+ goto done;
+ }
+
+ /* Allocate/initialize the memory for image information. REQUIRED. */
+ info_ptr = lib.png_create_info_struct(png_ptr);
+ if (info_ptr == NULL) {
+ error = "Couldn't create image information for PNG file";
+ goto done;
+ }
+
+ /* Set error handling if you are using setjmp/longjmp method (this is
+ * the normal method of doing things with libpng). REQUIRED unless you
+ * set up your own error handlers in png_create_read_struct() earlier.
+ */
+#ifndef LIBPNG_VERSION_12
+ if ( setjmp(*lib.png_set_longjmp_fn(png_ptr, longjmp, sizeof (jmp_buf))) )
+#else
+ if ( setjmp(png_ptr->jmpbuf) )
+#endif
+ {
+ error = "Error reading the PNG file.";
+ goto done;
+ }
+
+ /* Set up the input control */
+ lib.png_set_read_fn(png_ptr, src, png_read_data);
+
+ /* Read PNG header info */
+ lib.png_read_info(png_ptr, info_ptr);
+ lib.png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
+ &color_type, &interlace_type, NULL, NULL);
+
+ /* tell libpng to strip 16 bit/color files down to 8 bits/color */
+ lib.png_set_strip_16(png_ptr) ;
+
+ /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
+ * byte into separate bytes (useful for paletted and grayscale images).
+ */
+ lib.png_set_packing(png_ptr);
+
+ /* scale greyscale values to the range 0..255 */
+ if(color_type == PNG_COLOR_TYPE_GRAY)
+ lib.png_set_expand(png_ptr);
+
+ /* For images with a single "transparent colour", set colour key;
+ if more than one index has transparency, or if partially transparent
+ entries exist, use full alpha channel */
+ if (lib.png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
+ int num_trans;
+ Uint8 *trans;
+ lib.png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans,
+ &transv);
+ if(color_type == PNG_COLOR_TYPE_PALETTE) {
+ /* Check if all tRNS entries are opaque except one */
+ int i, t = -1;
+ for(i = 0; i < num_trans; i++)
+ if(trans[i] == 0) {
+ if(t >= 0)
+ break;
+ t = i;
+ } else if(trans[i] != 255)
+ break;
+ if(i == num_trans) {
+ /* exactly one transparent index */
+ ckey = t;
+ } else {
+ /* more than one transparent index, or translucency */
+ lib.png_set_expand(png_ptr);
+ }
+ } else
+ ckey = 0; /* actual value will be set later */
+ }
+
+ if ( color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
+ lib.png_set_gray_to_rgb(png_ptr);
+
+ lib.png_read_update_info(png_ptr, info_ptr);
+
+ lib.png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
+ &color_type, &interlace_type, NULL, NULL);
+
+ /* Allocate the SDL surface to hold the image */
+ Rmask = Gmask = Bmask = Amask = 0 ;
+ num_channels = lib.png_get_channels(png_ptr, info_ptr);
+ if ( color_type != PNG_COLOR_TYPE_PALETTE ) {
+ if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {
+ Rmask = 0x000000FF;
+ Gmask = 0x0000FF00;
+ Bmask = 0x00FF0000;
+ Amask = (num_channels == 4) ? 0xFF000000 : 0;
+ } else {
+ int s = (num_channels == 4) ? 0 : 8;
+ Rmask = 0xFF000000 >> s;
+ Gmask = 0x00FF0000 >> s;
+ Bmask = 0x0000FF00 >> s;
+ Amask = 0x000000FF >> s;
+ }
+ }
+ surface = SDL_AllocSurface(SDL_SWSURFACE, width, height,
+ bit_depth*num_channels, Rmask,Gmask,Bmask,Amask);
+ if ( surface == NULL ) {
+ error = "Out of memory";
+ goto done;
+ }
+
+ if(ckey != -1) {
+ if(color_type != PNG_COLOR_TYPE_PALETTE)
+ /* FIXME: Should these be truncated or shifted down? */
+ ckey = SDL_MapRGB(surface->format,
+ (Uint8)transv->red,
+ (Uint8)transv->green,
+ (Uint8)transv->blue);
+ SDL_SetColorKey(surface, SDL_SRCCOLORKEY, ckey);
+ }
+
+ /* Create the array of pointers to image data */
+ row_pointers = (png_bytep*) malloc(sizeof(png_bytep)*height);
+ if ( (row_pointers == NULL) ) {
+ error = "Out of memory";
+ goto done;
+ }
+ for (row = 0; row < (int)height; row++) {
+ row_pointers[row] = (png_bytep)
+ (Uint8 *)surface->pixels + row*surface->pitch;
+ }
+
+ /* Read the entire image in one go */
+ lib.png_read_image(png_ptr, row_pointers);
+
+ /* and we're done! (png_read_end() can be omitted if no processing of
+ * post-IDAT text/time/etc. is desired)
+ * In some cases it can't read PNG's created by some popular programs (ACDSEE),
+ * we do not want to process comments, so we omit png_read_end
+
+ lib.png_read_end(png_ptr, info_ptr);
+ */
+
+ /* Load the palette, if any */
+ palette = surface->format->palette;
+ if ( palette ) {
+ int png_num_palette;
+ png_colorp png_palette;
+ lib.png_get_PLTE(png_ptr, info_ptr, &png_palette, &png_num_palette);
+ if(color_type == PNG_COLOR_TYPE_GRAY) {
+ palette->ncolors = 256;
+ for(i = 0; i < 256; i++) {
+ palette->colors[i].r = i;
+ palette->colors[i].g = i;
+ palette->colors[i].b = i;
+ }
+ } else if (png_num_palette > 0 ) {
+ palette->ncolors = png_num_palette;
+ for( i=0; i<png_num_palette; ++i ) {
+ palette->colors[i].b = png_palette[i].blue;
+ palette->colors[i].g = png_palette[i].green;
+ palette->colors[i].r = png_palette[i].red;
+ }
+ }
+ }
+
+done: /* Clean up and return */
+ if ( png_ptr ) {
+ lib.png_destroy_read_struct(&png_ptr,
+ info_ptr ? &info_ptr : (png_infopp)0,
+ (png_infopp)0);
+ }
+ if ( row_pointers ) {
+ free(row_pointers);
+ }
+ if ( error ) {
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ if ( surface ) {
+ SDL_FreeSurface(surface);
+ surface = NULL;
+ }
+ IMG_SetError(error);
+ }
+ return(surface);
+}
+
+#else
+
+int IMG_InitPNG()
+{
+ IMG_SetError("PNG images are not supported");
+ return(-1);
+}
+
+void IMG_QuitPNG()
+{
+}
+
+/* See if an image is contained in a data source */
+int IMG_isPNG(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a PNG type image from an SDL datasource */
+SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_PNG */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_pnm.c b/apps/plugins/sdl/SDL_image/IMG_pnm.c
new file mode 100644
index 0000000000..0787f52aff
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_pnm.c
@@ -0,0 +1,258 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * PNM (portable anymap) image loader:
+ *
+ * Supports: PBM, PGM and PPM, ASCII and binary formats
+ * (PBM and PGM are loaded as 8bpp surfaces)
+ * Does not support: maximum component value > 255
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_PNM
+
+/* See if an image is contained in a data source */
+int IMG_isPNM(SDL_RWops *src)
+{
+ int start;
+ int is_PNM;
+ char magic[2];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_PNM = 0;
+ if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
+ /*
+ * PNM magic signatures:
+ * P1 PBM, ascii format
+ * P2 PGM, ascii format
+ * P3 PPM, ascii format
+ * 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;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_PNM);
+}
+
+/* read a non-negative integer from the source. return -1 upon error */
+static int ReadNumber(SDL_RWops *src)
+{
+ int number;
+ unsigned char ch;
+
+ /* Initialize return value */
+ number = 0;
+
+ /* Skip leading whitespace */
+ do {
+ if ( ! SDL_RWread(src, &ch, 1, 1) ) {
+ return(0);
+ }
+ /* Eat comments as whitespace */
+ if ( ch == '#' ) { /* Comment is '#' to end of line */
+ do {
+ if ( ! SDL_RWread(src, &ch, 1, 1) ) {
+ return -1;
+ }
+ } while ( (ch != '\r') && (ch != '\n') );
+ }
+ } while ( isspace(ch) );
+
+ /* Add up the number */
+ do {
+ number *= 10;
+ number += ch-'0';
+
+ if ( !SDL_RWread(src, &ch, 1, 1) ) {
+ return -1;
+ }
+ } while ( isdigit(ch) );
+
+ return(number);
+}
+
+SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)
+{
+ int start;
+ 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, PAM } kind;
+
+#define ERROR(s) do { error = (s); goto done; } while(0)
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ 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");
+ }
+
+ /* Read the image into the surface */
+ row = surface->pixels;
+ for(y = 0; y < height; y++) {
+ if(ascii) {
+ int i;
+ if(kind == PBM) {
+ for(i = 0; i < width; i++) {
+ Uint8 ch;
+ do {
+ if(!SDL_RWread(src, &ch,
+ 1, 1))
+ ERROR("file truncated");
+ ch -= '0';
+ } while(ch > 1);
+ row[i] = ch;
+ }
+ } else {
+ for(i = 0; i < bpl; i++) {
+ int c;
+ c = ReadNumber(src);
+ if(c < 0)
+ ERROR("file truncated");
+ row[i] = c;
+ }
+ }
+ } else {
+ Uint8 *dst = (kind == PBM) ? buf : row;
+ if(!SDL_RWread(src, dst, bpl, 1))
+ ERROR("file truncated");
+ if(kind == PBM) {
+ /* expand bitmap to 8bpp */
+ int i;
+ for(i = 0; i < width; i++) {
+ int bit = 7 - (i & 7);
+ row[i] = (buf[i >> 3] >> bit) & 1;
+ }
+ }
+ }
+ if(maxval < 255) {
+ /* scale up to full dynamic range (slow) */
+ int i;
+ for(i = 0; i < bpl; i++)
+ row[i] = row[i] * 255 / maxval;
+ }
+ row += surface->pitch;
+ }
+done:
+ free(buf);
+ if(error) {
+ SDL_RWseek(src, start, RW_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_isPNM(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a PNM type image from an SDL datasource */
+SDL_Surface *IMG_LoadPNM_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_PNM */
diff --git a/apps/plugins/sdl/SDL_image/IMG_tga.c b/apps/plugins/sdl/SDL_image/IMG_tga.c
new file mode 100644
index 0000000000..0e65c5d320
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_tga.c
@@ -0,0 +1,336 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a Targa image file loading framework */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "SDL_endian.h"
+
+#include "SDL_image.h"
+
+#ifdef LOAD_TGA
+
+/*
+ * A TGA loader for the SDL library
+ * Supports: Reading 8, 15, 16, 24 and 32bpp images, with alpha or colourkey,
+ * uncompressed or RLE encoded.
+ *
+ * 2000-06-10 Mattias Engdegård <f91-men@nada.kth.se>: initial version
+ * 2000-06-26 Mattias Engdegård <f91-men@nada.kth.se>: read greyscale TGAs
+ * 2000-08-09 Mattias Engdegård <f91-men@nada.kth.se>: alpha inversion removed
+ */
+
+struct TGAheader {
+ Uint8 infolen; /* length of info field */
+ Uint8 has_cmap; /* 1 if image has colormap, 0 otherwise */
+ Uint8 type;
+
+ Uint8 cmap_start[2]; /* index of first colormap entry */
+ Uint8 cmap_len[2]; /* number of entries in colormap */
+ Uint8 cmap_bits; /* bits per colormap entry */
+
+ Uint8 yorigin[2]; /* image origin (ignored here) */
+ Uint8 xorigin[2];
+ Uint8 width[2]; /* image size */
+ Uint8 height[2];
+ Uint8 pixel_bits; /* bits/pixel */
+ Uint8 flags;
+};
+
+enum tga_type {
+ TGA_TYPE_INDEXED = 1,
+ TGA_TYPE_RGB = 2,
+ TGA_TYPE_BW = 3,
+ TGA_TYPE_RLE_INDEXED = 9,
+ TGA_TYPE_RLE_RGB = 10,
+ TGA_TYPE_RLE_BW = 11
+};
+
+#define TGA_INTERLEAVE_MASK 0xc0
+#define TGA_INTERLEAVE_NONE 0x00
+#define TGA_INTERLEAVE_2WAY 0x40
+#define TGA_INTERLEAVE_4WAY 0x80
+
+#define TGA_ORIGIN_MASK 0x30
+#define TGA_ORIGIN_LEFT 0x00
+#define TGA_ORIGIN_RIGHT 0x10
+#define TGA_ORIGIN_LOWER 0x00
+#define TGA_ORIGIN_UPPER 0x20
+
+/* read/write unaligned little-endian 16-bit ints */
+#define LE16(p) ((p)[0] + ((p)[1] << 8))
+#define SETLE16(p, v) ((p)[0] = (v), (p)[1] = (v) >> 8)
+
+/* Load a TGA type image from an SDL datasource */
+SDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src)
+{
+ int start;
+ const char *error = NULL;
+ struct TGAheader hdr;
+ int rle = 0;
+ int alpha = 0;
+ int indexed = 0;
+ int grey = 0;
+ int ckey = -1;
+ int ncols, w, h;
+ SDL_Surface *img = NULL;
+ Uint32 rmask, gmask, bmask, amask;
+ Uint8 *dst;
+ int i;
+ int bpp;
+ int lstep;
+ Uint32 pixel;
+ int count, rep;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if(!SDL_RWread(src, &hdr, sizeof(hdr), 1)) {
+ error = "Error reading TGA data";
+ goto error;
+ }
+ ncols = LE16(hdr.cmap_len);
+ switch(hdr.type) {
+ case TGA_TYPE_RLE_INDEXED:
+ rle = 1;
+ /* fallthrough */
+ case TGA_TYPE_INDEXED:
+ if(!hdr.has_cmap || hdr.pixel_bits != 8 || ncols > 256)
+ goto unsupported;
+ indexed = 1;
+ break;
+
+ case TGA_TYPE_RLE_RGB:
+ rle = 1;
+ /* fallthrough */
+ case TGA_TYPE_RGB:
+ indexed = 0;
+ break;
+
+ case TGA_TYPE_RLE_BW:
+ rle = 1;
+ /* fallthrough */
+ case TGA_TYPE_BW:
+ if(hdr.pixel_bits != 8)
+ goto unsupported;
+ /* Treat greyscale as 8bpp indexed images */
+ indexed = grey = 1;
+ break;
+
+ default:
+ goto unsupported;
+ }
+
+ bpp = (hdr.pixel_bits + 7) >> 3;
+ rmask = gmask = bmask = amask = 0;
+ switch(hdr.pixel_bits) {
+ case 8:
+ if(!indexed) {
+ goto unsupported;
+ }
+ break;
+
+ case 15:
+ case 16:
+ /* 15 and 16bpp both seem to use 5 bits/plane. The extra alpha bit
+ is ignored for now. */
+ rmask = 0x7c00;
+ gmask = 0x03e0;
+ bmask = 0x001f;
+ break;
+
+ case 32:
+ alpha = 1;
+ /* fallthrough */
+ case 24:
+ if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
+ int s = alpha ? 0 : 8;
+ amask = 0x000000ff >> s;
+ rmask = 0x0000ff00 >> s;
+ gmask = 0x00ff0000 >> s;
+ bmask = 0xff000000 >> s;
+ } else {
+ amask = alpha ? 0xff000000 : 0;
+ rmask = 0x00ff0000;
+ gmask = 0x0000ff00;
+ bmask = 0x000000ff;
+ }
+ break;
+
+ default:
+ goto unsupported;
+ }
+
+ if((hdr.flags & TGA_INTERLEAVE_MASK) != TGA_INTERLEAVE_NONE
+ || hdr.flags & TGA_ORIGIN_RIGHT) {
+ goto unsupported;
+ }
+
+ SDL_RWseek(src, hdr.infolen, RW_SEEK_CUR); /* skip info field */
+
+ w = LE16(hdr.width);
+ h = LE16(hdr.height);
+ img = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h,
+ bpp * 8,
+ rmask, gmask, bmask, amask);
+ if(img == NULL) {
+ error = "Out of memory";
+ goto error;
+ }
+
+ if(hdr.has_cmap) {
+ int palsiz = ncols * ((hdr.cmap_bits + 7) >> 3);
+ if(indexed && !grey) {
+ Uint8 *pal = malloc(palsiz), *p = pal;
+ SDL_Color *colors = img->format->palette->colors;
+ img->format->palette->ncolors = ncols;
+ SDL_RWread(src, pal, palsiz, 1);
+ for(i = 0; i < ncols; i++) {
+ switch(hdr.cmap_bits) {
+ case 15:
+ case 16:
+ {
+ Uint16 c = p[0] + (p[1] << 8);
+ p += 2;
+ colors[i].r = (c >> 7) & 0xf8;
+ colors[i].g = (c >> 2) & 0xf8;
+ colors[i].b = c << 3;
+ }
+ break;
+ case 24:
+ case 32:
+ colors[i].b = *p++;
+ colors[i].g = *p++;
+ colors[i].r = *p++;
+ if(hdr.cmap_bits == 32 && *p++ < 128)
+ ckey = i;
+ break;
+ }
+ }
+ free(pal);
+ if(ckey >= 0)
+ SDL_SetColorKey(img, SDL_SRCCOLORKEY, ckey);
+ } else {
+ /* skip unneeded colormap */
+ SDL_RWseek(src, palsiz, RW_SEEK_CUR);
+ }
+ }
+
+ if(grey) {
+ SDL_Color *colors = img->format->palette->colors;
+ for(i = 0; i < 256; i++)
+ colors[i].r = colors[i].g = colors[i].b = i;
+ img->format->palette->ncolors = 256;
+ }
+
+ if(hdr.flags & TGA_ORIGIN_UPPER) {
+ lstep = img->pitch;
+ dst = img->pixels;
+ } else {
+ lstep = -img->pitch;
+ dst = (Uint8 *)img->pixels + (h - 1) * img->pitch;
+ }
+
+ /* The RLE decoding code is slightly convoluted since we can't rely on
+ spans not to wrap across scan lines */
+ count = rep = 0;
+ for(i = 0; i < h; i++) {
+ if(rle) {
+ int x = 0;
+ for(;;) {
+ Uint8 c;
+
+ if(count) {
+ int n = count;
+ if(n > w - x)
+ n = w - x;
+ SDL_RWread(src, dst + x * bpp, n * bpp, 1);
+ count -= n;
+ x += n;
+ if(x == w)
+ break;
+ } else if(rep) {
+ int n = rep;
+ if(n > w - x)
+ n = w - x;
+ rep -= n;
+ while(n--) {
+ memcpy(dst + x * bpp, &pixel, bpp);
+ x++;
+ }
+ if(x == w)
+ break;
+ }
+
+ SDL_RWread(src, &c, 1, 1);
+ if(c & 0x80) {
+ SDL_RWread(src, &pixel, bpp, 1);
+ rep = (c & 0x7f) + 1;
+ } else {
+ count = c + 1;
+ }
+ }
+
+ } else {
+ SDL_RWread(src, dst, w * bpp, 1);
+ }
+ if(SDL_BYTEORDER == SDL_BIG_ENDIAN && bpp == 2) {
+ /* swap byte order */
+ int x;
+ Uint16 *p = (Uint16 *)dst;
+ for(x = 0; x < w; x++)
+ p[x] = SDL_Swap16(p[x]);
+ }
+ dst += lstep;
+ }
+ return img;
+
+unsupported:
+ error = "Unsupported TGA format";
+
+error:
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ if ( img ) {
+ SDL_FreeSurface(img);
+ }
+ IMG_SetError(error);
+ return NULL;
+}
+
+#else
+
+/* dummy TGA load routine */
+SDL_Surface *IMG_LoadTGA_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_TGA */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_tif.c b/apps/plugins/sdl/SDL_image/IMG_tif.c
new file mode 100644
index 0000000000..25084ad7ac
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_tif.c
@@ -0,0 +1,298 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
+
+/* This is a TIFF image file loading framework */
+
+#include <stdio.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_TIF
+
+#include <tiffio.h>
+
+static struct {
+ int loaded;
+ void *handle;
+ TIFF* (*TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc);
+ void (*TIFFClose)(TIFF*);
+ int (*TIFFGetField)(TIFF*, ttag_t, ...);
+ int (*TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int);
+ TIFFErrorHandler (*TIFFSetErrorHandler)(TIFFErrorHandler);
+} lib;
+
+#ifdef LOAD_TIF_DYNAMIC
+int IMG_InitTIF()
+{
+ if ( lib.loaded == 0 ) {
+ lib.handle = SDL_LoadObject(LOAD_TIF_DYNAMIC);
+ if ( lib.handle == NULL ) {
+ return -1;
+ }
+ lib.TIFFClientOpen =
+ (TIFF* (*)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc))
+ SDL_LoadFunction(lib.handle, "TIFFClientOpen");
+ if ( lib.TIFFClientOpen == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.TIFFClose =
+ (void (*)(TIFF*))
+ SDL_LoadFunction(lib.handle, "TIFFClose");
+ if ( lib.TIFFClose == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.TIFFGetField =
+ (int (*)(TIFF*, ttag_t, ...))
+ SDL_LoadFunction(lib.handle, "TIFFGetField");
+ if ( lib.TIFFGetField == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.TIFFReadRGBAImage =
+ (int (*)(TIFF*, uint32, uint32, uint32*, int))
+ SDL_LoadFunction(lib.handle, "TIFFReadRGBAImage");
+ if ( lib.TIFFReadRGBAImage == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ lib.TIFFSetErrorHandler =
+ (TIFFErrorHandler (*)(TIFFErrorHandler))
+ SDL_LoadFunction(lib.handle, "TIFFSetErrorHandler");
+ if ( lib.TIFFSetErrorHandler == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitTIF()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ SDL_UnloadObject(lib.handle);
+ }
+ --lib.loaded;
+}
+#else
+int IMG_InitTIF()
+{
+ if ( lib.loaded == 0 ) {
+ lib.TIFFClientOpen = TIFFClientOpen;
+ lib.TIFFClose = TIFFClose;
+ lib.TIFFGetField = TIFFGetField;
+ lib.TIFFReadRGBAImage = TIFFReadRGBAImage;
+ lib.TIFFSetErrorHandler = TIFFSetErrorHandler;
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitTIF()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ }
+ --lib.loaded;
+}
+#endif /* LOAD_TIF_DYNAMIC */
+
+/*
+ * These are the thunking routine to use the SDL_RWops* routines from
+ * libtiff's internals.
+*/
+
+static tsize_t tiff_read(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ return SDL_RWread((SDL_RWops*)fd, buf, 1, size);
+}
+
+static toff_t tiff_seek(thandle_t fd, toff_t offset, int origin)
+{
+ return SDL_RWseek((SDL_RWops*)fd, offset, origin);
+}
+
+static tsize_t tiff_write(thandle_t fd, tdata_t buf, tsize_t size)
+{
+ return SDL_RWwrite((SDL_RWops*)fd, buf, 1, size);
+}
+
+static int tiff_close(thandle_t fd)
+{
+ /*
+ * We don't want libtiff closing our SDL_RWops*, but if it's not given
+ * a routine to try, and if the image isn't a TIFF, it'll segfault.
+ */
+ return 0;
+}
+
+static int tiff_map(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+ return (0);
+}
+
+static void tiff_unmap(thandle_t fd, tdata_t base, toff_t size)
+{
+ return;
+}
+
+static toff_t tiff_size(thandle_t fd)
+{
+ Uint32 save_pos;
+ toff_t size;
+
+ save_pos = SDL_RWtell((SDL_RWops*)fd);
+ SDL_RWseek((SDL_RWops*)fd, 0, RW_SEEK_END);
+ size = SDL_RWtell((SDL_RWops*)fd);
+ SDL_RWseek((SDL_RWops*)fd, save_pos, RW_SEEK_SET);
+ return size;
+}
+
+int IMG_isTIF(SDL_RWops* src)
+{
+ int start;
+ int is_TIF;
+ Uint8 magic[4];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_TIF = 0;
+ if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {
+ if ( (magic[0] == 'I' &&
+ magic[1] == 'I' &&
+ magic[2] == 0x2a &&
+ magic[3] == 0x00) ||
+ (magic[0] == 'M' &&
+ magic[1] == 'M' &&
+ magic[2] == 0x00 &&
+ magic[3] == 0x2a) ) {
+ is_TIF = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_TIF);
+}
+
+SDL_Surface* IMG_LoadTIF_RW(SDL_RWops* src)
+{
+ int start;
+ TIFF* tiff;
+ SDL_Surface* surface = NULL;
+ Uint32 img_width, img_height;
+ Uint32 Rmask, Gmask, Bmask, Amask;
+ Uint32 x, y;
+ Uint32 half;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ if ( !IMG_Init(IMG_INIT_TIF) ) {
+ return NULL;
+ }
+
+ /* turn off memory mapped access with the m flag */
+ tiff = lib.TIFFClientOpen("SDL_image", "rm", (thandle_t)src,
+ tiff_read, tiff_write, tiff_seek, tiff_close, tiff_size, tiff_map, tiff_unmap);
+ if(!tiff)
+ goto error;
+
+ /* Retrieve the dimensions of the image from the TIFF tags */
+ lib.TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &img_width);
+ lib.TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &img_height);
+
+ Rmask = 0x000000FF;
+ Gmask = 0x0000FF00;
+ Bmask = 0x00FF0000;
+ Amask = 0xFF000000;
+ surface = SDL_AllocSurface(SDL_SWSURFACE, img_width, img_height, 32,
+ Rmask, Gmask, Bmask, Amask);
+ if(!surface)
+ goto error;
+
+ if(!lib.TIFFReadRGBAImage(tiff, img_width, img_height, surface->pixels, 0))
+ goto error;
+
+ /* libtiff loads the image upside-down, flip it back */
+ half = img_height / 2;
+ for(y = 0; y < half; y++)
+ {
+ Uint32 *top = (Uint32 *)surface->pixels + y * surface->pitch/4;
+ Uint32 *bot = (Uint32 *)surface->pixels
+ + (img_height - y - 1) * surface->pitch/4;
+ for(x = 0; x < img_width; x++)
+ {
+ Uint32 tmp = top[x];
+ top[x] = bot[x];
+ bot[x] = tmp;
+ }
+ }
+ lib.TIFFClose(tiff);
+
+ return surface;
+
+error:
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ if ( surface ) {
+ SDL_FreeSurface(surface);
+ }
+ return NULL;
+}
+
+#else
+
+int IMG_InitTIF()
+{
+ IMG_SetError("TIFF images are not supported");
+ return(-1);
+}
+
+void IMG_QuitTIF()
+{
+}
+
+/* See if an image is contained in a data source */
+int IMG_isTIF(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a TIFF type image from an SDL datasource */
+SDL_Surface *IMG_LoadTIF_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_TIF */
+
+#endif /* !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND) */
diff --git a/apps/plugins/sdl/SDL_image/IMG_webp.c b/apps/plugins/sdl/SDL_image/IMG_webp.c
new file mode 100644
index 0000000000..94727ce195
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_webp.c
@@ -0,0 +1,295 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* This is a WEBP image file loading framework */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_WEBP
+
+/*=============================================================================
+ File: SDL_webp.c
+ Purpose: A WEBP loader for the SDL library
+ Revision:
+ Created by: Michael Bonfils (Murlock) (26 November 2011)
+ murlock42@gmail.com
+
+=============================================================================*/
+
+#include "SDL_endian.h"
+
+#ifdef macintosh
+#define MACOS
+#endif
+#include <webp/decode.h>
+
+static struct {
+ int loaded;
+ void *handle;
+ int/*VP8StatuCode*/ (*webp_get_features_internal) (const uint8_t *data, uint32_t data_size, WebPBitstreamFeatures* const features, int decoder_abi_version);
+ uint8_t* (*webp_decode_rgb_into) (const uint8_t* data, uint32_t data_size, uint8_t* output_buffer, int output_buffer_size, int output_stride);
+ uint8_t* (*webp_decode_rgba_into) (const uint8_t* data, uint32_t data_size, uint8_t* output_buffer, int output_buffer_size, int output_stride);
+} lib;
+
+#ifdef LOAD_WEBP_DYNAMIC
+int IMG_InitWEBP()
+{
+ if ( lib.loaded == 0 ) {
+ lib.handle = SDL_LoadObject(LOAD_WEBP_DYNAMIC);
+ if ( lib.handle == NULL ) {
+ return -1;
+ }
+ lib.webp_get_features_internal =
+ ( int (*) (const uint8_t *, uint32_t, WebPBitstreamFeatures* const, int) )
+ SDL_LoadFunction(lib.handle, "WebPGetFeaturesInternal" );
+ if ( lib.webp_get_features_internal == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+
+ lib.webp_decode_rgb_into =
+ ( uint8_t* (*) (const uint8_t*, uint32_t, uint8_t*, int, int ) )
+ SDL_LoadFunction(lib.handle, "WebPDecodeRGBInto" );
+ if ( lib.webp_decode_rgb_into == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+
+ lib.webp_decode_rgba_into =
+ ( uint8_t* (*) (const uint8_t*, uint32_t, uint8_t*, int, int ) )
+ SDL_LoadFunction(lib.handle, "WebPDecodeRGBInto" );
+ if ( lib.webp_decode_rgba_into == NULL ) {
+ SDL_UnloadObject(lib.handle);
+ return -1;
+ }
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitWEBP()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ SDL_UnloadObject(lib.handle);
+ }
+ --lib.loaded;
+}
+#else
+int IMG_InitWEBP()
+{
+ if ( lib.loaded == 0 ) {
+ lib.webp_get_features_internal = WebPGetFeaturesInternal;
+ lib.webp_decode_rgb_into = WebPDecodeRGBInto;
+ lib.webp_decode_rgba_into = WebPDecodeRGBAInto;
+ }
+ ++lib.loaded;
+
+ return 0;
+}
+void IMG_QuitWEBP()
+{
+ if ( lib.loaded == 0 ) {
+ return;
+ }
+ if ( lib.loaded == 1 ) {
+ }
+ --lib.loaded;
+}
+#endif /* LOAD_WEBP_DYNAMIC */
+
+static int webp_getinfo( SDL_RWops *src, int *datasize ) {
+ int start;
+ int is_WEBP;
+ int data;
+ Uint8 magic[20];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_WEBP = 0;
+ if ( SDL_RWread(src, magic, 1, sizeof(magic)) == sizeof(magic) ) {
+ if ( magic[ 0] == 'R' &&
+ magic[ 1] == 'I' &&
+ magic[ 2] == 'F' &&
+ magic[ 3] == 'F' &&
+ magic[ 8] == 'W' &&
+ magic[ 9] == 'E' &&
+ magic[10] == 'B' &&
+ magic[11] == 'P' &&
+ magic[12] == 'V' &&
+ magic[13] == 'P' &&
+ magic[14] == '8' &&
+ magic[15] == ' ' ) {
+ is_WEBP = 1;
+ data = magic[16] | magic[17]<<8 | magic[18]<<16 | magic[19]<<24;
+ if ( datasize )
+ *datasize = data;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_WEBP);
+}
+
+/* See if an image is contained in a data source */
+int IMG_isWEBP(SDL_RWops *src)
+{
+ return webp_getinfo( src, NULL );
+}
+
+SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src)
+{
+ int start;
+ const char *error = NULL;
+ SDL_Surface *volatile surface = NULL;
+ Uint32 Rmask;
+ Uint32 Gmask;
+ Uint32 Bmask;
+ Uint32 Amask;
+ WebPBitstreamFeatures features;
+ int raw_data_size;
+ uint8_t *raw_data;
+ int r;
+ uint8_t *ret;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+
+ start = SDL_RWtell(src);
+
+ if ( !IMG_Init(IMG_INIT_WEBP) ) {
+ goto error;
+ }
+
+
+ raw_data_size = -1;
+ if ( !webp_getinfo( src, &raw_data_size ) ) {
+ error = "Invalid WEBP";
+ goto error;
+ }
+
+ // skip header
+ SDL_RWseek(src, start+20, RW_SEEK_SET );
+
+ raw_data = (uint8_t*) malloc( raw_data_size );
+ if ( raw_data == NULL ) {
+ error = "Failed to allocate enought buffer for WEBP";
+ goto error;
+ }
+
+ r = SDL_RWread(src, raw_data, 1, raw_data_size );
+ if ( r != raw_data_size ) {
+ error = "Failed to read WEBP";
+ goto error;
+ }
+
+#if 0
+ // extract size of picture, not interesting since we don't know about alpha channel
+ int width = -1, height = -1;
+ if ( !WebPGetInfo( raw_data, raw_data_size, &width, &height ) ) {
+ printf("WebPGetInfo has failed\n" );
+ return NULL;
+ }
+#endif
+
+ if ( lib.webp_get_features_internal( raw_data, raw_data_size, &features, WEBP_DECODER_ABI_VERSION ) != VP8_STATUS_OK ) {
+ error = "WebPGetFeatures has failed";
+ return NULL;
+ }
+
+ /* Check if it's ok !*/
+ Rmask = 0x000000FF;
+ Gmask = 0x0000FF00;
+ Bmask = 0x00FF0000;
+ Amask = features.has_alpha?0xFF000001:0;
+
+ surface = SDL_AllocSurface(SDL_SWSURFACE, features.width, features.height,
+ features.has_alpha?32:24, Rmask,Gmask,Bmask,Amask);
+
+ if ( surface == NULL ) {
+ error = "Failed to allocate SDL_Surface";
+ goto error;
+ }
+
+ if ( features.has_alpha ) {
+ ret = lib.webp_decode_rgba_into( raw_data, raw_data_size, surface->pixels, surface->pitch * surface->h, surface->pitch );
+ } else {
+ ret = lib.webp_decode_rgb_into( raw_data, raw_data_size, surface->pixels, surface->pitch * surface->h, surface->pitch );
+ }
+
+ if ( !ret ) {
+ error = "Failed to decode WEBP";
+ goto error;
+ }
+
+ return surface;
+
+
+error:
+
+ if ( surface ) {
+ SDL_FreeSurface( surface );
+ }
+
+ if ( raw_data ) {
+ free( raw_data );
+ }
+
+ if ( error ) {
+ IMG_SetError( error );
+ }
+
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(NULL);
+}
+
+#else
+
+int IMG_InitWEBP()
+{
+ IMG_SetError("WEBP images are not supported");
+ return(-1);
+}
+
+void IMG_QuitWEBP()
+{
+}
+
+/* See if an image is contained in a data source */
+int IMG_isWEBP(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a WEBP type image from an SDL datasource */
+SDL_Surface *IMG_LoadWEBP_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_WEBP */
diff --git a/apps/plugins/sdl/SDL_image/IMG_xcf.c b/apps/plugins/sdl/SDL_image/IMG_xcf.c
new file mode 100644
index 0000000000..1dced65ee5
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_xcf.c
@@ -0,0 +1,824 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* This is a XCF image file loading framework */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "SDL_endian.h"
+#include "SDL_image.h"
+
+#ifdef LOAD_XCF
+
+#if DEBUG
+static char prop_names [][30] = {
+ "end",
+ "colormap",
+ "active_layer",
+ "active_channel",
+ "selection",
+ "floating_selection",
+ "opacity",
+ "mode",
+ "visible",
+ "linked",
+ "preserve_transparency",
+ "apply_mask",
+ "edit_mask",
+ "show_mask",
+ "show_masked",
+ "offsets",
+ "color",
+ "compression",
+ "guides",
+ "resolution",
+ "tattoo",
+ "parasites",
+ "unit",
+ "paths",
+ "user_unit"
+};
+#endif
+
+
+typedef enum
+{
+ PROP_END = 0,
+ PROP_COLORMAP = 1,
+ PROP_ACTIVE_LAYER = 2,
+ PROP_ACTIVE_CHANNEL = 3,
+ PROP_SELECTION = 4,
+ PROP_FLOATING_SELECTION = 5,
+ PROP_OPACITY = 6,
+ PROP_MODE = 7,
+ PROP_VISIBLE = 8,
+ PROP_LINKED = 9,
+ PROP_PRESERVE_TRANSPARENCY = 10,
+ PROP_APPLY_MASK = 11,
+ PROP_EDIT_MASK = 12,
+ PROP_SHOW_MASK = 13,
+ PROP_SHOW_MASKED = 14,
+ PROP_OFFSETS = 15,
+ PROP_COLOR = 16,
+ PROP_COMPRESSION = 17,
+ PROP_GUIDES = 18,
+ PROP_RESOLUTION = 19,
+ PROP_TATTOO = 20,
+ PROP_PARASITES = 21,
+ PROP_UNIT = 22,
+ PROP_PATHS = 23,
+ PROP_USER_UNIT = 24
+} xcf_prop_type;
+
+typedef enum {
+ COMPR_NONE = 0,
+ COMPR_RLE = 1,
+ COMPR_ZLIB = 2,
+ COMPR_FRACTAL = 3
+} xcf_compr_type;
+
+typedef enum {
+ IMAGE_RGB = 0,
+ IMAGE_GREYSCALE = 1,
+ IMAGE_INDEXED = 2
+} xcf_image_type;
+
+typedef struct {
+ Uint32 id;
+ Uint32 length;
+ union {
+ struct {
+ Uint32 num;
+ char * cmap;
+ } colormap; // 1
+ struct {
+ Uint32 drawable_offset;
+ } floating_selection; // 5
+ Sint32 opacity;
+ Sint32 mode;
+ int visible;
+ int linked;
+ int preserve_transparency;
+ int apply_mask;
+ int show_mask;
+ struct {
+ Sint32 x;
+ Sint32 y;
+ } offset;
+ unsigned char color [3];
+ Uint8 compression;
+ struct {
+ Sint32 x;
+ Sint32 y;
+ } resolution;
+ struct {
+ char * name;
+ Uint32 flags;
+ Uint32 size;
+ char * data;
+ } parasite;
+ } data;
+} xcf_prop;
+
+typedef struct {
+ char sign [14];
+ Uint32 width;
+ Uint32 height;
+ Sint32 image_type;
+ xcf_prop * properties;
+
+ Uint32 * layer_file_offsets;
+ Uint32 * channel_file_offsets;
+
+ xcf_compr_type compr;
+ Uint32 cm_num;
+ unsigned char * cm_map;
+} xcf_header;
+
+typedef struct {
+ Uint32 width;
+ Uint32 height;
+ Sint32 layer_type;
+ char * name;
+ xcf_prop * properties;
+
+ Uint32 hierarchy_file_offset;
+ Uint32 layer_mask_offset;
+
+ Uint32 offset_x;
+ Uint32 offset_y;
+ int visible;
+} xcf_layer;
+
+typedef struct {
+ Uint32 width;
+ Uint32 height;
+ char * name;
+ xcf_prop * properties;
+
+ Uint32 hierarchy_file_offset;
+
+ Uint32 color;
+ Uint32 opacity;
+ int selection;
+ int visible;
+} xcf_channel;
+
+typedef struct {
+ Uint32 width;
+ Uint32 height;
+ Uint32 bpp;
+
+ Uint32 * level_file_offsets;
+} xcf_hierarchy;
+
+typedef struct {
+ Uint32 width;
+ Uint32 height;
+
+ Uint32 * tile_file_offsets;
+} xcf_level;
+
+typedef unsigned char * xcf_tile;
+
+typedef unsigned char * (* load_tile_type) (SDL_RWops *, Uint32, int, int, int);
+
+
+/* See if an image is contained in a data source */
+int IMG_isXCF(SDL_RWops *src)
+{
+ int start;
+ int is_XCF;
+ char magic[14];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_XCF = 0;
+ if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
+ if (strncmp(magic, "gimp xcf ", 9) == 0) {
+ is_XCF = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_XCF);
+}
+
+static char * read_string (SDL_RWops * src) {
+ Uint32 tmp;
+ char * data;
+
+ tmp = SDL_ReadBE32 (src);
+ if (tmp > 0) {
+ data = (char *) malloc (sizeof (char) * tmp);
+ SDL_RWread (src, data, tmp, 1);
+ }
+ else {
+ data = NULL;
+ }
+
+ return data;
+}
+
+
+static Uint32 Swap32 (Uint32 v) {
+ return
+ ((v & 0x000000FF) << 16)
+ | ((v & 0x0000FF00))
+ | ((v & 0x00FF0000) >> 16)
+ | ((v & 0xFF000000));
+}
+
+static void xcf_read_property (SDL_RWops * src, xcf_prop * prop) {
+ prop->id = SDL_ReadBE32 (src);
+ prop->length = SDL_ReadBE32 (src);
+
+#if DEBUG
+ printf ("%.8X: %s: %d\n", SDL_RWtell (src), prop->id < 25 ? prop_names [prop->id] : "unknown", prop->length);
+#endif
+
+ switch (prop->id) {
+ case PROP_COLORMAP:
+ prop->data.colormap.num = SDL_ReadBE32 (src);
+ prop->data.colormap.cmap = (char *) malloc (sizeof (char) * prop->data.colormap.num * 3);
+ SDL_RWread (src, prop->data.colormap.cmap, prop->data.colormap.num*3, 1);
+ break;
+
+ case PROP_OFFSETS:
+ prop->data.offset.x = SDL_ReadBE32 (src);
+ prop->data.offset.y = SDL_ReadBE32 (src);
+ break;
+ case PROP_OPACITY:
+ prop->data.opacity = SDL_ReadBE32 (src);
+ break;
+ case PROP_COMPRESSION:
+ case PROP_COLOR:
+ SDL_RWread (src, &prop->data, prop->length, 1);
+ break;
+ case PROP_VISIBLE:
+ prop->data.visible = SDL_ReadBE32 (src);
+ break;
+ default:
+ // SDL_RWread (src, &prop->data, prop->length, 1);
+ SDL_RWseek (src, prop->length, RW_SEEK_CUR);
+ }
+}
+
+static void free_xcf_header (xcf_header * h) {
+ if (h->cm_num)
+ free (h->cm_map);
+
+ free (h);
+}
+
+static xcf_header * read_xcf_header (SDL_RWops * src) {
+ xcf_header * h;
+ xcf_prop prop;
+
+ h = (xcf_header *) malloc (sizeof (xcf_header));
+ SDL_RWread (src, h->sign, 14, 1);
+ h->width = SDL_ReadBE32 (src);
+ h->height = SDL_ReadBE32 (src);
+ h->image_type = SDL_ReadBE32 (src);
+
+ h->properties = NULL;
+ h->compr = COMPR_NONE;
+ h->cm_num = 0;
+ h->cm_map = NULL;
+
+ // Just read, don't save
+ do {
+ xcf_read_property (src, &prop);
+ if (prop.id == PROP_COMPRESSION)
+ h->compr = prop.data.compression;
+ else if (prop.id == PROP_COLORMAP) {
+ // unused var: int i;
+
+ h->cm_num = prop.data.colormap.num;
+ h->cm_map = (unsigned char *) malloc (sizeof (unsigned char) * 3 * h->cm_num);
+ memcpy (h->cm_map, prop.data.colormap.cmap, 3*sizeof (char)*h->cm_num);
+ free (prop.data.colormap.cmap);
+ }
+ } while (prop.id != PROP_END);
+
+ return h;
+}
+
+static void free_xcf_layer (xcf_layer * l) {
+ free (l->name);
+ free (l);
+}
+
+static xcf_layer * read_xcf_layer (SDL_RWops * src) {
+ xcf_layer * l;
+ xcf_prop prop;
+
+ l = (xcf_layer *) malloc (sizeof (xcf_layer));
+ l->width = SDL_ReadBE32 (src);
+ l->height = SDL_ReadBE32 (src);
+ l->layer_type = SDL_ReadBE32 (src);
+
+ l->name = read_string (src);
+
+ do {
+ xcf_read_property (src, &prop);
+ if (prop.id == PROP_OFFSETS) {
+ l->offset_x = prop.data.offset.x;
+ l->offset_y = prop.data.offset.y;
+ } else if (prop.id == PROP_VISIBLE) {
+ l->visible = prop.data.visible ? 1 : 0;
+ }
+ } while (prop.id != PROP_END);
+
+ l->hierarchy_file_offset = SDL_ReadBE32 (src);
+ l->layer_mask_offset = SDL_ReadBE32 (src);
+
+ return l;
+}
+
+static void free_xcf_channel (xcf_channel * c) {
+ free (c->name);
+ free (c);
+}
+
+static xcf_channel * read_xcf_channel (SDL_RWops * src) {
+ xcf_channel * l;
+ xcf_prop prop;
+
+ l = (xcf_channel *) malloc (sizeof (xcf_channel));
+ l->width = SDL_ReadBE32 (src);
+ l->height = SDL_ReadBE32 (src);
+
+ l->name = read_string (src);
+
+ l->selection = 0;
+ do {
+ xcf_read_property (src, &prop);
+ switch (prop.id) {
+ case PROP_OPACITY:
+ l->opacity = prop.data.opacity << 24;
+ break;
+ case PROP_COLOR:
+ l->color = ((Uint32) prop.data.color[0] << 16)
+ | ((Uint32) prop.data.color[1] << 8)
+ | ((Uint32) prop.data.color[2]);
+ break;
+ case PROP_SELECTION:
+ l->selection = 1;
+ break;
+ case PROP_VISIBLE:
+ l->visible = prop.data.visible ? 1 : 0;
+ break;
+ default:
+ ;
+ }
+ } while (prop.id != PROP_END);
+
+ l->hierarchy_file_offset = SDL_ReadBE32 (src);
+
+ return l;
+}
+
+static void free_xcf_hierarchy (xcf_hierarchy * h) {
+ free (h->level_file_offsets);
+ free (h);
+}
+
+static xcf_hierarchy * read_xcf_hierarchy (SDL_RWops * src) {
+ xcf_hierarchy * h;
+ int i;
+
+ h = (xcf_hierarchy *) malloc (sizeof (xcf_hierarchy));
+ h->width = SDL_ReadBE32 (src);
+ h->height = SDL_ReadBE32 (src);
+ h->bpp = SDL_ReadBE32 (src);
+
+ h->level_file_offsets = NULL;
+ i = 0;
+ do {
+ h->level_file_offsets = (Uint32 *) realloc (h->level_file_offsets, sizeof (Uint32) * (i+1));
+ h->level_file_offsets [i] = SDL_ReadBE32 (src);
+ } while (h->level_file_offsets [i++]);
+
+ return h;
+}
+
+static void free_xcf_level (xcf_level * l) {
+ free (l->tile_file_offsets);
+ free (l);
+}
+
+static xcf_level * read_xcf_level (SDL_RWops * src) {
+ xcf_level * l;
+ int i;
+
+ l = (xcf_level *) malloc (sizeof (xcf_level));
+ l->width = SDL_ReadBE32 (src);
+ l->height = SDL_ReadBE32 (src);
+
+ l->tile_file_offsets = NULL;
+ i = 0;
+ do {
+ l->tile_file_offsets = (Uint32 *) realloc (l->tile_file_offsets, sizeof (Uint32) * (i+1));
+ l->tile_file_offsets [i] = SDL_ReadBE32 (src);
+ } while (l->tile_file_offsets [i++]);
+
+ return l;
+}
+
+static void free_xcf_tile (unsigned char * t) {
+ free (t);
+}
+
+static unsigned char * load_xcf_tile_none (SDL_RWops * src, Uint32 len, int bpp, int x, int y) {
+ unsigned char * load;
+
+ load = (unsigned char *) malloc (len); // expect this is okay
+ SDL_RWread (src, load, len, 1);
+
+ return load;
+}
+
+static unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp, int x, int y) {
+ unsigned char * load, * t, * data, * d;
+ Uint32 reallen;
+ int i, size, count, j, length;
+ unsigned char val;
+
+ t = load = (unsigned char *) malloc (len);
+ reallen = SDL_RWread (src, t, 1, len);
+
+ data = (unsigned char *) malloc (x*y*bpp);
+ for (i = 0; i < bpp; i++) {
+ d = data + i;
+ size = x*y;
+ count = 0;
+
+ while (size > 0) {
+ val = *t++;
+
+ length = val;
+ if (length >= 128) {
+ length = 255 - (length - 1);
+ if (length == 128) {
+ length = (*t << 8) + t[1];
+ t += 2;
+ }
+
+ count += length;
+ size -= length;
+
+ while (length-- > 0) {
+ *d = *t++;
+ d += bpp;
+ }
+ }
+ else {
+ length += 1;
+ if (length == 128) {
+ length = (*t << 8) + t[1];
+ t += 2;
+ }
+
+ count += length;
+ size -= length;
+
+ val = *t++;
+
+ for (j = 0; j < length; j++) {
+ *d = val;
+ d += bpp;
+ }
+ }
+ }
+ }
+
+ free (load);
+ return (data);
+}
+
+static Uint32 rgb2grey (Uint32 a) {
+ Uint8 l;
+ l = 0.2990 * ((a && 0x00FF0000) >> 16)
+ + 0.5870 * ((a && 0x0000FF00) >> 8)
+ + 0.1140 * ((a && 0x000000FF));
+
+ return (l << 16) | (l << 8) | l;
+}
+
+static void create_channel_surface (SDL_Surface * surf, xcf_image_type itype, Uint32 color, Uint32 opacity) {
+ Uint32 c = 0;
+
+ switch (itype) {
+ case IMAGE_RGB:
+ case IMAGE_INDEXED:
+ c = opacity | color;
+ break;
+ case IMAGE_GREYSCALE:
+ c = opacity | rgb2grey (color);
+ break;
+ }
+ SDL_FillRect (surf, NULL, c);
+}
+
+static int do_layer_surface (SDL_Surface * surface, SDL_RWops * src, xcf_header * head, xcf_layer * layer, load_tile_type load_tile) {
+ xcf_hierarchy * hierarchy;
+ xcf_level * level;
+ unsigned char * tile;
+ Uint8 * p8;
+ Uint16 * p16;
+ Uint32 * p;
+ int x, y, tx, ty, ox, oy, i, j;
+ Uint32 *row;
+
+ SDL_RWseek (src, layer->hierarchy_file_offset, RW_SEEK_SET);
+ hierarchy = read_xcf_hierarchy (src);
+
+ level = NULL;
+ for (i = 0; hierarchy->level_file_offsets [i]; i++) {
+ SDL_RWseek (src, hierarchy->level_file_offsets [i], RW_SEEK_SET);
+ level = read_xcf_level (src);
+
+ ty = tx = 0;
+ for (j = 0; level->tile_file_offsets [j]; j++) {
+ SDL_RWseek (src, level->tile_file_offsets [j], RW_SEEK_SET);
+ ox = tx+64 > level->width ? level->width % 64 : 64;
+ oy = ty+64 > level->height ? level->height % 64 : 64;
+
+ if (level->tile_file_offsets [j+1]) {
+ tile = load_tile
+ (src,
+ level->tile_file_offsets [j+1] - level->tile_file_offsets [j],
+ hierarchy->bpp,
+ ox, oy);
+ }
+ else {
+ tile = load_tile
+ (src,
+ ox*oy*6,
+ hierarchy->bpp,
+ ox, oy);
+ }
+
+ p8 = tile;
+ p16 = (Uint16 *) p8;
+ p = (Uint32 *) p8;
+ for (y=ty; y < ty+oy; y++) {
+ row = (Uint32 *)((Uint8 *)surface->pixels + y*surface->pitch + tx*4);
+ switch (hierarchy->bpp) {
+ case 4:
+ for (x=tx; x < tx+ox; x++)
+ *row++ = Swap32 (*p++);
+ break;
+ case 3:
+ for (x=tx; x < tx+ox; x++) {
+ *row = 0xFF000000;
+ *row |= ((Uint32) *(p8++) << 16);
+ *row |= ((Uint32) *(p8++) << 8);
+ *row |= ((Uint32) *(p8++) << 0);
+ row++;
+ }
+ break;
+ case 2: // Indexed/Greyscale + Alpha
+ switch (head->image_type) {
+ case IMAGE_INDEXED:
+ for (x=tx; x < tx+ox; x++) {
+ *row = ((Uint32) (head->cm_map [*p8*3]) << 16);
+ *row |= ((Uint32) (head->cm_map [*p8*3+1]) << 8);
+ *row |= ((Uint32) (head->cm_map [*p8++*3+2]) << 0);
+ *row |= ((Uint32) *p8++ << 24);;
+ row++;
+ }
+ break;
+ case IMAGE_GREYSCALE:
+ for (x=tx; x < tx+ox; x++) {
+ *row = ((Uint32) *p8 << 16);
+ *row |= ((Uint32) *p8 << 8);
+ *row |= ((Uint32) *p8++ << 0);
+ *row |= ((Uint32) *p8++ << 24);;
+ row++;
+ }
+ break;
+ default:
+ fprintf (stderr, "Unknown Gimp image type (%d)\n", head->image_type);
+ return 1;
+ }
+ break;
+ case 1: // Indexed/Greyscale
+ switch (head->image_type) {
+ case IMAGE_INDEXED:
+ for (x = tx; x < tx+ox; x++) {
+ *row++ = 0xFF000000
+ | ((Uint32) (head->cm_map [*p8*3]) << 16)
+ | ((Uint32) (head->cm_map [*p8*3+1]) << 8)
+ | ((Uint32) (head->cm_map [*p8*3+2]) << 0);
+ p8++;
+ }
+ break;
+ case IMAGE_GREYSCALE:
+ for (x=tx; x < tx+ox; x++) {
+ *row++ = 0xFF000000
+ | (((Uint32) (*p8)) << 16)
+ | (((Uint32) (*p8)) << 8)
+ | (((Uint32) (*p8)) << 0);
+ ++p8;
+ }
+ break;
+ default:
+ fprintf (stderr, "Unknown Gimp image type (%d)\n", head->image_type);
+ return 1;
+ }
+ break;
+ }
+ }
+ tx += 64;
+ if (tx >= level->width) {
+ tx = 0;
+ ty += 64;
+ }
+ if (ty >= level->height) {
+ break;
+ }
+
+ free_xcf_tile (tile);
+ }
+ free_xcf_level (level);
+ }
+
+ free_xcf_hierarchy (hierarchy);
+
+ return 0;
+}
+
+SDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src)
+{
+ int start;
+ const char *error = NULL;
+ SDL_Surface *surface, *lays;
+ xcf_header * head;
+ xcf_layer * layer;
+ xcf_channel ** channel;
+ int chnls, i, offsets;
+ Uint32 offset, fp;
+
+ unsigned char * (* load_tile) (SDL_RWops *, Uint32, int, int, int);
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ /* Initialize the data we will clean up when we're done */
+ surface = NULL;
+
+ head = read_xcf_header (src);
+
+ switch (head->compr) {
+ case COMPR_NONE:
+ load_tile = load_xcf_tile_none;
+ break;
+ case COMPR_RLE:
+ load_tile = load_xcf_tile_rle;
+ break;
+ default:
+ fprintf (stderr, "Unsupported Compression.\n");
+ free_xcf_header (head);
+ return NULL;
+ }
+
+ /* Create the surface of the appropriate type */
+ surface = SDL_AllocSurface(SDL_SWSURFACE, head->width, head->height, 32,
+ 0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);
+
+ if ( surface == NULL ) {
+ error = "Out of memory";
+ goto done;
+ }
+
+ head->layer_file_offsets = NULL;
+ offsets = 0;
+
+ while ((offset = SDL_ReadBE32 (src))) {
+ head->layer_file_offsets = (Uint32 *) realloc (head->layer_file_offsets, sizeof (Uint32) * (offsets+1));
+ head->layer_file_offsets [offsets] = offset;
+ offsets++;
+ }
+ fp = SDL_RWtell (src);
+
+ lays = SDL_AllocSurface(SDL_SWSURFACE, head->width, head->height, 32,
+ 0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);
+
+ if ( lays == NULL ) {
+ error = "Out of memory";
+ goto done;
+ }
+
+ // Blit layers backwards, because Gimp saves them highest first
+ for (i = offsets; i > 0; i--) {
+ SDL_Rect rs, rd;
+ SDL_RWseek (src, head->layer_file_offsets [i-1], RW_SEEK_SET);
+
+ layer = read_xcf_layer (src);
+ do_layer_surface (lays, src, head, layer, load_tile);
+ rs.x = 0;
+ rs.y = 0;
+ rs.w = layer->width;
+ rs.h = layer->height;
+ rd.x = layer->offset_x;
+ rd.y = layer->offset_y;
+ rd.w = layer->width;
+ rd.h = layer->height;
+
+ if (layer->visible)
+ SDL_BlitSurface (lays, &rs, surface, &rd);
+ free_xcf_layer (layer);
+ }
+
+ SDL_FreeSurface (lays);
+
+ SDL_RWseek (src, fp, RW_SEEK_SET);
+
+ // read channels
+ channel = NULL;
+ chnls = 0;
+ while ((offset = SDL_ReadBE32 (src))) {
+ channel = (xcf_channel **) realloc (channel, sizeof (xcf_channel *) * (chnls+1));
+ fp = SDL_RWtell (src);
+ SDL_RWseek (src, offset, RW_SEEK_SET);
+ channel [chnls++] = (read_xcf_channel (src));
+ SDL_RWseek (src, fp, RW_SEEK_SET);
+ }
+
+ if (chnls) {
+ SDL_Surface * chs;
+
+ chs = SDL_AllocSurface(SDL_SWSURFACE, head->width, head->height, 32,
+ 0x00FF0000,0x0000FF00,0x000000FF,0xFF000000);
+
+ if (chs == NULL) {
+ error = "Out of memory";
+ goto done;
+ }
+ for (i = 0; i < chnls; i++) {
+ // printf ("CNLBLT %i\n", i);
+ if (!channel [i]->selection && channel [i]->visible) {
+ create_channel_surface (chs, head->image_type, channel [i]->color, channel [i]->opacity);
+ SDL_BlitSurface (chs, NULL, surface, NULL);
+ }
+ free_xcf_channel (channel [i]);
+ }
+
+ SDL_FreeSurface (chs);
+ }
+
+done:
+ free_xcf_header (head);
+ if ( error ) {
+ SDL_RWseek(src, start, RW_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_isXCF(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a XCF type image from an SDL datasource */
+SDL_Surface *IMG_LoadXCF_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_XCF */
diff --git a/apps/plugins/sdl/SDL_image/IMG_xpm.c b/apps/plugins/sdl/SDL_image/IMG_xpm.c
new file mode 100644
index 0000000000..486992f459
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_xpm.c
@@ -0,0 +1,514 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/*
+ * XPM (X PixMap) image loader:
+ *
+ * Supports the XPMv3 format, EXCEPT:
+ * - hotspot coordinates are ignored
+ * - only colour ('c') colour symbols are used
+ * - rgb.txt is not used (for portability), so only RGB colours
+ * are recognized (#rrggbb etc) - only a few basic colour names are
+ * handled
+ *
+ * The result is an 8bpp indexed surface if possible, otherwise 32bpp.
+ * The colourkey is correctly set if transparency is used.
+ *
+ * Besides the standard API, also provides
+ *
+ * SDL_Surface *IMG_ReadXPMFromArray(char **xpm)
+ *
+ * that reads the image data from an XPM file included in the C source.
+ *
+ * TODO: include rgb.txt here. The full table (from solaris 2.6) only
+ * requires about 13K in binary form.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_XPM
+
+/* See if an image is contained in a data source */
+int IMG_isXPM(SDL_RWops *src)
+{
+ int start;
+ int is_XPM;
+ char magic[9];
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_XPM = 0;
+ if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
+ if ( memcmp(magic, "/* XPM */", sizeof(magic)) == 0 ) {
+ is_XPM = 1;
+ }
+ }
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_XPM);
+}
+
+/* Hash table to look up colors from pixel strings */
+#define STARTING_HASH_SIZE 256
+
+struct hash_entry {
+ char *key;
+ Uint32 color;
+ struct hash_entry *next;
+};
+
+struct color_hash {
+ struct hash_entry **table;
+ struct hash_entry *entries; /* array of all entries */
+ struct hash_entry *next_free;
+ int size;
+ int maxnum;
+};
+
+static int hash_key(const char *key, int cpp, int size)
+{
+ int hash;
+
+ hash = 0;
+ while ( cpp-- > 0 ) {
+ hash = hash * 33 + *key++;
+ }
+ return hash & (size - 1);
+}
+
+static struct color_hash *create_colorhash(int maxnum)
+{
+ int bytes, s;
+ struct color_hash *hash;
+
+ /* we know how many entries we need, so we can allocate
+ everything here */
+ hash = malloc(sizeof *hash);
+ if(!hash)
+ return NULL;
+
+ /* use power-of-2 sized hash table for decoding speed */
+ for(s = STARTING_HASH_SIZE; s < maxnum; s <<= 1)
+ ;
+ hash->size = s;
+ hash->maxnum = maxnum;
+ bytes = hash->size * sizeof(struct hash_entry **);
+ hash->entries = NULL; /* in case malloc fails */
+ hash->table = malloc(bytes);
+ if(!hash->table)
+ return NULL;
+ memset(hash->table, 0, bytes);
+ hash->entries = malloc(maxnum * sizeof(struct hash_entry));
+ if(!hash->entries) {
+ free(hash->table);
+ return NULL;
+ }
+ hash->next_free = hash->entries;
+ return hash;
+}
+
+static int add_colorhash(struct color_hash *hash,
+ char *key, int cpp, Uint32 color)
+{
+ int index = hash_key(key, cpp, hash->size);
+ struct hash_entry *e = hash->next_free++;
+ e->color = color;
+ e->key = key;
+ e->next = hash->table[index];
+ hash->table[index] = e;
+ return 1;
+}
+
+/* fast lookup that works if cpp == 1 */
+#define QUICK_COLORHASH(hash, key) ((hash)->table[*(Uint8 *)(key)]->color)
+
+static Uint32 get_colorhash(struct color_hash *hash, const char *key, int cpp)
+{
+ struct hash_entry *entry = hash->table[hash_key(key, cpp, hash->size)];
+ while(entry) {
+ if(memcmp(key, entry->key, cpp) == 0)
+ return entry->color;
+ entry = entry->next;
+ }
+ return 0; /* garbage in - garbage out */
+}
+
+static void free_colorhash(struct color_hash *hash)
+{
+ if(hash && hash->table) {
+ free(hash->table);
+ free(hash->entries);
+ free(hash);
+ }
+}
+
+/* portable case-insensitive string comparison */
+static int string_equal(const char *a, const char *b, int n)
+{
+ while(*a && *b && n) {
+ if(toupper((unsigned char)*a) != toupper((unsigned char)*b))
+ return 0;
+ a++;
+ b++;
+ n--;
+ }
+ return *a == *b;
+}
+
+#define ARRAYSIZE(a) (int)(sizeof(a) / sizeof((a)[0]))
+
+/*
+ * convert colour spec to RGB (in 0xrrggbb format).
+ * return 1 if successful.
+ */
+static int color_to_rgb(char *spec, int speclen, Uint32 *rgb)
+{
+ /* poor man's rgb.txt */
+ static struct { char *name; Uint32 rgb; } known[] = {
+ {"none", 0xffffffff},
+ {"black", 0x00000000},
+ {"white", 0x00ffffff},
+ {"red", 0x00ff0000},
+ {"green", 0x0000ff00},
+ {"blue", 0x000000ff}
+ };
+
+ if(spec[0] == '#') {
+ char buf[7];
+ switch(speclen) {
+ case 4:
+ buf[0] = buf[1] = spec[1];
+ buf[2] = buf[3] = spec[2];
+ buf[4] = buf[5] = spec[3];
+ break;
+ case 7:
+ memcpy(buf, spec + 1, 6);
+ break;
+ case 13:
+ buf[0] = spec[1];
+ buf[1] = spec[2];
+ buf[2] = spec[5];
+ buf[3] = spec[6];
+ buf[4] = spec[9];
+ buf[5] = spec[10];
+ break;
+ }
+ buf[6] = '\0';
+ *rgb = strtol(buf, NULL, 16);
+ return 1;
+ } else {
+ int i;
+ for(i = 0; i < ARRAYSIZE(known); i++)
+ if(string_equal(known[i].name, spec, speclen)) {
+ *rgb = known[i].rgb;
+ return 1;
+ }
+ return 0;
+ }
+}
+
+#ifndef MAX
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+static char *linebuf;
+static int buflen;
+static char *error;
+
+/*
+ * Read next line from the source.
+ * If len > 0, it's assumed to be at least len chars (for efficiency).
+ * Return NULL and set error upon EOF or parse error.
+ */
+static char *get_next_line(char ***lines, SDL_RWops *src, int len)
+{
+ char *linebufnew;
+
+ if(lines) {
+ return *(*lines)++;
+ } else {
+ char c;
+ int n;
+ do {
+ if(SDL_RWread(src, &c, 1, 1) <= 0) {
+ error = "Premature end of data";
+ return NULL;
+ }
+ } while(c != '"');
+ if(len) {
+ len += 4; /* "\",\n\0" */
+ if(len > buflen){
+ buflen = len;
+ linebufnew = realloc(linebuf, buflen);
+ if(!linebufnew) {
+ free(linebuf);
+ error = "Out of memory";
+ return NULL;
+ }
+ linebuf = linebufnew;
+ }
+ if(SDL_RWread(src, linebuf, len - 1, 1) <= 0) {
+ error = "Premature end of data";
+ return NULL;
+ }
+ n = len - 2;
+ } else {
+ n = 0;
+ do {
+ if(n >= buflen - 1) {
+ if(buflen == 0)
+ buflen = 16;
+ buflen *= 2;
+ linebufnew = realloc(linebuf, buflen);
+ if(!linebufnew) {
+ free(linebuf);
+ error = "Out of memory";
+ return NULL;
+ }
+ linebuf = linebufnew;
+ }
+ if(SDL_RWread(src, linebuf + n, 1, 1) <= 0) {
+ error = "Premature end of data";
+ return NULL;
+ }
+ } while(linebuf[n++] != '"');
+ n--;
+ }
+ linebuf[n] = '\0';
+ return linebuf;
+ }
+}
+
+#define SKIPSPACE(p) \
+do { \
+ while(isspace((unsigned char)*(p))) \
+ ++(p); \
+} while(0)
+
+#define SKIPNONSPACE(p) \
+do { \
+ while(!isspace((unsigned char)*(p)) && *p) \
+ ++(p); \
+} while(0)
+
+/* read XPM from either array or RWops */
+static SDL_Surface *load_xpm(char **xpm, SDL_RWops *src)
+{
+ int start = 0;
+ SDL_Surface *image = NULL;
+ int index;
+ int x, y;
+ int w, h, ncolors, cpp;
+ int indexed;
+ Uint8 *dst;
+ struct color_hash *colors = NULL;
+ SDL_Color *im_colors = NULL;
+ char *keystrings = NULL, *nextkey;
+ char *line;
+ char ***xpmlines = NULL;
+ int pixels_len;
+
+ error = NULL;
+ linebuf = NULL;
+ buflen = 0;
+
+ if ( src )
+ start = SDL_RWtell(src);
+
+ if(xpm)
+ xpmlines = &xpm;
+
+ line = get_next_line(xpmlines, src, 0);
+ if(!line)
+ goto done;
+ /*
+ * The header string of an XPMv3 image has the format
+ *
+ * <width> <height> <ncolors> <cpp> [ <hotspot_x> <hotspot_y> ]
+ *
+ * where the hotspot coords are intended for mouse cursors.
+ * Right now we don't use the hotspots but it should be handled
+ * one day.
+ */
+ if(sscanf(line, "%d %d %d %d", &w, &h, &ncolors, &cpp) != 4
+ || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) {
+ error = "Invalid format description";
+ goto done;
+ }
+
+ keystrings = malloc(ncolors * cpp);
+ if(!keystrings) {
+ error = "Out of memory";
+ goto done;
+ }
+ nextkey = keystrings;
+
+ /* Create the new surface */
+ if(ncolors <= 256) {
+ indexed = 1;
+ image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8,
+ 0, 0, 0, 0);
+ im_colors = image->format->palette->colors;
+ image->format->palette->ncolors = ncolors;
+ } else {
+ indexed = 0;
+ image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
+ 0xff0000, 0x00ff00, 0x0000ff, 0);
+ }
+ if(!image) {
+ /* Hmm, some SDL error (out of memory?) */
+ goto done;
+ }
+
+ /* Read the colors */
+ colors = create_colorhash(ncolors);
+ if (!colors) {
+ error = "Out of memory";
+ goto done;
+ }
+ for(index = 0; index < ncolors; ++index ) {
+ char *p;
+ line = get_next_line(xpmlines, src, 0);
+ if(!line)
+ goto done;
+
+ p = line + cpp + 1;
+
+ /* parse a colour definition */
+ for(;;) {
+ char nametype;
+ char *colname;
+ Uint32 rgb, pixel;
+
+ SKIPSPACE(p);
+ if(!*p) {
+ error = "colour parse error";
+ goto done;
+ }
+ nametype = *p;
+ SKIPNONSPACE(p);
+ SKIPSPACE(p);
+ colname = p;
+ SKIPNONSPACE(p);
+ if(nametype == 's')
+ continue; /* skip symbolic colour names */
+
+ if(!color_to_rgb(colname, p - colname, &rgb))
+ continue;
+
+ memcpy(nextkey, line, cpp);
+ if(indexed) {
+ SDL_Color *c = im_colors + index;
+ c->r = (Uint8)(rgb >> 16);
+ c->g = (Uint8)(rgb >> 8);
+ c->b = (Uint8)(rgb);
+ pixel = index;
+ } else
+ pixel = rgb;
+ add_colorhash(colors, nextkey, cpp, pixel);
+ nextkey += cpp;
+ if(rgb == 0xffffffff)
+ SDL_SetColorKey(image, SDL_SRCCOLORKEY, pixel);
+ break;
+ }
+ }
+
+ /* Read the pixels */
+ pixels_len = w * cpp;
+ dst = image->pixels;
+ for(y = 0; y < h; y++) {
+ line = get_next_line(xpmlines, src, pixels_len);
+ if(indexed) {
+ /* optimization for some common cases */
+ if(cpp == 1)
+ for(x = 0; x < w; x++)
+ dst[x] = (Uint8)QUICK_COLORHASH(colors,
+ line + x);
+ else
+ for(x = 0; x < w; x++)
+ dst[x] = (Uint8)get_colorhash(colors,
+ line + x * cpp,
+ cpp);
+ } else {
+ for (x = 0; x < w; x++)
+ ((Uint32*)dst)[x] = get_colorhash(colors,
+ line + x * cpp,
+ cpp);
+ }
+ dst += image->pitch;
+ }
+
+done:
+ if(error) {
+ if ( src )
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ if ( image ) {
+ SDL_FreeSurface(image);
+ image = NULL;
+ }
+ IMG_SetError(error);
+ }
+ free(keystrings);
+ free_colorhash(colors);
+ free(linebuf);
+ return(image);
+}
+
+/* Load a XPM type image from an RWops datasource */
+SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
+{
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ return load_xpm(NULL, src);
+}
+
+SDL_Surface *IMG_ReadXPMFromArray(char **xpm)
+{
+ return load_xpm(xpm, NULL);
+}
+
+#else /* not LOAD_XPM */
+
+/* See if an image is contained in a data source */
+int IMG_isXPM(SDL_RWops *src)
+{
+ return(0);
+}
+
+
+/* Load a XPM type image from an SDL datasource */
+SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+SDL_Surface *IMG_ReadXPMFromArray(char **xpm)
+{
+ return NULL;
+}
+#endif /* not LOAD_XPM */
diff --git a/apps/plugins/sdl/SDL_image/IMG_xv.c b/apps/plugins/sdl/SDL_image/IMG_xv.c
new file mode 100644
index 0000000000..0383ec9fbc
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_xv.c
@@ -0,0 +1,165 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* This is a XV thumbnail image file loading 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;
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_XV = 0;
+ if ( get_header(src, &w, &h) == 0 ) {
+ is_XV = 1;
+ }
+ SDL_RWseek(src, start, RW_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, RW_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 */
diff --git a/apps/plugins/sdl/SDL_image/IMG_xxx.c b/apps/plugins/sdl/SDL_image/IMG_xxx.c
new file mode 100644
index 0000000000..924dd38ce5
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/IMG_xxx.c
@@ -0,0 +1,87 @@
+/*
+ SDL_image: An example image loading library for use with SDL
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+/* This is a generic "format not supported" image framework */
+
+#include <stdio.h>
+
+#include "SDL_image.h"
+
+#ifdef LOAD_XXX
+
+/* See if an image is contained in a data source */
+int IMG_isXXX(SDL_RWops *src)
+{
+ int start;
+ int is_XXX;
+
+ if ( !src )
+ return 0;
+ start = SDL_RWtell(src);
+ is_XXX = 0;
+
+ /* Detect the image here */
+
+ SDL_RWseek(src, start, RW_SEEK_SET);
+ return(is_XXX);
+}
+
+/* Load a XXX type image from an SDL datasource */
+SDL_Surface *IMG_LoadXXX_RW(SDL_RWops *src)
+{
+ int start;
+ const char *error = NULL;
+ SDL_Surface *surface = NULL;
+
+ if ( !src ) {
+ /* The error message has been set in SDL_RWFromFile */
+ return NULL;
+ }
+ start = SDL_RWtell(src);
+
+ /* Load the image here */
+
+ if ( error ) {
+ SDL_RWseek(src, start, RW_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_isXXX(SDL_RWops *src)
+{
+ return(0);
+}
+
+/* Load a XXX type image from an SDL datasource */
+SDL_Surface *IMG_LoadXXX_RW(SDL_RWops *src)
+{
+ return(NULL);
+}
+
+#endif /* LOAD_XXX */
diff --git a/apps/plugins/sdl/SDL_image/README b/apps/plugins/sdl/SDL_image/README
new file mode 100644
index 0000000000..c989178270
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/README
@@ -0,0 +1,40 @@
+
+SDL_image 1.2
+
+The latest version of this library is available from:
+http://www.libsdl.org/projects/SDL_image/
+
+This is a simple library to load images of various formats as SDL surfaces.
+This library supports BMP, PNM (PPM/PGM/PBM), XPM, LBM, PCX, GIF, JPEG, PNG,
+TGA, and TIFF formats.
+
+API:
+#include "SDL_image.h"
+
+ SDL_Surface *IMG_Load(const char *file);
+or
+ SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc);
+or
+ SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type);
+
+where type is a string specifying the format (i.e. "PNG" or "pcx").
+Note that IMG_Load_RW cannot load TGA images.
+
+To create a surface from an XPM image included in C source, use:
+
+ SDL_Surface *IMG_ReadXPMFromArray(char **xpm);
+
+An example program 'showimage' is included, with source in showimage.c
+
+JPEG support requires the JPEG library: http://www.ijg.org/
+PNG support requires the PNG library: http://www.libpng.org/pub/png/libpng.html
+ and the Zlib library: http://www.gzip.org/zlib/
+TIFF support requires the TIFF library: ftp://ftp.sgi.com/graphics/tiff/
+
+If you have these libraries installed in non-standard places, you can
+try adding those paths to the configure script, e.g.
+sh ./configure CPPFLAGS="-I/somewhere/include" LDFLAGS="-L/somewhere/lib"
+If this works, you may need to add /somewhere/lib to your LD_LIBRARY_PATH
+so shared library loading works correctly.
+
+This library is under the zlib License, see the file "COPYING" for details.
diff --git a/apps/plugins/sdl/SDL_image/showimage.c b/apps/plugins/sdl/SDL_image/showimage.c
new file mode 100644
index 0000000000..6f29d7d5d2
--- /dev/null
+++ b/apps/plugins/sdl/SDL_image/showimage.c
@@ -0,0 +1,216 @@
+/*
+ showimage: A test application for the SDL image loading library.
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "SDL.h"
+#include "SDL_image.h"
+
+/* #define XPM_INCLUDED and supply picture.xpm to test the XPM inclusion
+ feature */
+
+#ifdef XPM_INCLUDED
+#include "picture.xpm"
+#endif
+
+/* Draw a Gimpish background pattern to show transparency in the image */
+static void draw_background(SDL_Surface *screen)
+{
+ Uint8 *dst = screen->pixels;
+ int x, y;
+ int bpp = screen->format->BytesPerPixel;
+ Uint32 col[2];
+ col[0] = SDL_MapRGB(screen->format, 0x66, 0x66, 0x66);
+ col[1] = SDL_MapRGB(screen->format, 0x99, 0x99, 0x99);
+ for(y = 0; y < screen->h; y++) {
+ for(x = 0; x < screen->w; x++) {
+ /* use an 8x8 checkerboard pattern */
+ Uint32 c = col[((x ^ y) >> 3) & 1];
+ switch(bpp) {
+ case 1:
+ dst[x] = (Uint8)c;
+ break;
+ case 2:
+ ((Uint16 *)dst)[x] = (Uint16)c;
+ break;
+ case 3:
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+ dst[x * 3] = (Uint8)(c);
+ dst[x * 3 + 1] = (Uint8)(c >> 8);
+ dst[x * 3 + 2] = (Uint8)(c >> 16);
+#else
+ dst[x * 3] = (Uint8)(c >> 16);
+ dst[x * 3 + 1] = (Uint8)(c >> 8);
+ dst[x * 3 + 2] = (Uint8)(c);
+#endif
+ break;
+ case 4:
+ ((Uint32 *)dst)[x] = c;
+ break;
+ }
+ }
+ dst += screen->pitch;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ Uint32 flags;
+ SDL_Surface *screen, *image;
+ int i, depth, done;
+ SDL_Event event;
+#if 0
+ SDL_RWops* rw_ops;
+#endif
+
+ /* Check command line usage */
+ if ( ! argv[1] ) {
+ fprintf(stderr, "Usage: %s <image_file>\n", argv[0]);
+ return(1);
+ }
+
+ /* Initialize the SDL library */
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
+ fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
+ return(255);
+ }
+
+ flags = SDL_SWSURFACE;
+ for ( i=1; argv[i]; ++i ) {
+ if ( strcmp(argv[i], "-fullscreen") == 0 ) {
+ SDL_ShowCursor(0);
+ flags |= SDL_FULLSCREEN;
+ continue;
+ }
+#if 0
+ rw_ops = SDL_RWFromFile(argv[1], "r");
+
+ fprintf(stderr, "BMP:\t%d\n", IMG_isBMP(rw_ops));
+ fprintf(stderr, "GIF:\t%d\n", IMG_isGIF(rw_ops));
+ fprintf(stderr, "JPG:\t%d\n", IMG_isJPG(rw_ops));
+ fprintf(stderr, "PNG:\t%d\n", IMG_isPNG(rw_ops));
+ fprintf(stderr, "TIF:\t%d\n", IMG_isTIF(rw_ops));
+ /* fprintf(stderr, "TGA:\t%d\n", IMG_isTGA(rw_ops)); */
+ fprintf(stderr, "PCX:\t%d\n", IMG_isPCX(rw_ops));
+#endif
+
+ /* Open the image file */
+#ifdef XPM_INCLUDED
+ image = IMG_ReadXPMFromArray(picture_xpm);
+#else
+ image = IMG_Load(argv[i]);
+#endif
+ if ( image == NULL ) {
+ fprintf(stderr, "Couldn't load %s: %s\n",
+ argv[i], SDL_GetError());
+ continue;
+ }
+ SDL_WM_SetCaption(argv[i], "showimage");
+
+ /* Create a display for the image */
+ depth = SDL_VideoModeOK(image->w, image->h, 32, flags);
+ /* Use the deepest native mode, except that we emulate 32bpp
+ for viewing non-indexed images on 8bpp screens */
+ if ( depth == 0 ) {
+ if ( image->format->BytesPerPixel > 1 ) {
+ depth = 32;
+ } else {
+ depth = 8;
+ }
+ } else
+ if ( (image->format->BytesPerPixel > 1) && (depth == 8) ) {
+ depth = 32;
+ }
+ if(depth == 8)
+ flags |= SDL_HWPALETTE;
+ screen = SDL_SetVideoMode(image->w, image->h, depth, flags);
+ if ( screen == NULL ) {
+ fprintf(stderr,"Couldn't set %dx%dx%d video mode: %s\n",
+ image->w, image->h, depth, SDL_GetError());
+ continue;
+ }
+
+ /* Set the palette, if one exists */
+ if ( image->format->palette ) {
+ SDL_SetColors(screen, image->format->palette->colors,
+ 0, image->format->palette->ncolors);
+ }
+
+ /* Draw a background pattern if the surface has transparency */
+ if(image->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY))
+ draw_background(screen);
+
+ /* Display the image */
+ SDL_BlitSurface(image, NULL, screen, NULL);
+ SDL_UpdateRect(screen, 0, 0, 0, 0);
+
+ done = 0;
+ while ( ! done ) {
+ if ( SDL_PollEvent(&event) ) {
+ switch (event.type) {
+ case SDL_KEYUP:
+ switch (event.key.keysym.sym) {
+ case SDLK_LEFT:
+ if ( i > 1 ) {
+ i -= 2;
+ done = 1;
+ }
+ break;
+ case SDLK_RIGHT:
+ if ( argv[i+1] ) {
+ done = 1;
+ }
+ break;
+ case SDLK_ESCAPE:
+ case SDLK_q:
+ argv[i+1] = NULL;
+ /* Drop through to done */
+ case SDLK_SPACE:
+ case SDLK_TAB:
+ done = 1;
+ break;
+ default:
+ break;
+ }
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ done = 1;
+ break;
+ case SDL_QUIT:
+ argv[i+1] = NULL;
+ done = 1;
+ break;
+ default:
+ break;
+ }
+ } else {
+ SDL_Delay(10);
+ }
+ }
+ SDL_FreeSurface(image);
+ }
+
+ /* We're done! */
+ SDL_Quit();
+ return(0);
+}
diff --git a/apps/plugins/sdl/SDL_mixer/CHANGES b/apps/plugins/sdl/SDL_mixer/CHANGES
new file mode 100644
index 0000000000..9eb53f3733
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/CHANGES
@@ -0,0 +1,348 @@
+1.2.12:
+Sam Lantinga - Sat Jan 14 22:00:29 2012 -0500
+ * Fixed seek offset with SMPEG (was relative, should be absolute)
+Sam Lantinga - Fri Jan 13 03:04:27 EST 2012
+ * Fixed memory crash loading Ogg Vorbis files on Windows
+Sam Lantinga - Thu Jan 05 22:51:54 2012 -0500
+ * Added an Xcode project for iOS
+Nikos Chantziaras - 2012-01-02 17:37:36 PST
+ * Added Mix_LoadMUSType_RW() so you can tell SDL_mixer what type the music is
+Sam Lantinga - Sun Jan 01 16:45:58 2012 -0500
+ * Fixed looping native MIDI on Mac OS X and Windows
+Sam Lantinga - Sun Jan 01 01:00:51 2012 -0500
+ * Added /usr/local/share/timidity to the timidity data path
+Sam Lantinga - Sat Dec 31 21:26:46 2011 -0500
+ * Fixed timidity loading of some MIDI files
+Sam Lantinga - Sat Dec 31 19:11:59 EST 2011
+ * Fixed dropping audio in the FLAC audio decoding
+Sam Lantinga - Sat Dec 31 18:32:05 EST 2011
+ * Fixed memory leak in SDL_LoadMUS()
+Sam Lantinga - Sat Dec 31 10:22:05 EST 2011
+ * Removed GPL native MIDI code for new licensing
+Sam Lantinga - Sat Dec 31 10:22:05 EST 2011
+ * SDL_mixer is now under the zlib license
+Manuel Montezelo - 2011-12-28 11:42:44 PST
+ * Fixed drums playing on MIDI channel 16 with timidity
+Ryan C. Gordon - Wed Jun 15 03:41:31 2011 -0400
+ * The music-finished hook can start a track immediately
+James Le Cuirot - Mon Mar 21 16:54:11 PDT 2011
+ * Added support for FluidSynth
+Egor Suvorov - Tue Jan 18 11:06:47 PST 2011
+ * Added support for native MIDI on Haiku
+Sam Lantinga - Tue Jan 11 01:29:19 2011 -0800
+ * Added Android.mk to build on the Android platform
+Jon Atkins - Sat Nov 14 13:00:18 PST 2009
+ * Added support for libmodplug (disabled by default)
+
+1.2.11:
+Sam Lantinga - Sat Nov 14 12:38:01 PST 2009
+ * Fixed initialization error and crashes if MikMod library isn't available
+Sam Lantinga - Sat Nov 14 11:22:14 PST 2009
+ * Fixed bug loading multiple music files
+
+1.2.10:
+Sam Lantinga - Sun Nov 8 08:34:48 PST 2009
+ * Added Mix_Init()/Mix_Quit() to prevent constantly loading and unloading DLLs
+Mike Frysinger - 2009-11-05 09:11:43 PST
+ * Check for fork/vfork on any platform, don't just assume it on UNIX
+Jon Atkins - Thu Nov 5 00:02:50 2009 UTC
+ * Fixed export of Mix_GetNumChunkDecoders() and Mix_GetNumMusicDecoders()
+C.W. Betts - 2009-11-02 00:16:21 PST
+ * Use newer MIDI API on Mac OS X 10.5+
+
+1.2.9:
+Ryan Gordon - Sun Oct 18 11:42:31 PDT 2009
+ * Updated native MIDI support on Mac OS X for 10.6
+Ryan Gordon - Sun Oct 11 05:29:55 2009 UTC
+ * Reset channel volumes after a fade out interrupts a fade in.
+Ryan Gordon - Sun Oct 11 02:59:12 2009 UTC
+ * Fixed crash race condition with position audio functions
+Ryan Gordon - Sat Oct 10 17:05:45 2009 UTC
+ * Fixed stereo panning in 8-bit mode
+Sam Lantinga - Sat Oct 10 11:07:15 2009 UTC
+ * Added /usr/share/timidity to the default timidity.cfg locations
+Sam Lantinga - Sat Oct 3 13:33:36 PDT 2009
+ * MOD support uses libmikmod and is dynamically loaded by default
+ * A patched version of libmikmod is included in libmikmod-3.1.12.zip
+ * The libmikmod patches fix security issues CVE-2007-6720 and CVE-2009-0179.
+Sam Lantinga - Sat Oct 3 02:49:41 PDT 2009
+ * Added TIMIDITY_CFG environment variable to fully locate timidity.cfg
+Sam Lantinga - Fri Oct 2 07:15:35 PDT 2009
+ * Implemented seamless looping for music playback
+Forrest Voight - 2009-06-13 20:31:38 PDT
+ * ID3 files are now recognized as MP3 format
+Steven Noonan - 2008-05-13 13:31:36 PDT
+ * Fixed native MIDI crash on 64-bit Windows
+Ryan Gordon - Fri Jun 5 16:07:08 2009 UTC
+ * Added decoder enumeration API:
+ Mix_GetNumChunkDecoders(), Mix_GetChunkDecoder(),
+ Mix_GetNumMusicDecoders(), Mix_GetMusicDecoder()
+Austen Dicken - Tue Feb 26 23:28:27 PST 2008
+ * Added support for FLAC audio both as chunks and streaming
+Tilman Sauerbeck - Tue Feb 26 03:44:47 PST 2008
+ * Added support for streaming WAV files with Mix_LoadMUS_RW()
+Ryan Gordon - Mon Feb 4 17:10:08 UTC 2008
+ * Fixed crash caused by not resetting position_channels
+
+1.2.8:
+Sam Lantinga - Wed Jul 18 09:45:54 PDT 2007
+ * Improved detection of Ogg Vorbis and Tremor libraries
+Ryan Gordon - Sun Jul 15 12:03:54 EDT 2007
+ * Fixed memory leaks in Effects API.
+David Rose - Sat Jul 14 22:16:09 PDT 2007
+ * Added support for MP3 playback with libmad (for GPL projects only!)
+Sam Lantinga - Sat Jul 14 21:39:30 PDT 2007
+ * Fixed the final loop of audio samples of a certain size
+Sam Lantinga - Sat Jul 14 21:05:09 PDT 2007
+ * Fixed opening Ogg Vorbis files using different C runtimes on Windows
+Philippe Simons - Sat Jul 14 20:33:17 PDT 2007
+ * Added support for Ogg Vorbis playback with Tremor (an integer decoder)
+Sam Lantinga - Sat Jul 14 07:02:09 PDT 2007
+ * Fixed memory corruption in timidity resampling code
+Ryan Gordon - Tue Jul 3 10:44:29 2007 UTC
+ * Fixed building SDL_mixer with SDL 1.3 pre-release
+Ryan Gordon - Tue Feb 13 08:11:54 2007 UTC
+ * Fixed compiling both timidity and native midi in the same build
+Hans de Goede - Sun Aug 20 23:25:46 2006 UTC
+ * Added volume control to playmus
+Jonathan Atkins - Thu Aug 10 15:06:40 2006 UTC
+ * Fixed linking with system libmikmod
+David Ergo - Fri Jun 23 09:07:19 2006 UTC
+ * Corrected no-op conditions in SetDistance(), SetPanning() and SetPosition()
+ * Fixed copy/paste errors in channel amplitudes
+
+1.2.7:
+Sam Lantinga - Fri May 12 00:04:32 PDT 2006
+ * Added support for dynamically loading SMPEG library
+Sam Lantinga - Thu May 11 22:22:43 PDT 2006
+ * Added support for dynamically loading Ogg Vorbis library
+Sam Lantinga - Sun Apr 30 09:01:44 PDT 2006
+ * Removed automake dependency, to allow Universal binaries on Mac OS X
+ * Added gcc-fat.sh for generating Universal binaries on Mac OS X
+Sam Lantinga - Sun Apr 30 01:48:40 PDT 2006
+ * Updated libtool support to version 1.5.22
+Patrice Mandin - Sat Jul 16 16:43:24 UTC 2005
+ * Use SDL_RWops also for native midi mac and win32
+Patrice Mandin - Sat Jul 9 14:40:09 UTC 2005
+ * Use SDL_RWops also for native midi gpl (todo: mac and win32)
+Ryan C. Gordon - Sat Jul 9 01:54:03 EDT 2005
+ * Tweaked Mix_Chunk's definition to make predeclaration easier.
+Patrice Mandin - Mon Jul 4 19:45:40 UTC 2005
+ * Search timidity.cfg also in /etc
+ * Fix memory leaks in timidity player
+ * Use also SDL_RWops to read midifiles for timidity
+Ryan C. Gordon - Mon Jun 13 18:18:12 EDT 2005
+ * Patch from Eric Wing to fix native midi compiling on MacOS/x86.
+Sam Lantinga - Wed Dec 22 17:14:32 PST 2004
+ * Disabled support for the system version of libmikmod by default
+Sam Lantinga - Tue Dec 21 09:51:29 PST 2004
+ * Fixed building mikmod support on UNIX
+ * Always build SDL_RWops music support
+ * Added SDL_RWops support for reading MP3 files
+
+1.2.6:
+Jonathan Atkins - Wed, 15 Sep 2004 23:26:42 -0500
+ * Added support for using the system version of libmikmod
+Martin_Storsjö - Sun, 22 Aug 2004 02:21:14 +0300 (EEST)
+ * Added SDL_RWops support for reading Ogg Vorbis files
+Greg Lee - Wed, 14 Jul 2004 05:13:14 -1000
+ * Added 4 and 6 channel surround sound output support
+ * Added support for RMID format MIDI files
+ * Improved timidity support (reverb, chorus, Roland & Yamaha sysex dumps, etc.)
+Sam Lantinga - Wed Nov 19 00:23:44 PST 2003
+ * Updated libtool support for new mingw32 DLL build process
+Ryan C. Gordon - Sun Nov 9 23:34:47 EST 2003
+ * Patch from Steven Fuller to fix positioning effect on bigendian systems.
+Laurent Ganter - Mon, 6 Oct 2003 11:51:33 +0200
+ * Fixed bug with MIDI volume in native Windows playback
+Andre Leiradella - Fri, 30 May 2003 16:12:03 -0300
+ * Added SDL_RWops support for reading MOD files
+Kyle Davenport - Sat, 19 Apr 2003 17:13:31 -0500
+ * Added .la files to the development RPM, fixing RPM build on RedHat 8
+
+1.2.5:
+Darrell Walisser - Tue Mar 4 09:24:01 PST 2003
+ * Worked around MacOS X deadlock between CoreAudio and QuickTime
+Darrell Walisser - Fri, 14 Feb 2003 20:56:08 -0500
+ * Fixed crash in native midi code with files with more than 32 tracks
+Marc Le Douarain - Sat, 15 Feb 2003 14:46:41 +0100
+ * Added 8SVX format support to the AIFF loader
+Sam Lantinga Wed Feb 12 21:03:57 PST 2003
+ * Fixed volume control on WAVE music chunks
+Ben Nason - Mon, 10 Feb 2003 11:50:27 -0800
+ * Fixed volume control on MOD music chunks
+Patrice Mandin - Fri, 31 Jan 2003 15:17:30 +0100
+ * Added support for the Atari platform
+Ryan C. Gordon - Fri Dec 27 10:14:07 EST 2002
+ * Patch from Steven Fuller to fix panning effect with 8-bit sounds.
+Ryan C. Gordon - Thu Jan 2 12:31:48 EST 2003
+ * Patch from guy on 3DRealms forums to fix native win32 midi volume.
+Ryan C. Gordon - Wed Oct 30 07:12:06 EST 2002
+ * Small, looping music samples should now be able to fade out correctly.
+Sam Lantinga - Sun Oct 20 20:52:24 PDT 2002
+ * Added shared library support for MacOS X
+Pete Shinners - Wed Oct 16 17:10:08 EDT 2002
+ * Correctly report an error when using an unknown filetype
+Vaclav Slavik - Sun Sep 8 18:57:38 PDT 2002
+ * Added support for loading Ogg Vorbis samples as an audio chunk
+Martin Storsjö - Tue Jul 16 10:38:12 PDT 2002
+ * Fixed to start playing another sample immediately when one finishes
+Martin Storsjö - Tue May 28 13:08:29 PDT 2002
+ * Fixed a volume bug when calling Mix_HaltChannel() on unused channel
+Xavier Wielemans - Wed Jun 12 14:28:14 EDT 2002
+ * Fixed volume reset bug at end of channel fade.
+Ryan C. Gordon - Wed Jun 26 16:30:59 EDT 2002
+ * Mix_LoadMUS() will now accept an MP3 by file extension, instead of relying
+ entirely on the magic number.
+
+1.2.4:
+Sam Lantinga - Mon May 20 09:11:22 PDT 2002
+ * Updated the CodeWarrior project files
+Sam Lantinga - Sun May 19 13:46:29 PDT 2002
+ * Added a function to query the music format: Mix_GetMusicType()
+Sam Lantinga - Sat May 18 12:45:16 PDT 2002
+ * Added a function to load audio data from memory: Mix_QuickLoad_RAW()
+Sam Lantinga - Thu May 16 11:26:46 PDT 2002
+ * Cleaned up threading issues in the music playback code
+Ryan Gordon - Thu May 2 21:08:48 PDT 2002
+ * Fixed deadlock introduced in the last release
+
+1.2.3:
+Sam Lantinga - Sat Apr 13 07:49:47 PDT 2002
+ * Updated autogen.sh for new versions of automake
+ * Specify the SDL API calling convention (C by default)
+Ryan Gordon - Sat Apr 13 07:33:37 PDT 2002
+ * Fixed recursive audio lock in the mixing function
+jean-julien Filatriau - Sat Mar 23 18:05:37 PST 2002
+ * Fixed setting invalid volume when querying mixer and music volumes
+Guillaume Cottenceau - Wed Feb 13 15:43:20 PST 2002
+ * Implemented Ogg Vorbis stream rewinding
+Peter Kutak - Wed Feb 13 10:26:57 PST 2002
+ * Added native midi support on Linux, using GPL code
+ --enable-music-native-midi-gpl
+Pete Shinners - Mon Jan 14 11:31:26 PST 2002
+ * Added seek support for MP3 files
+Ryan Gordon - Mon Jan 14 11:30:44 PST 2002
+ * Sample "finished" callbacks are now always called when a sample is stopped.
+
+1.2.2:
+Guillaume Cottenceau - Wed Dec 19 08:59:05 PST 2001
+ * Added an API for seeking in music files (implemented for MOD and Ogg music)
+ Mix_FadeInMusicPos(), Mix_SetMusicPosition()
+ * Exposed the mikmod synchro value for music synchronization
+ Mix_SetSynchroValue(), Mix_GetSynchroValue()
+
+1.2.1:
+Yi-Huang Han - Wed Oct 24 21:55:47 PDT 2001
+ * Fixed MOD music volume when looping
+David Hedbor - Thu Oct 18 10:01:41 PDT 2001
+ * Stop implicit looping, set fade out and other flags on MOD files
+Sam Lantinga - Tue Oct 16 11:17:12 PDT 2001
+ * The music file type is now determined by extension as well as magic
+Ryan C. Gordon - Tue Sep 11 12:05:54 PDT 2001
+ * Reworked playwave.c to make it more useful as a mixer testbed
+ * Added a realtime sound effect API to SDL_mixer.h
+ * Added the following standard sound effects:
+ panning, distance attenuation, basic positional audio, stereo reversal
+ * Added API for mixer versioning: Mix_Linked_Version() and MIX_VERSION()
+Sam Lantinga - Tue Sep 11 11:48:53 PDT 2001
+ * Updated MikMod code to version 3.1.9a
+Torbjörn Andersson - Tue Sep 11 11:22:29 PDT 2001
+ * Added support for loading AIFF audio chunks
+Max Horn - Tue Sep 4 20:38:11 PDT 2001
+ * Added native MIDI music support on MacOS and MacOS X
+Florian Schulze - Sun Aug 19 14:55:37 PDT 2001
+ * Added native MIDI music support on Windows
+Sam Lantinga - Sun Aug 19 02:20:55 PDT 2001
+ * Added Project Builder projects for building MacOS X framework
+Darrell Walisser - Sun Aug 19 00:47:22 PDT 2001
+ * Fixed compilation problems with mikmod under MacOS X
+Torbjörn Andersson - Sun, 19 Aug 2001 16:03:30
+ * Fixed AIFF music playing support
+Sam Lantinga - Sat Aug 18 04:14:13 PDT 2001
+ * Fixed building Ogg Vorbis support on Windows
+Ryan C. Gordon - Thu, 7 Jun 2001 13:15:51
+ * Added Mix_ChannelFinished() and Mix_GetChunk()
+Ryan C. Gordon - Tue, 5 Jun 2001 11:01:51
+ * Added VOC sound file support
+Guillaume Cottenceau - Thu May 10 11:17:55 PDT 2001
+ * Fixed crashes when API used with audio not initialized
+Paul Jenner - Sat, 14 Apr 2001 09:20:38 -0700 (PDT)
+ * Added support for building RPM directly from tar archive
+
+1.2.0:
+Sam Lantinga - Wed Apr 4 12:42:20 PDT 2001
+ * Synchronized release version with SDL 1.2.0
+
+1.1.1:
+John Hall - Tue Jan 2 13:46:54 PST 2001
+ * Added support to playmus for track switching with Ctrl-C
+ * Added support to playmus for multiple command line files
+
+1.1.0:
+Sam Lantinga - Wed Nov 29 20:47:13 PST 2000
+ * Package specifically for SDL 1.1 (no real reason API-wise, but for clarity)
+
+1.0.7:
+Sam Lantinga - Tue Nov 7 10:22:09 PST 2000
+ * Fixed hang in mikmod re-initialization
+Stephane Peter - Oct 17 13:07:32 PST 2000
+ * Fixed music fading
+Ray Kelm - Fri, 04 Aug 2000 20:58:00 -0400
+ * Added support for cross-compiling Windows DLL from Linux
+
+1.0.6:
+Sam Lantinga - Sun Jul 2 14:16:44 PDT 2000
+ * Added support for the Ogg Vorbis music format: http://www.vorbis.org/
+Darrell Walisser - Wed Jun 28 11:59:40 PDT 2000
+ * Added Codewarrior projects for MacOS
+Sam Lantinga - Mon Jun 26 12:01:11 PDT 2000
+ * Fixed symbol aliasing problem with "channel"
+Matt - Wed, 12 Apr 2000 15:36:13 -0700
+ * Added SDL_RWops support for mikmod loading (not hooked into music.c yet)
+
+1.0.5:
+Paul Furber - Fri Mar 3 14:58:50 PST 2000
+ * Fixed MP3 detection with compilers that use signed char datatypes
+
+1.0.4:
+Sam Lantinga - Thu Feb 10 19:42:03 PST 2000
+ * Ported the base mixer and mikmod libraries to MacOS
+Markus Oberhumer - Wed Feb 2 13:16:17 PST 2000
+ * Fixed problem with short looping sounds
+Sam Lantinga - Tue Feb 1 13:25:44 PST 2000
+ * Added Visual C++ project file
+Markus Oberhumer - Tue Feb 1 13:23:11 PST 2000
+ * Cleaned up code for compiling with Visual C++
+ * Don't hang in Mix_HaltMusic() if the music is paused
+Sam Lantinga - Fri Jan 28 08:54:56 PST 2000
+ * Fixed looping WAVE chunks that are not aligned on sample boundaries
+
+1.0.3:
+Sam Lantinga - Mon Jan 17 19:48:09 PST 2000
+ * Changed the name of the library from "mixer" to "SDL_mixer"
+ * Instead of including "mixer.h", include "SDL_mixer.h",
+ * Instead of linking with libmixer.a, link with libSDL_mixer.a
+
+1.0.2:
+Sam Lantinga - Fri Jan 14 11:06:56 PST 2000
+ * Made the CHANGELOG entries Y2K compliant. :)
+MFX - Updated the mikmod support to MikMod 3.1.8
+MFX - Added Mix_HookMusicFinished() API function
+
+1.0.1:
+SOL - Added a post-mixing callback
+SP - A few music-related bugfixes
+
+1.0.0:
+SOL - Added autoconf support
+SP - Added MP3 support using SMPEG
+SP - Added fading in/out of music and samples
+SP - Added dynamic allocation of channels
+SP - Added channel grouping functions
+SP - Added expiration delay for samples
+
+Initial Key:
+SOL - Sam Lantinga (hercules@lokigames.com)
+SP - Stephane Peter (megastep@lokigames.com)
+MFX - Markus Oberhumer (markus.oberhumer@jk.uni-linz.ac.at)
diff --git a/apps/plugins/sdl/SDL_mixer/COPYING b/apps/plugins/sdl/SDL_mixer/COPYING
new file mode 100644
index 0000000000..dce4d178b1
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/COPYING
@@ -0,0 +1,20 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
diff --git a/apps/plugins/sdl/SDL_mixer/Makefile.in b/apps/plugins/sdl/SDL_mixer/Makefile.in
new file mode 100644
index 0000000000..3d10565c6d
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/Makefile.in
@@ -0,0 +1,133 @@
+# Makefile to build and install the SDL_mixer library
+
+top_builddir = .
+srcdir = @srcdir@
+objects = build
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = $(DESTDIR)@bindir@
+libdir = $(DESTDIR)@libdir@
+includedir = $(DESTDIR)@includedir@
+datarootdir = $(DESTDIR)@datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+auxdir = @ac_aux_dir@
+distpath = $(srcdir)/..
+distdir = SDL_mixer-@VERSION@
+distfile = $(distdir).tar.gz
+
+@SET_MAKE@
+EXE = @EXE@
+SHELL = @SHELL@
+CC = @CC@
+CXX = g++
+CFLAGS = @BUILD_CFLAGS@
+EXTRA_CFLAGS = @EXTRA_CFLAGS@
+LDFLAGS = @BUILD_LDFLAGS@
+EXTRA_LDFLAGS = @EXTRA_LDFLAGS@
+LIBTOOL = @LIBTOOL@
+INSTALL = @INSTALL@
+AR = @AR@
+RANLIB = @RANLIB@
+WINDRES = @WINDRES@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_LIBS = @SDL_LIBS@
+
+TARGET = libSDL_mixer.la
+OBJECTS = @OBJECTS@
+VERSION_OBJECTS = @VERSION_OBJECTS@
+PLAYWAVE_OBJECTS = @PLAYWAVE_OBJECTS@
+PLAYMUS_OBJECTS = @PLAYMUS_OBJECTS@
+
+DIST = Android.mk CHANGES COPYING CWProjects.sea.bin MPWmake.sea.bin Makefile.in SDL_mixer.pc.in README SDL_mixer.h SDL_mixer.qpg.in SDL_mixer.spec SDL_mixer.spec.in VisualC Watcom-OS2.zip Xcode Xcode-iOS acinclude autogen.sh build-scripts configure configure.in dynamic_flac.c dynamic_flac.h dynamic_fluidsynth.c dynamic_fluidsynth.h dynamic_mod.c dynamic_mod.h dynamic_mp3.c dynamic_mp3.h dynamic_ogg.c dynamic_ogg.h effect_position.c effect_stereoreverse.c effects_internal.c effects_internal.h fluidsynth.c fluidsynth.h gcc-fat.sh libmikmod-3.1.12.zip load_aiff.c load_aiff.h load_flac.c load_flac.h load_ogg.c load_ogg.h load_voc.c load_voc.h mixer.c music.c music_cmd.c music_cmd.h music_flac.c music_flac.h music_mad.c music_mad.h music_mod.c music_mod.h music_modplug.c music_modplug.h music_ogg.c music_ogg.h native_midi playmus.c playwave.c timidity wavestream.c wavestream.h version.rc
+
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+LT_LDFLAGS = -no-undefined -rpath $(libdir) -release $(LT_RELEASE) -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+
+all: $(srcdir)/configure Makefile $(objects) $(objects)/$(TARGET) $(objects)/playwave$(EXE) $(objects)/playmus$(EXE)
+
+$(srcdir)/configure: $(srcdir)/configure.in
+ @echo "Warning, configure.in is out of date"
+ #(cd $(srcdir) && sh autogen.sh && sh configure)
+ @sleep 3
+
+Makefile: $(srcdir)/Makefile.in
+ $(SHELL) config.status $@
+
+$(objects):
+ $(SHELL) $(auxdir)/mkinstalldirs $@
+
+.PHONY: all install install-hdrs install-lib install-bin uninstall uninstall-hdrs uninstall-lib uninstall-bin clean distclean dist
+
+$(objects)/$(TARGET): $(OBJECTS) $(VERSION_OBJECTS)
+ $(LIBTOOL) --mode=link $(CC) -o $@ $(OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS)
+
+$(objects)/playwave$(EXE): $(objects)/playwave.lo $(objects)/$(TARGET)
+ $(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playwave.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET)
+
+$(objects)/playmus$(EXE): $(objects)/playmus.lo $(objects)/$(TARGET)
+ $(LIBTOOL) --mode=link $(CC) -o $@ $(objects)/playmus.lo $(SDL_CFLAGS) $(SDL_LIBS) $(objects)/$(TARGET)
+
+install: all install-hdrs install-lib #install-bin
+install-hdrs:
+ $(SHELL) $(auxdir)/mkinstalldirs $(includedir)/SDL
+ for src in $(srcdir)/SDL_mixer.h; do \
+ file=`echo $$src | sed -e 's|^.*/||'`; \
+ $(INSTALL) -m 644 $$src $(includedir)/SDL/$$file; \
+ done
+ $(SHELL) $(auxdir)/mkinstalldirs $(libdir)/pkgconfig
+ $(INSTALL) -m 644 SDL_mixer.pc $(libdir)/pkgconfig/
+install-lib: $(objects) $(objects)/$(TARGET)
+ $(SHELL) $(auxdir)/mkinstalldirs $(libdir)
+ $(LIBTOOL) --mode=install $(INSTALL) $(objects)/$(TARGET) $(libdir)/$(TARGET)
+install-bin:
+ $(SHELL) $(auxdir)/mkinstalldirs $(bindir)
+ $(LIBTOOL) --mode=install $(INSTALL) -m 755 $(objects)/playwave$(EXE) $(bindir)/playwave$(EXE)
+ $(LIBTOOL) --mode=install $(INSTALL) -m 755 $(objects)/playmus$(EXE) $(bindir)/playmus$(EXE)
+
+uninstall: uninstall-hdrs uninstall-lib uninstall-bin
+uninstall-hdrs:
+ for src in $(srcdir)/SDL_mixer.h; do \
+ file=`echo $$src | sed -e 's|^.*/||'`; \
+ rm -f $(includedir)/SDL/$$file; \
+ done
+ -rmdir $(includedir)/SDL
+ rm -f $(libdir)/pkgconfig/SDL_mixer.pc
+ -rmdir $(libdir)/pkgconfig
+uninstall-lib:
+ $(LIBTOOL) --mode=uninstall rm -f $(libdir)/$(TARGET)
+uninstall-bin:
+ rm -f $(bindir)/playwave$(EXE)
+ rm -f $(bindir)/playmus$(EXE)
+
+clean:
+ rm -rf $(objects)
+
+distclean: clean
+ rm -f Makefile
+ rm -f SDL_mixer.qpg
+ rm -f config.status config.cache config.log libtool
+ rm -f SDL_mixer.pc
+ rm -rf $(srcdir)/autom4te*
+ find $(srcdir) \( \
+ -name '*~' -o \
+ -name '*.bak' -o \
+ -name '*.old' -o \
+ -name '*.rej' -o \
+ -name '*.orig' -o \
+ -name '.#*' \) \
+ -exec rm -f {} \;
+
+dist $(distfile):
+ $(SHELL) $(auxdir)/mkinstalldirs $(distdir)
+ tar cf - $(DIST) | (cd $(distdir); tar xf -)
+ rm -rf `find $(distdir) -name .svn`
+ rm -f `find $(distdir) -name '.#*'`
+ tar cvf - $(distdir) | gzip --best >$(distfile)
+ rm -rf $(distdir)
+
+rpm: $(distfile)
+ rpmbuild -ta $?
diff --git a/apps/plugins/sdl/SDL_mixer/README b/apps/plugins/sdl/SDL_mixer/README
new file mode 100644
index 0000000000..b17cfe6840
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/README
@@ -0,0 +1,43 @@
+
+SDL_mixer 1.2
+
+The latest version of this library is available from:
+http://www.libsdl.org/projects/SDL_mixer/
+
+Due to popular demand, here is a simple multi-channel audio mixer.
+It supports 8 channels of 16 bit stereo audio, plus a single channel
+of music, mixed by the popular MikMod MOD, Timidity MIDI and SMPEG MP3
+libraries.
+
+See the header file SDL_mixer.h and the examples playwave.c and playmus.c
+for documentation on this mixer library.
+
+The mixer can currently load Microsoft WAVE files and Creative Labs VOC
+files as audio samples, and can load MIDI files via Timidity and the
+following music formats via MikMod: .MOD .S3M .IT .XM. It can load
+Ogg Vorbis streams as music if built with Ogg Vorbis or Tremor libraries,
+and finally it can load MP3 music using the SMPEG or libmad libraries.
+
+Tremor decoding is disabled by default; you can enable it by passing
+ --enable-music-ogg-tremor
+to configure, or by defining OGG_MUSIC and OGG_USE_TREMOR.
+
+libmad decoding is disabled by default; you can enable it by passing
+ --enable-music-mp3-mad
+to configure, or by defining MP3_MAD_MUSIC
+vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+WARNING: The license for libmad is GPL, which means that in order to
+ use it your application must also be GPL!
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The process of mixing MIDI files to wave output is very CPU intensive,
+so if playing regular WAVE files sound great, but playing MIDI files
+sound choppy, try using 8-bit audio, mono audio, or lower frequencies.
+
+To play MIDI files, you'll need to get a complete set of GUS patches
+from:
+http://www.libsdl.org/projects/mixer/timidity/timidity.tar.gz
+and unpack them in /usr/local/lib under UNIX, and C:\ under Win32.
+
+This library is under the zlib license, see the file "COPYING" for details.
+
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_flac.c b/apps/plugins/sdl/SDL_mixer/dynamic_flac.c
new file mode 100644
index 0000000000..59421fddea
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_flac.c
@@ -0,0 +1,177 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Implementation of the dynamic loading functionality for libFLAC.
+ ~ Austen Dicken (admin@cvpcs.org)
+*/
+
+#ifdef FLAC_MUSIC
+
+#include "SDL_loadso.h"
+
+#include "dynamic_flac.h"
+
+flac_loader flac = {
+ 0, NULL
+};
+
+#ifdef FLAC_DYNAMIC
+int Mix_InitFLAC()
+{
+ if ( flac.loaded == 0 ) {
+ flac.handle = SDL_LoadObject(FLAC_DYNAMIC);
+ if ( flac.handle == NULL ) {
+ return -1;
+ }
+ flac.FLAC__stream_decoder_new =
+ (FLAC__StreamDecoder *(*)())
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_new");
+ if ( flac.FLAC__stream_decoder_new == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_delete =
+ (void (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_delete");
+ if ( flac.FLAC__stream_decoder_delete == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_init_stream =
+ (FLAC__StreamDecoderInitStatus (*)(
+ FLAC__StreamDecoder *,
+ FLAC__StreamDecoderReadCallback,
+ FLAC__StreamDecoderSeekCallback,
+ FLAC__StreamDecoderTellCallback,
+ FLAC__StreamDecoderLengthCallback,
+ FLAC__StreamDecoderEofCallback,
+ FLAC__StreamDecoderWriteCallback,
+ FLAC__StreamDecoderMetadataCallback,
+ FLAC__StreamDecoderErrorCallback,
+ void *))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_init_stream");
+ if ( flac.FLAC__stream_decoder_init_stream == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_finish =
+ (FLAC__bool (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_finish");
+ if ( flac.FLAC__stream_decoder_finish == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_flush =
+ (FLAC__bool (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_flush");
+ if ( flac.FLAC__stream_decoder_flush == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_process_single =
+ (FLAC__bool (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle,
+ "FLAC__stream_decoder_process_single");
+ if ( flac.FLAC__stream_decoder_process_single == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_process_until_end_of_metadata =
+ (FLAC__bool (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle,
+ "FLAC__stream_decoder_process_until_end_of_metadata");
+ if ( flac.FLAC__stream_decoder_process_until_end_of_metadata == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_process_until_end_of_stream =
+ (FLAC__bool (*)(FLAC__StreamDecoder *))
+ SDL_LoadFunction(flac.handle,
+ "FLAC__stream_decoder_process_until_end_of_stream");
+ if ( flac.FLAC__stream_decoder_process_until_end_of_stream == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_seek_absolute =
+ (FLAC__bool (*)(FLAC__StreamDecoder *, FLAC__uint64))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_seek_absolute");
+ if ( flac.FLAC__stream_decoder_seek_absolute == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ flac.FLAC__stream_decoder_get_state =
+ (FLAC__StreamDecoderState (*)(const FLAC__StreamDecoder *decoder))
+ SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_get_state");
+ if ( flac.FLAC__stream_decoder_get_state == NULL ) {
+ SDL_UnloadObject(flac.handle);
+ return -1;
+ }
+ }
+ ++flac.loaded;
+
+ return 0;
+}
+void Mix_QuitFLAC()
+{
+ if ( flac.loaded == 0 ) {
+ return;
+ }
+ if ( flac.loaded == 1 ) {
+ SDL_UnloadObject(flac.handle);
+ }
+ --flac.loaded;
+}
+#else
+int Mix_InitFLAC()
+{
+ if ( flac.loaded == 0 ) {
+ flac.FLAC__stream_decoder_new = FLAC__stream_decoder_new;
+ flac.FLAC__stream_decoder_delete = FLAC__stream_decoder_delete;
+ flac.FLAC__stream_decoder_init_stream =
+ FLAC__stream_decoder_init_stream;
+ flac.FLAC__stream_decoder_finish = FLAC__stream_decoder_finish;
+ flac.FLAC__stream_decoder_flush = FLAC__stream_decoder_flush;
+ flac.FLAC__stream_decoder_process_single =
+ FLAC__stream_decoder_process_single;
+ flac.FLAC__stream_decoder_process_until_end_of_metadata =
+ FLAC__stream_decoder_process_until_end_of_metadata;
+ flac.FLAC__stream_decoder_process_until_end_of_stream =
+ FLAC__stream_decoder_process_until_end_of_stream;
+ flac.FLAC__stream_decoder_seek_absolute =
+ FLAC__stream_decoder_seek_absolute;
+ flac.FLAC__stream_decoder_get_state =
+ FLAC__stream_decoder_get_state;
+ }
+ ++flac.loaded;
+
+ return 0;
+}
+void Mix_QuitFLAC()
+{
+ if ( flac.loaded == 0 ) {
+ return;
+ }
+ if ( flac.loaded == 1 ) {
+ }
+ --flac.loaded;
+}
+#endif /* FLAC_DYNAMIC */
+
+#endif /* FLAC_MUSIC */
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_flac.h b/apps/plugins/sdl/SDL_mixer/dynamic_flac.h
new file mode 100644
index 0000000000..e2dd3f7540
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_flac.h
@@ -0,0 +1,66 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ The following file defines all of the functions/objects used to dynamically
+ link to the libFLAC library.
+ ~ Austen Dicken (admin@cvpcs.org)
+*/
+
+#ifdef FLAC_MUSIC
+
+#include <FLAC/stream_decoder.h>
+
+typedef struct {
+ int loaded;
+ void *handle;
+ FLAC__StreamDecoder *(*FLAC__stream_decoder_new)();
+ void (*FLAC__stream_decoder_delete)(FLAC__StreamDecoder *decoder);
+ FLAC__StreamDecoderInitStatus (*FLAC__stream_decoder_init_stream)(
+ FLAC__StreamDecoder *decoder,
+ FLAC__StreamDecoderReadCallback read_callback,
+ FLAC__StreamDecoderSeekCallback seek_callback,
+ FLAC__StreamDecoderTellCallback tell_callback,
+ FLAC__StreamDecoderLengthCallback length_callback,
+ FLAC__StreamDecoderEofCallback eof_callback,
+ FLAC__StreamDecoderWriteCallback write_callback,
+ FLAC__StreamDecoderMetadataCallback metadata_callback,
+ FLAC__StreamDecoderErrorCallback error_callback,
+ void *client_data);
+ FLAC__bool (*FLAC__stream_decoder_finish)(FLAC__StreamDecoder *decoder);
+ FLAC__bool (*FLAC__stream_decoder_flush)(FLAC__StreamDecoder *decoder);
+ FLAC__bool (*FLAC__stream_decoder_process_single)(
+ FLAC__StreamDecoder *decoder);
+ FLAC__bool (*FLAC__stream_decoder_process_until_end_of_metadata)(
+ FLAC__StreamDecoder *decoder);
+ FLAC__bool (*FLAC__stream_decoder_process_until_end_of_stream)(
+ FLAC__StreamDecoder *decoder);
+ FLAC__bool (*FLAC__stream_decoder_seek_absolute)(
+ FLAC__StreamDecoder *decoder,
+ FLAC__uint64 sample);
+ FLAC__StreamDecoderState (*FLAC__stream_decoder_get_state)(
+ const FLAC__StreamDecoder *decoder);
+} flac_loader;
+
+extern flac_loader flac;
+
+#endif /* FLAC_MUSIC */
+
+extern int Mix_InitFLAC();
+extern void Mix_QuitFLAC();
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.c b/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.c
new file mode 100644
index 0000000000..73c687fb7b
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.c
@@ -0,0 +1,87 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ James Le Cuirot
+ chewi@aura-online.co.uk
+*/
+
+#ifdef USE_FLUIDSYNTH_MIDI
+
+#include "SDL_loadso.h"
+#include "dynamic_fluidsynth.h"
+
+fluidsynth_loader fluidsynth = {
+ 0, NULL
+};
+
+#ifdef FLUIDSYNTH_DYNAMIC
+#define FLUIDSYNTH_LOADER(FUNC, SIG) \
+ fluidsynth.FUNC = (SIG) SDL_LoadFunction(fluidsynth.handle, #FUNC); \
+ if (fluidsynth.FUNC == NULL) { SDL_UnloadObject(fluidsynth.handle); return -1; }
+#else
+#define FLUIDSYNTH_LOADER(FUNC, SIG) \
+ fluidsynth.FUNC = FUNC;
+#endif
+
+int Mix_InitFluidSynth()
+{
+ if ( fluidsynth.loaded == 0 ) {
+#ifdef FLUIDSYNTH_DYNAMIC
+ fluidsynth.handle = SDL_LoadObject(FLUIDSYNTH_DYNAMIC);
+ if ( fluidsynth.handle == NULL ) return -1;
+#endif
+
+ FLUIDSYNTH_LOADER(delete_fluid_player, int (*)(fluid_player_t*));
+ FLUIDSYNTH_LOADER(delete_fluid_settings, void (*)(fluid_settings_t*));
+ FLUIDSYNTH_LOADER(delete_fluid_synth, int (*)(fluid_synth_t*));
+ FLUIDSYNTH_LOADER(fluid_player_add, int (*)(fluid_player_t*, const char*));
+ FLUIDSYNTH_LOADER(fluid_player_add_mem, int (*)(fluid_player_t*, const void*, size_t));
+ FLUIDSYNTH_LOADER(fluid_player_get_status, int (*)(fluid_player_t*));
+ FLUIDSYNTH_LOADER(fluid_player_play, int (*)(fluid_player_t*));
+ FLUIDSYNTH_LOADER(fluid_player_set_loop, int (*)(fluid_player_t*, int));
+ FLUIDSYNTH_LOADER(fluid_player_stop, int (*)(fluid_player_t*));
+ FLUIDSYNTH_LOADER(fluid_settings_setnum, int (*)(fluid_settings_t*, const char*, double));
+ FLUIDSYNTH_LOADER(fluid_synth_get_settings, fluid_settings_t* (*)(fluid_synth_t*));
+ FLUIDSYNTH_LOADER(fluid_synth_set_gain, void (*)(fluid_synth_t*, float));
+ FLUIDSYNTH_LOADER(fluid_synth_sfload, int(*)(fluid_synth_t*, const char*, int));
+ FLUIDSYNTH_LOADER(fluid_synth_write_s16, int(*)(fluid_synth_t*, int, void*, int, int, void*, int, int));
+ FLUIDSYNTH_LOADER(new_fluid_player, fluid_player_t* (*)(fluid_synth_t*));
+ FLUIDSYNTH_LOADER(new_fluid_settings, fluid_settings_t* (*)(void));
+ FLUIDSYNTH_LOADER(new_fluid_synth, fluid_synth_t* (*)(fluid_settings_t*));
+ }
+ ++fluidsynth.loaded;
+
+ return 0;
+}
+
+void Mix_QuitFluidSynth()
+{
+ if ( fluidsynth.loaded == 0 ) {
+ return;
+ }
+ if ( fluidsynth.loaded == 1 ) {
+#ifdef FLUIDSYNTH_DYNAMIC
+ SDL_UnloadObject(fluidsynth.handle);
+#endif
+ }
+ --fluidsynth.loaded;
+}
+
+#endif /* USE_FLUIDSYNTH_MIDI */
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.h b/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.h
new file mode 100644
index 0000000000..5d25232a22
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_fluidsynth.h
@@ -0,0 +1,57 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ James Le Cuirot
+ chewi@aura-online.co.uk
+*/
+
+#ifdef USE_FLUIDSYNTH_MIDI
+
+#include <fluidsynth.h>
+
+typedef struct {
+ int loaded;
+ void *handle;
+
+ int (*delete_fluid_player)(fluid_player_t*);
+ void (*delete_fluid_settings)(fluid_settings_t*);
+ int (*delete_fluid_synth)(fluid_synth_t*);
+ int (*fluid_player_add)(fluid_player_t*, const char*);
+ int (*fluid_player_add_mem)(fluid_player_t*, const void*, size_t);
+ int (*fluid_player_get_status)(fluid_player_t*);
+ int (*fluid_player_play)(fluid_player_t*);
+ int (*fluid_player_set_loop)(fluid_player_t*, int);
+ int (*fluid_player_stop)(fluid_player_t*);
+ int (*fluid_settings_setnum)(fluid_settings_t*, const char*, double);
+ fluid_settings_t* (*fluid_synth_get_settings)(fluid_synth_t*);
+ void (*fluid_synth_set_gain)(fluid_synth_t*, float);
+ int (*fluid_synth_sfload)(fluid_synth_t*, const char*, int);
+ int (*fluid_synth_write_s16)(fluid_synth_t*, int, void*, int, int, void*, int, int);
+ fluid_player_t* (*new_fluid_player)(fluid_synth_t*);
+ fluid_settings_t* (*new_fluid_settings)(void);
+ fluid_synth_t* (*new_fluid_synth)(fluid_settings_t*);
+} fluidsynth_loader;
+
+extern fluidsynth_loader fluidsynth;
+
+#endif /* USE_FLUIDSYNTH_MIDI */
+
+extern int Mix_InitFluidSynth();
+extern void Mix_QuitFluidSynth();
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_mod.c b/apps/plugins/sdl/SDL_mixer/dynamic_mod.c
new file mode 100644
index 0000000000..7e3cd0af11
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_mod.c
@@ -0,0 +1,275 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef MOD_MUSIC
+
+#include "SDL_loadso.h"
+
+#include "dynamic_mod.h"
+
+mikmod_loader mikmod = {
+ 0, NULL
+};
+
+#ifdef MOD_DYNAMIC
+int Mix_InitMOD()
+{
+ if ( mikmod.loaded == 0 ) {
+ mikmod.handle = SDL_LoadObject(MOD_DYNAMIC);
+ if ( mikmod.handle == NULL ) {
+ return -1;
+ }
+ mikmod.MikMod_Exit =
+ (void (*)(void))
+ SDL_LoadFunction(mikmod.handle, "MikMod_Exit");
+ if ( mikmod.MikMod_Exit == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_InfoDriver =
+ (CHAR* (*)(void))
+ SDL_LoadFunction(mikmod.handle, "MikMod_InfoDriver");
+ if ( mikmod.MikMod_InfoDriver == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_InfoLoader =
+ (CHAR* (*)(void))
+ SDL_LoadFunction(mikmod.handle, "MikMod_InfoLoader");
+ if ( mikmod.MikMod_InfoLoader == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_Init =
+ (BOOL (*)(CHAR*))
+ SDL_LoadFunction(mikmod.handle, "MikMod_Init");
+ if ( mikmod.MikMod_Init == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_RegisterAllLoaders =
+ (void (*)(void))
+ SDL_LoadFunction(mikmod.handle, "MikMod_RegisterAllLoaders");
+ if ( mikmod.MikMod_RegisterAllLoaders == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_RegisterDriver =
+ (void (*)(struct MDRIVER*))
+ SDL_LoadFunction(mikmod.handle, "MikMod_RegisterDriver");
+ if ( mikmod.MikMod_RegisterDriver == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_errno =
+ (int*)
+ SDL_LoadFunction(mikmod.handle, "MikMod_errno");
+ if ( mikmod.MikMod_errno == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.MikMod_strerror =
+ (char* (*)(int))
+ SDL_LoadFunction(mikmod.handle, "MikMod_strerror");
+ if ( mikmod.MikMod_strerror == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_Active =
+ (BOOL (*)(void))
+ SDL_LoadFunction(mikmod.handle, "Player_Active");
+ if ( mikmod.Player_Active == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_Free =
+ (void (*)(MODULE*))
+ SDL_LoadFunction(mikmod.handle, "Player_Free");
+ if ( mikmod.Player_Free == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_LoadGeneric =
+ (MODULE* (*)(MREADER*,int,BOOL))
+ SDL_LoadFunction(mikmod.handle, "Player_LoadGeneric");
+ if ( mikmod.Player_LoadGeneric == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_SetPosition =
+ (void (*)(UWORD))
+ SDL_LoadFunction(mikmod.handle, "Player_SetPosition");
+ if ( mikmod.Player_SetPosition == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_SetVolume =
+ (void (*)(SWORD))
+ SDL_LoadFunction(mikmod.handle, "Player_SetVolume");
+ if ( mikmod.Player_SetVolume == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_Start =
+ (void (*)(MODULE*))
+ SDL_LoadFunction(mikmod.handle, "Player_Start");
+ if ( mikmod.Player_Start == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.Player_Stop =
+ (void (*)(void))
+ SDL_LoadFunction(mikmod.handle, "Player_Stop");
+ if ( mikmod.Player_Stop == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.VC_WriteBytes =
+ (ULONG (*)(SBYTE*,ULONG))
+ SDL_LoadFunction(mikmod.handle, "VC_WriteBytes");
+ if ( mikmod.VC_WriteBytes == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.drv_nos =
+ (MDRIVER*)
+ SDL_LoadFunction(mikmod.handle, "drv_nos");
+ if ( mikmod.drv_nos == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_device =
+ (UWORD*)
+ SDL_LoadFunction(mikmod.handle, "md_device");
+ if ( mikmod.md_device == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_mixfreq =
+ (UWORD*)
+ SDL_LoadFunction(mikmod.handle, "md_mixfreq");
+ if ( mikmod.md_mixfreq == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_mode =
+ (UWORD*)
+ SDL_LoadFunction(mikmod.handle, "md_mode");
+ if ( mikmod.md_mode == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_musicvolume =
+ (UBYTE*)
+ SDL_LoadFunction(mikmod.handle, "md_musicvolume");
+ if ( mikmod.md_musicvolume == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_pansep =
+ (UBYTE*)
+ SDL_LoadFunction(mikmod.handle, "md_pansep");
+ if ( mikmod.md_pansep == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_reverb =
+ (UBYTE*)
+ SDL_LoadFunction(mikmod.handle, "md_reverb");
+ if ( mikmod.md_reverb == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_sndfxvolume =
+ (UBYTE*)
+ SDL_LoadFunction(mikmod.handle, "md_sndfxvolume");
+ if ( mikmod.md_sndfxvolume == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ mikmod.md_volume =
+ (UBYTE*)
+ SDL_LoadFunction(mikmod.handle, "md_volume");
+ if ( mikmod.md_volume == NULL ) {
+ SDL_UnloadObject(mikmod.handle);
+ return -1;
+ }
+ }
+ ++mikmod.loaded;
+
+ return 0;
+}
+void Mix_QuitMOD()
+{
+ if ( mikmod.loaded == 0 ) {
+ return;
+ }
+ if ( mikmod.loaded == 1 ) {
+ SDL_UnloadObject(mikmod.handle);
+ }
+ --mikmod.loaded;
+}
+#else
+int Mix_InitMOD()
+{
+ if ( mikmod.loaded == 0 ) {
+ mikmod.MikMod_Exit = MikMod_Exit;
+ mikmod.MikMod_InfoDriver = MikMod_InfoDriver;
+ mikmod.MikMod_InfoLoader = MikMod_InfoLoader;
+ mikmod.MikMod_Init = MikMod_Init;
+ mikmod.MikMod_RegisterAllLoaders = MikMod_RegisterAllLoaders;
+ mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver;
+ mikmod.MikMod_errno = &MikMod_errno;
+ mikmod.MikMod_strerror = MikMod_strerror;
+ mikmod.Player_Active = Player_Active;
+ mikmod.Player_Free = Player_Free;
+ mikmod.Player_LoadGeneric = Player_LoadGeneric;
+ mikmod.Player_SetPosition = Player_SetPosition;
+ mikmod.Player_SetVolume = Player_SetVolume;
+ mikmod.Player_Start = Player_Start;
+ mikmod.Player_Stop = Player_Stop;
+ mikmod.VC_WriteBytes = VC_WriteBytes;
+ mikmod.drv_nos = &drv_nos;
+ mikmod.md_device = &md_device;
+ mikmod.md_mixfreq = &md_mixfreq;
+ mikmod.md_mode = &md_mode;
+ mikmod.md_musicvolume = &md_musicvolume;
+ mikmod.md_pansep = &md_pansep;
+ mikmod.md_reverb = &md_reverb;
+ mikmod.md_sndfxvolume = &md_sndfxvolume;
+ mikmod.md_volume = &md_volume;
+ }
+ ++mikmod.loaded;
+
+ return 0;
+}
+void Mix_QuitMOD()
+{
+ if ( mikmod.loaded == 0 ) {
+ return;
+ }
+ if ( mikmod.loaded == 1 ) {
+ }
+ --mikmod.loaded;
+}
+#endif /* MOD_DYNAMIC */
+
+#endif /* MOD_MUSIC */
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_mod.h b/apps/plugins/sdl/SDL_mixer/dynamic_mod.h
new file mode 100644
index 0000000000..3561b151db
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_mod.h
@@ -0,0 +1,62 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef MOD_MUSIC
+
+#include "mikmod.h"
+
+typedef struct {
+ int loaded;
+ void *handle;
+
+ void (*MikMod_Exit)(void);
+ CHAR* (*MikMod_InfoDriver)(void);
+ CHAR* (*MikMod_InfoLoader)(void);
+ BOOL (*MikMod_Init)(CHAR*);
+ void (*MikMod_RegisterAllLoaders)(void);
+ void (*MikMod_RegisterDriver)(struct MDRIVER*);
+ int* MikMod_errno;
+ char* (*MikMod_strerror)(int);
+ BOOL (*Player_Active)(void);
+ void (*Player_Free)(MODULE*);
+ MODULE* (*Player_LoadGeneric)(MREADER*,int,BOOL);
+ void (*Player_SetPosition)(UWORD);
+ void (*Player_SetVolume)(SWORD);
+ void (*Player_Start)(MODULE*);
+ void (*Player_Stop)(void);
+ ULONG (*VC_WriteBytes)(SBYTE*,ULONG);
+ struct MDRIVER* drv_nos;
+ UWORD* md_device;
+ UWORD* md_mixfreq;
+ UWORD* md_mode;
+ UBYTE* md_musicvolume;
+ UBYTE* md_pansep;
+ UBYTE* md_reverb;
+ UBYTE* md_sndfxvolume;
+ UBYTE* md_volume;
+} mikmod_loader;
+
+extern mikmod_loader mikmod;
+
+#endif /* MOD_MUSIC */
+
+extern int Mix_InitMOD();
+extern void Mix_QuitMOD();
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_mp3.c b/apps/plugins/sdl/SDL_mixer/dynamic_mp3.c
new file mode 100644
index 0000000000..83a3e309fc
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_mp3.c
@@ -0,0 +1,171 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef MP3_MUSIC
+
+#include "SDL_loadso.h"
+
+#include "dynamic_mp3.h"
+
+smpeg_loader smpeg = {
+ 0, NULL
+};
+
+#ifdef MP3_DYNAMIC
+int Mix_InitMP3()
+{
+ if ( smpeg.loaded == 0 ) {
+ smpeg.handle = SDL_LoadObject(MP3_DYNAMIC);
+ if ( smpeg.handle == NULL ) {
+ return -1;
+ }
+ smpeg.SMPEG_actualSpec =
+ (void (*)( SMPEG *, SDL_AudioSpec * ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_actualSpec");
+ if ( smpeg.SMPEG_actualSpec == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_delete =
+ (void (*)( SMPEG* ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_delete");
+ if ( smpeg.SMPEG_delete == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_enableaudio =
+ (void (*)( SMPEG*, int ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_enableaudio");
+ if ( smpeg.SMPEG_enableaudio == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_enablevideo =
+ (void (*)( SMPEG*, int ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_enablevideo");
+ if ( smpeg.SMPEG_enablevideo == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_new_rwops =
+ (SMPEG* (*)(SDL_RWops *, SMPEG_Info*, int))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_new_rwops");
+ if ( smpeg.SMPEG_new_rwops == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_play =
+ (void (*)( SMPEG* ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_play");
+ if ( smpeg.SMPEG_play == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_playAudio =
+ (int (*)( SMPEG *, Uint8 *, int ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_playAudio");
+ if ( smpeg.SMPEG_playAudio == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_rewind =
+ (void (*)( SMPEG* ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_rewind");
+ if ( smpeg.SMPEG_rewind == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_setvolume =
+ (void (*)( SMPEG*, int ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_setvolume");
+ if ( smpeg.SMPEG_setvolume == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_skip =
+ (void (*)( SMPEG*, float ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_skip");
+ if ( smpeg.SMPEG_skip == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_status =
+ (SMPEGstatus (*)( SMPEG* ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_status");
+ if ( smpeg.SMPEG_status == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ smpeg.SMPEG_stop =
+ (void (*)( SMPEG* ))
+ SDL_LoadFunction(smpeg.handle, "SMPEG_stop");
+ if ( smpeg.SMPEG_stop == NULL ) {
+ SDL_UnloadObject(smpeg.handle);
+ return -1;
+ }
+ }
+ ++smpeg.loaded;
+
+ return 0;
+}
+void Mix_QuitMP3()
+{
+ if ( smpeg.loaded == 0 ) {
+ return;
+ }
+ if ( smpeg.loaded == 1 ) {
+ SDL_UnloadObject(smpeg.handle);
+ }
+ --smpeg.loaded;
+}
+#else
+int Mix_InitMP3()
+{
+ if ( smpeg.loaded == 0 ) {
+ smpeg.SMPEG_actualSpec = SMPEG_actualSpec;
+ smpeg.SMPEG_delete = SMPEG_delete;
+ smpeg.SMPEG_enableaudio = SMPEG_enableaudio;
+ smpeg.SMPEG_enablevideo = SMPEG_enablevideo;
+ smpeg.SMPEG_new_rwops = SMPEG_new_rwops;
+ smpeg.SMPEG_play = SMPEG_play;
+ smpeg.SMPEG_playAudio = SMPEG_playAudio;
+ smpeg.SMPEG_rewind = SMPEG_rewind;
+ smpeg.SMPEG_setvolume = SMPEG_setvolume;
+ smpeg.SMPEG_skip = SMPEG_skip;
+ smpeg.SMPEG_status = SMPEG_status;
+ smpeg.SMPEG_stop = SMPEG_stop;
+ }
+ ++smpeg.loaded;
+
+ return 0;
+}
+void Mix_QuitMP3()
+{
+ if ( smpeg.loaded == 0 ) {
+ return;
+ }
+ if ( smpeg.loaded == 1 ) {
+ }
+ --smpeg.loaded;
+}
+#endif /* MP3_DYNAMIC */
+
+#endif /* MP3_MUSIC */
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_mp3.h b/apps/plugins/sdl/SDL_mixer/dynamic_mp3.h
new file mode 100644
index 0000000000..03cbbbf9cf
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_mp3.h
@@ -0,0 +1,47 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef MP3_MUSIC
+#include "smpeg.h"
+
+typedef struct {
+ int loaded;
+ void *handle;
+ void (*SMPEG_actualSpec)( SMPEG *mpeg, SDL_AudioSpec *spec );
+ void (*SMPEG_delete)( SMPEG* mpeg );
+ void (*SMPEG_enableaudio)( SMPEG* mpeg, int enable );
+ void (*SMPEG_enablevideo)( SMPEG* mpeg, int enable );
+ SMPEG* (*SMPEG_new_rwops)(SDL_RWops *src, SMPEG_Info* info, int sdl_audio);
+ void (*SMPEG_play)( SMPEG* mpeg );
+ int (*SMPEG_playAudio)( SMPEG *mpeg, Uint8 *stream, int len );
+ void (*SMPEG_rewind)( SMPEG* mpeg );
+ void (*SMPEG_setvolume)( SMPEG* mpeg, int volume );
+ void (*SMPEG_skip)( SMPEG* mpeg, float seconds );
+ SMPEGstatus (*SMPEG_status)( SMPEG* mpeg );
+ void (*SMPEG_stop)( SMPEG* mpeg );
+} smpeg_loader;
+
+extern smpeg_loader smpeg;
+
+#endif /* MUSIC_MP3 */
+
+extern int Mix_InitMP3();
+extern void Mix_QuitMP3();
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_ogg.c b/apps/plugins/sdl/SDL_mixer/dynamic_ogg.c
new file mode 100644
index 0000000000..345a8c866f
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_ogg.c
@@ -0,0 +1,131 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef OGG_MUSIC
+
+#include "SDL_loadso.h"
+
+#include "dynamic_ogg.h"
+
+vorbis_loader vorbis = {
+ 0, NULL
+};
+
+#ifdef OGG_DYNAMIC
+int Mix_InitOgg()
+{
+ if ( vorbis.loaded == 0 ) {
+ vorbis.handle = SDL_LoadObject(OGG_DYNAMIC);
+ if ( vorbis.handle == NULL ) {
+ return -1;
+ }
+ vorbis.ov_clear =
+ (int (*)(OggVorbis_File *))
+ SDL_LoadFunction(vorbis.handle, "ov_clear");
+ if ( vorbis.ov_clear == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ vorbis.ov_info =
+ (vorbis_info *(*)(OggVorbis_File *,int))
+ SDL_LoadFunction(vorbis.handle, "ov_info");
+ if ( vorbis.ov_info == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ vorbis.ov_open_callbacks =
+ (int (*)(void *, OggVorbis_File *, char *, long, ov_callbacks))
+ SDL_LoadFunction(vorbis.handle, "ov_open_callbacks");
+ if ( vorbis.ov_open_callbacks == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ vorbis.ov_pcm_total =
+ (ogg_int64_t (*)(OggVorbis_File *,int))
+ SDL_LoadFunction(vorbis.handle, "ov_pcm_total");
+ if ( vorbis.ov_pcm_total == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ vorbis.ov_read =
+#ifdef OGG_USE_TREMOR
+ (long (*)(OggVorbis_File *,char *,int,int *))
+#else
+ (long (*)(OggVorbis_File *,char *,int,int,int,int,int *))
+#endif
+ SDL_LoadFunction(vorbis.handle, "ov_read");
+ if ( vorbis.ov_read == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ vorbis.ov_time_seek =
+#ifdef OGG_USE_TREMOR
+ (long (*)(OggVorbis_File *,ogg_int64_t))
+#else
+ (int (*)(OggVorbis_File *,double))
+#endif
+ SDL_LoadFunction(vorbis.handle, "ov_time_seek");
+ if ( vorbis.ov_time_seek == NULL ) {
+ SDL_UnloadObject(vorbis.handle);
+ return -1;
+ }
+ }
+ ++vorbis.loaded;
+
+ return 0;
+}
+void Mix_QuitOgg()
+{
+ if ( vorbis.loaded == 0 ) {
+ return;
+ }
+ if ( vorbis.loaded == 1 ) {
+ SDL_UnloadObject(vorbis.handle);
+ }
+ --vorbis.loaded;
+}
+#else
+int Mix_InitOgg()
+{
+ if ( vorbis.loaded == 0 ) {
+ vorbis.ov_clear = ov_clear;
+ vorbis.ov_info = ov_info;
+ vorbis.ov_open_callbacks = ov_open_callbacks;
+ vorbis.ov_pcm_total = ov_pcm_total;
+ vorbis.ov_read = ov_read;
+ vorbis.ov_time_seek = ov_time_seek;
+ }
+ ++vorbis.loaded;
+
+ return 0;
+}
+void Mix_QuitOgg()
+{
+ if ( vorbis.loaded == 0 ) {
+ return;
+ }
+ if ( vorbis.loaded == 1 ) {
+ }
+ --vorbis.loaded;
+}
+#endif /* OGG_DYNAMIC */
+
+#endif /* OGG_MUSIC */
diff --git a/apps/plugins/sdl/SDL_mixer/dynamic_ogg.h b/apps/plugins/sdl/SDL_mixer/dynamic_ogg.h
new file mode 100644
index 0000000000..822458d49e
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/dynamic_ogg.h
@@ -0,0 +1,53 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifdef OGG_MUSIC
+#ifdef OGG_USE_TREMOR
+#include <tremor/ivorbisfile.h>
+#else
+#include <vorbis/vorbisfile.h>
+#endif
+
+typedef struct {
+ int loaded;
+ void *handle;
+ int (*ov_clear)(OggVorbis_File *vf);
+ vorbis_info *(*ov_info)(OggVorbis_File *vf,int link);
+ int (*ov_open_callbacks)(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks);
+ ogg_int64_t (*ov_pcm_total)(OggVorbis_File *vf,int i);
+#ifdef OGG_USE_TREMOR
+ long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int *bitstream);
+#else
+ long (*ov_read)(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream);
+#endif
+#ifdef OGG_USE_TREMOR
+ int (*ov_time_seek)(OggVorbis_File *vf,ogg_int64_t pos);
+#else
+ int (*ov_time_seek)(OggVorbis_File *vf,double pos);
+#endif
+} vorbis_loader;
+
+extern vorbis_loader vorbis;
+
+#endif /* OGG_MUSIC */
+
+extern int Mix_InitOgg();
+extern void Mix_QuitOgg();
diff --git a/apps/plugins/sdl/SDL_mixer/effect_position.c b/apps/plugins/sdl/SDL_mixer/effect_position.c
new file mode 100644
index 0000000000..e0b467b12f
--- /dev/null
+++ b/apps/plugins/sdl/SDL_mixer/effect_position.c
@@ -0,0 +1,1615 @@
+/*
+ SDL_mixer: An audio mixer library based on the SDL library
+ Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ This file by Ryan C. Gordon (icculus@icculus.org)
+
+ These are some internally supported special effects that use SDL_mixer's
+ effect callback API. They are meant for speed over quality. :)
+*/
+
+/* $Id$ */
+
+#include "SDL.h"
+#include "SDL_mixer.h"
+#include "SDL_endian.h"
+
+#define __MIX_INTERNAL_EFFECT__
+#include "effects_internal.h"
+
+/* profile code:
+ #include <sys/time.h>
+ #include <unistd.h>
+ struct timeval tv1;
+ struct timeval tv2;
+
+ gettimeofday(&tv1, NULL);
+
+ ... do your thing here ...
+
+ gettimeofday(&tv2, NULL);
+ printf("%ld\n", tv2.tv_usec - tv1.tv_usec);
+*/
+
+
+/*
+ * Positional effects...panning, distance attenuation, etc.
+ */
+
+typedef struct _Eff_positionargs
+{
+ volatile float left_f;
+ volatile float right_f;
+ volatile Uint8 left_u8;
+ volatile Uint8 right_u8;
+ volatile float left_rear_f;
+ volatile float right_rear_f;
+ volatile float center_f;
+ volatile float lfe_f;
+ volatile Uint8 left_rear_u8;
+ volatile Uint8 right_rear_u8;
+ volatile Uint8 center_u8;
+ volatile Uint8 lfe_u8;
+ volatile float distance_f;
+ volatile Uint8 distance_u8;
+ volatile Sint16 room_angle;
+ volatile int in_use;
+ volatile int channels;
+} position_args;
+
+static position_args **pos_args_array = NULL;
+static position_args *pos_args_global = NULL;
+static int position_channels = 0;
+
+void _Eff_PositionDeinit(void)
+{
+ int i;
+ for (i = 0; i < position_channels; i++) {
+ SDL_free(pos_args_array[i]);
+ }
+
+ position_channels = 0;
+
+ SDL_free(pos_args_global);
+ pos_args_global = NULL;
+ SDL_free(pos_args_array);
+ pos_args_array = NULL;
+}
+
+
+/* This just frees up the callback-specific data. */
+static void _Eff_PositionDone(int channel, void *udata)
+{
+ if (channel < 0) {
+ if (pos_args_global != NULL) {
+ SDL_free(pos_args_global);
+ pos_args_global = NULL;
+ }
+ }
+
+ else if (pos_args_array[channel] != NULL) {
+ SDL_free(pos_args_array[channel]);
+ pos_args_array[channel] = NULL;
+ }
+}
+
+
+static void _Eff_position_u8(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint8 *ptr = (Uint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Uint16) != 0) {
+ *ptr = (Uint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ if (args->room_angle == 180)
+ for (i = 0; i < len; i += sizeof (Uint8) * 2) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else for (i = 0; i < len; i += sizeof (Uint8) * 2) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ }
+}
+static void _Eff_position_u8_c4(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint8 *ptr = (Uint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Uint16) != 0) {
+ *ptr = (Uint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ if (args->room_angle == 0)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 90)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 180)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 270)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ }
+}
+
+
+static void _Eff_position_u8_c6(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint8 *ptr = (Uint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Uint16) != 0) {
+ *ptr = (Uint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ if (args->room_angle == 0)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->center_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->lfe_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 90)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f/2) + 128)
+ + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f/2) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->lfe_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 180)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f/2) + 128)
+ + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f/2) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->lfe_f) * args->distance_f) + 128);
+ ptr++;
+ }
+ else if (args->room_angle == 270)
+ for (i = 0; i < len; i += sizeof (Uint8) * 6) {
+ /* must adjust the sample so that 0 is the center */
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_rear_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->right_f) * args->distance_f) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_f) * args->distance_f/2) + 128)
+ + (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->left_rear_f) * args->distance_f/2) + 128);
+ ptr++;
+ *ptr = (Uint8) ((Sint8) ((((float) (Sint8) (*ptr - 128))
+ * args->lfe_f) * args->distance_f) + 128);
+ ptr++;
+ }
+}
+
+
+/*
+ * This one runs about 10.1 times faster than the non-table version, with
+ * no loss in quality. It does, however, require 64k of memory for the
+ * lookup table. Also, this will only update position information once per
+ * call; the non-table version always checks the arguments for each sample,
+ * in case the user has called Mix_SetPanning() or whatnot again while this
+ * callback is running.
+ */
+static void _Eff_position_table_u8(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint8 *ptr = (Uint8 *) stream;
+ Uint32 *p;
+ int i;
+ Uint8 *l = ((Uint8 *) _Eff_volume_table) + (256 * args->left_u8);
+ Uint8 *r = ((Uint8 *) _Eff_volume_table) + (256 * args->right_u8);
+ Uint8 *d = ((Uint8 *) _Eff_volume_table) + (256 * args->distance_u8);
+
+ if (args->room_angle == 180) {
+ Uint8 *temp = l;
+ l = r;
+ r = temp;
+ }
+ /*
+ * if there's only a mono channnel, then l[] and r[] are always
+ * volume 255, and are therefore throwaways. Still, we have to
+ * be sure not to overrun the audio buffer...
+ */
+ while (len % sizeof (Uint32) != 0) {
+ *ptr = d[l[*ptr]];
+ ptr++;
+ if (args->channels > 1) {
+ *ptr = d[r[*ptr]];
+ ptr++;
+ }
+ len -= args->channels;
+ }
+
+ p = (Uint32 *) ptr;
+
+ for (i = 0; i < len; i += sizeof (Uint32)) {
+#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ *p = (d[l[(*p & 0xFF000000) >> 24]] << 24) |
+ (d[r[(*p & 0x00FF0000) >> 16]] << 16) |
+ (d[l[(*p & 0x0000FF00) >> 8]] << 8) |
+ (d[r[(*p & 0x000000FF) ]] ) ;
+#else
+ *p = (d[r[(*p & 0xFF000000) >> 24]] << 24) |
+ (d[l[(*p & 0x00FF0000) >> 16]] << 16) |
+ (d[r[(*p & 0x0000FF00) >> 8]] << 8) |
+ (d[l[(*p & 0x000000FF) ]] ) ;
+#endif
+ ++p;
+ }
+}
+
+
+static void _Eff_position_s8(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint8 *ptr = (Sint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Sint16) != 0) {
+ *ptr = (Sint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ if (args->room_angle == 180)
+ for (i = 0; i < len; i += sizeof (Sint8) * 2) {
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);
+ ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);
+ ptr++;
+ }
+ else
+ for (i = 0; i < len; i += sizeof (Sint8) * 2) {
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f);
+ ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f);
+ ptr++;
+ }
+}
+static void _Eff_position_s8_c4(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint8 *ptr = (Sint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Sint16) != 0) {
+ *ptr = (Sint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ for (i = 0; i < len; i += sizeof (Sint8) * 4) {
+ switch (args->room_angle) {
+ case 0:
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ break;
+ case 90:
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ break;
+ case 180:
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ break;
+ case 270:
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ break;
+ }
+ }
+}
+static void _Eff_position_s8_c6(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint8 *ptr = (Sint8 *) stream;
+ int i;
+
+ /*
+ * if there's only a mono channnel (the only way we wouldn't have
+ * a len divisible by 2 here), then left_f and right_f are always
+ * 1.0, and are therefore throwaways.
+ */
+ if (len % sizeof (Sint16) != 0) {
+ *ptr = (Sint8) (((float) *ptr) * args->distance_f);
+ ptr++;
+ len--;
+ }
+
+ for (i = 0; i < len; i += sizeof (Sint8) * 6) {
+ switch (args->room_angle) {
+ case 0:
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->center_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;
+ break;
+ case 90:
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)
+ + (Sint8)((((float) *ptr) * args->right_f) * args->distance_f / 2); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;
+ break;
+ case 180:
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f / 2)
+ + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;
+ break;
+ case 270:
+ *ptr = (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_rear_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->right_f) * args->distance_f); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->left_f) * args->distance_f / 2)
+ + (Sint8)((((float) *ptr) * args->left_rear_f) * args->distance_f / 2); ptr++;
+ *ptr = (Sint8)((((float) *ptr) * args->lfe_f) * args->distance_f); ptr++;
+ break;
+ }
+ }
+}
+
+
+/*
+ * This one runs about 10.1 times faster than the non-table version, with
+ * no loss in quality. It does, however, require 64k of memory for the
+ * lookup table. Also, this will only update position information once per
+ * call; the non-table version always checks the arguments for each sample,
+ * in case the user has called Mix_SetPanning() or whatnot again while this
+ * callback is running.
+ */
+static void _Eff_position_table_s8(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint8 *ptr = (Sint8 *) stream;
+ Uint32 *p;
+ int i;
+ Sint8 *l = ((Sint8 *) _Eff_volume_table) + (256 * args->left_u8);
+ Sint8 *r = ((Sint8 *) _Eff_volume_table) + (256 * args->right_u8);
+ Sint8 *d = ((Sint8 *) _Eff_volume_table) + (256 * args->distance_u8);
+
+ if (args->room_angle == 180) {
+ Sint8 *temp = l;
+ l = r;
+ r = temp;
+ }
+
+
+ while (len % sizeof (Uint32) != 0) {
+ *ptr = d[l[*ptr]];
+ ptr++;
+ if (args->channels > 1) {
+ *ptr = d[r[*ptr]];
+ ptr++;
+ }
+ len -= args->channels;
+ }
+
+ p = (Uint32 *) ptr;
+
+ for (i = 0; i < len; i += sizeof (Uint32)) {
+#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ *p = (d[l[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |
+ (d[r[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |
+ (d[l[((Sint16)(Sint8)((*p & 0x0000FF00) >> 8))+128]] << 8) |
+ (d[r[((Sint16)(Sint8)((*p & 0x000000FF) ))+128]] ) ;
+#else
+ *p = (d[r[((Sint16)(Sint8)((*p & 0xFF000000) >> 24))+128]] << 24) |
+ (d[l[((Sint16)(Sint8)((*p & 0x00FF0000) >> 16))+128]] << 16) |
+ (d[r[((Sint16)(Sint8)((*p & 0x0000FF00) >> 8))+128]] << 8) |
+ (d[l[((Sint16)(Sint8)((*p & 0x000000FF) ))+128]] ) ;
+#endif
+ ++p;
+ }
+
+
+}
+
+
+/* !!! FIXME : Optimize the code for 16-bit samples? */
+
+static void _Eff_position_u16lsb(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Uint16) * 2) {
+ Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+
+ if (args->room_angle == 180) {
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ }
+ else {
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ }
+ }
+}
+static void _Eff_position_u16lsb_c4(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Uint16) * 4) {
+ Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);
+ Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);
+ Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+ Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)
+ * args->distance_f) + 32768);
+
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ break;
+ case 90:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ break;
+ case 180:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ break;
+ case 270:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ break;
+ }
+ }
+}
+static void _Eff_position_u16lsb_c6(int chan, void *stream, int len, void *udata)
+{
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Uint16) * 6) {
+ Sint16 sampl = (Sint16) (SDL_SwapLE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapLE16(*(ptr+1)) - 32768);
+ Sint16 samplr = (Sint16) (SDL_SwapLE16(*(ptr+2)) - 32768);
+ Sint16 samprr = (Sint16) (SDL_SwapLE16(*(ptr+3)) - 32768);
+ Sint16 sampce = (Sint16) (SDL_SwapLE16(*(ptr+4)) - 32768);
+ Sint16 sampwf = (Sint16) (SDL_SwapLE16(*(ptr+5)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+ Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swapce = (Uint16) ((Sint16) (((float) sampce * args->center_f)
+ * args->distance_f) + 32768);
+ Uint16 swapwf = (Uint16) ((Sint16) (((float) sampwf * args->lfe_f)
+ * args->distance_f) + 32768);
+
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapce);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);
+ break;
+ case 90:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr)/2 + (Uint16) SDL_SwapLE16(swaprr)/2;
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);
+ break;
+ case 180:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);
+ break;
+ case 270:
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapl)/2 + (Uint16) SDL_SwapLE16(swaplr)/2;
+ *(ptr++) = (Uint16) SDL_SwapLE16(swapwf);
+ break;
+ }
+ }
+}
+
+static void _Eff_position_s16lsb(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 2 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+#if 0
+ if (len % (sizeof(Sint16) * 2)) {
+ fprintf(stderr,"Not an even number of frames! len=%d\n", len);
+ return;
+ }
+#endif
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 2) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ if (args->room_angle == 180) {
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ }
+ else {
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ }
+ }
+}
+static void _Eff_position_s16lsb_c4(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 4 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 4) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *
+ args->left_rear_f) * args->distance_f);
+ Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+2))) *
+ args->right_rear_f) * args->distance_f);
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ break;
+ case 90:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ break;
+ case 180:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ break;
+ case 270:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ break;
+ }
+ }
+}
+
+static void _Eff_position_s16lsb_c6(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 6 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 6) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+2))) *
+ args->left_rear_f) * args->distance_f);
+ Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+3))) *
+ args->right_rear_f) * args->distance_f);
+ Sint16 swapce = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+4))) *
+ args->center_f) * args->distance_f);
+ Sint16 swapwf = (Sint16) ((((float) (Sint16) SDL_SwapLE16(*(ptr+5))) *
+ args->lfe_f) * args->distance_f);
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapce);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);
+ break;
+ case 90:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr)/2 + (Sint16) SDL_SwapLE16(swaprr)/2;
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);
+ break;
+ case 180:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr)/2 + (Sint16) SDL_SwapLE16(swaplr)/2;
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);
+ break;
+ case 270:
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapl)/2 + (Sint16) SDL_SwapLE16(swaplr)/2;
+ *(ptr++) = (Sint16) SDL_SwapLE16(swapwf);
+ break;
+ }
+ }
+}
+
+static void _Eff_position_u16msb(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 2 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 2) {
+ Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+
+ if (args->room_angle == 180) {
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ }
+ else {
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ }
+ }
+}
+static void _Eff_position_u16msb_c4(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 4 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 4) {
+ Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);
+ Sint16 samplr = (Sint16) (SDL_SwapBE16(*(ptr+2)) - 32768);
+ Sint16 samprr = (Sint16) (SDL_SwapBE16(*(ptr+3)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+ Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)
+ * args->distance_f) + 32768);
+
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ break;
+ case 90:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ break;
+ case 180:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ break;
+ case 270:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ break;
+ }
+ }
+}
+static void _Eff_position_u16msb_c6(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 6 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Uint16 *ptr = (Uint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 6) {
+ Sint16 sampl = (Sint16) (SDL_SwapBE16(*(ptr+0)) - 32768);
+ Sint16 sampr = (Sint16) (SDL_SwapBE16(*(ptr+1)) - 32768);
+ Sint16 samplr = (Sint16) (SDL_SwapBE16(*(ptr+2)) - 32768);
+ Sint16 samprr = (Sint16) (SDL_SwapBE16(*(ptr+3)) - 32768);
+ Sint16 sampce = (Sint16) (SDL_SwapBE16(*(ptr+4)) - 32768);
+ Sint16 sampwf = (Sint16) (SDL_SwapBE16(*(ptr+5)) - 32768);
+
+ Uint16 swapl = (Uint16) ((Sint16) (((float) sampl * args->left_f)
+ * args->distance_f) + 32768);
+ Uint16 swapr = (Uint16) ((Sint16) (((float) sampr * args->right_f)
+ * args->distance_f) + 32768);
+ Uint16 swaplr = (Uint16) ((Sint16) (((float) samplr * args->left_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swaprr = (Uint16) ((Sint16) (((float) samprr * args->right_rear_f)
+ * args->distance_f) + 32768);
+ Uint16 swapce = (Uint16) ((Sint16) (((float) sampce * args->center_f)
+ * args->distance_f) + 32768);
+ Uint16 swapwf = (Uint16) ((Sint16) (((float) sampwf * args->lfe_f)
+ * args->distance_f) + 32768);
+
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapce);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);
+ break;
+ case 90:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr)/2 + (Uint16) SDL_SwapBE16(swaprr)/2;
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);
+ break;
+ case 180:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr)/2 + (Uint16) SDL_SwapBE16(swaplr)/2;
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);
+ break;
+ case 270:
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapl)/2 + (Uint16) SDL_SwapBE16(swaplr)/2;
+ *(ptr++) = (Uint16) SDL_SwapBE16(swapwf);
+ break;
+ }
+ }
+}
+
+static void _Eff_position_s16msb(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 2 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 2) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ }
+}
+static void _Eff_position_s16msb_c4(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 4 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 4) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+2))) *
+ args->left_rear_f) * args->distance_f);
+ Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+3))) *
+ args->right_rear_f) * args->distance_f);
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ break;
+ case 90:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ break;
+ case 180:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ break;
+ case 270:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ break;
+ }
+ }
+}
+static void _Eff_position_s16msb_c6(int chan, void *stream, int len, void *udata)
+{
+ /* 16 signed bits (lsb) * 6 channels. */
+ volatile position_args *args = (volatile position_args *) udata;
+ Sint16 *ptr = (Sint16 *) stream;
+ int i;
+
+ for (i = 0; i < len; i += sizeof (Sint16) * 6) {
+ Sint16 swapl = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+0))) *
+ args->left_f) * args->distance_f);
+ Sint16 swapr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+1))) *
+ args->right_f) * args->distance_f);
+ Sint16 swaplr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+2))) *
+ args->left_rear_f) * args->distance_f);
+ Sint16 swaprr = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+3))) *
+ args->right_rear_f) * args->distance_f);
+ Sint16 swapce = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+4))) *
+ args->center_f) * args->distance_f);
+ Sint16 swapwf = (Sint16) ((((float) (Sint16) SDL_SwapBE16(*(ptr+5))) *
+ args->lfe_f) * args->distance_f);
+
+ switch (args->room_angle) {
+ case 0:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapce);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);
+ break;
+ case 90:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr)/2 + (Sint16) SDL_SwapBE16(swaprr)/2;
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);
+ break;
+ case 180:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr)/2 + (Sint16) SDL_SwapBE16(swaplr)/2;
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);
+ break;
+ case 270:
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaplr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swaprr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapr);
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapl)/2 + (Sint16) SDL_SwapBE16(swaplr)/2;
+ *(ptr++) = (Sint16) SDL_SwapBE16(swapwf);
+ break;
+ }
+ }
+}
+
+static void init_position_args(position_args *args)
+{
+ memset(args, '\0', sizeof (position_args));
+ args->in_use = 0;
+ args->room_angle = 0;
+ args->left_u8 = args->right_u8 = args->distance_u8 = 255;
+ args->left_f = args->right_f = args->distance_f = 1.0f;
+ args->left_rear_u8 = args->right_rear_u8 = args->center_u8 = args->lfe_u8 = 255;
+ args->left_rear_f = args->right_rear_f = args->center_f = args->lfe_f = 1.0f;
+ Mix_QuerySpec(NULL, NULL, (int *) &args->channels);
+}
+
+
+static position_args *get_position_arg(int channel)
+{
+ void *rc;
+ int i;
+
+ if (channel < 0) {
+ if (pos_args_global == NULL) {
+ pos_args_global = SDL_malloc(sizeof (position_args));
+ if (pos_args_global == NULL) {
+ Mix_SetError("Out of memory");
+ return(NULL);
+ }
+ init_position_args(pos_args_global);
+ }
+
+ return(pos_args_global);
+ }
+
+ if (channel >= position_channels) {
+ rc = SDL_realloc(pos_args_array, (channel + 1) * sizeof (position_args *));
+ if (rc == NULL) {
+ Mix_SetError("Out of memory");
+ return(NULL);
+ }
+ pos_args_array = (position_args **) rc;
+ for (i = position_channels; i <= channel; i++) {
+ pos_args_array[i] = NULL;
+ }
+ position_channels = channel + 1;
+ }
+
+ if (pos_args_array[channel] == NULL) {
+ pos_args_array[channel] = (position_args *)SDL_malloc(sizeof(position_args));
+ if (pos_args_array[channel] == NULL) {
+ Mix_SetError("Out of memory");