From eacc8e27ccbd109beeada7359033818fc9275d50 Mon Sep 17 00:00:00 2001 From: remi-k Date: Tue, 26 Jan 2010 18:09:03 +0000 Subject: [PATCH 01/13] Updated python trunk to SFML 1.6 git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1373 4e206d99-4929-0410-ac5d-dfc041789085 --- python/setup.py | 20 ++++++++++---------- python/src/Joy.cpp | 9 +++++++++ python/src/Mouse.cpp | 3 +++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/python/setup.py b/python/setup.py index 9eed271e..589cff29 100644 --- a/python/setup.py +++ b/python/setup.py @@ -10,16 +10,16 @@ setup(name='PySFML', author_email='remi.k2620@gmail.com', url='http://www.sfml-dev.org/', license='zlib/png', - ext_modules=[ Extension('PySFML.sf', \ - ['src/Clock.cpp', 'src/Color.cpp', 'src/Drawable.cpp', \ - 'src/Event.cpp', 'src/Image.cpp', 'src/Input.cpp', 'src/Key.cpp', 'src/main.cpp', 'src/Music.cpp', \ - 'src/PostFX.cpp', 'src/Rect.cpp', 'src/RenderWindow.cpp', 'src/Sleep.cpp', \ - 'src/Sprite.cpp', 'src/String.cpp', 'src/VideoMode.cpp', 'src/View.cpp', 'src/Window.cpp', \ - 'src/Joy.cpp', 'src/Mouse.cpp', 'src/WindowStyle.cpp', 'src/Blend.cpp', 'src/Sound.cpp', \ - 'src/SoundBuffer.cpp', 'src/Listener.cpp', 'src/SoundRecorder.cpp', 'src/SoundBufferRecorder.cpp', \ - 'src/SoundStream.cpp', 'src/Font.cpp', 'src/Glyph.cpp', 'src/Shape.cpp', 'src/WindowSettings.cpp' ], \ - libraries=['sfml-graphics', 'sfml-window', 'sfml-audio', 'sfml-system'], \ - library_dirs=['../lib/mingw'], \ + ext_modules=[ Extension('PySFML.sf', + ['src/Clock.cpp', 'src/Color.cpp', 'src/Drawable.cpp', + 'src/Event.cpp', 'src/Image.cpp', 'src/Input.cpp', 'src/Key.cpp', 'src/main.cpp', 'src/Music.cpp', + 'src/PostFX.cpp', 'src/Rect.cpp', 'src/RenderWindow.cpp', 'src/Sleep.cpp', + 'src/Sprite.cpp', 'src/String.cpp', 'src/VideoMode.cpp', 'src/View.cpp', 'src/Window.cpp', + 'src/Joy.cpp', 'src/Mouse.cpp', 'src/WindowStyle.cpp', 'src/Blend.cpp', 'src/Sound.cpp', + 'src/SoundBuffer.cpp', 'src/Listener.cpp', 'src/SoundRecorder.cpp', 'src/SoundBufferRecorder.cpp', + 'src/SoundStream.cpp', 'src/Font.cpp', 'src/Glyph.cpp', 'src/Shape.cpp', 'src/WindowSettings.cpp'], + libraries=['sfml-graphics', 'sfml-window', 'sfml-audio', 'sfml-system'], + library_dirs=['../lib/mingw'], include_dirs=['../include'] )], package_dir = {'PySFML':'PySFML'}, diff --git a/python/src/Joy.cpp b/python/src/Joy.cpp index 7f20f68f..fdce88c6 100644 --- a/python/src/Joy.cpp +++ b/python/src/Joy.cpp @@ -101,5 +101,14 @@ void PySfJoy_InitConst() obj = PyLong_FromLong(sf::Joy::AxisPOV); PyDict_SetItemString(PySfJoyType.tp_dict, "AxisPOV", obj); Py_DECREF(obj); + obj = PyLong_FromLong(sf::Joy::Count); + PyDict_SetItemString(PySfJoyType.tp_dict, "Count", obj); + Py_DECREF(obj); + obj = PyLong_FromLong(sf::Joy::AxisCount); + PyDict_SetItemString(PySfJoyType.tp_dict, "AxisCount", obj); + Py_DECREF(obj); + obj = PyLong_FromLong(sf::Joy::ButtonCount); + PyDict_SetItemString(PySfJoyType.tp_dict, "ButtonCount", obj); + Py_DECREF(obj); } diff --git a/python/src/Mouse.cpp b/python/src/Mouse.cpp index d0165efc..f2fe2097 100644 --- a/python/src/Mouse.cpp +++ b/python/src/Mouse.cpp @@ -95,5 +95,8 @@ void PySfMouse_InitConst() obj = PyLong_FromLong(sf::Mouse::XButton2); PyDict_SetItemString(PySfMouseType.tp_dict, "XButton2", obj); Py_DECREF(obj); + obj = PyLong_FromLong(sf::Mouse::ButtonCount); + PyDict_SetItemString(PySfMouseType.tp_dict, "ButtonCount", obj); + Py_DECREF(obj); } From 35f6fa2060c14dcbea26242193a168d036bb5abf Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Wed, 27 Jan 2010 13:43:28 +0000 Subject: [PATCH 02/13] Fixed wrong paths for headers in VC2008 project files git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1374 4e206d99-4929-0410-ac5d-dfc041789085 --- build/vc2008/sfml-network.vcproj | 20 +- build/vc2008/sfml-system.vcproj | 34 +- src/SFML/Audio/stb_vorbis/stb_vorbis.c | 10076 +++++++++++------------ 3 files changed, 5075 insertions(+), 5055 deletions(-) diff --git a/build/vc2008/sfml-network.vcproj b/build/vc2008/sfml-network.vcproj index ddf91d78..859a95ae 100644 --- a/build/vc2008/sfml-network.vcproj +++ b/build/vc2008/sfml-network.vcproj @@ -347,7 +347,7 @@ > @@ -372,7 +372,7 @@ > + + diff --git a/build/vc2008/sfml-system.vcproj b/build/vc2008/sfml-system.vcproj index 413d8a45..4eb92c00 100644 --- a/build/vc2008/sfml-system.vcproj +++ b/build/vc2008/sfml-system.vcproj @@ -343,7 +343,7 @@ > @@ -368,7 +368,7 @@ > + + + + + + + + diff --git a/src/SFML/Audio/stb_vorbis/stb_vorbis.c b/src/SFML/Audio/stb_vorbis/stb_vorbis.c index e34405f8..902761a8 100755 --- a/src/SFML/Audio/stb_vorbis/stb_vorbis.c +++ b/src/SFML/Audio/stb_vorbis/stb_vorbis.c @@ -1,5039 +1,5039 @@ -// Ogg Vorbis I audio decoder -- version 0.99994 -// -// Written in April 2007 by Sean Barrett, sponsored by RAD Game Tools. -// -// Placed in the public domain April 2007 by the author: no copyright is -// claimed, and you may use it for any purpose you like. -// -// No warranty for any purpose is expressed or implied by the author (nor -// by RAD Game Tools). Report bugs and send enhancements to the author. -// -// Get the latest version and other information at: -// http://nothings.org/stb_vorbis/ - - -// Todo: -// -// - seeking (note you can seek yourself using the pushdata API) -// -// Limitations: -// -// - floor 0 not supported (used in old ogg vorbis files) -// - lossless sample-truncation at beginning ignored -// - cannot concatenate multiple vorbis streams -// - sample positions are 32-bit, limiting seekable 192Khz -// files to around 6 hours (Ogg supports 64-bit) -// -// All of these limitations may be removed in future versions. - -#include "stb_vorbis.h" - -#ifndef STB_VORBIS_HEADER_ONLY - -// global configuration settings (e.g. set these in the project/makefile), -// or just set them in this file at the top (although ideally the first few -// should be visible when the header file is compiled too, although it's not -// crucial) - -// STB_VORBIS_NO_PUSHDATA_API -// does not compile the code for the various stb_vorbis_*_pushdata() -// functions -// #define STB_VORBIS_NO_PUSHDATA_API - -// STB_VORBIS_NO_PULLDATA_API -// does not compile the code for the non-pushdata APIs -// #define STB_VORBIS_NO_PULLDATA_API - -// STB_VORBIS_NO_STDIO -// does not compile the code for the APIs that use FILE *s internally -// or externally (implied by STB_VORBIS_NO_PULLDATA_API) -// #define STB_VORBIS_NO_STDIO - -// STB_VORBIS_NO_INTEGER_CONVERSION -// does not compile the code for converting audio sample data from -// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) -// #define STB_VORBIS_NO_INTEGER_CONVERSION - -// STB_VORBIS_NO_FAST_SCALED_FLOAT -// does not use a fast float-to-int trick to accelerate float-to-int on -// most platforms which requires endianness be defined correctly. -#define STB_VORBIS_NO_FAST_SCALED_FLOAT - - -// STB_VORBIS_MAX_CHANNELS [number] -// globally define this to the maximum number of channels you need. -// The spec does not put a restriction on channels except that -// the count is stored in a byte, so 255 is the hard limit. -// Reducing this saves about 16 bytes per value, so using 16 saves -// (255-16)*16 or around 4KB. Plus anything other memory usage -// I forgot to account for. Can probably go as low as 8 (7.1 audio), -// 6 (5.1 audio), or 2 (stereo only). -#ifndef STB_VORBIS_MAX_CHANNELS -#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? -#endif - -// STB_VORBIS_PUSHDATA_CRC_COUNT [number] -// after a flush_pushdata(), stb_vorbis begins scanning for the -// next valid page, without backtracking. when it finds something -// that looks like a page, it streams through it and verifies its -// CRC32. Should that validation fail, it keeps scanning. But it's -// possible that _while_ streaming through to check the CRC32 of -// one candidate page, it sees another candidate page. This #define -// determines how many "overlapping" candidate pages it can search -// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas -// garbage pages could be as big as 64KB, but probably average ~16KB. -// So don't hose ourselves by scanning an apparent 64KB page and -// missing a ton of real ones in the interim; so minimum of 2 -#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT -#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 -#endif - -// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] -// sets the log size of the huffman-acceleration table. Maximum -// supported value is 24. with larger numbers, more decodings are O(1), -// but the table size is larger so worse cache missing, so you'll have -// to probe (and try multiple ogg vorbis files) to find the sweet spot. -#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH -#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 -#endif - -// STB_VORBIS_FAST_BINARY_LENGTH [number] -// sets the log size of the binary-search acceleration table. this -// is used in similar fashion to the fast-huffman size to set initial -// parameters for the binary search - -// STB_VORBIS_FAST_HUFFMAN_INT -// The fast huffman tables are much more efficient if they can be -// stored as 16-bit results instead of 32-bit results. This restricts -// the codebooks to having only 65535 possible outcomes, though. -// (At least, accelerated by the huffman table.) -#ifndef STB_VORBIS_FAST_HUFFMAN_INT -#define STB_VORBIS_FAST_HUFFMAN_SHORT -#endif - -// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH -// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls -// back on binary searching for the correct one. This requires storing -// extra tables with the huffman codes in sorted order. Defining this -// symbol trades off space for speed by forcing a linear search in the -// non-fast case, except for "sparse" codebooks. -// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH - -// STB_VORBIS_DIVIDES_IN_RESIDUE -// stb_vorbis precomputes the result of the scalar residue decoding -// that would otherwise require a divide per chunk. you can trade off -// space for time by defining this symbol. -// #define STB_VORBIS_DIVIDES_IN_RESIDUE - -// STB_VORBIS_DIVIDES_IN_CODEBOOK -// vorbis VQ codebooks can be encoded two ways: with every case explicitly -// stored, or with all elements being chosen from a small range of values, -// and all values possible in all elements. By default, stb_vorbis expands -// this latter kind out to look like the former kind for ease of decoding, -// because otherwise an integer divide-per-vector-element is required to -// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can -// trade off storage for speed. -//#define STB_VORBIS_DIVIDES_IN_CODEBOOK - -// STB_VORBIS_CODEBOOK_SHORTS -// The vorbis file format encodes VQ codebook floats as ax+b where a and -// b are floating point per-codebook constants, and x is a 16-bit int. -// Normally, stb_vorbis decodes them to floats rather than leaving them -// as 16-bit ints and computing ax+b while decoding. This is a speed/space -// tradeoff; you can save space by defining this flag. -#ifndef STB_VORBIS_CODEBOOK_SHORTS -#define STB_VORBIS_CODEBOOK_FLOATS -#endif - -// STB_VORBIS_DIVIDE_TABLE -// this replaces small integer divides in the floor decode loop with -// table lookups. made less than 1% difference, so disabled by default. - -// STB_VORBIS_NO_INLINE_DECODE -// disables the inlining of the scalar codebook fast-huffman decode. -// might save a little codespace; useful for debugging -// #define STB_VORBIS_NO_INLINE_DECODE - -// STB_VORBIS_NO_DEFER_FLOOR -// Normally we only decode the floor without synthesizing the actual -// full curve. We can instead synthesize the curve immediately. This -// requires more memory and is very likely slower, so I don't think -// you'd ever want to do it except for debugging. -// #define STB_VORBIS_NO_DEFER_FLOOR - - - - -////////////////////////////////////////////////////////////////////////////// - -#ifdef STB_VORBIS_NO_PULLDATA_API - #define STB_VORBIS_NO_INTEGER_CONVERSION - #define STB_VORBIS_NO_STDIO -#endif - -#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) - #define STB_VORBIS_NO_STDIO 1 -#endif - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT - - // only need endianness for fast-float-to-int, which we don't - // use for pushdata - - #ifndef STB_VORBIS_BIG_ENDIAN - #define STB_VORBIS_ENDIAN 0 - #else - #define STB_VORBIS_ENDIAN 1 - #endif - -#endif -#endif - - -#ifndef STB_VORBIS_NO_STDIO -#include -#endif - -#ifndef STB_VORBIS_NO_CRT -#include -#include -#include -#include - -#if !defined(__APPLE__) && !defined(MACOSX) && !defined(macintosh) && !defined(Macintosh) &&!defined(__FreeBSD__) -#include -#endif - -#else -#define NULL 0 -#endif - -#ifndef _MSC_VER - #if __GNUC__ - #define __forceinline inline - #else - #define __forceinline - #endif -#endif - -#if STB_VORBIS_MAX_CHANNELS > 256 -#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" -#endif - -#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 -#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" -#endif - - -#define MAX_BLOCKSIZE_LOG 13 // from specification -#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) - - -typedef unsigned char uint8; -typedef signed char int8; -typedef unsigned short uint16; -typedef signed short int16; -typedef unsigned int uint32; -typedef signed int int32; - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#ifdef STB_VORBIS_CODEBOOK_FLOATS -typedef float codetype; -#else -typedef uint16 codetype; -#endif - -// @NOTE -// -// Some arrays below are tagged "//varies", which means it's actually -// a variable-sized piece of data, but rather than malloc I assume it's -// small enough it's better to just allocate it all together with the -// main thing -// -// Most of the variables are specified with the smallest size I could pack -// them into. It might give better performance to make them all full-sized -// integers. It should be safe to freely rearrange the structures or change -// the sizes larger--nothing relies on silently truncating etc., nor the -// order of variables. - -#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) -#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) - -typedef struct -{ - int dimensions, entries; - uint8 *codeword_lengths; - float minimum_value; - float delta_value; - uint8 value_bits; - uint8 lookup_type; - uint8 sequence_p; - uint8 sparse; - uint32 lookup_values; - codetype *multiplicands; - uint32 *codewords; - #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT - int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; - #else - int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; - #endif - uint32 *sorted_codewords; - int *sorted_values; - int sorted_entries; -} Codebook; - -typedef struct -{ - uint8 order; - uint16 rate; - uint16 bark_map_size; - uint8 amplitude_bits; - uint8 amplitude_offset; - uint8 number_of_books; - uint8 book_list[16]; // varies -} Floor0; - -typedef struct -{ - uint8 partitions; - uint8 partition_class_list[32]; // varies - uint8 class_dimensions[16]; // varies - uint8 class_subclasses[16]; // varies - uint8 class_masterbooks[16]; // varies - int16 subclass_books[16][8]; // varies - uint16 Xlist[31*8+2]; // varies - uint8 sorted_order[31*8+2]; - uint8 neighbors[31*8+2][2]; - uint8 floor1_multiplier; - uint8 rangebits; - int values; -} Floor1; - -typedef union -{ - Floor0 floor0; - Floor1 floor1; -} Floor; - -typedef struct -{ - uint32 begin, end; - uint32 part_size; - uint8 classifications; - uint8 classbook; - uint8 **classdata; - int16 (*residue_books)[8]; -} Residue; - -typedef struct -{ - uint8 magnitude; - uint8 angle; - uint8 mux; -} MappingChannel; - -typedef struct -{ - uint16 coupling_steps; - MappingChannel *chan; - uint8 submaps; - uint8 submap_floor[15]; // varies - uint8 submap_residue[15]; // varies -} Mapping; - -typedef struct -{ - uint8 blockflag; - uint8 mapping; - uint16 windowtype; - uint16 transformtype; -} Mode; - -typedef struct -{ - uint32 goal_crc; // expected crc if match - int bytes_left; // bytes left in packet - uint32 crc_so_far; // running crc - int bytes_done; // bytes processed in _current_ chunk - uint32 sample_loc; // granule pos encoded in page -} CRCscan; - -typedef struct -{ - uint32 page_start, page_end; - uint32 after_previous_page_start; - uint32 first_decoded_sample; - uint32 last_decoded_sample; -} ProbedPage; - -struct stb_vorbis -{ - // user-accessible info - unsigned int sample_rate; - int channels; - - unsigned int setup_memory_required; - unsigned int temp_memory_required; - unsigned int setup_temp_memory_required; - - // input config -#ifndef STB_VORBIS_NO_STDIO - FILE *f; - uint32 f_start; - int close_on_free; -#endif - - uint8 *stream; - uint8 *stream_start; - uint8 *stream_end; - - uint32 stream_len; - - uint8 push_mode; - - uint32 first_audio_page_offset; - - ProbedPage p_first, p_last; - - // memory management - stb_vorbis_alloc alloc; - int setup_offset; - int temp_offset; - - // run-time results - int eof; - enum STBVorbisError error; - - // user-useful data - - // header info - int blocksize[2]; - int blocksize_0, blocksize_1; - int codebook_count; - Codebook *codebooks; - int floor_count; - uint16 floor_types[64]; // varies - Floor *floor_config; - int residue_count; - uint16 residue_types[64]; // varies - Residue *residue_config; - int mapping_count; - Mapping *mapping; - int mode_count; - Mode mode_config[64]; // varies - - uint32 total_samples; - - // decode buffer - float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; - float *outputs [STB_VORBIS_MAX_CHANNELS]; - - float *previous_window[STB_VORBIS_MAX_CHANNELS]; - int previous_length; - - #ifndef STB_VORBIS_NO_DEFER_FLOOR - int16 *finalY[STB_VORBIS_MAX_CHANNELS]; - #else - float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; - #endif - - uint32 current_loc; // sample location of next frame to decode - int current_loc_valid; - - // per-blocksize precomputed data - - // twiddle factors - float *A[2],*B[2],*C[2]; - float *window[2]; - uint16 *bit_reverse[2]; - - // current page/packet/segment streaming info - uint32 serial; // stream serial number for verification - int last_page; - int segment_count; - uint8 segments[255]; - uint8 page_flag; - uint8 bytes_in_seg; - uint8 first_decode; - int next_seg; - int last_seg; // flag that we're on the last segment - int last_seg_which; // what was the segment number of the last seg? - uint32 acc; - int valid_bits; - int packet_bytes; - int end_seg_with_known_loc; - uint32 known_loc_for_packet; - int discard_samples_deferred; - uint32 samples_output; - - // push mode scanning - int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching -#ifndef STB_VORBIS_NO_PUSHDATA_API - CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; -#endif - - // sample-access - int channel_buffer_start; - int channel_buffer_end; -}; - -extern int my_prof(int slot); -//#define stb_prof my_prof - -#ifndef stb_prof -#define stb_prof(x) 0 -#endif - -#if defined(STB_VORBIS_NO_PUSHDATA_API) - #define IS_PUSH_MODE(f) FALSE -#elif defined(STB_VORBIS_NO_PULLDATA_API) - #define IS_PUSH_MODE(f) TRUE -#else - #define IS_PUSH_MODE(f) ((f)->push_mode) -#endif - -typedef struct stb_vorbis vorb; - -static int error(vorb *f, enum STBVorbisError e) -{ - f->error = e; - if (!f->eof && e != VORBIS_need_more_data) { - f->error=e; // breakpoint for debugging - } - return 0; -} - - -// these functions are used for allocating temporary memory -// while decoding. if you can afford the stack space, use -// alloca(); otherwise, provide a temp buffer and it will -// allocate out of those. - -#define array_size_required(count,size) (count*(sizeof(void *)+(size))) - -#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) -#ifdef dealloca -#define temp_free(f,p) (f->alloc.alloc_buffer ? 0 : dealloca(size)) -#else -#define temp_free(f,p) 0 -#endif -#define temp_alloc_save(f) ((f)->temp_offset) -#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) - -#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) - -// given a sufficiently large block of memory, make an array of pointers to subblocks of it -static void *make_block_array(void *mem, int count, int size) -{ - int i; - void ** p = (void **) mem; - char *q = (char *) (p + count); - for (i=0; i < count; ++i) { - p[i] = q; - q += size; - } - return p; -} - -static void *setup_malloc(vorb *f, int sz) -{ - sz = (sz+3) & ~3; - f->setup_memory_required += sz; - if (f->alloc.alloc_buffer) { - void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; - if (f->setup_offset + sz > f->temp_offset) return NULL; - f->setup_offset += sz; - return p; - } - return sz ? malloc(sz) : NULL; -} - -static void setup_free(vorb *f, void *p) -{ - if (f->alloc.alloc_buffer) return; // do nothing; setup mem is not a stack - free(p); -} - -static void *setup_temp_malloc(vorb *f, int sz) -{ - sz = (sz+3) & ~3; - if (f->alloc.alloc_buffer) { - if (f->temp_offset - sz < f->setup_offset) return NULL; - f->temp_offset -= sz; - return (char *) f->alloc.alloc_buffer + f->temp_offset; - } - return malloc(sz); -} - -static void setup_temp_free(vorb *f, void *p, size_t sz) -{ - if (f->alloc.alloc_buffer) { - f->temp_offset += (sz+3)&~3; - return; - } - free(p); -} - -#define CRC32_POLY 0x04c11db7 // from spec - -static uint32 crc_table[256]; -static void crc32_init(void) -{ - int i,j; - uint32 s; - for(i=0; i < 256; i++) { - for (s=i<<24, j=0; j < 8; ++j) - s = (s << 1) ^ (s >= (1<<31) ? CRC32_POLY : 0); - crc_table[i] = s; - } -} - -static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) -{ - return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; -} - - -// used in setup, and for huffman that doesn't go fast path -static unsigned int bit_reverse(unsigned int n) -{ - n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); - n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); - n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); - n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); - return (n >> 16) | (n << 16); -} - -static float square(float x) -{ - return x*x; -} - -// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 -// as required by the specification. fast(?) implementation from stb.h -// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup -static int ilog(int32 n) -{ - static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; - - // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) - if (n < (1U << 14)) - if (n < (1U << 4)) return 0 + log2_4[n ]; - else if (n < (1U << 9)) return 5 + log2_4[n >> 5]; - else return 10 + log2_4[n >> 10]; - else if (n < (1U << 24)) - if (n < (1U << 19)) return 15 + log2_4[n >> 15]; - else return 20 + log2_4[n >> 20]; - else if (n < (1U << 29)) return 25 + log2_4[n >> 25]; - else if (n < (1U << 31)) return 30 + log2_4[n >> 30]; - else return 0; // signed n returns 0 -} - -#ifndef M_PI - #define M_PI 3.14159265358979323846264f // from CRC -#endif - -// code length assigned to a value with no huffman encoding -#define NO_CODE 255 - -/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// -// -// these functions are only called at setup, and only a few times -// per file - -static float float32_unpack(uint32 x) -{ - // from the specification - uint32 mantissa = x & 0x1fffff; - uint32 sign = x & 0x80000000; - uint32 exp = (x & 0x7fe00000) >> 21; - double res = sign ? -(double)mantissa : (double)mantissa; - return (float) ldexp((float)res, exp-788); -} - - -// zlib & jpeg huffman tables assume that the output symbols -// can either be arbitrarily arranged, or have monotonically -// increasing frequencies--they rely on the lengths being sorted; -// this makes for a very simple generation algorithm. -// vorbis allows a huffman table with non-sorted lengths. This -// requires a more sophisticated construction, since symbols in -// order do not map to huffman codes "in order". -static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) -{ - if (!c->sparse) { - c->codewords [symbol] = huff_code; - } else { - c->codewords [count] = huff_code; - c->codeword_lengths[count] = len; - values [count] = symbol; - } -} - -static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) -{ - int i,k,m=0; - uint32 available[32]; - - memset(available, 0, sizeof(available)); - // find the first entry - for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; - if (k == n) { assert(c->sorted_entries == 0); return TRUE; } - // add to the list - add_entry(c, 0, k, m++, len[k], values); - // add all available leaves - for (i=1; i <= len[k]; ++i) - available[i] = 1 << (32-i); - // note that the above code treats the first case specially, - // but it's really the same as the following code, so they - // could probably be combined (except the initial code is 0, - // and I use 0 in available[] to mean 'empty') - for (i=k+1; i < n; ++i) { - uint32 res; - int z = len[i], y; - if (z == NO_CODE) continue; - // find lowest available leaf (should always be earliest, - // which is what the specification calls for) - // note that this property, and the fact we can never have - // more than one free leaf at a given level, isn't totally - // trivial to prove, but it seems true and the assert never - // fires, so! - while (z > 0 && !available[z]) --z; - if (z == 0) { assert(0); return FALSE; } - res = available[z]; - available[z] = 0; - add_entry(c, bit_reverse(res), i, m++, len[i], values); - // propogate availability up the tree - if (z != len[i]) { - for (y=len[i]; y > z; --y) { - assert(available[y] == 0); - available[y] = res + (1 << (32-y)); - } - } - } - return TRUE; -} - -// accelerated huffman table allows fast O(1) match of all symbols -// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH -static void compute_accelerated_huffman(Codebook *c) -{ - int i, len; - for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) - c->fast_huffman[i] = -1; - - len = c->sparse ? c->sorted_entries : c->entries; - #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT - if (len > 32767) len = 32767; // largest possible value we can encode! - #endif - for (i=0; i < len; ++i) { - if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { - uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; - // set table entries for all bit combinations in the higher bits - while (z < FAST_HUFFMAN_TABLE_SIZE) { - c->fast_huffman[z] = i; - z += 1 << c->codeword_lengths[i]; - } - } - } -} - -static int uint32_compare(const void *p, const void *q) -{ - uint32 x = * (uint32 *) p; - uint32 y = * (uint32 *) q; - return x < y ? -1 : x > y; -} - -static int include_in_sort(Codebook *c, uint8 len) -{ - if (c->sparse) { assert(len != NO_CODE); return TRUE; } - if (len == NO_CODE) return FALSE; - if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; - return FALSE; -} - -// if the fast table above doesn't work, we want to binary -// search them... need to reverse the bits -static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) -{ - int i, len; - // build a list of all the entries - // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. - // this is kind of a frivolous optimization--I don't see any performance improvement, - // but it's like 4 extra lines of code, so. - if (!c->sparse) { - int k = 0; - for (i=0; i < c->entries; ++i) - if (include_in_sort(c, lengths[i])) - c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); - assert(k == c->sorted_entries); - } else { - for (i=0; i < c->sorted_entries; ++i) - c->sorted_codewords[i] = bit_reverse(c->codewords[i]); - } - - qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); - c->sorted_codewords[c->sorted_entries] = 0xffffffff; - - len = c->sparse ? c->sorted_entries : c->entries; - // now we need to indicate how they correspond; we could either - // #1: sort a different data structure that says who they correspond to - // #2: for each sorted entry, search the original list to find who corresponds - // #3: for each original entry, find the sorted entry - // #1 requires extra storage, #2 is slow, #3 can use binary search! - for (i=0; i < len; ++i) { - int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; - if (include_in_sort(c,huff_len)) { - uint32 code = bit_reverse(c->codewords[i]); - int x=0, n=c->sorted_entries; - while (n > 1) { - // invariant: sc[x] <= code < sc[x+n] - int m = x + (n >> 1); - if (c->sorted_codewords[m] <= code) { - x = m; - n -= (n>>1); - } else { - n >>= 1; - } - } - assert(c->sorted_codewords[x] == code); - if (c->sparse) { - c->sorted_values[x] = values[i]; - c->codeword_lengths[x] = huff_len; - } else { - c->sorted_values[x] = i; - } - } - } -} - -// only run while parsing the header (3 times) -static int vorbis_validate(uint8 *data) -{ - static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; - return memcmp(data, vorbis, 6) == 0; -} - -// called from setup only, once per code book -// (formula implied by specification) -static int lookup1_values(int entries, int dim) -{ - int r = (int) floor(exp((float) log((float) entries) / dim)); - if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; - ++r; // floor() to avoid _ftol() when non-CRT - assert(pow((float) r+1, dim) > entries); - assert((int) floor(pow((float) r, dim)) <= entries); // (int),floor() as above - return r; -} - -// called twice per file -static void compute_twiddle_factors(int n, float *A, float *B, float *C) -{ - int n4 = n >> 2, n8 = n >> 3; - int k,k2; - - for (k=k2=0; k < n4; ++k,k2+=2) { - A[k2 ] = (float) cos(4*k*M_PI/n); - A[k2+1] = (float) -sin(4*k*M_PI/n); - B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; - B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; - } - for (k=k2=0; k < n8; ++k,k2+=2) { - C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); - C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); - } -} - -static void compute_window(int n, float *window) -{ - int n2 = n >> 1, i; - for (i=0; i < n2; ++i) - window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); -} - -static void compute_bitreverse(int n, uint16 *rev) -{ - int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - int i, n8 = n >> 3; - for (i=0; i < n8; ++i) - rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; -} - -static int init_blocksize(vorb *f, int b, int n) -{ - int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; - f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); - f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); - f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); - if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); - compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); - f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); - if (!f->window[b]) return error(f, VORBIS_outofmem); - compute_window(n, f->window[b]); - f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); - if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); - compute_bitreverse(n, f->bit_reverse[b]); - return TRUE; -} - -static void neighbors(uint16 *x, int n, int *plow, int *phigh) -{ - int low = -1; - int high = 65536; - int i; - for (i=0; i < n; ++i) { - if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } - if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } - } -} - -// this has been repurposed so y is now the original index instead of y -typedef struct -{ - uint16 x,y; -} Point; - -int point_compare(const void *p, const void *q) -{ - Point *a = (Point *) p; - Point *b = (Point *) q; - return a->x < b->x ? -1 : a->x > b->x; -} - -// -/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// - - -#if defined(STB_VORBIS_NO_STDIO) - #define USE_MEMORY(z) TRUE -#else - #define USE_MEMORY(z) ((z)->stream) -#endif - -static uint8 get8(vorb *z) -{ - if (USE_MEMORY(z)) { - if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } - return *z->stream++; - } - - #ifndef STB_VORBIS_NO_STDIO - { - int c = fgetc(z->f); - if (c == EOF) { z->eof = TRUE; return 0; } - return c; - } - #endif -} - -static uint32 get32(vorb *f) -{ - uint32 x; - x = get8(f); - x += get8(f) << 8; - x += get8(f) << 16; - x += get8(f) << 24; - return x; -} - -static int getn(vorb *z, uint8 *data, int n) -{ - if (USE_MEMORY(z)) { - if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } - memcpy(data, z->stream, n); - z->stream += n; - return 1; - } - - #ifndef STB_VORBIS_NO_STDIO - if (fread(data, n, 1, z->f) == 1) - return 1; - else { - z->eof = 1; - return 0; - } - #endif -} - -static void skip(vorb *z, int n) -{ - if (USE_MEMORY(z)) { - z->stream += n; - if (z->stream >= z->stream_end) z->eof = 1; - return; - } - #ifndef STB_VORBIS_NO_STDIO - { - long x = ftell(z->f); - fseek(z->f, x+n, SEEK_SET); - } - #endif -} - -static int set_file_offset(stb_vorbis *f, unsigned int loc) -{ - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (f->push_mode) return 0; - #endif - f->eof = 0; - if (USE_MEMORY(f)) { - if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { - f->stream = f->stream_end; - f->eof = 1; - return 0; - } else { - f->stream = f->stream_start + loc; - return 1; - } - } - #ifndef STB_VORBIS_NO_STDIO - if (loc + f->f_start < loc || loc >= 0x80000000) { - loc = 0x7fffffff; - f->eof = 1; - } else { - loc += f->f_start; - } - if (!fseek(f->f, loc, SEEK_SET)) - return 1; - f->eof = 1; - fseek(f->f, f->f_start, SEEK_END); - return 0; - #endif -} - - -static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; - -static int capture_pattern(vorb *f) -{ - if (0x4f != get8(f)) return FALSE; - if (0x67 != get8(f)) return FALSE; - if (0x67 != get8(f)) return FALSE; - if (0x53 != get8(f)) return FALSE; - return TRUE; -} - -#define PAGEFLAG_continued_packet 1 -#define PAGEFLAG_first_page 2 -#define PAGEFLAG_last_page 4 - -static int start_page_no_capturepattern(vorb *f) -{ - uint32 loc0,loc1,n,i; - // stream structure version - if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); - // header flag - f->page_flag = get8(f); - // absolute granule position - loc0 = get32(f); - loc1 = get32(f); - // @TODO: validate loc0,loc1 as valid positions? - // stream serial number -- vorbis doesn't interleave, so discard - get32(f); - //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); - // page sequence number - n = get32(f); - f->last_page = n; - // CRC32 - get32(f); - // page_segments - f->segment_count = get8(f); - if (!getn(f, f->segments, f->segment_count)) - return error(f, VORBIS_unexpected_eof); - // assume we _don't_ know any the sample position of any segments - f->end_seg_with_known_loc = -2; - if (loc0 != ~0 || loc1 != ~0) { - // determine which packet is the last one that will complete - for (i=f->segment_count-1; i >= 0; --i) - if (f->segments[i] < 255) - break; - // 'i' is now the index of the _last_ segment of a packet that ends - if (i >= 0) { - f->end_seg_with_known_loc = i; - f->known_loc_for_packet = loc0; - } - } - if (f->first_decode) { - int i,len; - ProbedPage p; - len = 0; - for (i=0; i < f->segment_count; ++i) - len += f->segments[i]; - len += 27 + f->segment_count; - p.page_start = f->first_audio_page_offset; - p.page_end = p.page_start + len; - p.after_previous_page_start = p.page_start; - p.first_decoded_sample = 0; - p.last_decoded_sample = loc0; - f->p_first = p; - } - f->next_seg = 0; - return TRUE; -} - -static int start_page(vorb *f) -{ - if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); - return start_page_no_capturepattern(f); -} - -static int start_packet(vorb *f) -{ - while (f->next_seg == -1) { - if (!start_page(f)) return FALSE; - if (f->page_flag & PAGEFLAG_continued_packet) - return error(f, VORBIS_continued_packet_flag_invalid); - } - f->last_seg = FALSE; - f->valid_bits = 0; - f->packet_bytes = 0; - f->bytes_in_seg = 0; - // f->next_seg is now valid - return TRUE; -} - -static int maybe_start_packet(vorb *f) -{ - if (f->next_seg == -1) { - int x = get8(f); - if (f->eof) return FALSE; // EOF at page boundary is not an error! - if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); - if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (!start_page_no_capturepattern(f)) return FALSE; - if (f->page_flag & PAGEFLAG_continued_packet) { - // set up enough state that we can read this packet if we want, - // e.g. during recovery - f->last_seg = FALSE; - f->bytes_in_seg = 0; - return error(f, VORBIS_continued_packet_flag_invalid); - } - } - return start_packet(f); -} - -static int next_segment(vorb *f) -{ - int len; - if (f->last_seg) return 0; - if (f->next_seg == -1) { - f->last_seg_which = f->segment_count-1; // in case start_page fails - if (!start_page(f)) { f->last_seg = 1; return 0; } - if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); - } - len = f->segments[f->next_seg++]; - if (len < 255) { - f->last_seg = TRUE; - f->last_seg_which = f->next_seg-1; - } - if (f->next_seg >= f->segment_count) - f->next_seg = -1; - assert(f->bytes_in_seg == 0); - f->bytes_in_seg = len; - return len; -} - -#define EOP (-1) -#define INVALID_BITS (-1) - -static int get8_packet_raw(vorb *f) -{ - if (!f->bytes_in_seg) - if (f->last_seg) return EOP; - else if (!next_segment(f)) return EOP; - assert(f->bytes_in_seg > 0); - --f->bytes_in_seg; - ++f->packet_bytes; - return get8(f); -} - -static int get8_packet(vorb *f) -{ - int x = get8_packet_raw(f); - f->valid_bits = 0; - return x; -} - -static void flush_packet(vorb *f) -{ - while (get8_packet_raw(f) != EOP); -} - -// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important -// as the huffman decoder? -static uint32 get_bits(vorb *f, int n) -{ - uint32 z; - - if (f->valid_bits < 0) return 0; - if (f->valid_bits < n) { - if (n > 24) { - // the accumulator technique below would not work correctly in this case - z = get_bits(f, 24); - z += get_bits(f, n-24) << 24; - return z; - } - if (f->valid_bits == 0) f->acc = 0; - while (f->valid_bits < n) { - int z = get8_packet_raw(f); - if (z == EOP) { - f->valid_bits = INVALID_BITS; - return 0; - } - f->acc += z << f->valid_bits; - f->valid_bits += 8; - } - } - if (f->valid_bits < 0) return 0; - z = f->acc & ((1 << n)-1); - f->acc >>= n; - f->valid_bits -= n; - return z; -} - -static int32 get_bits_signed(vorb *f, int n) -{ - uint32 z = get_bits(f, n); - if (z & (1 << (n-1))) - z += ~((1 << n) - 1); - return (int32) z; -} - -// @OPTIMIZE: primary accumulator for huffman -// expand the buffer to as many bits as possible without reading off end of packet -// it might be nice to allow f->valid_bits and f->acc to be stored in registers, -// e.g. cache them locally and decode locally -static __forceinline void prep_huffman(vorb *f) -{ - if (f->valid_bits <= 24) { - if (f->valid_bits == 0) f->acc = 0; - do { - int z; - if (f->last_seg && !f->bytes_in_seg) return; - z = get8_packet_raw(f); - if (z == EOP) return; - f->acc += z << f->valid_bits; - f->valid_bits += 8; - } while (f->valid_bits <= 24); - } -} - -enum -{ - VORBIS_packet_id = 1, - VORBIS_packet_comment = 3, - VORBIS_packet_setup = 5, -}; - -static int codebook_decode_scalar_raw(vorb *f, Codebook *c) -{ - int i; - prep_huffman(f); - - assert(c->sorted_codewords || c->codewords); - // cases to use binary search: sorted_codewords && !c->codewords - // sorted_codewords && c->entries > 8 - if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { - // binary search - uint32 code = bit_reverse(f->acc); - int x=0, n=c->sorted_entries, len; - - while (n > 1) { - // invariant: sc[x] <= code < sc[x+n] - int m = x + (n >> 1); - if (c->sorted_codewords[m] <= code) { - x = m; - n -= (n>>1); - } else { - n >>= 1; - } - } - // x is now the sorted index - if (!c->sparse) x = c->sorted_values[x]; - // x is now sorted index if sparse, or symbol otherwise - len = c->codeword_lengths[x]; - if (f->valid_bits >= len) { - f->acc >>= len; - f->valid_bits -= len; - return x; - } - - f->valid_bits = 0; - return -1; - } - - // if small, linear search - assert(!c->sparse); - for (i=0; i < c->entries; ++i) { - if (c->codeword_lengths[i] == NO_CODE) continue; - if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { - if (f->valid_bits >= c->codeword_lengths[i]) { - f->acc >>= c->codeword_lengths[i]; - f->valid_bits -= c->codeword_lengths[i]; - return i; - } - f->valid_bits = 0; - return -1; - } - } - - error(f, VORBIS_invalid_stream); - f->valid_bits = 0; - return -1; -} - -static int codebook_decode_scalar(vorb *f, Codebook *c) -{ - int i; - if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) - prep_huffman(f); - // fast huffman table lookup - i = f->acc & FAST_HUFFMAN_TABLE_MASK; - i = c->fast_huffman[i]; - if (i >= 0) { - f->acc >>= c->codeword_lengths[i]; - f->valid_bits -= c->codeword_lengths[i]; - if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } - return i; - } - return codebook_decode_scalar_raw(f,c); -} - -#ifndef STB_VORBIS_NO_INLINE_DECODE - -#define DECODE_RAW(var, f,c) \ - if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ - prep_huffman(f); \ - var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ - var = c->fast_huffman[var]; \ - if (var >= 0) { \ - int n = c->codeword_lengths[var]; \ - f->acc >>= n; \ - f->valid_bits -= n; \ - if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ - } else { \ - var = codebook_decode_scalar_raw(f,c); \ - } - -#else - -#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); - -#endif - -#define DECODE(var,f,c) \ - DECODE_RAW(var,f,c) \ - if (c->sparse) var = c->sorted_values[var]; - -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) -#else - #define DECODE_VQ(var,f,c) DECODE(var,f,c) -#endif - - - - - - -// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case -// where we avoid one addition -#ifndef STB_VORBIS_CODEBOOK_FLOATS - #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off] * c->delta_value + c->minimum_value) - #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off] * c->delta_value) - #define CODEBOOK_ELEMENT_BASE(c) (c->minimum_value) -#else - #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) - #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) - #define CODEBOOK_ELEMENT_BASE(c) (0) -#endif - -static int codebook_decode_start(vorb *f, Codebook *c, int len) -{ - int z = -1; - - // type 0 is only legal in a scalar context - if (c->lookup_type == 0) - error(f, VORBIS_invalid_stream); - else { - DECODE_VQ(z,f,c); - if (c->sparse) assert(z < c->sorted_entries); - if (z < 0) { // check for EOP - if (!f->bytes_in_seg) - if (f->last_seg) - return z; - error(f, VORBIS_invalid_stream); - } - } - return z; -} - -static int codebook_decode(vorb *f, Codebook *c, float *output, int len) -{ - int i,z = codebook_decode_start(f,c,len); - if (z < 0) return FALSE; - if (len > c->dimensions) len = c->dimensions; - -#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - float last = CODEBOOK_ELEMENT_BASE(c); - int div = 1; - for (i=0; i < len; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - output[i] += val; - if (c->sequence_p) last = val + c->minimum_value; - div *= c->lookup_values; - } - return TRUE; - } -#endif - - z *= c->dimensions; - if (c->sequence_p) { - float last = CODEBOOK_ELEMENT_BASE(c); - for (i=0; i < len; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - output[i] += val; - last = val + c->minimum_value; - } - } else { - float last = CODEBOOK_ELEMENT_BASE(c); - for (i=0; i < len; ++i) { - output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; - } - } - - return TRUE; -} - -static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) -{ - int i,z = codebook_decode_start(f,c,len); - float last = CODEBOOK_ELEMENT_BASE(c); - if (z < 0) return FALSE; - if (len > c->dimensions) len = c->dimensions; - -#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int div = 1; - for (i=0; i < len; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - output[i*step] += val; - if (c->sequence_p) last = val; - div *= c->lookup_values; - } - return TRUE; - } -#endif - - z *= c->dimensions; - for (i=0; i < len; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - output[i*step] += val; - if (c->sequence_p) last = val; - } - - return TRUE; -} - -static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) -{ - int c_inter = *c_inter_p; - int p_inter = *p_inter_p; - int i,z, effective = c->dimensions; - - // type 0 is only legal in a scalar context - if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); - - while (total_decode > 0) { - float last = CODEBOOK_ELEMENT_BASE(c); - DECODE_VQ(z,f,c); - #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - assert(!c->sparse || z < c->sorted_entries); - #endif - if (z < 0) { - if (!f->bytes_in_seg) - if (f->last_seg) return FALSE; - return error(f, VORBIS_invalid_stream); - } - - // if this will take us off the end of the buffers, stop short! - // we check by computing the length of the virtual interleaved - // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), - // and the length we'll be using (effective) - if (c_inter + p_inter*ch + effective > len * ch) { - effective = len*ch - (p_inter*ch - c_inter); - } - - #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int div = 1; - for (i=0; i < effective; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - if (c->sequence_p) last = val; - div *= c->lookup_values; - } - } else - #endif - { - z *= c->dimensions; - if (c->sequence_p) { - for (i=0; i < effective; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - last = val; - } - } else { - for (i=0; i < effective; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - } - } - } - - total_decode -= effective; - } - *c_inter_p = c_inter; - *p_inter_p = p_inter; - return TRUE; -} - -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK -static int codebook_decode_deinterleave_repeat_2(vorb *f, Codebook *c, float **outputs, int *c_inter_p, int *p_inter_p, int len, int total_decode) -{ - int c_inter = *c_inter_p; - int p_inter = *p_inter_p; - int i,z, effective = c->dimensions; - - // type 0 is only legal in a scalar context - if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); - - while (total_decode > 0) { - float last = CODEBOOK_ELEMENT_BASE(c); - DECODE_VQ(z,f,c); - - if (z < 0) { - if (!f->bytes_in_seg) - if (f->last_seg) return FALSE; - return error(f, VORBIS_invalid_stream); - } - - // if this will take us off the end of the buffers, stop short! - // we check by computing the length of the virtual interleaved - // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), - // and the length we'll be using (effective) - if (c_inter + p_inter*2 + effective > len * 2) { - effective = len*2 - (p_inter*2 - c_inter); - } - - { - z *= c->dimensions; - stb_prof(11); - if (c->sequence_p) { - // haven't optimized this case because I don't have any examples - for (i=0; i < effective; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - outputs[c_inter][p_inter] += val; - if (++c_inter == 2) { c_inter = 0; ++p_inter; } - last = val; - } - } else { - i=0; - if (c_inter == 1) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - outputs[c_inter][p_inter] += val; - c_inter = 0; ++p_inter; - ++i; - } - { - float *z0 = outputs[0]; - float *z1 = outputs[1]; - for (; i+1 < effective;) { - z0[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; - z1[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i+1) + last; - ++p_inter; - i += 2; - } - } - if (i < effective) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - outputs[c_inter][p_inter] += val; - if (++c_inter == 2) { c_inter = 0; ++p_inter; } - } - } - } - - total_decode -= effective; - } - *c_inter_p = c_inter; - *p_inter_p = p_inter; - return TRUE; -} -#endif - -static int predict_point(int x, int x0, int x1, int y0, int y1) -{ - int dy = y1 - y0; - int adx = x1 - x0; - // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? - int err = abs(dy) * (x - x0); - int off = err / adx; - return dy < 0 ? y0 - off : y0 + off; -} - -// the following table is block-copied from the specification -static float inverse_db_table[256] = -{ - 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, - 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, - 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, - 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, - 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, - 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, - 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, - 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, - 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, - 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, - 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, - 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, - 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, - 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, - 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, - 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, - 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, - 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, - 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, - 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, - 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, - 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, - 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, - 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, - 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, - 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, - 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, - 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, - 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, - 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, - 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, - 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, - 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, - 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, - 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, - 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, - 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, - 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, - 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, - 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, - 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, - 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, - 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, - 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, - 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, - 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, - 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, - 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, - 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, - 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, - 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, - 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, - 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, - 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, - 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, - 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, - 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, - 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, - 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, - 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, - 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, - 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, - 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, - 0.82788260f, 0.88168307f, 0.9389798f, 1.0f -}; - - -// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, -// note that you must produce bit-identical output to decode correctly; -// this specific sequence of operations is specified in the spec (it's -// drawing integer-quantized frequency-space lines that the encoder -// expects to be exactly the same) -// ... also, isn't the whole point of Bresenham's algorithm to NOT -// have to divide in the setup? sigh. -#ifndef STB_VORBIS_NO_DEFER_FLOOR -#define LINE_OP(a,b) a *= b -#else -#define LINE_OP(a,b) a = b -#endif - -#ifdef STB_VORBIS_DIVIDE_TABLE -#define DIVTAB_NUMER 32 -#define DIVTAB_DENOM 64 -int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB -#endif - -static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) -{ - int dy = y1 - y0; - int adx = x1 - x0; - int ady = abs(dy); - int base; - int x=x0,y=y0; - int err = 0; - int sy; - -#ifdef STB_VORBIS_DIVIDE_TABLE - if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { - if (dy < 0) { - base = -integer_divide_table[ady][adx]; - sy = base-1; - } else { - base = integer_divide_table[ady][adx]; - sy = base+1; - } - } else { - base = dy / adx; - if (dy < 0) - sy = base - 1; - else - sy = base+1; - } -#else - base = dy / adx; - if (dy < 0) - sy = base - 1; - else - sy = base+1; -#endif - ady -= abs(base) * adx; - if (x1 > n) x1 = n; - LINE_OP(output[x], inverse_db_table[y]); - for (++x; x < x1; ++x) { - err += ady; - if (err >= adx) { - err -= adx; - y += sy; - } else - y += base; - LINE_OP(output[x], inverse_db_table[y]); - } -} - -static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) -{ - int k; - if (rtype == 0) { - int step = n / book->dimensions; - for (k=0; k < step; ++k) - if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) - return FALSE; - } else { - for (k=0; k < n; ) { - if (!codebook_decode(f, book, target+offset, n-k)) - return FALSE; - k += book->dimensions; - offset += book->dimensions; - } - } - return TRUE; -} - -static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) -{ - int i,j,pass; - Residue *r = f->residue_config + rn; - int rtype = f->residue_types[rn]; - int c = r->classbook; - int classwords = f->codebooks[c].dimensions; - int n_read = r->end - r->begin; - int part_read = n_read / r->part_size; - int temp_alloc_point = temp_alloc_save(f); - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); - #else - int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); - #endif - - stb_prof(2); - for (i=0; i < ch; ++i) - if (!do_not_decode[i]) - memset(residue_buffers[i], 0, sizeof(float) * n); - - if (rtype == 2 && ch != 1) { - int len = ch * n; - for (j=0; j < ch; ++j) - if (!do_not_decode[j]) - break; - if (j == ch) - goto done; - - stb_prof(3); - for (pass=0; pass < 8; ++pass) { - int pcount = 0, class_set = 0; - if (ch == 2) { - stb_prof(13); - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = (z & 1), p_inter = z>>1; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - stb_prof(5); - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - stb_prof(20); // accounts for X time - #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - #else - // saves 1% - if (!codebook_decode_deinterleave_repeat_2(f, book, residue_buffers, &c_inter, &p_inter, n, r->part_size)) - goto done; - #endif - stb_prof(7); - } else { - z += r->part_size; - c_inter = z & 1; - p_inter = z >> 1; - } - } - stb_prof(8); - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } else if (ch == 1) { - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = 0, p_inter = z; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - stb_prof(22); - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - stb_prof(3); - } else { - z += r->part_size; - c_inter = 0; - p_inter = z; - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } else { - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = z % ch, p_inter = z/ch; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - stb_prof(22); - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - stb_prof(3); - } else { - z += r->part_size; - c_inter = z % ch; - p_inter = z / ch; - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } - } - goto done; - } - stb_prof(9); - - for (pass=0; pass < 8; ++pass) { - int pcount = 0, class_set=0; - while (pcount < part_read) { - if (pass == 0) { - for (j=0; j < ch; ++j) { - if (!do_not_decode[j]) { - Codebook *c = f->codebooks+r->classbook; - int temp; - DECODE(temp,f,c); - if (temp == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[j][class_set] = r->classdata[temp]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[j][i+pcount] = temp % r->classifications; - temp /= r->classifications; - } - #endif - } - } - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - for (j=0; j < ch; ++j) { - if (!do_not_decode[j]) { - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[j][class_set][i]; - #else - int c = classifications[j][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - float *target = residue_buffers[j]; - int offset = r->begin + pcount * r->part_size; - int n = r->part_size; - Codebook *book = f->codebooks + b; - if (!residue_decode(f, book, target, offset, n, rtype)) - goto done; - } - } - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } - done: - stb_prof(0); - temp_alloc_restore(f,temp_alloc_point); -} - - -#if 0 -// slow way for debugging -void inverse_mdct_slow(float *buffer, int n) -{ - int i,j; - int n2 = n >> 1; - float *x = (float *) malloc(sizeof(*x) * n2); - memcpy(x, buffer, sizeof(*x) * n2); - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n2; ++j) - // formula from paper: - //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); - // formula from wikipedia - //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); - // these are equivalent, except the formula from the paper inverts the multiplier! - // however, what actually works is NO MULTIPLIER!?! - //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); - acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); - buffer[i] = acc; - } - free(x); -} -#elif 0 -// same as above, but just barely able to run in real time on modern machines -void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) -{ - float mcos[16384]; - int i,j; - int n2 = n >> 1, nmask = (n << 2) -1; - float *x = (float *) malloc(sizeof(*x) * n2); - memcpy(x, buffer, sizeof(*x) * n2); - for (i=0; i < 4*n; ++i) - mcos[i] = (float) cos(M_PI / 2 * i / n); - - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n2; ++j) - acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; - buffer[i] = acc; - } - free(x); -} -#else -// transform to use a slow dct-iv; this is STILL basically trivial, -// but only requires half as many ops -void dct_iv_slow(float *buffer, int n) -{ - float mcos[16384]; - float x[2048]; - int i,j; - int n2 = n >> 1, nmask = (n << 3) - 1; - memcpy(x, buffer, sizeof(*x) * n); - for (i=0; i < 8*n; ++i) - mcos[i] = (float) cos(M_PI / 4 * i / n); - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n; ++j) - acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; - //acc += x[j] * cos(M_PI / n * (i + 0.5) * (j + 0.5)); - buffer[i] = acc; - } -} - -void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) -{ - int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; - float temp[4096]; - - memcpy(temp, buffer, n2 * sizeof(float)); - dct_iv_slow(temp, n2); // returns -c'-d, a-b' - - for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' - for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' - for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d -} -#endif - -#ifndef LIBVORBIS_MDCT -#define LIBVORBIS_MDCT 0 -#endif - -#if LIBVORBIS_MDCT -// directly call the vorbis MDCT using an interface documented -// by Jeff Roberts... useful for performance comparison -typedef struct -{ - int n; - int log2n; - - float *trig; - int *bitrev; - - float scale; -} mdct_lookup; - -extern void mdct_init(mdct_lookup *lookup, int n); -extern void mdct_clear(mdct_lookup *l); -extern void mdct_backward(mdct_lookup *init, float *in, float *out); - -mdct_lookup M1,M2; - -void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) -{ - mdct_lookup *M; - if (M1.n == n) M = &M1; - else if (M2.n == n) M = &M2; - else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } - else { - if (M2.n) __asm int 3; - mdct_init(&M2, n); - M = &M2; - } - - mdct_backward(M, buffer, buffer); -} -#endif - - -// the following were split out into separate functions while optimizing; -// they could be pushed back up but eh. __forceinline showed no change; -// they're probably already being inlined. -static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) -{ - float *ee0 = e + i_off; - float *ee2 = ee0 + k_off; - int i; - - assert((n & 3) == 0); - for (i=(n>>2); i > 0; --i) { - float k00_20, k01_21; - k00_20 = ee0[ 0] - ee2[ 0]; - k01_21 = ee0[-1] - ee2[-1]; - ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; - ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; - ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-2] - ee2[-2]; - k01_21 = ee0[-3] - ee2[-3]; - ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; - ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; - ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-4] - ee2[-4]; - k01_21 = ee0[-5] - ee2[-5]; - ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; - ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; - ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-6] - ee2[-6]; - k01_21 = ee0[-7] - ee2[-7]; - ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; - ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; - ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - ee0 -= 8; - ee2 -= 8; - } -} - -static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) -{ - int i; - float k00_20, k01_21; - - float *e0 = e + d0; - float *e2 = e0 + k_off; - - for (i=lim >> 2; i > 0; --i) { - k00_20 = e0[-0] - e2[-0]; - k01_21 = e0[-1] - e2[-1]; - e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; - e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; - e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-2] - e2[-2]; - k01_21 = e0[-3] - e2[-3]; - e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; - e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; - e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-4] - e2[-4]; - k01_21 = e0[-5] - e2[-5]; - e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; - e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; - e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-6] - e2[-6]; - k01_21 = e0[-7] - e2[-7]; - e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; - e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; - e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; - - e0 -= 8; - e2 -= 8; - - A += k1; - } -} - -static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) -{ - int i; - float A0 = A[0]; - float A1 = A[0+1]; - float A2 = A[0+a_off]; - float A3 = A[0+a_off+1]; - float A4 = A[0+a_off*2+0]; - float A5 = A[0+a_off*2+1]; - float A6 = A[0+a_off*3+0]; - float A7 = A[0+a_off*3+1]; - - float k00,k11; - - float *ee0 = e +i_off; - float *ee2 = ee0+k_off; - - for (i=n; i > 0; --i) { - k00 = ee0[ 0] - ee2[ 0]; - k11 = ee0[-1] - ee2[-1]; - ee0[ 0] = ee0[ 0] + ee2[ 0]; - ee0[-1] = ee0[-1] + ee2[-1]; - ee2[ 0] = (k00) * A0 - (k11) * A1; - ee2[-1] = (k11) * A0 + (k00) * A1; - - k00 = ee0[-2] - ee2[-2]; - k11 = ee0[-3] - ee2[-3]; - ee0[-2] = ee0[-2] + ee2[-2]; - ee0[-3] = ee0[-3] + ee2[-3]; - ee2[-2] = (k00) * A2 - (k11) * A3; - ee2[-3] = (k11) * A2 + (k00) * A3; - - k00 = ee0[-4] - ee2[-4]; - k11 = ee0[-5] - ee2[-5]; - ee0[-4] = ee0[-4] + ee2[-4]; - ee0[-5] = ee0[-5] + ee2[-5]; - ee2[-4] = (k00) * A4 - (k11) * A5; - ee2[-5] = (k11) * A4 + (k00) * A5; - - k00 = ee0[-6] - ee2[-6]; - k11 = ee0[-7] - ee2[-7]; - ee0[-6] = ee0[-6] + ee2[-6]; - ee0[-7] = ee0[-7] + ee2[-7]; - ee2[-6] = (k00) * A6 - (k11) * A7; - ee2[-7] = (k11) * A6 + (k00) * A7; - - ee0 -= k0; - ee2 -= k0; - } -} - -static __forceinline void iter_54(float *z) -{ - float k00,k11,k22,k33; - float y0,y1,y2,y3; - - k00 = z[ 0] - z[-4]; - y0 = z[ 0] + z[-4]; - y2 = z[-2] + z[-6]; - k22 = z[-2] - z[-6]; - - z[-0] = y0 + y2; // z0 + z4 + z2 + z6 - z[-2] = y0 - y2; // z0 + z4 - z2 - z6 - - // done with y0,y2 - - k33 = z[-3] - z[-7]; - - z[-4] = k00 + k33; // z0 - z4 + z3 - z7 - z[-6] = k00 - k33; // z0 - z4 - z3 + z7 - - // done with k33 - - k11 = z[-1] - z[-5]; - y1 = z[-1] + z[-5]; - y3 = z[-3] + z[-7]; - - z[-1] = y1 + y3; // z1 + z5 + z3 + z7 - z[-3] = y1 - y3; // z1 + z5 - z3 - z7 - z[-5] = k11 - k22; // z1 - z5 + z2 - z6 - z[-7] = k11 + k22; // z1 - z5 - z2 + z6 -} - -static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) -{ - int k_off = -8; - int a_off = base_n >> 3; - float A2 = A[0+a_off]; - float *z = e + i_off; - float *base = z - 16 * n; - - while (z > base) { - float k00,k11; - - k00 = z[-0] - z[-8]; - k11 = z[-1] - z[-9]; - z[-0] = z[-0] + z[-8]; - z[-1] = z[-1] + z[-9]; - z[-8] = k00; - z[-9] = k11 ; - - k00 = z[ -2] - z[-10]; - k11 = z[ -3] - z[-11]; - z[ -2] = z[ -2] + z[-10]; - z[ -3] = z[ -3] + z[-11]; - z[-10] = (k00+k11) * A2; - z[-11] = (k11-k00) * A2; - - k00 = z[-12] - z[ -4]; // reverse to avoid a unary negation - k11 = z[ -5] - z[-13]; - z[ -4] = z[ -4] + z[-12]; - z[ -5] = z[ -5] + z[-13]; - z[-12] = k11; - z[-13] = k00; - - k00 = z[-14] - z[ -6]; // reverse to avoid a unary negation - k11 = z[ -7] - z[-15]; - z[ -6] = z[ -6] + z[-14]; - z[ -7] = z[ -7] + z[-15]; - z[-14] = (k00+k11) * A2; - z[-15] = (k00-k11) * A2; - - iter_54(z); - iter_54(z-8); - z -= 16; - } -} - -static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) -{ - int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; - int n3_4 = n - n4, ld; - // @OPTIMIZE: reduce register pressure by using fewer variables? - int save_point = temp_alloc_save(f); - float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); - float *u=NULL,*v=NULL; - // twiddle factors - float *A = f->A[blocktype]; - - // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" - // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. - - // kernel from paper - - - // merged: - // copy and reflect spectral data - // step 0 - - // note that it turns out that the items added together during - // this step are, in fact, being added to themselves (as reflected - // by step 0). inexplicable inefficiency! this became obvious - // once I combined the passes. - - // so there's a missing 'times 2' here (for adding X to itself). - // this propogates through linearly to the end, where the numbers - // are 1/2 too small, and need to be compensated for. - - { - float *d,*e, *AA, *e_stop; - d = &buf2[n2-2]; - AA = A; - e = &buffer[0]; - e_stop = &buffer[n2]; - while (e != e_stop) { - d[1] = (e[0] * AA[0] - e[2]*AA[1]); - d[0] = (e[0] * AA[1] + e[2]*AA[0]); - d -= 2; - AA += 2; - e += 4; - } - - e = &buffer[n2-3]; - while (d >= buf2) { - d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); - d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); - d -= 2; - AA += 2; - e -= 4; - } - } - - // now we use symbolic names for these, so that we can - // possibly swap their meaning as we change which operations - // are in place - - u = buffer; - v = buf2; - - // step 2 (paper output is w, now u) - // this could be in place, but the data ends up in the wrong - // place... _somebody_'s got to swap it, so this is nominated - { - float *AA = &A[n2-8]; - float *d0,*d1, *e0, *e1; - - e0 = &v[n4]; - e1 = &v[0]; - - d0 = &u[n4]; - d1 = &u[0]; - - while (AA >= A) { - float v40_20, v41_21; - - v41_21 = e0[1] - e1[1]; - v40_20 = e0[0] - e1[0]; - d0[1] = e0[1] + e1[1]; - d0[0] = e0[0] + e1[0]; - d1[1] = v41_21*AA[4] - v40_20*AA[5]; - d1[0] = v40_20*AA[4] + v41_21*AA[5]; - - v41_21 = e0[3] - e1[3]; - v40_20 = e0[2] - e1[2]; - d0[3] = e0[3] + e1[3]; - d0[2] = e0[2] + e1[2]; - d1[3] = v41_21*AA[0] - v40_20*AA[1]; - d1[2] = v40_20*AA[0] + v41_21*AA[1]; - - AA -= 8; - - d0 += 4; - d1 += 4; - e0 += 4; - e1 += 4; - } - } - - // step 3 - ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - - // optimized step 3: - - // the original step3 loop can be nested r inside s or s inside r; - // it's written originally as s inside r, but this is dumb when r - // iterates many times, and s few. So I have two copies of it and - // switch between them halfway. - - // this is iteration 0 of step 3 - imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); - imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); - - // this is iteration 1 of step 3 - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); - - l=2; - for (; l < (ld-3)>>1; ++l) { - int k0 = n >> (l+2), k0_2 = k0>>1; - int lim = 1 << (l+1); - int i; - for (i=0; i < lim; ++i) - imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); - } - - for (; l < ld-6; ++l) { - int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; - int rlim = n >> (l+6), r; - int lim = 1 << (l+1); - int i_off; - float *A0 = A; - i_off = n2-1; - for (r=rlim; r > 0; --r) { - imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); - A0 += k1*4; - i_off -= 8; - } - } - - // iterations with count: - // ld-6,-5,-4 all interleaved together - // the big win comes from getting rid of needless flops - // due to the constants on pass 5 & 4 being all 1 and 0; - // combining them to be simultaneous to improve cache made little difference - imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); - - // output is u - - // step 4, 5, and 6 - // cannot be in-place because of step 5 - { - uint16 *bitrev = f->bit_reverse[blocktype]; - // weirdly, I'd have thought reading sequentially and writing - // erratically would have been better than vice-versa, but in - // fact that's not what my testing showed. (That is, with - // j = bitreverse(i), do you read i and write j, or read j and write i.) - - float *d0 = &v[n4-4]; - float *d1 = &v[n2-4]; - while (d0 >= v) { - int k4; - - k4 = bitrev[0]; - d1[3] = u[k4+0]; - d1[2] = u[k4+1]; - d0[3] = u[k4+2]; - d0[2] = u[k4+3]; - - k4 = bitrev[1]; - d1[1] = u[k4+0]; - d1[0] = u[k4+1]; - d0[1] = u[k4+2]; - d0[0] = u[k4+3]; - - d0 -= 4; - d1 -= 4; - bitrev += 2; - } - } - // (paper output is u, now v) - - - // data must be in buf2 - assert(v == buf2); - - // step 7 (paper output is v, now v) - // this is now in place - { - float *C = f->C[blocktype]; - float *d, *e; - - d = v; - e = v + n2 - 4; - - while (d < e) { - float a02,a11,b0,b1,b2,b3; - - a02 = d[0] - e[2]; - a11 = d[1] + e[3]; - - b0 = C[1]*a02 + C[0]*a11; - b1 = C[1]*a11 - C[0]*a02; - - b2 = d[0] + e[ 2]; - b3 = d[1] - e[ 3]; - - d[0] = b2 + b0; - d[1] = b3 + b1; - e[2] = b2 - b0; - e[3] = b1 - b3; - - a02 = d[2] - e[0]; - a11 = d[3] + e[1]; - - b0 = C[3]*a02 + C[2]*a11; - b1 = C[3]*a11 - C[2]*a02; - - b2 = d[2] + e[ 0]; - b3 = d[3] - e[ 1]; - - d[2] = b2 + b0; - d[3] = b3 + b1; - e[0] = b2 - b0; - e[1] = b1 - b3; - - C += 4; - d += 4; - e -= 4; - } - } - - // data must be in buf2 - - - // step 8+decode (paper output is X, now buffer) - // this generates pairs of data a la 8 and pushes them directly through - // the decode kernel (pushing rather than pulling) to avoid having - // to make another pass later - - // this cannot POSSIBLY be in place, so we refer to the buffers directly - - { - float *d0,*d1,*d2,*d3; - - float *B = f->B[blocktype] + n2 - 8; - float *e = buf2 + n2 - 8; - d0 = &buffer[0]; - d1 = &buffer[n2-4]; - d2 = &buffer[n2]; - d3 = &buffer[n-4]; - while (e >= v) { - float p0,p1,p2,p3; - - p3 = e[6]*B[7] - e[7]*B[6]; - p2 = -e[6]*B[6] - e[7]*B[7]; - - d0[0] = p3; - d1[3] = - p3; - d2[0] = p2; - d3[3] = p2; - - p1 = e[4]*B[5] - e[5]*B[4]; - p0 = -e[4]*B[4] - e[5]*B[5]; - - d0[1] = p1; - d1[2] = - p1; - d2[1] = p0; - d3[2] = p0; - - p3 = e[2]*B[3] - e[3]*B[2]; - p2 = -e[2]*B[2] - e[3]*B[3]; - - d0[2] = p3; - d1[1] = - p3; - d2[2] = p2; - d3[1] = p2; - - p1 = e[0]*B[1] - e[1]*B[0]; - p0 = -e[0]*B[0] - e[1]*B[1]; - - d0[3] = p1; - d1[0] = - p1; - d2[3] = p0; - d3[0] = p0; - - B -= 8; - e -= 8; - d0 += 4; - d2 += 4; - d1 -= 4; - d3 -= 4; - } - } - - temp_alloc_restore(f,save_point); -} - -#if 0 -// this is the original version of the above code, if you want to optimize it from scratch -void inverse_mdct_naive(float *buffer, int n) -{ - float s; - float A[1 << 12], B[1 << 12], C[1 << 11]; - int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; - int n3_4 = n - n4, ld; - // how can they claim this only uses N words?! - // oh, because they're only used sparsely, whoops - float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; - // set up twiddle factors - - for (k=k2=0; k < n4; ++k,k2+=2) { - A[k2 ] = (float) cos(4*k*M_PI/n); - A[k2+1] = (float) -sin(4*k*M_PI/n); - B[k2 ] = (float) cos((k2+1)*M_PI/n/2); - B[k2+1] = (float) sin((k2+1)*M_PI/n/2); - } - for (k=k2=0; k < n8; ++k,k2+=2) { - C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); - C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); - } - - // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" - // Note there are bugs in that pseudocode, presumably due to them attempting - // to rename the arrays nicely rather than representing the way their actual - // implementation bounces buffers back and forth. As a result, even in the - // "some formulars corrected" version, a direct implementation fails. These - // are noted below as "paper bug". - - // copy and reflect spectral data - for (k=0; k < n2; ++k) u[k] = buffer[k]; - for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; - // kernel from paper - // step 1 - for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { - v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; - v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; - } - // step 2 - for (k=k4=0; k < n8; k+=1, k4+=4) { - w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; - w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; - w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4]; - w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4]; - } - // step 3 - ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - for (l=0; l < ld-3; ++l) { - int k0 = n >> (l+2), k1 = 1 << (l+3); - int rlim = n >> (l+4), r4, r; - int s2lim = 1 << (l+2), s2; - for (r=r4=0; r < rlim; r4+=4,++r) { - for (s2=0; s2 < s2lim; s2+=2) { - u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; - u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; - u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] - - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; - u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] - + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; - } - } - if (l+1 < ld-3) { - // paper bug: ping-ponging of u&w here is omitted - memcpy(w, u, sizeof(u)); - } - } - - // step 4 - for (i=0; i < n8; ++i) { - int j = bit_reverse(i) >> (32-ld+3); - assert(j < n8); - if (i == j) { - // paper bug: original code probably swapped in place; if copying, - // need to directly copy in this case - int i8 = i << 3; - v[i8+1] = u[i8+1]; - v[i8+3] = u[i8+3]; - v[i8+5] = u[i8+5]; - v[i8+7] = u[i8+7]; - } else if (i < j) { - int i8 = i << 3, j8 = j << 3; - v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; - v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; - v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; - v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; - } - } - // step 5 - for (k=0; k < n2; ++k) { - w[k] = v[k*2+1]; - } - // step 6 - for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { - u[n-1-k2] = w[k4]; - u[n-2-k2] = w[k4+1]; - u[n3_4 - 1 - k2] = w[k4+2]; - u[n3_4 - 2 - k2] = w[k4+3]; - } - // step 7 - for (k=k2=0; k < n8; ++k, k2 += 2) { - v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; - v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; - v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; - v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; - } - // step 8 - for (k=k2=0; k < n4; ++k,k2 += 2) { - X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; - X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; - } - - // decode kernel to output - // determined the following value experimentally - // (by first figuring out what made inverse_mdct_slow work); then matching that here - // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) - s = 0.5; // theoretically would be n4 - - // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, - // so it needs to use the "old" B values to behave correctly, or else - // set s to 1.0 ]]] - for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; - for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; - for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; -} -#endif - -static float *get_window(vorb *f, int len) -{ - len <<= 1; - if (len == f->blocksize_0) return f->window[0]; - if (len == f->blocksize_1) return f->window[1]; - assert(0); - return NULL; -} - -#ifndef STB_VORBIS_NO_DEFER_FLOOR -typedef int16 YTYPE; -#else -typedef int YTYPE; -#endif -static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) -{ - int n2 = n >> 1; - int s = map->chan[i].mux, floor; - floor = map->submap_floor[s]; - if (f->floor_types[floor] == 0) { - return error(f, VORBIS_invalid_stream); - } else { - Floor1 *g = &f->floor_config[floor].floor1; - int j,q; - int lx = 0, ly = finalY[0] * g->floor1_multiplier; - for (q=1; q < g->values; ++q) { - j = g->sorted_order[q]; - #ifndef STB_VORBIS_NO_DEFER_FLOOR - if (finalY[j] >= 0) - #else - if (step2_flag[j]) - #endif - { - int hy = finalY[j] * g->floor1_multiplier; - int hx = g->Xlist[j]; - draw_line(target, lx,ly, hx,hy, n2); - lx = hx, ly = hy; - } - } - if (lx < n2) - // optimization of: draw_line(target, lx,ly, n,ly, n2); - for (j=lx; j < n2; ++j) - LINE_OP(target[j], inverse_db_table[ly]); - } - return TRUE; -} - -static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) -{ - Mode *m; - int i, n, prev, next, window_center; - f->channel_buffer_start = f->channel_buffer_end = 0; - - retry: - if (f->eof) return FALSE; - if (!maybe_start_packet(f)) - return FALSE; - // check packet type - if (get_bits(f,1) != 0) { - if (IS_PUSH_MODE(f)) - return error(f,VORBIS_bad_packet_type); - while (EOP != get8_packet(f)); - goto retry; - } - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - - i = get_bits(f, ilog(f->mode_count-1)); - if (i == EOP) return FALSE; - if (i >= f->mode_count) return FALSE; - *mode = i; - m = f->mode_config + i; - if (m->blockflag) { - n = f->blocksize_1; - prev = get_bits(f,1); - next = get_bits(f,1); - } else { - prev = next = 0; - n = f->blocksize_0; - } - -// WINDOWING - - window_center = n >> 1; - if (m->blockflag && !prev) { - *p_left_start = (n - f->blocksize_0) >> 2; - *p_left_end = (n + f->blocksize_0) >> 2; - } else { - *p_left_start = 0; - *p_left_end = window_center; - } - if (m->blockflag && !next) { - *p_right_start = (n*3 - f->blocksize_0) >> 2; - *p_right_end = (n*3 + f->blocksize_0) >> 2; - } else { - *p_right_start = window_center; - *p_right_end = n; - } - return TRUE; -} - -static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) -{ - Mapping *map; - int i,j,k,n,n2; - int zero_channel[256]; - int really_zero_channel[256]; - int window_center; - -// WINDOWING - - n = f->blocksize[m->blockflag]; - window_center = n >> 1; - - map = &f->mapping[m->mapping]; - -// FLOORS - n2 = n >> 1; - - stb_prof(1); - for (i=0; i < f->channels; ++i) { - int s = map->chan[i].mux, floor; - zero_channel[i] = FALSE; - floor = map->submap_floor[s]; - if (f->floor_types[floor] == 0) { - return error(f, VORBIS_invalid_stream); - } else { - Floor1 *g = &f->floor_config[floor].floor1; - if (get_bits(f, 1)) { - short *finalY; - uint8 step2_flag[256]; - static int range_list[4] = { 256, 128, 86, 64 }; - int range = range_list[g->floor1_multiplier-1]; - int offset = 2; - finalY = f->finalY[i]; - finalY[0] = get_bits(f, ilog(range)-1); - finalY[1] = get_bits(f, ilog(range)-1); - for (j=0; j < g->partitions; ++j) { - int pclass = g->partition_class_list[j]; - int cdim = g->class_dimensions[pclass]; - int cbits = g->class_subclasses[pclass]; - int csub = (1 << cbits)-1; - int cval = 0; - if (cbits) { - Codebook *c = f->codebooks + g->class_masterbooks[pclass]; - DECODE(cval,f,c); - } - for (k=0; k < cdim; ++k) { - int book = g->subclass_books[pclass][cval & csub]; - cval = cval >> cbits; - if (book >= 0) { - int temp; - Codebook *c = f->codebooks + book; - DECODE(temp,f,c); - finalY[offset++] = temp; - } else - finalY[offset++] = 0; - } - } - if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec - step2_flag[0] = step2_flag[1] = 1; - for (j=2; j < g->values; ++j) { - int low, high, pred, highroom, lowroom, room, val; - low = g->neighbors[j][0]; - high = g->neighbors[j][1]; - //neighbors(g->Xlist, j, &low, &high); - pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); - val = finalY[j]; - highroom = range - pred; - lowroom = pred; - if (highroom < lowroom) - room = highroom * 2; - else - room = lowroom * 2; - if (val) { - step2_flag[low] = step2_flag[high] = 1; - step2_flag[j] = 1; - if (val >= room) - if (highroom > lowroom) - finalY[j] = val - lowroom + pred; - else - finalY[j] = pred - val + highroom - 1; - else - if (val & 1) - finalY[j] = pred - ((val+1)>>1); - else - finalY[j] = pred + (val>>1); - } else { - step2_flag[j] = 0; - finalY[j] = pred; - } - } - -#ifdef STB_VORBIS_NO_DEFER_FLOOR - do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); -#else - // defer final floor computation until _after_ residue - for (j=0; j < g->values; ++j) { - if (!step2_flag[j]) - finalY[j] = -1; - } -#endif - } else { - error: - zero_channel[i] = TRUE; - } - // So we just defer everything else to later - - // at this point we've decoded the floor into buffer - } - } - stb_prof(0); - // at this point we've decoded all floors - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - - // re-enable coupled channels if necessary - memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); - for (i=0; i < map->coupling_steps; ++i) - if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { - zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; - } - -// RESIDUE DECODE - for (i=0; i < map->submaps; ++i) { - float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; - int r,t; - uint8 do_not_decode[256]; - int ch = 0; - for (j=0; j < f->channels; ++j) { - if (map->chan[j].mux == i) { - if (zero_channel[j]) { - do_not_decode[ch] = TRUE; - residue_buffers[ch] = NULL; - } else { - do_not_decode[ch] = FALSE; - residue_buffers[ch] = f->channel_buffers[j]; - } - ++ch; - } - } - r = map->submap_residue[i]; - t = f->residue_types[r]; - decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); - } - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - -// INVERSE COUPLING - stb_prof(14); - for (i = map->coupling_steps-1; i >= 0; --i) { - int n2 = n >> 1; - float *m = f->channel_buffers[map->chan[i].magnitude]; - float *a = f->channel_buffers[map->chan[i].angle ]; - for (j=0; j < n2; ++j) { - float a2,m2; - if (m[j] > 0) - if (a[j] > 0) - m2 = m[j], a2 = m[j] - a[j]; - else - a2 = m[j], m2 = m[j] + a[j]; - else - if (a[j] > 0) - m2 = m[j], a2 = m[j] + a[j]; - else - a2 = m[j], m2 = m[j] - a[j]; - m[j] = m2; - a[j] = a2; - } - } - - // finish decoding the floors -#ifndef STB_VORBIS_NO_DEFER_FLOOR - stb_prof(15); - for (i=0; i < f->channels; ++i) { - if (really_zero_channel[i]) { - memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); - } else { - do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); - } - } -#else - for (i=0; i < f->channels; ++i) { - if (really_zero_channel[i]) { - memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); - } else { - for (j=0; j < n2; ++j) - f->channel_buffers[i][j] *= f->floor_buffers[i][j]; - } - } -#endif - -// INVERSE MDCT - stb_prof(16); - for (i=0; i < f->channels; ++i) - inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); - stb_prof(0); - - // this shouldn't be necessary, unless we exited on an error - // and want to flush to get to the next packet - flush_packet(f); - - if (f->first_decode) { - // assume we start so first non-discarded sample is sample 0 - // this isn't to spec, but spec would require us to read ahead - // and decode the size of all current frames--could be done, - // but presumably it's not a commonly used feature - f->current_loc = -n2; // start of first frame is positioned for discard - // we might have to discard samples "from" the next frame too, - // if we're lapping a large block then a small at the start? - f->discard_samples_deferred = n - right_end; - f->current_loc_valid = TRUE; - f->first_decode = FALSE; - } else if (f->discard_samples_deferred) { - left_start += f->discard_samples_deferred; - *p_left = left_start; - f->discard_samples_deferred = 0; - } else if (f->previous_length == 0 && f->current_loc_valid) { - // we're recovering from a seek... that means we're going to discard - // the samples from this packet even though we know our position from - // the last page header, so we need to update the position based on - // the discarded samples here - // but wait, the code below is going to add this in itself even - // on a discard, so we don't need to do it here... - } - - // check if we have ogg information about the sample # for this packet - if (f->last_seg_which == f->end_seg_with_known_loc) { - // if we have a valid current loc, and this is final: - if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { - uint32 current_end = f->known_loc_for_packet - (n-right_end); - // then let's infer the size of the (probably) short final frame - if (current_end < f->current_loc + right_end) { - if (current_end < f->current_loc) { - // negative truncation, that's impossible! - *len = 0; - } else { - *len = current_end - f->current_loc; - } - *len += left_start; - f->current_loc += *len; - return TRUE; - } - } - // otherwise, just set our sample loc - // guess that the ogg granule pos refers to the _middle_ of the - // last frame? - // set f->current_loc to the position of left_start - f->current_loc = f->known_loc_for_packet - (n2-left_start); - f->current_loc_valid = TRUE; - } - if (f->current_loc_valid) - f->current_loc += (right_start - left_start); - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - *len = right_end; // ignore samples after the window goes to 0 - return TRUE; -} - -static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) -{ - int mode, left_end, right_end; - if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; - return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); -} - -static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) -{ - int prev,i,j; - // we use right&left (the start of the right- and left-window sin()-regions) - // to determine how much to return, rather than inferring from the rules - // (same result, clearer code); 'left' indicates where our sin() window - // starts, therefore where the previous window's right edge starts, and - // therefore where to start mixing from the previous buffer. 'right' - // indicates where our sin() ending-window starts, therefore that's where - // we start saving, and where our returned-data ends. - - // mixin from previous window - if (f->previous_length) { - int i,j, n = f->previous_length; - float *w = get_window(f, n); - for (i=0; i < f->channels; ++i) { - for (j=0; j < n; ++j) - f->channel_buffers[i][left+j] = - f->channel_buffers[i][left+j]*w[ j] + - f->previous_window[i][ j]*w[n-1-j]; - } - } - - prev = f->previous_length; - - // last half of this data becomes previous window - f->previous_length = len - right; - - // @OPTIMIZE: could avoid this copy by double-buffering the - // output (flipping previous_window with channel_buffers), but - // then previous_window would have to be 2x as large, and - // channel_buffers couldn't be temp mem (although they're NOT - // currently temp mem, they could be (unless we want to level - // performance by spreading out the computation)) - for (i=0; i < f->channels; ++i) - for (j=0; right+j < len; ++j) - f->previous_window[i][j] = f->channel_buffers[i][right+j]; - - if (!prev) - // there was no previous packet, so this data isn't valid... - // this isn't entirely true, only the would-have-overlapped data - // isn't valid, but this seems to be what the spec requires - return 0; - - // truncate a short frame - if (len < right) right = len; - - f->samples_output += right-left; - - return right - left; -} - -static void vorbis_pump_first_frame(stb_vorbis *f) -{ - int len, right, left; - if (vorbis_decode_packet(f, &len, &left, &right)) - vorbis_finish_frame(f, len, left, right); -} - -#ifndef STB_VORBIS_NO_PUSHDATA_API -static int is_whole_packet_present(stb_vorbis *f, int end_page) -{ - // make sure that we have the packet available before continuing... - // this requires a full ogg parse, but we know we can fetch from f->stream - - // instead of coding this out explicitly, we could save the current read state, - // read the next packet with get8() until end-of-packet, check f->eof, then - // reset the state? but that would be slower, esp. since we'd have over 256 bytes - // of state to restore (primarily the page segment table) - - int s = f->next_seg, first = TRUE; - uint8 *p = f->stream; - - if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag - for (; s < f->segment_count; ++s) { - p += f->segments[s]; - if (f->segments[s] < 255) // stop at first short segment - break; - } - // either this continues, or it ends it... - if (end_page) - if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream); - if (s == f->segment_count) - s = -1; // set 'crosses page' flag - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - first = FALSE; - } - for (; s == -1;) { - uint8 *q; - int n; - - // check that we have the page header ready - if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); - // validate the page - if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); - if (p[4] != 0) return error(f, VORBIS_invalid_stream); - if (first) { // the first segment must NOT have 'continued_packet', later ones MUST - if (f->previous_length) - if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); - // if no previous length, we're resynching, so we can come in on a continued-packet, - // which we'll just drop - } else { - if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); - } - n = p[26]; // segment counts - q = p+27; // q points to segment table - p = q + n; // advance past header - // make sure we've read the segment table - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - for (s=0; s < n; ++s) { - p += q[s]; - if (q[s] < 255) - break; - } - if (end_page) - if (s < n-1) return error(f, VORBIS_invalid_stream); - if (s == f->segment_count) - s = -1; // set 'crosses page' flag - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - first = FALSE; - } - return TRUE; -} -#endif // !STB_VORBIS_NO_PUSHDATA_API - -static int start_decoder(vorb *f) -{ - uint8 header[6], x,y; - int len,i,j,k, max_submaps = 0; - int longest_floorlist=0; - - // first page, first packet - - if (!start_page(f)) return FALSE; - // validate page flag - if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); - if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); - if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); - // check for expected packet length - if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); - if (f->segments[0] != 30) return error(f, VORBIS_invalid_first_page); - // read packet - // check packet header - if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); - if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); - if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); - // vorbis_version - if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); - f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); - if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); - f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); - get32(f); // bitrate_maximum - get32(f); // bitrate_nominal - get32(f); // bitrate_minimum - x = get8(f); - { int log0,log1; - log0 = x & 15; - log1 = x >> 4; - f->blocksize_0 = 1 << log0; - f->blocksize_1 = 1 << log1; - if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); - if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); - if (log0 > log1) return error(f, VORBIS_invalid_setup); - } - - // framing_flag - x = get8(f); - if (!(x & 1)) return error(f, VORBIS_invalid_first_page); - - // second packet! - if (!start_page(f)) return FALSE; - - if (!start_packet(f)) return FALSE; - do { - len = next_segment(f); - skip(f, len); - f->bytes_in_seg = 0; - } while (len); - - // third packet! - if (!start_packet(f)) return FALSE; - - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (IS_PUSH_MODE(f)) { - if (!is_whole_packet_present(f, TRUE)) { - // convert error in ogg header to write type - if (f->error == VORBIS_invalid_stream) - f->error = VORBIS_invalid_setup; - return FALSE; - } - } - #endif - - crc32_init(); // always init it, to avoid multithread race conditions - - if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); - for (i=0; i < 6; ++i) header[i] = get8_packet(f); - if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); - - // codebooks - - f->codebook_count = get_bits(f,8) + 1; - f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); - if (f->codebooks == NULL) return error(f, VORBIS_outofmem); - memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); - for (i=0; i < f->codebook_count; ++i) { - uint32 *values; - int ordered, sorted_count; - int total=0; - uint8 *lengths; - Codebook *c = f->codebooks+i; - x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); - c->dimensions = (get_bits(f, 8)<<8) + x; - x = get_bits(f, 8); - y = get_bits(f, 8); - c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; - ordered = get_bits(f,1); - c->sparse = ordered ? 0 : get_bits(f,1); - - if (c->sparse) - lengths = (uint8 *) setup_temp_malloc(f, c->entries); - else - lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); - - if (!lengths) return error(f, VORBIS_outofmem); - - if (ordered) { - int current_entry = 0; - int current_length = get_bits(f,5) + 1; - while (current_entry < c->entries) { - int limit = c->entries - current_entry; - int n = get_bits(f, ilog(limit)); - if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } - memset(lengths + current_entry, current_length, n); - current_entry += n; - ++current_length; - } - } else { - for (j=0; j < c->entries; ++j) { - int present = c->sparse ? get_bits(f,1) : 1; - if (present) { - lengths[j] = get_bits(f, 5) + 1; - ++total; - } else { - lengths[j] = NO_CODE; - } - } - } - - if (c->sparse && total >= c->entries >> 2) { - // convert sparse items to non-sparse! - if (c->entries > (int) f->setup_temp_memory_required) - f->setup_temp_memory_required = c->entries; - - c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); - memcpy(c->codeword_lengths, lengths, c->entries); - setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! - lengths = c->codeword_lengths; - c->sparse = 0; - } - - // compute the size of the sorted tables - if (c->sparse) { - sorted_count = total; - //assert(total != 0); - } else { - sorted_count = 0; - #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH - for (j=0; j < c->entries; ++j) - if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) - ++sorted_count; - #endif - } - - c->sorted_entries = sorted_count; - values = NULL; - - if (!c->sparse) { - c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); - if (!c->codewords) return error(f, VORBIS_outofmem); - } else { - unsigned int size; - if (c->sorted_entries) { - c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); - if (!c->codeword_lengths) return error(f, VORBIS_outofmem); - c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); - if (!c->codewords) return error(f, VORBIS_outofmem); - values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); - if (!values) return error(f, VORBIS_outofmem); - } - size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; - if (size > f->setup_temp_memory_required) - f->setup_temp_memory_required = size; - } - - if (!compute_codewords(c, lengths, c->entries, values)) { - if (c->sparse) setup_temp_free(f, values, 0); - return error(f, VORBIS_invalid_setup); - } - - if (c->sorted_entries) { - // allocate an extra slot for sentinels - c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); - // allocate an extra slot at the front so that c->sorted_values[-1] is defined - // so that we can catch that case without an extra if - c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); - if (c->sorted_values) { ++c->sorted_values; c->sorted_values[-1] = -1; } - compute_sorted_huffman(c, lengths, values); - } - - if (c->sparse) { - setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); - setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); - setup_temp_free(f, lengths, c->entries); - c->codewords = NULL; - } - - compute_accelerated_huffman(c); - - c->lookup_type = get_bits(f, 4); - if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); - if (c->lookup_type > 0) { - uint16 *mults; - c->minimum_value = float32_unpack(get_bits(f, 32)); - c->delta_value = float32_unpack(get_bits(f, 32)); - c->value_bits = get_bits(f, 4)+1; - c->sequence_p = get_bits(f,1); - if (c->lookup_type == 1) { - c->lookup_values = lookup1_values(c->entries, c->dimensions); - } else { - c->lookup_values = c->entries * c->dimensions; - } - mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); - if (mults == NULL) return error(f, VORBIS_outofmem); - for (j=0; j < (int) c->lookup_values; ++j) { - int q = get_bits(f, c->value_bits); - if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } - mults[j] = q; - } - -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int len, sparse = c->sparse; - // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop - if (sparse) { - if (c->sorted_entries == 0) goto skip; - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); - } else - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); - if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } - len = sparse ? c->sorted_entries : c->entries; - for (j=0; j < len; ++j) { - int z = sparse ? c->sorted_values[j] : j, div=1; - for (k=0; k < c->dimensions; ++k) { - int off = (z / div) % c->lookup_values; - c->multiplicands[j*c->dimensions + k] = - #ifndef STB_VORBIS_CODEBOOK_FLOATS - mults[off]; - #else - mults[off]*c->delta_value + c->minimum_value; - // in this case (and this case only) we could pre-expand c->sequence_p, - // and throw away the decode logic for it; have to ALSO do - // it in the case below, but it can only be done if - // STB_VORBIS_CODEBOOK_FLOATS - // !STB_VORBIS_DIVIDES_IN_CODEBOOK - #endif - div *= c->lookup_values; - } - } - setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); - c->lookup_type = 2; - } - else -#endif - { - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); - #ifndef STB_VORBIS_CODEBOOK_FLOATS - memcpy(c->multiplicands, mults, sizeof(c->multiplicands[0]) * c->lookup_values); - #else - for (j=0; j < (int) c->lookup_values; ++j) - c->multiplicands[j] = mults[j] * c->delta_value + c->minimum_value; - #endif - setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); - } - skip:; - - #ifdef STB_VORBIS_CODEBOOK_FLOATS - if (c->lookup_type == 2 && c->sequence_p) { - for (j=1; j < (int) c->lookup_values; ++j) - c->multiplicands[j] = c->multiplicands[j-1]; - c->sequence_p = 0; - } - #endif - } - } - - // time domain transfers (notused) - - x = get_bits(f, 6) + 1; - for (i=0; i < x; ++i) { - uint32 z = get_bits(f, 16); - if (z != 0) return error(f, VORBIS_invalid_setup); - } - - // Floors - f->floor_count = get_bits(f, 6)+1; - f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); - for (i=0; i < f->floor_count; ++i) { - f->floor_types[i] = get_bits(f, 16); - if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); - if (f->floor_types[i] == 0) { - Floor0 *g = &f->floor_config[i].floor0; - g->order = get_bits(f,8); - g->rate = get_bits(f,16); - g->bark_map_size = get_bits(f,16); - g->amplitude_bits = get_bits(f,6); - g->amplitude_offset = get_bits(f,8); - g->number_of_books = get_bits(f,4) + 1; - for (j=0; j < g->number_of_books; ++j) - g->book_list[j] = get_bits(f,8); - return error(f, VORBIS_feature_not_supported); - } else { - Point p[31*8+2]; - Floor1 *g = &f->floor_config[i].floor1; - int max_class = -1; - g->partitions = get_bits(f, 5); - for (j=0; j < g->partitions; ++j) { - g->partition_class_list[j] = get_bits(f, 4); - if (g->partition_class_list[j] > max_class) - max_class = g->partition_class_list[j]; - } - for (j=0; j <= max_class; ++j) { - g->class_dimensions[j] = get_bits(f, 3)+1; - g->class_subclasses[j] = get_bits(f, 2); - if (g->class_subclasses[j]) { - g->class_masterbooks[j] = get_bits(f, 8); - if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } - for (k=0; k < 1 << g->class_subclasses[j]; ++k) { - g->subclass_books[j][k] = get_bits(f,8)-1; - if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } - } - g->floor1_multiplier = get_bits(f,2)+1; - g->rangebits = get_bits(f,4); - g->Xlist[0] = 0; - g->Xlist[1] = 1 << g->rangebits; - g->values = 2; - for (j=0; j < g->partitions; ++j) { - int c = g->partition_class_list[j]; - for (k=0; k < g->class_dimensions[c]; ++k) { - g->Xlist[g->values] = get_bits(f, g->rangebits); - ++g->values; - } - } - // precompute the sorting - for (j=0; j < g->values; ++j) { - p[j].x = g->Xlist[j]; - p[j].y = j; - } - qsort(p, g->values, sizeof(p[0]), point_compare); - for (j=0; j < g->values; ++j) - g->sorted_order[j] = (uint8) p[j].y; - // precompute the neighbors - for (j=2; j < g->values; ++j) { - int low,hi; - neighbors(g->Xlist, j, &low,&hi); - g->neighbors[j][0] = low; - g->neighbors[j][1] = hi; - } - - if (g->values > longest_floorlist) - longest_floorlist = g->values; - } - } - - // Residue - f->residue_count = get_bits(f, 6)+1; - f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(*f->residue_config)); - for (i=0; i < f->residue_count; ++i) { - uint8 residue_cascade[64]; - Residue *r = f->residue_config+i; - f->residue_types[i] = get_bits(f, 16); - if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); - r->begin = get_bits(f, 24); - r->end = get_bits(f, 24); - r->part_size = get_bits(f,24)+1; - r->classifications = get_bits(f,6)+1; - r->classbook = get_bits(f,8); - for (j=0; j < r->classifications; ++j) { - uint8 high_bits=0; - uint8 low_bits=get_bits(f,3); - if (get_bits(f,1)) - high_bits = get_bits(f,5); - residue_cascade[j] = high_bits*8 + low_bits; - } - r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); - for (j=0; j < r->classifications; ++j) { - for (k=0; k < 8; ++k) { - if (residue_cascade[j] & (1 << k)) { - r->residue_books[j][k] = get_bits(f, 8); - if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } else { - r->residue_books[j][k] = -1; - } - } - } - // precompute the classifications[] array to avoid inner-loop mod/divide - // call it 'classdata' since we already have r->classifications - r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); - if (!r->classdata) return error(f, VORBIS_outofmem); - memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); - for (j=0; j < f->codebooks[r->classbook].entries; ++j) { - int classwords = f->codebooks[r->classbook].dimensions; - int temp = j; - r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); - for (k=classwords-1; k >= 0; --k) { - r->classdata[j][k] = temp % r->classifications; - temp /= r->classifications; - } - } - } - - f->mapping_count = get_bits(f,6)+1; - f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); - for (i=0; i < f->mapping_count; ++i) { - Mapping *m = f->mapping + i; - int mapping_type = get_bits(f,16); - if (mapping_type != 0) return error(f, VORBIS_invalid_setup); - m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); - if (get_bits(f,1)) - m->submaps = get_bits(f,4); - else - m->submaps = 1; - if (m->submaps > max_submaps) - max_submaps = m->submaps; - if (get_bits(f,1)) { - m->coupling_steps = get_bits(f,8)+1; - for (k=0; k < m->coupling_steps; ++k) { - m->chan[k].magnitude = get_bits(f, ilog(f->channels)-1); - m->chan[k].angle = get_bits(f, ilog(f->channels)-1); - if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); - if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); - if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); - } - } else - m->coupling_steps = 0; - - // reserved field - if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); - if (m->submaps > 1) { - for (j=0; j < f->channels; ++j) { - m->chan[j].mux = get_bits(f, 4); - if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); - } - } else - // @SPECIFICATION: this case is missing from the spec - for (j=0; j < f->channels; ++j) - m->chan[j].mux = 0; - - for (j=0; j < m->submaps; ++j) { - get_bits(f,8); // discard - m->submap_floor[j] = get_bits(f,8); - m->submap_residue[j] = get_bits(f,8); - if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); - if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); - } - } - - // Modes - f->mode_count = get_bits(f, 6)+1; - for (i=0; i < f->mode_count; ++i) { - Mode *m = f->mode_config+i; - m->blockflag = get_bits(f,1); - m->windowtype = get_bits(f,16); - m->transformtype = get_bits(f,16); - m->mapping = get_bits(f,8); - if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); - if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); - if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); - } - - flush_packet(f); - - f->previous_length = 0; - - for (i=0; i < f->channels; ++i) { - f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); - f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); - f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); - #ifdef STB_VORBIS_NO_DEFER_FLOOR - f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); - #endif - } - - if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; - if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; - f->blocksize[0] = f->blocksize_0; - f->blocksize[1] = f->blocksize_1; - -#ifdef STB_VORBIS_DIVIDE_TABLE - if (integer_divide_table[1][1]==0) - for (i=0; i < DIVTAB_NUMER; ++i) - for (j=1; j < DIVTAB_DENOM; ++j) - integer_divide_table[i][j] = i / j; -#endif - - // compute how much temporary memory is needed - - // 1. - { - uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); - uint32 classify_mem; - int i,max_part_read=0; - for (i=0; i < f->residue_count; ++i) { - Residue *r = f->residue_config + i; - int n_read = r->end - r->begin; - int part_read = n_read / r->part_size; - if (part_read > max_part_read) - max_part_read = part_read; - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); - #else - classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); - #endif - - f->temp_memory_required = classify_mem; - if (imdct_mem > f->temp_memory_required) - f->temp_memory_required = imdct_mem; - } - - f->first_decode = TRUE; - - if (f->alloc.alloc_buffer) { - assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); - // check if there's enough temp memory so we don't error later - if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) - return error(f, VORBIS_outofmem); - } - - f->first_audio_page_offset = stb_vorbis_get_file_offset(f); - - return TRUE; -} - -static void vorbis_deinit(stb_vorbis *p) -{ - int i,j; - for (i=0; i < p->residue_count; ++i) { - Residue *r = p->residue_config+i; - if (r->classdata) { - for (j=0; j < p->codebooks[r->classbook].entries; ++j) - setup_free(p, r->classdata[j]); - setup_free(p, r->classdata); - } - setup_free(p, r->residue_books); - } - - if (p->codebooks) { - for (i=0; i < p->codebook_count; ++i) { - Codebook *c = p->codebooks + i; - setup_free(p, c->codeword_lengths); - setup_free(p, c->multiplicands); - setup_free(p, c->codewords); - setup_free(p, c->sorted_codewords); - // c->sorted_values[-1] is the first entry in the array - setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); - } - setup_free(p, p->codebooks); - } - setup_free(p, p->floor_config); - setup_free(p, p->residue_config); - for (i=0; i < p->mapping_count; ++i) - setup_free(p, p->mapping[i].chan); - setup_free(p, p->mapping); - for (i=0; i < p->channels; ++i) { - setup_free(p, p->channel_buffers[i]); - setup_free(p, p->previous_window[i]); - #ifdef STB_VORBIS_NO_DEFER_FLOOR - setup_free(p, p->floor_buffers[i]); - #endif - setup_free(p, p->finalY[i]); - } - for (i=0; i < 2; ++i) { - setup_free(p, p->A[i]); - setup_free(p, p->B[i]); - setup_free(p, p->C[i]); - setup_free(p, p->window[i]); +// Ogg Vorbis I audio decoder -- version 0.99994 +// +// Written in April 2007 by Sean Barrett, sponsored by RAD Game Tools. +// +// Placed in the public domain April 2007 by the author: no copyright is +// claimed, and you may use it for any purpose you like. +// +// No warranty for any purpose is expressed or implied by the author (nor +// by RAD Game Tools). Report bugs and send enhancements to the author. +// +// Get the latest version and other information at: +// http://nothings.org/stb_vorbis/ + + +// Todo: +// +// - seeking (note you can seek yourself using the pushdata API) +// +// Limitations: +// +// - floor 0 not supported (used in old ogg vorbis files) +// - lossless sample-truncation at beginning ignored +// - cannot concatenate multiple vorbis streams +// - sample positions are 32-bit, limiting seekable 192Khz +// files to around 6 hours (Ogg supports 64-bit) +// +// All of these limitations may be removed in future versions. + +#include "stb_vorbis.h" + +#ifndef STB_VORBIS_HEADER_ONLY + +// global configuration settings (e.g. set these in the project/makefile), +// or just set them in this file at the top (although ideally the first few +// should be visible when the header file is compiled too, although it's not +// crucial) + +// STB_VORBIS_NO_PUSHDATA_API +// does not compile the code for the various stb_vorbis_*_pushdata() +// functions +// #define STB_VORBIS_NO_PUSHDATA_API + +// STB_VORBIS_NO_PULLDATA_API +// does not compile the code for the non-pushdata APIs +// #define STB_VORBIS_NO_PULLDATA_API + +// STB_VORBIS_NO_STDIO +// does not compile the code for the APIs that use FILE *s internally +// or externally (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_STDIO + +// STB_VORBIS_NO_INTEGER_CONVERSION +// does not compile the code for converting audio sample data from +// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_INTEGER_CONVERSION + +// STB_VORBIS_NO_FAST_SCALED_FLOAT +// does not use a fast float-to-int trick to accelerate float-to-int on +// most platforms which requires endianness be defined correctly. +#define STB_VORBIS_NO_FAST_SCALED_FLOAT + + +// STB_VORBIS_MAX_CHANNELS [number] +// globally define this to the maximum number of channels you need. +// The spec does not put a restriction on channels except that +// the count is stored in a byte, so 255 is the hard limit. +// Reducing this saves about 16 bytes per value, so using 16 saves +// (255-16)*16 or around 4KB. Plus anything other memory usage +// I forgot to account for. Can probably go as low as 8 (7.1 audio), +// 6 (5.1 audio), or 2 (stereo only). +#ifndef STB_VORBIS_MAX_CHANNELS +#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? +#endif + +// STB_VORBIS_PUSHDATA_CRC_COUNT [number] +// after a flush_pushdata(), stb_vorbis begins scanning for the +// next valid page, without backtracking. when it finds something +// that looks like a page, it streams through it and verifies its +// CRC32. Should that validation fail, it keeps scanning. But it's +// possible that _while_ streaming through to check the CRC32 of +// one candidate page, it sees another candidate page. This #define +// determines how many "overlapping" candidate pages it can search +// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas +// garbage pages could be as big as 64KB, but probably average ~16KB. +// So don't hose ourselves by scanning an apparent 64KB page and +// missing a ton of real ones in the interim; so minimum of 2 +#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT +#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 +#endif + +// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] +// sets the log size of the huffman-acceleration table. Maximum +// supported value is 24. with larger numbers, more decodings are O(1), +// but the table size is larger so worse cache missing, so you'll have +// to probe (and try multiple ogg vorbis files) to find the sweet spot. +#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH +#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 +#endif + +// STB_VORBIS_FAST_BINARY_LENGTH [number] +// sets the log size of the binary-search acceleration table. this +// is used in similar fashion to the fast-huffman size to set initial +// parameters for the binary search + +// STB_VORBIS_FAST_HUFFMAN_INT +// The fast huffman tables are much more efficient if they can be +// stored as 16-bit results instead of 32-bit results. This restricts +// the codebooks to having only 65535 possible outcomes, though. +// (At least, accelerated by the huffman table.) +#ifndef STB_VORBIS_FAST_HUFFMAN_INT +#define STB_VORBIS_FAST_HUFFMAN_SHORT +#endif + +// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH +// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls +// back on binary searching for the correct one. This requires storing +// extra tables with the huffman codes in sorted order. Defining this +// symbol trades off space for speed by forcing a linear search in the +// non-fast case, except for "sparse" codebooks. +// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + +// STB_VORBIS_DIVIDES_IN_RESIDUE +// stb_vorbis precomputes the result of the scalar residue decoding +// that would otherwise require a divide per chunk. you can trade off +// space for time by defining this symbol. +// #define STB_VORBIS_DIVIDES_IN_RESIDUE + +// STB_VORBIS_DIVIDES_IN_CODEBOOK +// vorbis VQ codebooks can be encoded two ways: with every case explicitly +// stored, or with all elements being chosen from a small range of values, +// and all values possible in all elements. By default, stb_vorbis expands +// this latter kind out to look like the former kind for ease of decoding, +// because otherwise an integer divide-per-vector-element is required to +// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can +// trade off storage for speed. +//#define STB_VORBIS_DIVIDES_IN_CODEBOOK + +// STB_VORBIS_CODEBOOK_SHORTS +// The vorbis file format encodes VQ codebook floats as ax+b where a and +// b are floating point per-codebook constants, and x is a 16-bit int. +// Normally, stb_vorbis decodes them to floats rather than leaving them +// as 16-bit ints and computing ax+b while decoding. This is a speed/space +// tradeoff; you can save space by defining this flag. +#ifndef STB_VORBIS_CODEBOOK_SHORTS +#define STB_VORBIS_CODEBOOK_FLOATS +#endif + +// STB_VORBIS_DIVIDE_TABLE +// this replaces small integer divides in the floor decode loop with +// table lookups. made less than 1% difference, so disabled by default. + +// STB_VORBIS_NO_INLINE_DECODE +// disables the inlining of the scalar codebook fast-huffman decode. +// might save a little codespace; useful for debugging +// #define STB_VORBIS_NO_INLINE_DECODE + +// STB_VORBIS_NO_DEFER_FLOOR +// Normally we only decode the floor without synthesizing the actual +// full curve. We can instead synthesize the curve immediately. This +// requires more memory and is very likely slower, so I don't think +// you'd ever want to do it except for debugging. +// #define STB_VORBIS_NO_DEFER_FLOOR + + + + +////////////////////////////////////////////////////////////////////////////// + +#ifdef STB_VORBIS_NO_PULLDATA_API + #define STB_VORBIS_NO_INTEGER_CONVERSION + #define STB_VORBIS_NO_STDIO +#endif + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) + #define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + + // only need endianness for fast-float-to-int, which we don't + // use for pushdata + + #ifndef STB_VORBIS_BIG_ENDIAN + #define STB_VORBIS_ENDIAN 0 + #else + #define STB_VORBIS_ENDIAN 1 + #endif + +#endif +#endif + + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifndef STB_VORBIS_NO_CRT +#include +#include +#include +#include + +#if !defined(__APPLE__) && !defined(MACOSX) && !defined(macintosh) && !defined(Macintosh) &&!defined(__FreeBSD__) +#include +#endif + +#else +#define NULL 0 +#endif + +#ifndef _MSC_VER + #if __GNUC__ + #define __forceinline inline + #else + #define __forceinline + #endif +#endif + +#if STB_VORBIS_MAX_CHANNELS > 256 +#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" +#endif + +#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 +#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" +#endif + + +#define MAX_BLOCKSIZE_LOG 13 // from specification +#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) + + +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifdef STB_VORBIS_CODEBOOK_FLOATS +typedef float codetype; +#else +typedef uint16 codetype; +#endif + +// @NOTE +// +// Some arrays below are tagged "//varies", which means it's actually +// a variable-sized piece of data, but rather than malloc I assume it's +// small enough it's better to just allocate it all together with the +// main thing +// +// Most of the variables are specified with the smallest size I could pack +// them into. It might give better performance to make them all full-sized +// integers. It should be safe to freely rearrange the structures or change +// the sizes larger--nothing relies on silently truncating etc., nor the +// order of variables. + +#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) +#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) + +typedef struct +{ + int dimensions, entries; + uint8 *codeword_lengths; + float minimum_value; + float delta_value; + uint8 value_bits; + uint8 lookup_type; + uint8 sequence_p; + uint8 sparse; + uint32 lookup_values; + codetype *multiplicands; + uint32 *codewords; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #else + int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #endif + uint32 *sorted_codewords; + int *sorted_values; + int sorted_entries; +} Codebook; + +typedef struct +{ + uint8 order; + uint16 rate; + uint16 bark_map_size; + uint8 amplitude_bits; + uint8 amplitude_offset; + uint8 number_of_books; + uint8 book_list[16]; // varies +} Floor0; + +typedef struct +{ + uint8 partitions; + uint8 partition_class_list[32]; // varies + uint8 class_dimensions[16]; // varies + uint8 class_subclasses[16]; // varies + uint8 class_masterbooks[16]; // varies + int16 subclass_books[16][8]; // varies + uint16 Xlist[31*8+2]; // varies + uint8 sorted_order[31*8+2]; + uint8 neighbors[31*8+2][2]; + uint8 floor1_multiplier; + uint8 rangebits; + int values; +} Floor1; + +typedef union +{ + Floor0 floor0; + Floor1 floor1; +} Floor; + +typedef struct +{ + uint32 begin, end; + uint32 part_size; + uint8 classifications; + uint8 classbook; + uint8 **classdata; + int16 (*residue_books)[8]; +} Residue; + +typedef struct +{ + uint8 magnitude; + uint8 angle; + uint8 mux; +} MappingChannel; + +typedef struct +{ + uint16 coupling_steps; + MappingChannel *chan; + uint8 submaps; + uint8 submap_floor[15]; // varies + uint8 submap_residue[15]; // varies +} Mapping; + +typedef struct +{ + uint8 blockflag; + uint8 mapping; + uint16 windowtype; + uint16 transformtype; +} Mode; + +typedef struct +{ + uint32 goal_crc; // expected crc if match + int bytes_left; // bytes left in packet + uint32 crc_so_far; // running crc + int bytes_done; // bytes processed in _current_ chunk + uint32 sample_loc; // granule pos encoded in page +} CRCscan; + +typedef struct +{ + uint32 page_start, page_end; + uint32 after_previous_page_start; + uint32 first_decoded_sample; + uint32 last_decoded_sample; +} ProbedPage; + +struct stb_vorbis +{ + // user-accessible info + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int temp_memory_required; + unsigned int setup_temp_memory_required; + + // input config +#ifndef STB_VORBIS_NO_STDIO + FILE *f; + uint32 f_start; + int close_on_free; +#endif + + uint8 *stream; + uint8 *stream_start; + uint8 *stream_end; + + uint32 stream_len; + + uint8 push_mode; + + uint32 first_audio_page_offset; + + ProbedPage p_first, p_last; + + // memory management + stb_vorbis_alloc alloc; + int setup_offset; + int temp_offset; + + // run-time results + int eof; + enum STBVorbisError error; + + // user-useful data + + // header info + int blocksize[2]; + int blocksize_0, blocksize_1; + int codebook_count; + Codebook *codebooks; + int floor_count; + uint16 floor_types[64]; // varies + Floor *floor_config; + int residue_count; + uint16 residue_types[64]; // varies + Residue *residue_config; + int mapping_count; + Mapping *mapping; + int mode_count; + Mode mode_config[64]; // varies + + uint32 total_samples; + + // decode buffer + float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; + float *outputs [STB_VORBIS_MAX_CHANNELS]; + + float *previous_window[STB_VORBIS_MAX_CHANNELS]; + int previous_length; + + #ifndef STB_VORBIS_NO_DEFER_FLOOR + int16 *finalY[STB_VORBIS_MAX_CHANNELS]; + #else + float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; + #endif + + uint32 current_loc; // sample location of next frame to decode + int current_loc_valid; + + // per-blocksize precomputed data + + // twiddle factors + float *A[2],*B[2],*C[2]; + float *window[2]; + uint16 *bit_reverse[2]; + + // current page/packet/segment streaming info + uint32 serial; // stream serial number for verification + int last_page; + int segment_count; + uint8 segments[255]; + uint8 page_flag; + uint8 bytes_in_seg; + uint8 first_decode; + int next_seg; + int last_seg; // flag that we're on the last segment + int last_seg_which; // what was the segment number of the last seg? + uint32 acc; + int valid_bits; + int packet_bytes; + int end_seg_with_known_loc; + uint32 known_loc_for_packet; + int discard_samples_deferred; + uint32 samples_output; + + // push mode scanning + int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching +#ifndef STB_VORBIS_NO_PUSHDATA_API + CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; +#endif + + // sample-access + int channel_buffer_start; + int channel_buffer_end; +}; + +extern int my_prof(int slot); +//#define stb_prof my_prof + +#ifndef stb_prof +#define stb_prof(x) 0 +#endif + +#if defined(STB_VORBIS_NO_PUSHDATA_API) + #define IS_PUSH_MODE(f) FALSE +#elif defined(STB_VORBIS_NO_PULLDATA_API) + #define IS_PUSH_MODE(f) TRUE +#else + #define IS_PUSH_MODE(f) ((f)->push_mode) +#endif + +typedef struct stb_vorbis vorb; + +static int error(vorb *f, enum STBVorbisError e) +{ + f->error = e; + if (!f->eof && e != VORBIS_need_more_data) { + f->error=e; // breakpoint for debugging + } + return 0; +} + + +// these functions are used for allocating temporary memory +// while decoding. if you can afford the stack space, use +// alloca(); otherwise, provide a temp buffer and it will +// allocate out of those. + +#define array_size_required(count,size) (count*(sizeof(void *)+(size))) + +#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) +#ifdef dealloca +#define temp_free(f,p) (f->alloc.alloc_buffer ? 0 : dealloca(size)) +#else +#define temp_free(f,p) 0 +#endif +#define temp_alloc_save(f) ((f)->temp_offset) +#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) + +#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) + +// given a sufficiently large block of memory, make an array of pointers to subblocks of it +static void *make_block_array(void *mem, int count, int size) +{ + int i; + void ** p = (void **) mem; + char *q = (char *) (p + count); + for (i=0; i < count; ++i) { + p[i] = q; + q += size; + } + return p; +} + +static void *setup_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + f->setup_memory_required += sz; + if (f->alloc.alloc_buffer) { + void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; + if (f->setup_offset + sz > f->temp_offset) return NULL; + f->setup_offset += sz; + return p; + } + return sz ? malloc(sz) : NULL; +} + +static void setup_free(vorb *f, void *p) +{ + if (f->alloc.alloc_buffer) return; // do nothing; setup mem is not a stack + free(p); +} + +static void *setup_temp_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + if (f->alloc.alloc_buffer) { + if (f->temp_offset - sz < f->setup_offset) return NULL; + f->temp_offset -= sz; + return (char *) f->alloc.alloc_buffer + f->temp_offset; + } + return malloc(sz); +} + +static void setup_temp_free(vorb *f, void *p, size_t sz) +{ + if (f->alloc.alloc_buffer) { + f->temp_offset += (sz+3)&~3; + return; + } + free(p); +} + +#define CRC32_POLY 0x04c11db7 // from spec + +static uint32 crc_table[256]; +static void crc32_init(void) +{ + int i,j; + uint32 s; + for(i=0; i < 256; i++) { + for (s=i<<24, j=0; j < 8; ++j) + s = (s << 1) ^ (s >= (1<<31) ? CRC32_POLY : 0); + crc_table[i] = s; + } +} + +static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) +{ + return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; +} + + +// used in setup, and for huffman that doesn't go fast path +static unsigned int bit_reverse(unsigned int n) +{ + n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); + n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); + n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); + n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); + return (n >> 16) | (n << 16); +} + +static float square(float x) +{ + return x*x; +} + +// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 +// as required by the specification. fast(?) implementation from stb.h +// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup +static int ilog(int32 n) +{ + static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; + + // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) + if (n < (1U << 14)) + if (n < (1U << 4)) return 0 + log2_4[n ]; + else if (n < (1U << 9)) return 5 + log2_4[n >> 5]; + else return 10 + log2_4[n >> 10]; + else if (n < (1U << 24)) + if (n < (1U << 19)) return 15 + log2_4[n >> 15]; + else return 20 + log2_4[n >> 20]; + else if (n < (1U << 29)) return 25 + log2_4[n >> 25]; + else if (n < (1U << 31)) return 30 + log2_4[n >> 30]; + else return 0; // signed n returns 0 +} + +#ifndef M_PI + #define M_PI 3.14159265358979323846264f // from CRC +#endif + +// code length assigned to a value with no huffman encoding +#define NO_CODE 255 + +/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// +// +// these functions are only called at setup, and only a few times +// per file + +static float float32_unpack(uint32 x) +{ + // from the specification + uint32 mantissa = x & 0x1fffff; + uint32 sign = x & 0x80000000; + uint32 exp = (x & 0x7fe00000) >> 21; + double res = sign ? -(double)mantissa : (double)mantissa; + return (float) ldexp((float)res, exp-788); +} + + +// zlib & jpeg huffman tables assume that the output symbols +// can either be arbitrarily arranged, or have monotonically +// increasing frequencies--they rely on the lengths being sorted; +// this makes for a very simple generation algorithm. +// vorbis allows a huffman table with non-sorted lengths. This +// requires a more sophisticated construction, since symbols in +// order do not map to huffman codes "in order". +static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) +{ + if (!c->sparse) { + c->codewords [symbol] = huff_code; + } else { + c->codewords [count] = huff_code; + c->codeword_lengths[count] = len; + values [count] = symbol; + } +} + +static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) +{ + int i,k,m=0; + uint32 available[32]; + + memset(available, 0, sizeof(available)); + // find the first entry + for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; + if (k == n) { assert(c->sorted_entries == 0); return TRUE; } + // add to the list + add_entry(c, 0, k, m++, len[k], values); + // add all available leaves + for (i=1; i <= len[k]; ++i) + available[i] = 1 << (32-i); + // note that the above code treats the first case specially, + // but it's really the same as the following code, so they + // could probably be combined (except the initial code is 0, + // and I use 0 in available[] to mean 'empty') + for (i=k+1; i < n; ++i) { + uint32 res; + int z = len[i], y; + if (z == NO_CODE) continue; + // find lowest available leaf (should always be earliest, + // which is what the specification calls for) + // note that this property, and the fact we can never have + // more than one free leaf at a given level, isn't totally + // trivial to prove, but it seems true and the assert never + // fires, so! + while (z > 0 && !available[z]) --z; + if (z == 0) { assert(0); return FALSE; } + res = available[z]; + available[z] = 0; + add_entry(c, bit_reverse(res), i, m++, len[i], values); + // propogate availability up the tree + if (z != len[i]) { + for (y=len[i]; y > z; --y) { + assert(available[y] == 0); + available[y] = res + (1 << (32-y)); + } + } + } + return TRUE; +} + +// accelerated huffman table allows fast O(1) match of all symbols +// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH +static void compute_accelerated_huffman(Codebook *c) +{ + int i, len; + for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) + c->fast_huffman[i] = -1; + + len = c->sparse ? c->sorted_entries : c->entries; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + if (len > 32767) len = 32767; // largest possible value we can encode! + #endif + for (i=0; i < len; ++i) { + if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { + uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; + // set table entries for all bit combinations in the higher bits + while (z < FAST_HUFFMAN_TABLE_SIZE) { + c->fast_huffman[z] = i; + z += 1 << c->codeword_lengths[i]; + } + } + } +} + +static int uint32_compare(const void *p, const void *q) +{ + uint32 x = * (uint32 *) p; + uint32 y = * (uint32 *) q; + return x < y ? -1 : x > y; +} + +static int include_in_sort(Codebook *c, uint8 len) +{ + if (c->sparse) { assert(len != NO_CODE); return TRUE; } + if (len == NO_CODE) return FALSE; + if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; + return FALSE; +} + +// if the fast table above doesn't work, we want to binary +// search them... need to reverse the bits +static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) +{ + int i, len; + // build a list of all the entries + // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. + // this is kind of a frivolous optimization--I don't see any performance improvement, + // but it's like 4 extra lines of code, so. + if (!c->sparse) { + int k = 0; + for (i=0; i < c->entries; ++i) + if (include_in_sort(c, lengths[i])) + c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); + assert(k == c->sorted_entries); + } else { + for (i=0; i < c->sorted_entries; ++i) + c->sorted_codewords[i] = bit_reverse(c->codewords[i]); + } + + qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); + c->sorted_codewords[c->sorted_entries] = 0xffffffff; + + len = c->sparse ? c->sorted_entries : c->entries; + // now we need to indicate how they correspond; we could either + // #1: sort a different data structure that says who they correspond to + // #2: for each sorted entry, search the original list to find who corresponds + // #3: for each original entry, find the sorted entry + // #1 requires extra storage, #2 is slow, #3 can use binary search! + for (i=0; i < len; ++i) { + int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; + if (include_in_sort(c,huff_len)) { + uint32 code = bit_reverse(c->codewords[i]); + int x=0, n=c->sorted_entries; + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + assert(c->sorted_codewords[x] == code); + if (c->sparse) { + c->sorted_values[x] = values[i]; + c->codeword_lengths[x] = huff_len; + } else { + c->sorted_values[x] = i; + } + } + } +} + +// only run while parsing the header (3 times) +static int vorbis_validate(uint8 *data) +{ + static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; + return memcmp(data, vorbis, 6) == 0; +} + +// called from setup only, once per code book +// (formula implied by specification) +static int lookup1_values(int entries, int dim) +{ + int r = (int) floor(exp((float) log((float) entries) / dim)); + if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; + ++r; // floor() to avoid _ftol() when non-CRT + assert(pow((float) r+1, dim) > entries); + assert((int) floor(pow((float) r, dim)) <= entries); // (int),floor() as above + return r; +} + +// called twice per file +static void compute_twiddle_factors(int n, float *A, float *B, float *C) +{ + int n4 = n >> 2, n8 = n >> 3; + int k,k2; + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; + B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } +} + +static void compute_window(int n, float *window) +{ + int n2 = n >> 1, i; + for (i=0; i < n2; ++i) + window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); +} + +static void compute_bitreverse(int n, uint16 *rev) +{ + int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + int i, n8 = n >> 3; + for (i=0; i < n8; ++i) + rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; +} + +static int init_blocksize(vorb *f, int b, int n) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; + f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); + if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); + compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); + f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); + if (!f->window[b]) return error(f, VORBIS_outofmem); + compute_window(n, f->window[b]); + f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); + if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); + compute_bitreverse(n, f->bit_reverse[b]); + return TRUE; +} + +static void neighbors(uint16 *x, int n, int *plow, int *phigh) +{ + int low = -1; + int high = 65536; + int i; + for (i=0; i < n; ++i) { + if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } + if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } + } +} + +// this has been repurposed so y is now the original index instead of y +typedef struct +{ + uint16 x,y; +} Point; + +int point_compare(const void *p, const void *q) +{ + Point *a = (Point *) p; + Point *b = (Point *) q; + return a->x < b->x ? -1 : a->x > b->x; +} + +// +/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// + + +#if defined(STB_VORBIS_NO_STDIO) + #define USE_MEMORY(z) TRUE +#else + #define USE_MEMORY(z) ((z)->stream) +#endif + +static uint8 get8(vorb *z) +{ + if (USE_MEMORY(z)) { + if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } + return *z->stream++; + } + + #ifndef STB_VORBIS_NO_STDIO + { + int c = fgetc(z->f); + if (c == EOF) { z->eof = TRUE; return 0; } + return c; + } + #endif +} + +static uint32 get32(vorb *f) +{ + uint32 x; + x = get8(f); + x += get8(f) << 8; + x += get8(f) << 16; + x += get8(f) << 24; + return x; +} + +static int getn(vorb *z, uint8 *data, int n) +{ + if (USE_MEMORY(z)) { + if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } + memcpy(data, z->stream, n); + z->stream += n; + return 1; + } + + #ifndef STB_VORBIS_NO_STDIO + if (fread(data, n, 1, z->f) == 1) + return 1; + else { + z->eof = 1; + return 0; + } + #endif +} + +static void skip(vorb *z, int n) +{ + if (USE_MEMORY(z)) { + z->stream += n; + if (z->stream >= z->stream_end) z->eof = 1; + return; + } + #ifndef STB_VORBIS_NO_STDIO + { + long x = ftell(z->f); + fseek(z->f, x+n, SEEK_SET); + } + #endif +} + +static int set_file_offset(stb_vorbis *f, unsigned int loc) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + f->eof = 0; + if (USE_MEMORY(f)) { + if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { + f->stream = f->stream_end; + f->eof = 1; + return 0; + } else { + f->stream = f->stream_start + loc; + return 1; + } + } + #ifndef STB_VORBIS_NO_STDIO + if (loc + f->f_start < loc || loc >= 0x80000000) { + loc = 0x7fffffff; + f->eof = 1; + } else { + loc += f->f_start; + } + if (!fseek(f->f, loc, SEEK_SET)) + return 1; + f->eof = 1; + fseek(f->f, f->f_start, SEEK_END); + return 0; + #endif +} + + +static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; + +static int capture_pattern(vorb *f) +{ + if (0x4f != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x53 != get8(f)) return FALSE; + return TRUE; +} + +#define PAGEFLAG_continued_packet 1 +#define PAGEFLAG_first_page 2 +#define PAGEFLAG_last_page 4 + +static int start_page_no_capturepattern(vorb *f) +{ + uint32 loc0,loc1,n,i; + // stream structure version + if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); + // header flag + f->page_flag = get8(f); + // absolute granule position + loc0 = get32(f); + loc1 = get32(f); + // @TODO: validate loc0,loc1 as valid positions? + // stream serial number -- vorbis doesn't interleave, so discard + get32(f); + //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); + // page sequence number + n = get32(f); + f->last_page = n; + // CRC32 + get32(f); + // page_segments + f->segment_count = get8(f); + if (!getn(f, f->segments, f->segment_count)) + return error(f, VORBIS_unexpected_eof); + // assume we _don't_ know any the sample position of any segments + f->end_seg_with_known_loc = -2; + if (loc0 != ~0 || loc1 != ~0) { + // determine which packet is the last one that will complete + for (i=f->segment_count-1; i >= 0; --i) + if (f->segments[i] < 255) + break; + // 'i' is now the index of the _last_ segment of a packet that ends + if (i >= 0) { + f->end_seg_with_known_loc = i; + f->known_loc_for_packet = loc0; + } + } + if (f->first_decode) { + int i,len; + ProbedPage p; + len = 0; + for (i=0; i < f->segment_count; ++i) + len += f->segments[i]; + len += 27 + f->segment_count; + p.page_start = f->first_audio_page_offset; + p.page_end = p.page_start + len; + p.after_previous_page_start = p.page_start; + p.first_decoded_sample = 0; + p.last_decoded_sample = loc0; + f->p_first = p; + } + f->next_seg = 0; + return TRUE; +} + +static int start_page(vorb *f) +{ + if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); + return start_page_no_capturepattern(f); +} + +static int start_packet(vorb *f) +{ + while (f->next_seg == -1) { + if (!start_page(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) + return error(f, VORBIS_continued_packet_flag_invalid); + } + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + // f->next_seg is now valid + return TRUE; +} + +static int maybe_start_packet(vorb *f) +{ + if (f->next_seg == -1) { + int x = get8(f); + if (f->eof) return FALSE; // EOF at page boundary is not an error! + if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (!start_page_no_capturepattern(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) { + // set up enough state that we can read this packet if we want, + // e.g. during recovery + f->last_seg = FALSE; + f->bytes_in_seg = 0; + return error(f, VORBIS_continued_packet_flag_invalid); + } + } + return start_packet(f); +} + +static int next_segment(vorb *f) +{ + int len; + if (f->last_seg) return 0; + if (f->next_seg == -1) { + f->last_seg_which = f->segment_count-1; // in case start_page fails + if (!start_page(f)) { f->last_seg = 1; return 0; } + if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); + } + len = f->segments[f->next_seg++]; + if (len < 255) { + f->last_seg = TRUE; + f->last_seg_which = f->next_seg-1; + } + if (f->next_seg >= f->segment_count) + f->next_seg = -1; + assert(f->bytes_in_seg == 0); + f->bytes_in_seg = len; + return len; +} + +#define EOP (-1) +#define INVALID_BITS (-1) + +static int get8_packet_raw(vorb *f) +{ + if (!f->bytes_in_seg) + if (f->last_seg) return EOP; + else if (!next_segment(f)) return EOP; + assert(f->bytes_in_seg > 0); + --f->bytes_in_seg; + ++f->packet_bytes; + return get8(f); +} + +static int get8_packet(vorb *f) +{ + int x = get8_packet_raw(f); + f->valid_bits = 0; + return x; +} + +static void flush_packet(vorb *f) +{ + while (get8_packet_raw(f) != EOP); +} + +// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important +// as the huffman decoder? +static uint32 get_bits(vorb *f, int n) +{ + uint32 z; + + if (f->valid_bits < 0) return 0; + if (f->valid_bits < n) { + if (n > 24) { + // the accumulator technique below would not work correctly in this case + z = get_bits(f, 24); + z += get_bits(f, n-24) << 24; + return z; + } + if (f->valid_bits == 0) f->acc = 0; + while (f->valid_bits < n) { + int z = get8_packet_raw(f); + if (z == EOP) { + f->valid_bits = INVALID_BITS; + return 0; + } + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } + } + if (f->valid_bits < 0) return 0; + z = f->acc & ((1 << n)-1); + f->acc >>= n; + f->valid_bits -= n; + return z; +} + +static int32 get_bits_signed(vorb *f, int n) +{ + uint32 z = get_bits(f, n); + if (z & (1 << (n-1))) + z += ~((1 << n) - 1); + return (int32) z; +} + +// @OPTIMIZE: primary accumulator for huffman +// expand the buffer to as many bits as possible without reading off end of packet +// it might be nice to allow f->valid_bits and f->acc to be stored in registers, +// e.g. cache them locally and decode locally +static __forceinline void prep_huffman(vorb *f) +{ + if (f->valid_bits <= 24) { + if (f->valid_bits == 0) f->acc = 0; + do { + int z; + if (f->last_seg && !f->bytes_in_seg) return; + z = get8_packet_raw(f); + if (z == EOP) return; + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } while (f->valid_bits <= 24); + } +} + +enum +{ + VORBIS_packet_id = 1, + VORBIS_packet_comment = 3, + VORBIS_packet_setup = 5, +}; + +static int codebook_decode_scalar_raw(vorb *f, Codebook *c) +{ + int i; + prep_huffman(f); + + assert(c->sorted_codewords || c->codewords); + // cases to use binary search: sorted_codewords && !c->codewords + // sorted_codewords && c->entries > 8 + if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { + // binary search + uint32 code = bit_reverse(f->acc); + int x=0, n=c->sorted_entries, len; + + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + // x is now the sorted index + if (!c->sparse) x = c->sorted_values[x]; + // x is now sorted index if sparse, or symbol otherwise + len = c->codeword_lengths[x]; + if (f->valid_bits >= len) { + f->acc >>= len; + f->valid_bits -= len; + return x; + } + + f->valid_bits = 0; + return -1; + } + + // if small, linear search + assert(!c->sparse); + for (i=0; i < c->entries; ++i) { + if (c->codeword_lengths[i] == NO_CODE) continue; + if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { + if (f->valid_bits >= c->codeword_lengths[i]) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + return i; + } + f->valid_bits = 0; + return -1; + } + } + + error(f, VORBIS_invalid_stream); + f->valid_bits = 0; + return -1; +} + +static int codebook_decode_scalar(vorb *f, Codebook *c) +{ + int i; + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) + prep_huffman(f); + // fast huffman table lookup + i = f->acc & FAST_HUFFMAN_TABLE_MASK; + i = c->fast_huffman[i]; + if (i >= 0) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } + return i; + } + return codebook_decode_scalar_raw(f,c); +} + +#ifndef STB_VORBIS_NO_INLINE_DECODE + +#define DECODE_RAW(var, f,c) \ + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ + prep_huffman(f); \ + var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ + var = c->fast_huffman[var]; \ + if (var >= 0) { \ + int n = c->codeword_lengths[var]; \ + f->acc >>= n; \ + f->valid_bits -= n; \ + if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ + } else { \ + var = codebook_decode_scalar_raw(f,c); \ + } + +#else + +#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); + +#endif + +#define DECODE(var,f,c) \ + DECODE_RAW(var,f,c) \ + if (c->sparse) var = c->sorted_values[var]; + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) +#else + #define DECODE_VQ(var,f,c) DECODE(var,f,c) +#endif + + + + + + +// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case +// where we avoid one addition +#ifndef STB_VORBIS_CODEBOOK_FLOATS + #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off] * c->delta_value + c->minimum_value) + #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off] * c->delta_value) + #define CODEBOOK_ELEMENT_BASE(c) (c->minimum_value) +#else + #define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) + #define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) + #define CODEBOOK_ELEMENT_BASE(c) (0) +#endif + +static int codebook_decode_start(vorb *f, Codebook *c, int len) +{ + int z = -1; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) + error(f, VORBIS_invalid_stream); + else { + DECODE_VQ(z,f,c); + if (c->sparse) assert(z < c->sorted_entries); + if (z < 0) { // check for EOP + if (!f->bytes_in_seg) + if (f->last_seg) + return z; + error(f, VORBIS_invalid_stream); + } + } + return z; +} + +static int codebook_decode(vorb *f, Codebook *c, float *output, int len) +{ + int i,z = codebook_decode_start(f,c,len); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + float last = CODEBOOK_ELEMENT_BASE(c); + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i] += val; + if (c->sequence_p) last = val + c->minimum_value; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + if (c->sequence_p) { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i] += val; + last = val + c->minimum_value; + } + } else { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + } + } + + return TRUE; +} + +static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) +{ + int i,z = codebook_decode_start(f,c,len); + float last = CODEBOOK_ELEMENT_BASE(c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + } + + return TRUE; +} + +static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + assert(!c->sparse || z < c->sorted_entries); + #endif + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*ch + effective > len * ch) { + effective = len*ch - (p_inter*ch - c_inter); + } + + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < effective; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + } else + #endif + { + z *= c->dimensions; + if (c->sequence_p) { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK +static int codebook_decode_deinterleave_repeat_2(vorb *f, Codebook *c, float **outputs, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*2 + effective > len * 2) { + effective = len*2 - (p_inter*2 - c_inter); + } + + { + z *= c->dimensions; + stb_prof(11); + if (c->sequence_p) { + // haven't optimized this case because I don't have any examples + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == 2) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + i=0; + if (c_inter == 1) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + c_inter = 0; ++p_inter; + ++i; + } + { + float *z0 = outputs[0]; + float *z1 = outputs[1]; + for (; i+1 < effective;) { + z0[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + z1[p_inter] += CODEBOOK_ELEMENT_FAST(c,z+i+1) + last; + ++p_inter; + i += 2; + } + } + if (i < effective) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + outputs[c_inter][p_inter] += val; + if (++c_inter == 2) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} +#endif + +static int predict_point(int x, int x0, int x1, int y0, int y1) +{ + int dy = y1 - y0; + int adx = x1 - x0; + // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? + int err = abs(dy) * (x - x0); + int off = err / adx; + return dy < 0 ? y0 - off : y0 + off; +} + +// the following table is block-copied from the specification +static float inverse_db_table[256] = +{ + 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, + 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, + 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, + 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, + 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, + 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, + 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, + 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, + 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, + 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, + 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, + 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, + 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, + 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, + 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, + 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, + 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, + 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, + 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, + 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, + 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, + 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, + 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, + 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, + 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, + 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, + 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, + 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, + 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, + 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, + 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, + 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, + 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, + 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, + 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, + 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, + 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, + 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, + 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, + 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, + 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, + 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, + 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, + 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, + 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, + 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, + 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, + 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, + 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, + 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, + 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, + 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, + 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, + 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, + 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, + 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, + 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, + 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, + 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, + 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, + 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, + 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, + 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, + 0.82788260f, 0.88168307f, 0.9389798f, 1.0f +}; + + +// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, +// note that you must produce bit-identical output to decode correctly; +// this specific sequence of operations is specified in the spec (it's +// drawing integer-quantized frequency-space lines that the encoder +// expects to be exactly the same) +// ... also, isn't the whole point of Bresenham's algorithm to NOT +// have to divide in the setup? sigh. +#ifndef STB_VORBIS_NO_DEFER_FLOOR +#define LINE_OP(a,b) a *= b +#else +#define LINE_OP(a,b) a = b +#endif + +#ifdef STB_VORBIS_DIVIDE_TABLE +#define DIVTAB_NUMER 32 +#define DIVTAB_DENOM 64 +int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB +#endif + +static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) +{ + int dy = y1 - y0; + int adx = x1 - x0; + int ady = abs(dy); + int base; + int x=x0,y=y0; + int err = 0; + int sy; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { + if (dy < 0) { + base = -integer_divide_table[ady][adx]; + sy = base-1; + } else { + base = integer_divide_table[ady][adx]; + sy = base+1; + } + } else { + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; + } +#else + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; +#endif + ady -= abs(base) * adx; + if (x1 > n) x1 = n; + LINE_OP(output[x], inverse_db_table[y]); + for (++x; x < x1; ++x) { + err += ady; + if (err >= adx) { + err -= adx; + y += sy; + } else + y += base; + LINE_OP(output[x], inverse_db_table[y]); + } +} + +static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) +{ + int k; + if (rtype == 0) { + int step = n / book->dimensions; + for (k=0; k < step; ++k) + if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) + return FALSE; + } else { + for (k=0; k < n; ) { + if (!codebook_decode(f, book, target+offset, n-k)) + return FALSE; + k += book->dimensions; + offset += book->dimensions; + } + } + return TRUE; +} + +static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) +{ + int i,j,pass; + Residue *r = f->residue_config + rn; + int rtype = f->residue_types[rn]; + int c = r->classbook; + int classwords = f->codebooks[c].dimensions; + int n_read = r->end - r->begin; + int part_read = n_read / r->part_size; + int temp_alloc_point = temp_alloc_save(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); + #else + int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); + #endif + + stb_prof(2); + for (i=0; i < ch; ++i) + if (!do_not_decode[i]) + memset(residue_buffers[i], 0, sizeof(float) * n); + + if (rtype == 2 && ch != 1) { + int len = ch * n; + for (j=0; j < ch; ++j) + if (!do_not_decode[j]) + break; + if (j == ch) + goto done; + + stb_prof(3); + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set = 0; + if (ch == 2) { + stb_prof(13); + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = (z & 1), p_inter = z>>1; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + stb_prof(5); + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(20); // accounts for X time + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #else + // saves 1% + if (!codebook_decode_deinterleave_repeat_2(f, book, residue_buffers, &c_inter, &p_inter, n, r->part_size)) + goto done; + #endif + stb_prof(7); + } else { + z += r->part_size; + c_inter = z & 1; + p_inter = z >> 1; + } + } + stb_prof(8); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else if (ch == 1) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = 0, p_inter = z; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(22); + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + stb_prof(3); + } else { + z += r->part_size; + c_inter = 0; + p_inter = z; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = z % ch, p_inter = z/ch; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + stb_prof(22); + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + stb_prof(3); + } else { + z += r->part_size; + c_inter = z % ch; + p_inter = z / ch; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + } + goto done; + } + stb_prof(9); + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set=0; + while (pcount < part_read) { + if (pass == 0) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + Codebook *c = f->codebooks+r->classbook; + int temp; + DECODE(temp,f,c); + if (temp == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[j][class_set] = r->classdata[temp]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[j][i+pcount] = temp % r->classifications; + temp /= r->classifications; + } + #endif + } + } + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[j][class_set][i]; + #else + int c = classifications[j][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + float *target = residue_buffers[j]; + int offset = r->begin + pcount * r->part_size; + int n = r->part_size; + Codebook *book = f->codebooks + b; + if (!residue_decode(f, book, target, offset, n, rtype)) + goto done; + } + } + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + done: + stb_prof(0); + temp_alloc_restore(f,temp_alloc_point); +} + + +#if 0 +// slow way for debugging +void inverse_mdct_slow(float *buffer, int n) +{ + int i,j; + int n2 = n >> 1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + // formula from paper: + //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + // formula from wikipedia + //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + // these are equivalent, except the formula from the paper inverts the multiplier! + // however, what actually works is NO MULTIPLIER!?! + //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + buffer[i] = acc; + } + free(x); +} +#elif 0 +// same as above, but just barely able to run in real time on modern machines +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + float mcos[16384]; + int i,j; + int n2 = n >> 1, nmask = (n << 2) -1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < 4*n; ++i) + mcos[i] = (float) cos(M_PI / 2 * i / n); + + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; + buffer[i] = acc; + } + free(x); +} +#else +// transform to use a slow dct-iv; this is STILL basically trivial, +// but only requires half as many ops +void dct_iv_slow(float *buffer, int n) +{ + float mcos[16384]; + float x[2048]; + int i,j; + int n2 = n >> 1, nmask = (n << 3) - 1; + memcpy(x, buffer, sizeof(*x) * n); + for (i=0; i < 8*n; ++i) + mcos[i] = (float) cos(M_PI / 4 * i / n); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n; ++j) + acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; + //acc += x[j] * cos(M_PI / n * (i + 0.5) * (j + 0.5)); + buffer[i] = acc; + } +} + +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; + float temp[4096]; + + memcpy(temp, buffer, n2 * sizeof(float)); + dct_iv_slow(temp, n2); // returns -c'-d, a-b' + + for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' + for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' + for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d +} +#endif + +#ifndef LIBVORBIS_MDCT +#define LIBVORBIS_MDCT 0 +#endif + +#if LIBVORBIS_MDCT +// directly call the vorbis MDCT using an interface documented +// by Jeff Roberts... useful for performance comparison +typedef struct +{ + int n; + int log2n; + + float *trig; + int *bitrev; + + float scale; +} mdct_lookup; + +extern void mdct_init(mdct_lookup *lookup, int n); +extern void mdct_clear(mdct_lookup *l); +extern void mdct_backward(mdct_lookup *init, float *in, float *out); + +mdct_lookup M1,M2; + +void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + mdct_lookup *M; + if (M1.n == n) M = &M1; + else if (M2.n == n) M = &M2; + else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } + else { + if (M2.n) __asm int 3; + mdct_init(&M2, n); + M = &M2; + } + + mdct_backward(M, buffer, buffer); +} +#endif + + +// the following were split out into separate functions while optimizing; +// they could be pushed back up but eh. __forceinline showed no change; +// they're probably already being inlined. +static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) +{ + float *ee0 = e + i_off; + float *ee2 = ee0 + k_off; + int i; + + assert((n & 3) == 0); + for (i=(n>>2); i > 0; --i) { + float k00_20, k01_21; + k00_20 = ee0[ 0] - ee2[ 0]; + k01_21 = ee0[-1] - ee2[-1]; + ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-2] - ee2[-2]; + k01_21 = ee0[-3] - ee2[-3]; + ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-4] - ee2[-4]; + k01_21 = ee0[-5] - ee2[-5]; + ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-6] - ee2[-6]; + k01_21 = ee0[-7] - ee2[-7]; + ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + ee0 -= 8; + ee2 -= 8; + } +} + +static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) +{ + int i; + float k00_20, k01_21; + + float *e0 = e + d0; + float *e2 = e0 + k_off; + + for (i=lim >> 2; i > 0; --i) { + k00_20 = e0[-0] - e2[-0]; + k01_21 = e0[-1] - e2[-1]; + e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; + e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; + e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-2] - e2[-2]; + k01_21 = e0[-3] - e2[-3]; + e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; + e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; + e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-4] - e2[-4]; + k01_21 = e0[-5] - e2[-5]; + e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; + e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; + e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-6] - e2[-6]; + k01_21 = e0[-7] - e2[-7]; + e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; + e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; + e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; + + e0 -= 8; + e2 -= 8; + + A += k1; + } +} + +static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) +{ + int i; + float A0 = A[0]; + float A1 = A[0+1]; + float A2 = A[0+a_off]; + float A3 = A[0+a_off+1]; + float A4 = A[0+a_off*2+0]; + float A5 = A[0+a_off*2+1]; + float A6 = A[0+a_off*3+0]; + float A7 = A[0+a_off*3+1]; + + float k00,k11; + + float *ee0 = e +i_off; + float *ee2 = ee0+k_off; + + for (i=n; i > 0; --i) { + k00 = ee0[ 0] - ee2[ 0]; + k11 = ee0[-1] - ee2[-1]; + ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = (k00) * A0 - (k11) * A1; + ee2[-1] = (k11) * A0 + (k00) * A1; + + k00 = ee0[-2] - ee2[-2]; + k11 = ee0[-3] - ee2[-3]; + ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = (k00) * A2 - (k11) * A3; + ee2[-3] = (k11) * A2 + (k00) * A3; + + k00 = ee0[-4] - ee2[-4]; + k11 = ee0[-5] - ee2[-5]; + ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = (k00) * A4 - (k11) * A5; + ee2[-5] = (k11) * A4 + (k00) * A5; + + k00 = ee0[-6] - ee2[-6]; + k11 = ee0[-7] - ee2[-7]; + ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = (k00) * A6 - (k11) * A7; + ee2[-7] = (k11) * A6 + (k00) * A7; + + ee0 -= k0; + ee2 -= k0; + } +} + +static __forceinline void iter_54(float *z) +{ + float k00,k11,k22,k33; + float y0,y1,y2,y3; + + k00 = z[ 0] - z[-4]; + y0 = z[ 0] + z[-4]; + y2 = z[-2] + z[-6]; + k22 = z[-2] - z[-6]; + + z[-0] = y0 + y2; // z0 + z4 + z2 + z6 + z[-2] = y0 - y2; // z0 + z4 - z2 - z6 + + // done with y0,y2 + + k33 = z[-3] - z[-7]; + + z[-4] = k00 + k33; // z0 - z4 + z3 - z7 + z[-6] = k00 - k33; // z0 - z4 - z3 + z7 + + // done with k33 + + k11 = z[-1] - z[-5]; + y1 = z[-1] + z[-5]; + y3 = z[-3] + z[-7]; + + z[-1] = y1 + y3; // z1 + z5 + z3 + z7 + z[-3] = y1 - y3; // z1 + z5 - z3 - z7 + z[-5] = k11 - k22; // z1 - z5 + z2 - z6 + z[-7] = k11 + k22; // z1 - z5 - z2 + z6 +} + +static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) +{ + int k_off = -8; + int a_off = base_n >> 3; + float A2 = A[0+a_off]; + float *z = e + i_off; + float *base = z - 16 * n; + + while (z > base) { + float k00,k11; + + k00 = z[-0] - z[-8]; + k11 = z[-1] - z[-9]; + z[-0] = z[-0] + z[-8]; + z[-1] = z[-1] + z[-9]; + z[-8] = k00; + z[-9] = k11 ; + + k00 = z[ -2] - z[-10]; + k11 = z[ -3] - z[-11]; + z[ -2] = z[ -2] + z[-10]; + z[ -3] = z[ -3] + z[-11]; + z[-10] = (k00+k11) * A2; + z[-11] = (k11-k00) * A2; + + k00 = z[-12] - z[ -4]; // reverse to avoid a unary negation + k11 = z[ -5] - z[-13]; + z[ -4] = z[ -4] + z[-12]; + z[ -5] = z[ -5] + z[-13]; + z[-12] = k11; + z[-13] = k00; + + k00 = z[-14] - z[ -6]; // reverse to avoid a unary negation + k11 = z[ -7] - z[-15]; + z[ -6] = z[ -6] + z[-14]; + z[ -7] = z[ -7] + z[-15]; + z[-14] = (k00+k11) * A2; + z[-15] = (k00-k11) * A2; + + iter_54(z); + iter_54(z-8); + z -= 16; + } +} + +static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // @OPTIMIZE: reduce register pressure by using fewer variables? + int save_point = temp_alloc_save(f); + float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); + float *u=NULL,*v=NULL; + // twiddle factors + float *A = f->A[blocktype]; + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. + + // kernel from paper + + + // merged: + // copy and reflect spectral data + // step 0 + + // note that it turns out that the items added together during + // this step are, in fact, being added to themselves (as reflected + // by step 0). inexplicable inefficiency! this became obvious + // once I combined the passes. + + // so there's a missing 'times 2' here (for adding X to itself). + // this propogates through linearly to the end, where the numbers + // are 1/2 too small, and need to be compensated for. + + { + float *d,*e, *AA, *e_stop; + d = &buf2[n2-2]; + AA = A; + e = &buffer[0]; + e_stop = &buffer[n2]; + while (e != e_stop) { + d[1] = (e[0] * AA[0] - e[2]*AA[1]); + d[0] = (e[0] * AA[1] + e[2]*AA[0]); + d -= 2; + AA += 2; + e += 4; + } + + e = &buffer[n2-3]; + while (d >= buf2) { + d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); + d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); + d -= 2; + AA += 2; + e -= 4; + } + } + + // now we use symbolic names for these, so that we can + // possibly swap their meaning as we change which operations + // are in place + + u = buffer; + v = buf2; + + // step 2 (paper output is w, now u) + // this could be in place, but the data ends up in the wrong + // place... _somebody_'s got to swap it, so this is nominated + { + float *AA = &A[n2-8]; + float *d0,*d1, *e0, *e1; + + e0 = &v[n4]; + e1 = &v[0]; + + d0 = &u[n4]; + d1 = &u[0]; + + while (AA >= A) { + float v40_20, v41_21; + + v41_21 = e0[1] - e1[1]; + v40_20 = e0[0] - e1[0]; + d0[1] = e0[1] + e1[1]; + d0[0] = e0[0] + e1[0]; + d1[1] = v41_21*AA[4] - v40_20*AA[5]; + d1[0] = v40_20*AA[4] + v41_21*AA[5]; + + v41_21 = e0[3] - e1[3]; + v40_20 = e0[2] - e1[2]; + d0[3] = e0[3] + e1[3]; + d0[2] = e0[2] + e1[2]; + d1[3] = v41_21*AA[0] - v40_20*AA[1]; + d1[2] = v40_20*AA[0] + v41_21*AA[1]; + + AA -= 8; + + d0 += 4; + d1 += 4; + e0 += 4; + e1 += 4; + } + } + + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + + // optimized step 3: + + // the original step3 loop can be nested r inside s or s inside r; + // it's written originally as s inside r, but this is dumb when r + // iterates many times, and s few. So I have two copies of it and + // switch between them halfway. + + // this is iteration 0 of step 3 + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); + + // this is iteration 1 of step 3 + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); + + l=2; + for (; l < (ld-3)>>1; ++l) { + int k0 = n >> (l+2), k0_2 = k0>>1; + int lim = 1 << (l+1); + int i; + for (i=0; i < lim; ++i) + imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); + } + + for (; l < ld-6; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; + int rlim = n >> (l+6), r; + int lim = 1 << (l+1); + int i_off; + float *A0 = A; + i_off = n2-1; + for (r=rlim; r > 0; --r) { + imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); + A0 += k1*4; + i_off -= 8; + } + } + + // iterations with count: + // ld-6,-5,-4 all interleaved together + // the big win comes from getting rid of needless flops + // due to the constants on pass 5 & 4 being all 1 and 0; + // combining them to be simultaneous to improve cache made little difference + imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); + + // output is u + + // step 4, 5, and 6 + // cannot be in-place because of step 5 + { + uint16 *bitrev = f->bit_reverse[blocktype]; + // weirdly, I'd have thought reading sequentially and writing + // erratically would have been better than vice-versa, but in + // fact that's not what my testing showed. (That is, with + // j = bitreverse(i), do you read i and write j, or read j and write i.) + + float *d0 = &v[n4-4]; + float *d1 = &v[n2-4]; + while (d0 >= v) { + int k4; + + k4 = bitrev[0]; + d1[3] = u[k4+0]; + d1[2] = u[k4+1]; + d0[3] = u[k4+2]; + d0[2] = u[k4+3]; + + k4 = bitrev[1]; + d1[1] = u[k4+0]; + d1[0] = u[k4+1]; + d0[1] = u[k4+2]; + d0[0] = u[k4+3]; + + d0 -= 4; + d1 -= 4; + bitrev += 2; + } + } + // (paper output is u, now v) + + + // data must be in buf2 + assert(v == buf2); + + // step 7 (paper output is v, now v) + // this is now in place + { + float *C = f->C[blocktype]; + float *d, *e; + + d = v; + e = v + n2 - 4; + + while (d < e) { + float a02,a11,b0,b1,b2,b3; + + a02 = d[0] - e[2]; + a11 = d[1] + e[3]; + + b0 = C[1]*a02 + C[0]*a11; + b1 = C[1]*a11 - C[0]*a02; + + b2 = d[0] + e[ 2]; + b3 = d[1] - e[ 3]; + + d[0] = b2 + b0; + d[1] = b3 + b1; + e[2] = b2 - b0; + e[3] = b1 - b3; + + a02 = d[2] - e[0]; + a11 = d[3] + e[1]; + + b0 = C[3]*a02 + C[2]*a11; + b1 = C[3]*a11 - C[2]*a02; + + b2 = d[2] + e[ 0]; + b3 = d[3] - e[ 1]; + + d[2] = b2 + b0; + d[3] = b3 + b1; + e[0] = b2 - b0; + e[1] = b1 - b3; + + C += 4; + d += 4; + e -= 4; + } + } + + // data must be in buf2 + + + // step 8+decode (paper output is X, now buffer) + // this generates pairs of data a la 8 and pushes them directly through + // the decode kernel (pushing rather than pulling) to avoid having + // to make another pass later + + // this cannot POSSIBLY be in place, so we refer to the buffers directly + + { + float *d0,*d1,*d2,*d3; + + float *B = f->B[blocktype] + n2 - 8; + float *e = buf2 + n2 - 8; + d0 = &buffer[0]; + d1 = &buffer[n2-4]; + d2 = &buffer[n2]; + d3 = &buffer[n-4]; + while (e >= v) { + float p0,p1,p2,p3; + + p3 = e[6]*B[7] - e[7]*B[6]; + p2 = -e[6]*B[6] - e[7]*B[7]; + + d0[0] = p3; + d1[3] = - p3; + d2[0] = p2; + d3[3] = p2; + + p1 = e[4]*B[5] - e[5]*B[4]; + p0 = -e[4]*B[4] - e[5]*B[5]; + + d0[1] = p1; + d1[2] = - p1; + d2[1] = p0; + d3[2] = p0; + + p3 = e[2]*B[3] - e[3]*B[2]; + p2 = -e[2]*B[2] - e[3]*B[3]; + + d0[2] = p3; + d1[1] = - p3; + d2[2] = p2; + d3[1] = p2; + + p1 = e[0]*B[1] - e[1]*B[0]; + p0 = -e[0]*B[0] - e[1]*B[1]; + + d0[3] = p1; + d1[0] = - p1; + d2[3] = p0; + d3[0] = p0; + + B -= 8; + e -= 8; + d0 += 4; + d2 += 4; + d1 -= 4; + d3 -= 4; + } + } + + temp_alloc_restore(f,save_point); +} + +#if 0 +// this is the original version of the above code, if you want to optimize it from scratch +void inverse_mdct_naive(float *buffer, int n) +{ + float s; + float A[1 << 12], B[1 << 12], C[1 << 11]; + int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // how can they claim this only uses N words?! + // oh, because they're only used sparsely, whoops + float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; + // set up twiddle factors + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2); + B[k2+1] = (float) sin((k2+1)*M_PI/n/2); + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // Note there are bugs in that pseudocode, presumably due to them attempting + // to rename the arrays nicely rather than representing the way their actual + // implementation bounces buffers back and forth. As a result, even in the + // "some formulars corrected" version, a direct implementation fails. These + // are noted below as "paper bug". + + // copy and reflect spectral data + for (k=0; k < n2; ++k) u[k] = buffer[k]; + for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; + // kernel from paper + // step 1 + for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { + v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; + v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; + } + // step 2 + for (k=k4=0; k < n8; k+=1, k4+=4) { + w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; + w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; + w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4]; + w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4]; + } + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + for (l=0; l < ld-3; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3); + int rlim = n >> (l+4), r4, r; + int s2lim = 1 << (l+2), s2; + for (r=r4=0; r < rlim; r4+=4,++r) { + for (s2=0; s2 < s2lim; s2+=2) { + u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; + u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; + u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] + - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; + u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] + + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; + } + } + if (l+1 < ld-3) { + // paper bug: ping-ponging of u&w here is omitted + memcpy(w, u, sizeof(u)); + } + } + + // step 4 + for (i=0; i < n8; ++i) { + int j = bit_reverse(i) >> (32-ld+3); + assert(j < n8); + if (i == j) { + // paper bug: original code probably swapped in place; if copying, + // need to directly copy in this case + int i8 = i << 3; + v[i8+1] = u[i8+1]; + v[i8+3] = u[i8+3]; + v[i8+5] = u[i8+5]; + v[i8+7] = u[i8+7]; + } else if (i < j) { + int i8 = i << 3, j8 = j << 3; + v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; + v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; + v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; + v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; + } + } + // step 5 + for (k=0; k < n2; ++k) { + w[k] = v[k*2+1]; + } + // step 6 + for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { + u[n-1-k2] = w[k4]; + u[n-2-k2] = w[k4+1]; + u[n3_4 - 1 - k2] = w[k4+2]; + u[n3_4 - 2 - k2] = w[k4+3]; + } + // step 7 + for (k=k2=0; k < n8; ++k, k2 += 2) { + v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + } + // step 8 + for (k=k2=0; k < n4; ++k,k2 += 2) { + X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; + X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; + } + + // decode kernel to output + // determined the following value experimentally + // (by first figuring out what made inverse_mdct_slow work); then matching that here + // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) + s = 0.5; // theoretically would be n4 + + // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, + // so it needs to use the "old" B values to behave correctly, or else + // set s to 1.0 ]]] + for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; + for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; + for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; +} +#endif + +static float *get_window(vorb *f, int len) +{ + len <<= 1; + if (len == f->blocksize_0) return f->window[0]; + if (len == f->blocksize_1) return f->window[1]; + assert(0); + return NULL; +} + +#ifndef STB_VORBIS_NO_DEFER_FLOOR +typedef int16 YTYPE; +#else +typedef int YTYPE; +#endif +static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) +{ + int n2 = n >> 1; + int s = map->chan[i].mux, floor; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + int j,q; + int lx = 0, ly = finalY[0] * g->floor1_multiplier; + for (q=1; q < g->values; ++q) { + j = g->sorted_order[q]; + #ifndef STB_VORBIS_NO_DEFER_FLOOR + if (finalY[j] >= 0) + #else + if (step2_flag[j]) + #endif + { + int hy = finalY[j] * g->floor1_multiplier; + int hx = g->Xlist[j]; + draw_line(target, lx,ly, hx,hy, n2); + lx = hx, ly = hy; + } + } + if (lx < n2) + // optimization of: draw_line(target, lx,ly, n,ly, n2); + for (j=lx; j < n2; ++j) + LINE_OP(target[j], inverse_db_table[ly]); + } + return TRUE; +} + +static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + Mode *m; + int i, n, prev, next, window_center; + f->channel_buffer_start = f->channel_buffer_end = 0; + + retry: + if (f->eof) return FALSE; + if (!maybe_start_packet(f)) + return FALSE; + // check packet type + if (get_bits(f,1) != 0) { + if (IS_PUSH_MODE(f)) + return error(f,VORBIS_bad_packet_type); + while (EOP != get8_packet(f)); + goto retry; + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + i = get_bits(f, ilog(f->mode_count-1)); + if (i == EOP) return FALSE; + if (i >= f->mode_count) return FALSE; + *mode = i; + m = f->mode_config + i; + if (m->blockflag) { + n = f->blocksize_1; + prev = get_bits(f,1); + next = get_bits(f,1); + } else { + prev = next = 0; + n = f->blocksize_0; + } + +// WINDOWING + + window_center = n >> 1; + if (m->blockflag && !prev) { + *p_left_start = (n - f->blocksize_0) >> 2; + *p_left_end = (n + f->blocksize_0) >> 2; + } else { + *p_left_start = 0; + *p_left_end = window_center; + } + if (m->blockflag && !next) { + *p_right_start = (n*3 - f->blocksize_0) >> 2; + *p_right_end = (n*3 + f->blocksize_0) >> 2; + } else { + *p_right_start = window_center; + *p_right_end = n; + } + return TRUE; +} + +static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) +{ + Mapping *map; + int i,j,k,n,n2; + int zero_channel[256]; + int really_zero_channel[256]; + int window_center; + +// WINDOWING + + n = f->blocksize[m->blockflag]; + window_center = n >> 1; + + map = &f->mapping[m->mapping]; + +// FLOORS + n2 = n >> 1; + + stb_prof(1); + for (i=0; i < f->channels; ++i) { + int s = map->chan[i].mux, floor; + zero_channel[i] = FALSE; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + if (get_bits(f, 1)) { + short *finalY; + uint8 step2_flag[256]; + static int range_list[4] = { 256, 128, 86, 64 }; + int range = range_list[g->floor1_multiplier-1]; + int offset = 2; + finalY = f->finalY[i]; + finalY[0] = get_bits(f, ilog(range)-1); + finalY[1] = get_bits(f, ilog(range)-1); + for (j=0; j < g->partitions; ++j) { + int pclass = g->partition_class_list[j]; + int cdim = g->class_dimensions[pclass]; + int cbits = g->class_subclasses[pclass]; + int csub = (1 << cbits)-1; + int cval = 0; + if (cbits) { + Codebook *c = f->codebooks + g->class_masterbooks[pclass]; + DECODE(cval,f,c); + } + for (k=0; k < cdim; ++k) { + int book = g->subclass_books[pclass][cval & csub]; + cval = cval >> cbits; + if (book >= 0) { + int temp; + Codebook *c = f->codebooks + book; + DECODE(temp,f,c); + finalY[offset++] = temp; + } else + finalY[offset++] = 0; + } + } + if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec + step2_flag[0] = step2_flag[1] = 1; + for (j=2; j < g->values; ++j) { + int low, high, pred, highroom, lowroom, room, val; + low = g->neighbors[j][0]; + high = g->neighbors[j][1]; + //neighbors(g->Xlist, j, &low, &high); + pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); + val = finalY[j]; + highroom = range - pred; + lowroom = pred; + if (highroom < lowroom) + room = highroom * 2; + else + room = lowroom * 2; + if (val) { + step2_flag[low] = step2_flag[high] = 1; + step2_flag[j] = 1; + if (val >= room) + if (highroom > lowroom) + finalY[j] = val - lowroom + pred; + else + finalY[j] = pred - val + highroom - 1; + else + if (val & 1) + finalY[j] = pred - ((val+1)>>1); + else + finalY[j] = pred + (val>>1); + } else { + step2_flag[j] = 0; + finalY[j] = pred; + } + } + +#ifdef STB_VORBIS_NO_DEFER_FLOOR + do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); +#else + // defer final floor computation until _after_ residue + for (j=0; j < g->values; ++j) { + if (!step2_flag[j]) + finalY[j] = -1; + } +#endif + } else { + error: + zero_channel[i] = TRUE; + } + // So we just defer everything else to later + + // at this point we've decoded the floor into buffer + } + } + stb_prof(0); + // at this point we've decoded all floors + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + // re-enable coupled channels if necessary + memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); + for (i=0; i < map->coupling_steps; ++i) + if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { + zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; + } + +// RESIDUE DECODE + for (i=0; i < map->submaps; ++i) { + float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; + int r,t; + uint8 do_not_decode[256]; + int ch = 0; + for (j=0; j < f->channels; ++j) { + if (map->chan[j].mux == i) { + if (zero_channel[j]) { + do_not_decode[ch] = TRUE; + residue_buffers[ch] = NULL; + } else { + do_not_decode[ch] = FALSE; + residue_buffers[ch] = f->channel_buffers[j]; + } + ++ch; + } + } + r = map->submap_residue[i]; + t = f->residue_types[r]; + decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + +// INVERSE COUPLING + stb_prof(14); + for (i = map->coupling_steps-1; i >= 0; --i) { + int n2 = n >> 1; + float *m = f->channel_buffers[map->chan[i].magnitude]; + float *a = f->channel_buffers[map->chan[i].angle ]; + for (j=0; j < n2; ++j) { + float a2,m2; + if (m[j] > 0) + if (a[j] > 0) + m2 = m[j], a2 = m[j] - a[j]; + else + a2 = m[j], m2 = m[j] + a[j]; + else + if (a[j] > 0) + m2 = m[j], a2 = m[j] + a[j]; + else + a2 = m[j], m2 = m[j] - a[j]; + m[j] = m2; + a[j] = a2; + } + } + + // finish decoding the floors +#ifndef STB_VORBIS_NO_DEFER_FLOOR + stb_prof(15); + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); + } + } +#else + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + for (j=0; j < n2; ++j) + f->channel_buffers[i][j] *= f->floor_buffers[i][j]; + } + } +#endif + +// INVERSE MDCT + stb_prof(16); + for (i=0; i < f->channels; ++i) + inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); + stb_prof(0); + + // this shouldn't be necessary, unless we exited on an error + // and want to flush to get to the next packet + flush_packet(f); + + if (f->first_decode) { + // assume we start so first non-discarded sample is sample 0 + // this isn't to spec, but spec would require us to read ahead + // and decode the size of all current frames--could be done, + // but presumably it's not a commonly used feature + f->current_loc = -n2; // start of first frame is positioned for discard + // we might have to discard samples "from" the next frame too, + // if we're lapping a large block then a small at the start? + f->discard_samples_deferred = n - right_end; + f->current_loc_valid = TRUE; + f->first_decode = FALSE; + } else if (f->discard_samples_deferred) { + left_start += f->discard_samples_deferred; + *p_left = left_start; + f->discard_samples_deferred = 0; + } else if (f->previous_length == 0 && f->current_loc_valid) { + // we're recovering from a seek... that means we're going to discard + // the samples from this packet even though we know our position from + // the last page header, so we need to update the position based on + // the discarded samples here + // but wait, the code below is going to add this in itself even + // on a discard, so we don't need to do it here... + } + + // check if we have ogg information about the sample # for this packet + if (f->last_seg_which == f->end_seg_with_known_loc) { + // if we have a valid current loc, and this is final: + if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { + uint32 current_end = f->known_loc_for_packet - (n-right_end); + // then let's infer the size of the (probably) short final frame + if (current_end < f->current_loc + right_end) { + if (current_end < f->current_loc) { + // negative truncation, that's impossible! + *len = 0; + } else { + *len = current_end - f->current_loc; + } + *len += left_start; + f->current_loc += *len; + return TRUE; + } + } + // otherwise, just set our sample loc + // guess that the ogg granule pos refers to the _middle_ of the + // last frame? + // set f->current_loc to the position of left_start + f->current_loc = f->known_loc_for_packet - (n2-left_start); + f->current_loc_valid = TRUE; + } + if (f->current_loc_valid) + f->current_loc += (right_start - left_start); + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + *len = right_end; // ignore samples after the window goes to 0 + return TRUE; +} + +static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) +{ + int mode, left_end, right_end; + if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; + return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); +} + +static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) +{ + int prev,i,j; + // we use right&left (the start of the right- and left-window sin()-regions) + // to determine how much to return, rather than inferring from the rules + // (same result, clearer code); 'left' indicates where our sin() window + // starts, therefore where the previous window's right edge starts, and + // therefore where to start mixing from the previous buffer. 'right' + // indicates where our sin() ending-window starts, therefore that's where + // we start saving, and where our returned-data ends. + + // mixin from previous window + if (f->previous_length) { + int i,j, n = f->previous_length; + float *w = get_window(f, n); + for (i=0; i < f->channels; ++i) { + for (j=0; j < n; ++j) + f->channel_buffers[i][left+j] = + f->channel_buffers[i][left+j]*w[ j] + + f->previous_window[i][ j]*w[n-1-j]; + } + } + + prev = f->previous_length; + + // last half of this data becomes previous window + f->previous_length = len - right; + + // @OPTIMIZE: could avoid this copy by double-buffering the + // output (flipping previous_window with channel_buffers), but + // then previous_window would have to be 2x as large, and + // channel_buffers couldn't be temp mem (although they're NOT + // currently temp mem, they could be (unless we want to level + // performance by spreading out the computation)) + for (i=0; i < f->channels; ++i) + for (j=0; right+j < len; ++j) + f->previous_window[i][j] = f->channel_buffers[i][right+j]; + + if (!prev) + // there was no previous packet, so this data isn't valid... + // this isn't entirely true, only the would-have-overlapped data + // isn't valid, but this seems to be what the spec requires + return 0; + + // truncate a short frame + if (len < right) right = len; + + f->samples_output += right-left; + + return right - left; +} + +static void vorbis_pump_first_frame(stb_vorbis *f) +{ + int len, right, left; + if (vorbis_decode_packet(f, &len, &left, &right)) + vorbis_finish_frame(f, len, left, right); +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API +static int is_whole_packet_present(stb_vorbis *f, int end_page) +{ + // make sure that we have the packet available before continuing... + // this requires a full ogg parse, but we know we can fetch from f->stream + + // instead of coding this out explicitly, we could save the current read state, + // read the next packet with get8() until end-of-packet, check f->eof, then + // reset the state? but that would be slower, esp. since we'd have over 256 bytes + // of state to restore (primarily the page segment table) + + int s = f->next_seg, first = TRUE; + uint8 *p = f->stream; + + if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag + for (; s < f->segment_count; ++s) { + p += f->segments[s]; + if (f->segments[s] < 255) // stop at first short segment + break; + } + // either this continues, or it ends it... + if (end_page) + if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream); + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + for (; s == -1;) { + uint8 *q; + int n; + + // check that we have the page header ready + if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); + // validate the page + if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); + if (p[4] != 0) return error(f, VORBIS_invalid_stream); + if (first) { // the first segment must NOT have 'continued_packet', later ones MUST + if (f->previous_length) + if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + // if no previous length, we're resynching, so we can come in on a continued-packet, + // which we'll just drop + } else { + if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + } + n = p[26]; // segment counts + q = p+27; // q points to segment table + p = q + n; // advance past header + // make sure we've read the segment table + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + for (s=0; s < n; ++s) { + p += q[s]; + if (q[s] < 255) + break; + } + if (end_page) + if (s < n-1) return error(f, VORBIS_invalid_stream); + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + return TRUE; +} +#endif // !STB_VORBIS_NO_PUSHDATA_API + +static int start_decoder(vorb *f) +{ + uint8 header[6], x,y; + int len,i,j,k, max_submaps = 0; + int longest_floorlist=0; + + // first page, first packet + + if (!start_page(f)) return FALSE; + // validate page flag + if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); + // check for expected packet length + if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); + if (f->segments[0] != 30) return error(f, VORBIS_invalid_first_page); + // read packet + // check packet header + if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); + if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); + // vorbis_version + if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); + f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); + if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); + f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); + get32(f); // bitrate_maximum + get32(f); // bitrate_nominal + get32(f); // bitrate_minimum + x = get8(f); + { int log0,log1; + log0 = x & 15; + log1 = x >> 4; + f->blocksize_0 = 1 << log0; + f->blocksize_1 = 1 << log1; + if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); + if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); + if (log0 > log1) return error(f, VORBIS_invalid_setup); + } + + // framing_flag + x = get8(f); + if (!(x & 1)) return error(f, VORBIS_invalid_first_page); + + // second packet! + if (!start_page(f)) return FALSE; + + if (!start_packet(f)) return FALSE; + do { + len = next_segment(f); + skip(f, len); + f->bytes_in_seg = 0; + } while (len); + + // third packet! + if (!start_packet(f)) return FALSE; + + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (IS_PUSH_MODE(f)) { + if (!is_whole_packet_present(f, TRUE)) { + // convert error in ogg header to write type + if (f->error == VORBIS_invalid_stream) + f->error = VORBIS_invalid_setup; + return FALSE; + } + } + #endif + + crc32_init(); // always init it, to avoid multithread race conditions + + if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + + // codebooks + + f->codebook_count = get_bits(f,8) + 1; + f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); + if (f->codebooks == NULL) return error(f, VORBIS_outofmem); + memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); + for (i=0; i < f->codebook_count; ++i) { + uint32 *values; + int ordered, sorted_count; + int total=0; + uint8 *lengths; + Codebook *c = f->codebooks+i; + x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); + c->dimensions = (get_bits(f, 8)<<8) + x; + x = get_bits(f, 8); + y = get_bits(f, 8); + c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; + ordered = get_bits(f,1); + c->sparse = ordered ? 0 : get_bits(f,1); + + if (c->sparse) + lengths = (uint8 *) setup_temp_malloc(f, c->entries); + else + lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + + if (!lengths) return error(f, VORBIS_outofmem); + + if (ordered) { + int current_entry = 0; + int current_length = get_bits(f,5) + 1; + while (current_entry < c->entries) { + int limit = c->entries - current_entry; + int n = get_bits(f, ilog(limit)); + if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } + memset(lengths + current_entry, current_length, n); + current_entry += n; + ++current_length; + } + } else { + for (j=0; j < c->entries; ++j) { + int present = c->sparse ? get_bits(f,1) : 1; + if (present) { + lengths[j] = get_bits(f, 5) + 1; + ++total; + } else { + lengths[j] = NO_CODE; + } + } + } + + if (c->sparse && total >= c->entries >> 2) { + // convert sparse items to non-sparse! + if (c->entries > (int) f->setup_temp_memory_required) + f->setup_temp_memory_required = c->entries; + + c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + memcpy(c->codeword_lengths, lengths, c->entries); + setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! + lengths = c->codeword_lengths; + c->sparse = 0; + } + + // compute the size of the sorted tables + if (c->sparse) { + sorted_count = total; + //assert(total != 0); + } else { + sorted_count = 0; + #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + for (j=0; j < c->entries; ++j) + if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) + ++sorted_count; + #endif + } + + c->sorted_entries = sorted_count; + values = NULL; + + if (!c->sparse) { + c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + } else { + unsigned int size; + if (c->sorted_entries) { + c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); + if (!c->codeword_lengths) return error(f, VORBIS_outofmem); + c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); + if (!values) return error(f, VORBIS_outofmem); + } + size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; + if (size > f->setup_temp_memory_required) + f->setup_temp_memory_required = size; + } + + if (!compute_codewords(c, lengths, c->entries, values)) { + if (c->sparse) setup_temp_free(f, values, 0); + return error(f, VORBIS_invalid_setup); + } + + if (c->sorted_entries) { + // allocate an extra slot for sentinels + c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); + // allocate an extra slot at the front so that c->sorted_values[-1] is defined + // so that we can catch that case without an extra if + c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); + if (c->sorted_values) { ++c->sorted_values; c->sorted_values[-1] = -1; } + compute_sorted_huffman(c, lengths, values); + } + + if (c->sparse) { + setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); + setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); + setup_temp_free(f, lengths, c->entries); + c->codewords = NULL; + } + + compute_accelerated_huffman(c); + + c->lookup_type = get_bits(f, 4); + if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); + if (c->lookup_type > 0) { + uint16 *mults; + c->minimum_value = float32_unpack(get_bits(f, 32)); + c->delta_value = float32_unpack(get_bits(f, 32)); + c->value_bits = get_bits(f, 4)+1; + c->sequence_p = get_bits(f,1); + if (c->lookup_type == 1) { + c->lookup_values = lookup1_values(c->entries, c->dimensions); + } else { + c->lookup_values = c->entries * c->dimensions; + } + mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); + if (mults == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < (int) c->lookup_values; ++j) { + int q = get_bits(f, c->value_bits); + if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } + mults[j] = q; + } + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int len, sparse = c->sparse; + // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop + if (sparse) { + if (c->sorted_entries == 0) goto skip; + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); + } else + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); + if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + len = sparse ? c->sorted_entries : c->entries; + for (j=0; j < len; ++j) { + int z = sparse ? c->sorted_values[j] : j, div=1; + for (k=0; k < c->dimensions; ++k) { + int off = (z / div) % c->lookup_values; + c->multiplicands[j*c->dimensions + k] = + #ifndef STB_VORBIS_CODEBOOK_FLOATS + mults[off]; + #else + mults[off]*c->delta_value + c->minimum_value; + // in this case (and this case only) we could pre-expand c->sequence_p, + // and throw away the decode logic for it; have to ALSO do + // it in the case below, but it can only be done if + // STB_VORBIS_CODEBOOK_FLOATS + // !STB_VORBIS_DIVIDES_IN_CODEBOOK + #endif + div *= c->lookup_values; + } + } + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + c->lookup_type = 2; + } + else +#endif + { + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); + #ifndef STB_VORBIS_CODEBOOK_FLOATS + memcpy(c->multiplicands, mults, sizeof(c->multiplicands[0]) * c->lookup_values); + #else + for (j=0; j < (int) c->lookup_values; ++j) + c->multiplicands[j] = mults[j] * c->delta_value + c->minimum_value; + #endif + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + } + skip:; + + #ifdef STB_VORBIS_CODEBOOK_FLOATS + if (c->lookup_type == 2 && c->sequence_p) { + for (j=1; j < (int) c->lookup_values; ++j) + c->multiplicands[j] = c->multiplicands[j-1]; + c->sequence_p = 0; + } + #endif + } + } + + // time domain transfers (notused) + + x = get_bits(f, 6) + 1; + for (i=0; i < x; ++i) { + uint32 z = get_bits(f, 16); + if (z != 0) return error(f, VORBIS_invalid_setup); + } + + // Floors + f->floor_count = get_bits(f, 6)+1; + f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); + for (i=0; i < f->floor_count; ++i) { + f->floor_types[i] = get_bits(f, 16); + if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); + if (f->floor_types[i] == 0) { + Floor0 *g = &f->floor_config[i].floor0; + g->order = get_bits(f,8); + g->rate = get_bits(f,16); + g->bark_map_size = get_bits(f,16); + g->amplitude_bits = get_bits(f,6); + g->amplitude_offset = get_bits(f,8); + g->number_of_books = get_bits(f,4) + 1; + for (j=0; j < g->number_of_books; ++j) + g->book_list[j] = get_bits(f,8); + return error(f, VORBIS_feature_not_supported); + } else { + Point p[31*8+2]; + Floor1 *g = &f->floor_config[i].floor1; + int max_class = -1; + g->partitions = get_bits(f, 5); + for (j=0; j < g->partitions; ++j) { + g->partition_class_list[j] = get_bits(f, 4); + if (g->partition_class_list[j] > max_class) + max_class = g->partition_class_list[j]; + } + for (j=0; j <= max_class; ++j) { + g->class_dimensions[j] = get_bits(f, 3)+1; + g->class_subclasses[j] = get_bits(f, 2); + if (g->class_subclasses[j]) { + g->class_masterbooks[j] = get_bits(f, 8); + if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + for (k=0; k < 1 << g->class_subclasses[j]; ++k) { + g->subclass_books[j][k] = get_bits(f,8)-1; + if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + } + g->floor1_multiplier = get_bits(f,2)+1; + g->rangebits = get_bits(f,4); + g->Xlist[0] = 0; + g->Xlist[1] = 1 << g->rangebits; + g->values = 2; + for (j=0; j < g->partitions; ++j) { + int c = g->partition_class_list[j]; + for (k=0; k < g->class_dimensions[c]; ++k) { + g->Xlist[g->values] = get_bits(f, g->rangebits); + ++g->values; + } + } + // precompute the sorting + for (j=0; j < g->values; ++j) { + p[j].x = g->Xlist[j]; + p[j].y = j; + } + qsort(p, g->values, sizeof(p[0]), point_compare); + for (j=0; j < g->values; ++j) + g->sorted_order[j] = (uint8) p[j].y; + // precompute the neighbors + for (j=2; j < g->values; ++j) { + int low,hi; + neighbors(g->Xlist, j, &low,&hi); + g->neighbors[j][0] = low; + g->neighbors[j][1] = hi; + } + + if (g->values > longest_floorlist) + longest_floorlist = g->values; + } + } + + // Residue + f->residue_count = get_bits(f, 6)+1; + f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(*f->residue_config)); + for (i=0; i < f->residue_count; ++i) { + uint8 residue_cascade[64]; + Residue *r = f->residue_config+i; + f->residue_types[i] = get_bits(f, 16); + if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); + r->begin = get_bits(f, 24); + r->end = get_bits(f, 24); + r->part_size = get_bits(f,24)+1; + r->classifications = get_bits(f,6)+1; + r->classbook = get_bits(f,8); + for (j=0; j < r->classifications; ++j) { + uint8 high_bits=0; + uint8 low_bits=get_bits(f,3); + if (get_bits(f,1)) + high_bits = get_bits(f,5); + residue_cascade[j] = high_bits*8 + low_bits; + } + r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); + for (j=0; j < r->classifications; ++j) { + for (k=0; k < 8; ++k) { + if (residue_cascade[j] & (1 << k)) { + r->residue_books[j][k] = get_bits(f, 8); + if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } else { + r->residue_books[j][k] = -1; + } + } + } + // precompute the classifications[] array to avoid inner-loop mod/divide + // call it 'classdata' since we already have r->classifications + r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + if (!r->classdata) return error(f, VORBIS_outofmem); + memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + for (j=0; j < f->codebooks[r->classbook].entries; ++j) { + int classwords = f->codebooks[r->classbook].dimensions; + int temp = j; + r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); + for (k=classwords-1; k >= 0; --k) { + r->classdata[j][k] = temp % r->classifications; + temp /= r->classifications; + } + } + } + + f->mapping_count = get_bits(f,6)+1; + f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); + for (i=0; i < f->mapping_count; ++i) { + Mapping *m = f->mapping + i; + int mapping_type = get_bits(f,16); + if (mapping_type != 0) return error(f, VORBIS_invalid_setup); + m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); + if (get_bits(f,1)) + m->submaps = get_bits(f,4); + else + m->submaps = 1; + if (m->submaps > max_submaps) + max_submaps = m->submaps; + if (get_bits(f,1)) { + m->coupling_steps = get_bits(f,8)+1; + for (k=0; k < m->coupling_steps; ++k) { + m->chan[k].magnitude = get_bits(f, ilog(f->channels)-1); + m->chan[k].angle = get_bits(f, ilog(f->channels)-1); + if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); + } + } else + m->coupling_steps = 0; + + // reserved field + if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); + if (m->submaps > 1) { + for (j=0; j < f->channels; ++j) { + m->chan[j].mux = get_bits(f, 4); + if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); + } + } else + // @SPECIFICATION: this case is missing from the spec + for (j=0; j < f->channels; ++j) + m->chan[j].mux = 0; + + for (j=0; j < m->submaps; ++j) { + get_bits(f,8); // discard + m->submap_floor[j] = get_bits(f,8); + m->submap_residue[j] = get_bits(f,8); + if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); + if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); + } + } + + // Modes + f->mode_count = get_bits(f, 6)+1; + for (i=0; i < f->mode_count; ++i) { + Mode *m = f->mode_config+i; + m->blockflag = get_bits(f,1); + m->windowtype = get_bits(f,16); + m->transformtype = get_bits(f,16); + m->mapping = get_bits(f,8); + if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); + if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); + if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); + } + + flush_packet(f); + + f->previous_length = 0; + + for (i=0; i < f->channels; ++i) { + f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); + f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + #endif + } + + if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; + if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; + f->blocksize[0] = f->blocksize_0; + f->blocksize[1] = f->blocksize_1; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (integer_divide_table[1][1]==0) + for (i=0; i < DIVTAB_NUMER; ++i) + for (j=1; j < DIVTAB_DENOM; ++j) + integer_divide_table[i][j] = i / j; +#endif + + // compute how much temporary memory is needed + + // 1. + { + uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); + uint32 classify_mem; + int i,max_part_read=0; + for (i=0; i < f->residue_count; ++i) { + Residue *r = f->residue_config + i; + int n_read = r->end - r->begin; + int part_read = n_read / r->part_size; + if (part_read > max_part_read) + max_part_read = part_read; + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); + #else + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); + #endif + + f->temp_memory_required = classify_mem; + if (imdct_mem > f->temp_memory_required) + f->temp_memory_required = imdct_mem; + } + + f->first_decode = TRUE; + + if (f->alloc.alloc_buffer) { + assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); + // check if there's enough temp memory so we don't error later + if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) + return error(f, VORBIS_outofmem); + } + + f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + + return TRUE; +} + +static void vorbis_deinit(stb_vorbis *p) +{ + int i,j; + for (i=0; i < p->residue_count; ++i) { + Residue *r = p->residue_config+i; + if (r->classdata) { + for (j=0; j < p->codebooks[r->classbook].entries; ++j) + setup_free(p, r->classdata[j]); + setup_free(p, r->classdata); + } + setup_free(p, r->residue_books); + } + + if (p->codebooks) { + for (i=0; i < p->codebook_count; ++i) { + Codebook *c = p->codebooks + i; + setup_free(p, c->codeword_lengths); + setup_free(p, c->multiplicands); + setup_free(p, c->codewords); + setup_free(p, c->sorted_codewords); + // c->sorted_values[-1] is the first entry in the array + setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); + } + setup_free(p, p->codebooks); + } + setup_free(p, p->floor_config); + setup_free(p, p->residue_config); + for (i=0; i < p->mapping_count; ++i) + setup_free(p, p->mapping[i].chan); + setup_free(p, p->mapping); + for (i=0; i < p->channels; ++i) { + setup_free(p, p->channel_buffers[i]); + setup_free(p, p->previous_window[i]); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + setup_free(p, p->floor_buffers[i]); + #endif + setup_free(p, p->finalY[i]); + } + for (i=0; i < 2; ++i) { + setup_free(p, p->A[i]); + setup_free(p, p->B[i]); + setup_free(p, p->C[i]); + setup_free(p, p->window[i]); setup_free(p, p->bit_reverse[i]); - } - #ifndef STB_VORBIS_NO_STDIO - if (p->close_on_free) fclose(p->f); - #endif -} - -void stb_vorbis_close(stb_vorbis *p) -{ - if (p == NULL) return; - vorbis_deinit(p); - setup_free(p,p); -} - -static void vorbis_init(stb_vorbis *p, stb_vorbis_alloc *z) -{ - memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start - if (z) { - p->alloc = *z; - p->alloc.alloc_buffer_length_in_bytes = (p->alloc.alloc_buffer_length_in_bytes+3) & ~3; - p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; - } - p->eof = 0; - p->error = VORBIS__no_error; - p->stream = NULL; - p->codebooks = NULL; - p->page_crc_tests = -1; - #ifndef STB_VORBIS_NO_STDIO - p->close_on_free = FALSE; - p->f = NULL; - #endif -} - -int stb_vorbis_get_sample_offset(stb_vorbis *f) -{ - if (f->current_loc_valid) - return f->current_loc; - else - return -1; -} - -stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) -{ - stb_vorbis_info d; - d.channels = f->channels; - d.sample_rate = f->sample_rate; - d.setup_memory_required = f->setup_memory_required; - d.setup_temp_memory_required = f->setup_temp_memory_required; - d.temp_memory_required = f->temp_memory_required; - d.max_frame_size = f->blocksize_1 >> 1; - return d; -} - -int stb_vorbis_get_error(stb_vorbis *f) -{ - int e = f->error; - f->error = VORBIS__no_error; - return e; -} - -static stb_vorbis * vorbis_alloc(stb_vorbis *f) -{ - stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); - return p; -} - -#ifndef STB_VORBIS_NO_PUSHDATA_API - -void stb_vorbis_flush_pushdata(stb_vorbis *f) -{ - f->previous_length = 0; - f->page_crc_tests = 0; - f->discard_samples_deferred = 0; - f->current_loc_valid = FALSE; - f->first_decode = FALSE; - f->samples_output = 0; - f->channel_buffer_start = 0; - f->channel_buffer_end = 0; -} - -static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) -{ - int i,n; - for (i=0; i < f->page_crc_tests; ++i) - f->scan[i].bytes_done = 0; - - // if we have room for more scans, search for them first, because - // they may cause us to stop early if their header is incomplete - if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { - if (data_len < 4) return 0; - data_len -= 3; // need to look for 4-byte sequence, so don't miss - // one that straddles a boundary - for (i=0; i < data_len; ++i) { - if (data[i] == 0x4f) { - if (0==memcmp(data+i, ogg_page_header, 4)) { - int j,len; - uint32 crc; - // make sure we have the whole page header - if (i+26 >= data_len || i+27+data[i+26] >= data_len) { - // only read up to this page start, so hopefully we'll - // have the whole page header start next time - data_len = i; - break; - } - // ok, we have it all; compute the length of the page - len = 27 + data[i+26]; - for (j=0; j < data[i+26]; ++j) - len += data[i+27+j]; - // scan everything up to the embedded crc (which we must 0) - crc = 0; - for (j=0; j < 22; ++j) - crc = crc32_update(crc, data[i+j]); - // now process 4 0-bytes - for ( ; j < 26; ++j) - crc = crc32_update(crc, 0); - // len is the total number of bytes we need to scan - n = f->page_crc_tests++; - f->scan[n].bytes_left = len-j; - f->scan[n].crc_so_far = crc; - f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); - // if the last frame on a page is continued to the next, then - // we can't recover the sample_loc immediately - if (data[i+27+data[i+26]-1] == 255) - f->scan[n].sample_loc = ~0; - else - f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); - f->scan[n].bytes_done = i+j; - if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) - break; - // keep going if we still have room for more - } - } - } - } - - for (i=0; i < f->page_crc_tests;) { - uint32 crc; - int j; - int n = f->scan[i].bytes_done; - int m = f->scan[i].bytes_left; - if (m > data_len - n) m = data_len - n; - // m is the bytes to scan in the current chunk - crc = f->scan[i].crc_so_far; - for (j=0; j < m; ++j) - crc = crc32_update(crc, data[n+j]); - f->scan[i].bytes_left -= m; - f->scan[i].crc_so_far = crc; - if (f->scan[i].bytes_left == 0) { - // does it match? - if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { - // Houston, we have page - data_len = n+m; // consumption amount is wherever that scan ended - f->page_crc_tests = -1; // drop out of page scan mode - f->previous_length = 0; // decode-but-don't-output one frame - f->next_seg = -1; // start a new page - f->current_loc = f->scan[i].sample_loc; // set the current sample location - // to the amount we'd have decoded had we decoded this page - f->current_loc_valid = f->current_loc != ~0; - return data_len; - } - // delete entry - f->scan[i] = f->scan[--f->page_crc_tests]; - } else { - ++i; - } - } - - return data_len; -} - -// return value: number of bytes we used -int stb_vorbis_decode_frame_pushdata( - stb_vorbis *f, // the file we're decoding - uint8 *data, int data_len, // the memory available for decoding - int *channels, // place to write number of float * buffers - float ***output, // place to write float ** array of float * buffers - int *samples // place to write number of output samples - ) -{ - int i; - int len,right,left; - - if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - if (f->page_crc_tests >= 0) { - *samples = 0; - return vorbis_search_for_page_pushdata(f, data, data_len); - } - - f->stream = data; - f->stream_end = data + data_len; - f->error = VORBIS__no_error; - - // check that we have the entire packet in memory - if (!is_whole_packet_present(f, FALSE)) { - *samples = 0; - return 0; - } - - if (!vorbis_decode_packet(f, &len, &left, &right)) { - // save the actual error we encountered - enum STBVorbisError error = f->error; - if (error == VORBIS_bad_packet_type) { - // flush and resynch - f->error = VORBIS__no_error; - while (get8_packet(f) != EOP) - if (f->eof) break; - *samples = 0; - return f->stream - data; - } - if (error == VORBIS_continued_packet_flag_invalid) { - if (f->previous_length == 0) { - // we may be resynching, in which case it's ok to hit one - // of these; just discard the packet - f->error = VORBIS__no_error; - while (get8_packet(f) != EOP) - if (f->eof) break; - *samples = 0; - return f->stream - data; - } - } - // if we get an error while parsing, what to do? - // well, it DEFINITELY won't work to continue from where we are! - stb_vorbis_flush_pushdata(f); - // restore the error that actually made us bail - f->error = error; - *samples = 0; - return 1; - } - - // success! - len = vorbis_finish_frame(f, len, left, right); - for (i=0; i < f->channels; ++i) - f->outputs[i] = f->channel_buffers[i] + left; - - if (channels) *channels = f->channels; - *samples = len; - *output = f->outputs; - return f->stream - data; -} - -stb_vorbis *stb_vorbis_open_pushdata( - unsigned char *data, int data_len, // the memory available for decoding - int *data_used, // only defined if result is not NULL - int *error, stb_vorbis_alloc *alloc) -{ - stb_vorbis *f, p; - vorbis_init(&p, alloc); - p.stream = data; - p.stream_end = data + data_len; - p.push_mode = TRUE; - if (!start_decoder(&p)) { - if (p.eof) - *error = VORBIS_need_more_data; - else - *error = p.error; - return NULL; - } - f = vorbis_alloc(&p); - if (f) { - *f = p; - *data_used = f->stream - data; - *error = 0; - return f; - } else { - vorbis_deinit(&p); - return NULL; - } -} -#endif // STB_VORBIS_NO_PUSHDATA_API - -unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) -{ - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (f->push_mode) return 0; - #endif - if (USE_MEMORY(f)) return f->stream - f->stream_start; - #ifndef STB_VORBIS_NO_STDIO - return ftell(f->f) - f->f_start; - #endif -} - -#ifndef STB_VORBIS_NO_PULLDATA_API -// -// DATA-PULLING API -// - -static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) -{ - for(;;) { - int n; - if (f->eof) return 0; - n = get8(f); - if (n == 0x4f) { // page header - unsigned int retry_loc = stb_vorbis_get_file_offset(f); - int i; - // check if we're off the end of a file_section stream - if (retry_loc - 25 > f->stream_len) - return 0; - // check the rest of the header - for (i=1; i < 4; ++i) - if (get8(f) != ogg_page_header[i]) - break; - if (f->eof) return 0; - if (i == 4) { - uint8 header[27]; - uint32 i, crc, goal, len; - for (i=0; i < 4; ++i) - header[i] = ogg_page_header[i]; - for (; i < 27; ++i) - header[i] = get8(f); - if (f->eof) return 0; - if (header[4] != 0) goto invalid; - goal = header[22] + (header[23] << 8) + (header[24]<<16) + (header[25]<<24); - for (i=22; i < 26; ++i) - header[i] = 0; - crc = 0; - for (i=0; i < 27; ++i) - crc = crc32_update(crc, header[i]); - len = 0; - for (i=0; i < header[26]; ++i) { - int s = get8(f); - crc = crc32_update(crc, s); - len += s; - } - if (len && f->eof) return 0; - for (i=0; i < len; ++i) - crc = crc32_update(crc, get8(f)); - // finished parsing probable page - if (crc == goal) { - // we could now check that it's either got the last - // page flag set, OR it's followed by the capture - // pattern, but I guess TECHNICALLY you could have - // a file with garbage between each ogg page and recover - // from it automatically? So even though that paranoia - // might decrease the chance of an invalid decode by - // another 2^32, not worth it since it would hose those - // invalid-but-useful files? - if (end) - *end = stb_vorbis_get_file_offset(f); - if (last) - if (header[5] & 0x04) - *last = 1; - else - *last = 0; - set_file_offset(f, retry_loc-1); - return 1; - } - } - invalid: - // not a valid page, so rewind and look for next one - set_file_offset(f, retry_loc); - } - } -} - -// seek is implemented with 'interpolation search'--this is like -// binary search, but we use the data values to estimate the likely -// location of the data item (plus a bit of a bias so when the -// estimation is wrong we don't waste overly much time) - -#define SAMPLE_unknown 0xffffffff - - -// ogg vorbis, in its insane infinite wisdom, only provides -// information about the sample at the END of the page. -// therefore we COULD have the data we need in the current -// page, and not know it. we could just use the end location -// as our only knowledge for bounds, seek back, and eventually -// the binary search finds it. or we can try to be smart and -// not waste time trying to locate more pages. we try to be -// smart, since this data is already in memory anyway, so -// doing needless I/O would be crazy! -static int vorbis_analyze_page(stb_vorbis *f, ProbedPage *z) -{ - uint8 header[27], lacing[255]; - uint8 packet_type[255]; - int num_packet, packet_start, previous =0; - int i,len; - uint32 samples; - - // record where the page starts - z->page_start = stb_vorbis_get_file_offset(f); - - // parse the header - getn(f, header, 27); - assert(header[0] == 'O' && header[1] == 'g' && header[2] == 'g' && header[3] == 'S'); - getn(f, lacing, header[26]); - - // determine the length of the payload - len = 0; - for (i=0; i < header[26]; ++i) - len += lacing[i]; - - // this implies where the page ends - z->page_end = z->page_start + 27 + header[26] + len; - - // read the last-decoded sample out of the data - z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 16); - - if (header[5] & 4) { - // if this is the last page, it's not possible to work - // backwards to figure out the first sample! whoops! fuck. - z->first_decoded_sample = SAMPLE_unknown; - set_file_offset(f, z->page_start); - return 1; - } - - // scan through the frames to determine the sample-count of each one... - // our goal is the sample # of the first fully-decoded sample on the - // page, which is the first decoded sample of the 2nd page - - num_packet=0; - - packet_start = ((header[5] & 1) == 0); - - for (i=0; i < header[26]; ++i) { - if (packet_start) { - uint8 n,b,m; - if (lacing[i] == 0) goto bail; // trying to read from zero-length packet - n = get8(f); - // if bottom bit is non-zero, we've got corruption - if (n & 1) goto bail; - n >>= 1; - b = ilog(f->mode_count-1); - m = n >> b; - n &= (1 << b)-1; - if (n >= f->mode_count) goto bail; - if (num_packet == 0 && f->mode_config[n].blockflag) - previous = (m & 1); - packet_type[num_packet++] = f->mode_config[n].blockflag; - skip(f, lacing[i]-1); - } else - skip(f, lacing[i]); - packet_start = (lacing[i] < 255); - } - - // now that we know the sizes of all the pages, we can start determining - // how much sample data there is. - - samples = 0; - - // for the last packet, we step by its whole length, because the definition - // is that we encoded the end sample loc of the 'last packet completed', - // where 'completed' refers to packets being split, and we are left to guess - // what 'end sample loc' means. we assume it means ignoring the fact that - // the last half of the data is useless without windowing against the next - // packet... (so it's not REALLY complete in that sense) - if (num_packet > 1) - samples += f->blocksize[packet_type[num_packet-1]]; - - for (i=num_packet-2; i >= 1; --i) { - // now, for this packet, how many samples do we have that - // do not overlap the following packet? - if (packet_type[i] == 1) - if (packet_type[i+1] == 1) - samples += f->blocksize_1 >> 1; - else - samples += ((f->blocksize_1 - f->blocksize_0) >> 2) + (f->blocksize_0 >> 1); - else - samples += f->blocksize_0 >> 1; - } - // now, at this point, we've rewound to the very beginning of the - // _second_ packet. if we entirely discard the first packet after - // a seek, this will be exactly the right sample number. HOWEVER! - // we can't as easily compute this number for the LAST page. The - // only way to get the sample offset of the LAST page is to use - // the end loc from the previous page. But what that returns us - // is _exactly_ the place where we get our first non-overlapped - // sample. (I think. Stupid spec for being ambiguous.) So for - // consistency it's better to do that here, too. However, that - // will then require us to NOT discard all of the first frame we - // decode, in some cases, which means an even weirder frame size - // and extra code. what a fucking pain. - - // we're going to discard the first packet if we - // start the seek here, so we don't care about it. (we could actually - // do better; if the first packet is long, and the previous packet - // is short, there's actually data in the first half of the first - // packet that doesn't need discarding... but not worth paying the - // effort of tracking that of that here and in the seeking logic) - // except crap, if we infer it from the _previous_ packet's end - // location, we DO need to use that definition... and we HAVE to - // infer the start loc of the LAST packet from the previous packet's - // end location. fuck you, ogg vorbis. - - z->first_decoded_sample = z->last_decoded_sample - samples; - - // restore file state to where we were - set_file_offset(f, z->page_start); - return 1; - - // restore file state to where we were - bail: - set_file_offset(f, z->page_start); - return 0; -} - -static int vorbis_seek_frame_from_page(stb_vorbis *f, uint32 page_start, uint32 first_sample, uint32 target_sample, int fine) -{ - int left_start, left_end, right_start, right_end, mode,i; - int frame=0; - uint32 frame_start; - int frames_to_skip, data_to_skip; - - // first_sample is the sample # of the first sample that doesn't - // overlap the previous page... note that this requires us to - // _partially_ discard the first packet! bleh. - set_file_offset(f, page_start); - - f->next_seg = -1; // force page resync - - frame_start = first_sample; - // frame start is where the previous packet's last decoded sample - // was, which corresponds to left_end... EXCEPT if the previous - // packet was long and this packet is short? Probably a bug here. - - - // now, we can start decoding frames... we'll only FAKE decode them, - // until we find the frame that contains our sample; then we'll rewind, - // and try again - for (;;) { - int start; - - if (!vorbis_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) - return error(f, VORBIS_seek_failed); - - if (frame == 0) - start = left_end; - else - start = left_start; - - // the window starts at left_start; the last valid sample we generate - // before the next frame's window start is right_start-1 - if (target_sample < frame_start + right_start-start) - break; - - flush_packet(f); - if (f->eof) - return error(f, VORBIS_seek_failed); - - frame_start += right_start - start; - - ++frame; - } - - // ok, at this point, the sample we want is contained in frame #'frame' - - // to decode frame #'frame' normally, we have to decode the - // previous frame first... but if it's the FIRST frame of the page - // we can't. if it's the first frame, it means it falls in the part - // of the first frame that doesn't overlap either of the other frames. - // so, if we have to handle that case for the first frame, we might - // as well handle it for all of them, so: - if (target_sample > frame_start + (left_end - left_start)) { - // so what we want to do is go ahead and just immediately decode - // this frame, but then make it so the next get_frame_float() uses - // this already-decoded data? or do we want to go ahead and rewind, - // and leave a flag saying to skip the first N data? let's do that - frames_to_skip = frame; // if this is frame #1, skip 1 frame (#0) - data_to_skip = left_end - left_start; - } else { - // otherwise, we want to skip frames 0, 1, 2, ... frame-2 - // (which means frame-2+1 total frames) then decode frame-1, - // then leave frame pending - frames_to_skip = frame - 1; - assert(frames_to_skip >= 0); - data_to_skip = -1; - } - - set_file_offset(f, page_start); - f->next_seg = - 1; // force page resync - - for (i=0; i < frames_to_skip; ++i) { - maybe_start_packet(f); - flush_packet(f); - } - - if (data_to_skip >= 0) { - int i,j,n = f->blocksize_0 >> 1; - f->discard_samples_deferred = data_to_skip; - for (i=0; i < f->channels; ++i) - for (j=0; j < n; ++j) - f->previous_window[i][j] = 0; - f->previous_length = n; - frame_start += data_to_skip; - } else { - f->previous_length = 0; - vorbis_pump_first_frame(f); - } - - // at this point, the NEXT decoded frame will generate the desired sample - if (fine) { - // so if we're doing sample accurate streaming, we want to go ahead and decode it! - if (target_sample != frame_start) { - int n; - stb_vorbis_get_frame_float(f, &n, NULL); - assert(target_sample > frame_start); - assert(f->channel_buffer_start + (int) (target_sample-frame_start) < f->channel_buffer_end); - f->channel_buffer_start += (target_sample - frame_start); - } - } - - return 0; -} - -static int vorbis_seek_base(stb_vorbis *f, unsigned int sample_number, int fine) -{ - ProbedPage p[2],q; - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - // do we know the location of the last page? - if (f->p_last.page_start == 0) { - uint32 z = stb_vorbis_stream_length_in_samples(f); - if (z == 0) return error(f, VORBIS_cant_find_last_page); - } - - p[0] = f->p_first; - p[1] = f->p_last; - - if (sample_number >= f->p_last.last_decoded_sample) - sample_number = f->p_last.last_decoded_sample-1; - - if (sample_number < f->p_first.last_decoded_sample) { - vorbis_seek_frame_from_page(f, p[0].page_start, 0, sample_number, fine); - return 0; - } else { - int attempts=0; - while (p[0].page_end < p[1].page_start) { - uint32 probe; - uint32 start_offset, end_offset; - uint32 start_sample, end_sample; - - // copy these into local variables so we can tweak them - // if any are unknown - start_offset = p[0].page_end; - end_offset = p[1].after_previous_page_start; // an address known to seek to page p[1] - start_sample = p[0].last_decoded_sample; - end_sample = p[1].last_decoded_sample; - - // currently there is no such tweaking logic needed/possible? - if (start_sample == SAMPLE_unknown || end_sample == SAMPLE_unknown) - return error(f, VORBIS_seek_failed); - - // now we want to lerp between these for the target samples... - - // step 1: we need to bias towards the page start... - if (start_offset + 4000 < end_offset) - end_offset -= 4000; - - // now compute an interpolated search loc - probe = start_offset + (int) floor((float) (end_offset - start_offset) / (end_sample - start_sample) * (sample_number - start_sample)); - - // next we need to bias towards binary search... - // code is a little wonky to allow for full 32-bit unsigned values - if (attempts >= 4) { - uint32 probe2 = start_offset + ((end_offset - start_offset) >> 1); - if (attempts >= 8) - probe = probe2; - else if (probe < probe2) - probe = probe + ((probe2 - probe) >> 1); - else - probe = probe2 + ((probe - probe2) >> 1); - } - ++attempts; - - set_file_offset(f, probe); - if (!vorbis_find_page(f, NULL, NULL)) return error(f, VORBIS_seek_failed); - if (!vorbis_analyze_page(f, &q)) return error(f, VORBIS_seek_failed); - q.after_previous_page_start = probe; - - // it's possible we've just found the last page again - if (q.page_start == p[1].page_start) { - p[1] = q; - continue; - } - - if (sample_number < q.last_decoded_sample) - p[1] = q; - else - p[0] = q; - } - - if (p[0].last_decoded_sample <= sample_number && sample_number < p[1].last_decoded_sample) { - vorbis_seek_frame_from_page(f, p[1].page_start, p[0].last_decoded_sample, sample_number, fine); - return 0; - } - return error(f, VORBIS_seek_failed); - } -} - -int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) -{ - return vorbis_seek_base(f, sample_number, FALSE); -} - -int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) -{ - return vorbis_seek_base(f, sample_number, TRUE); -} - -void stb_vorbis_seek_start(stb_vorbis *f) -{ - if (IS_PUSH_MODE(f)) { error(f, VORBIS_invalid_api_mixing); return; } - set_file_offset(f, f->first_audio_page_offset); - f->previous_length = 0; - f->first_decode = TRUE; - f->next_seg = -1; - vorbis_pump_first_frame(f); -} - -unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) -{ - unsigned int restore_offset, previous_safe; - unsigned int end, last_page_loc; - - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - if (!f->total_samples) { - int last; - uint32 lo,hi; - char header[6]; - - // first, store the current decode position so we can restore it - restore_offset = stb_vorbis_get_file_offset(f); - - // now we want to seek back 64K from the end (the last page must - // be at most a little less than 64K, but let's allow a little slop) - if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) - previous_safe = f->stream_len - 65536; - else - previous_safe = f->first_audio_page_offset; - - set_file_offset(f, previous_safe); - // previous_safe is now our candidate 'earliest known place that seeking - // to will lead to the final page' - - if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { - // if we can't find a page, we're hosed! - f->error = VORBIS_cant_find_last_page; - f->total_samples = 0xffffffff; - goto done; - } - - // check if there are more pages - last_page_loc = stb_vorbis_get_file_offset(f); - - // stop when the last_page flag is set, not when we reach eof; - // this allows us to stop short of a 'file_section' end without - // explicitly checking the length of the section - while (!last) { - set_file_offset(f, end); - if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { - // the last page we found didn't have the 'last page' flag - // set. whoops! - break; - } - previous_safe = last_page_loc+1; - last_page_loc = stb_vorbis_get_file_offset(f); - } - - set_file_offset(f, last_page_loc); - - // parse the header - getn(f, (unsigned char *)header, 6); - // extract the absolute granule position - lo = get32(f); - hi = get32(f); - if (lo == 0xffffffff && hi == 0xffffffff) { - f->error = VORBIS_cant_find_last_page; - f->total_samples = SAMPLE_unknown; - goto done; - } - if (hi) - lo = 0xfffffffe; // saturate - f->total_samples = lo; - - f->p_last.page_start = last_page_loc; - f->p_last.page_end = end; - f->p_last.last_decoded_sample = lo; - f->p_last.first_decoded_sample = SAMPLE_unknown; - f->p_last.after_previous_page_start = previous_safe; - - done: - set_file_offset(f, restore_offset); - } - return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; -} - -float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) -{ - return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; -} - - - -int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) -{ - int len, right,left,i; - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - if (!vorbis_decode_packet(f, &len, &left, &right)) { - f->channel_buffer_start = f->channel_buffer_end = 0; - return 0; - } - - len = vorbis_finish_frame(f, len, left, right); - for (i=0; i < f->channels; ++i) - f->outputs[i] = f->channel_buffers[i] + left; - - f->channel_buffer_start = left; - f->channel_buffer_end = left+len; - - if (channels) *channels = f->channels; - if (output) *output = f->outputs; - return len; -} - -#ifndef STB_VORBIS_NO_STDIO - -stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc, unsigned int length) -{ - stb_vorbis *f, p; - vorbis_init(&p, alloc); - p.f = file; - p.f_start = ftell(file); - p.stream_len = length; - p.close_on_free = close_on_free; - if (start_decoder(&p)) { - f = vorbis_alloc(&p); - if (f) { - *f = p; - vorbis_pump_first_frame(f); - return f; - } - } - if (error) *error = p.error; - vorbis_deinit(&p); - return NULL; -} - -stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc) -{ - unsigned int len, start; - start = ftell(file); - fseek(file, 0, SEEK_END); - len = ftell(file) - start; - fseek(file, start, SEEK_SET); - return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); -} - -stb_vorbis * stb_vorbis_open_filename(char *filename, int *error, stb_vorbis_alloc *alloc) -{ - FILE *f = fopen(filename, "rb"); - if (f) - return stb_vorbis_open_file(f, TRUE, error, alloc); - if (error) *error = VORBIS_file_open_failure; - return NULL; -} -#endif // STB_VORBIS_NO_STDIO - -stb_vorbis * stb_vorbis_open_memory(unsigned char *data, int len, int *error, stb_vorbis_alloc *alloc) -{ - stb_vorbis *f, p; - if (data == NULL) return NULL; - vorbis_init(&p, alloc); - p.stream = data; - p.stream_end = data + len; - p.stream_start = p.stream; - p.stream_len = len; - p.push_mode = FALSE; - if (start_decoder(&p)) { - f = vorbis_alloc(&p); - if (f) { - *f = p; - vorbis_pump_first_frame(f); - return f; - } - } - if (error) *error = p.error; - vorbis_deinit(&p); - return NULL; -} - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -#define PLAYBACK_MONO 1 -#define PLAYBACK_LEFT 2 -#define PLAYBACK_RIGHT 4 - -#define L (PLAYBACK_LEFT | PLAYBACK_MONO) -#define C (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) -#define R (PLAYBACK_RIGHT | PLAYBACK_MONO) - -static int8 channel_position[7][6] = -{ - { 0 }, - { C }, - { L, R }, - { L, C, R }, - { L, R, L, R }, - { L, C, R, L, R }, - { L, C, R, L, R, C }, -}; - - -#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT - // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round - #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) - #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) - #define FAST_SCALED_FLOAT_TO_INT(x,s) ((temp = (x) + MAGIC(s)), (*(int *)&temp) - ADDEND(s)) - #define check_endianness() - typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; - #define FASTDEF(x) x -#else - #define FAST_SCALED_FLOAT_TO_INT(x,s) ((int) ((x) * (1 << (s)))) - #define check_endianness() - #define FASTDEF(x) -#endif - -static void copy_samples(short *dest, float *src, int len) -{ - int i; - FASTDEF(float temp); - check_endianness(); - for (i=0; i < len; ++i) { - int v = FAST_SCALED_FLOAT_TO_INT(src[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - dest[i] = v; - } -} - -static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) -{ - #define BUFFER_SIZE 32 - float buffer[BUFFER_SIZE]; - int i,j,o,n = BUFFER_SIZE; - FASTDEF(float temp); - check_endianness(); - for (o = 0; o < len; o += BUFFER_SIZE) { - memset(buffer, 0, sizeof(buffer)); - if (o + n > len) n = len - o; - for (j=0; j < num_c; ++j) { - if (channel_position[num_c][j] & mask) { - for (i=0; i < n; ++i) - buffer[i] += data[j][d_offset+o+i]; - } - } - for (i=0; i < n; ++i) { - int v = FAST_SCALED_FLOAT_TO_INT(buffer[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - output[o+i] = v; - } - } -} - -static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; -static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) -{ - #define BUFFER_SIZE 32 - float buffer[BUFFER_SIZE]; - int i,j,o,n = BUFFER_SIZE >> 1; - FASTDEF(float temp); - // o is the offset in the source data - check_endianness(); - for (o = 0; o < len; o += BUFFER_SIZE >> 1) { - // o2 is the offset in the output data - int o2 = o << 1; - memset(buffer, 0, sizeof(buffer)); - if (o + n > len) n = len - o; - for (j=0; j < num_c; ++j) { - int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); - if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { - for (i=0; i < n; ++i) { - buffer[i*2+0] += data[j][d_offset+o+i]; - buffer[i*2+1] += data[j][d_offset+o+i]; - } - } else if (m == PLAYBACK_LEFT) { - for (i=0; i < n; ++i) { - buffer[i*2+0] += data[j][d_offset+o+i]; - } - } else if (m == PLAYBACK_RIGHT) { - for (i=0; i < n; ++i) { - buffer[i*2+1] += data[j][d_offset+o+i]; - } - } - } - for (i=0; i < (n<<1); ++i) { - int v = FAST_SCALED_FLOAT_TO_INT(buffer[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - output[o2+i] = v; - } - } -} - -static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) -{ - int i; - if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { - static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; - for (i=0; i < buf_c; ++i) - compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); - } else { - int limit = buf_c < data_c ? buf_c : data_c; - for (i=0; i < limit; ++i) - copy_samples(buffer[i]+b_offset, data[i], samples); - for ( ; i < buf_c; ++i) - memset(buffer[i]+b_offset, 0, sizeof(short) * samples); - } -} - -int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) -{ - float **output; - int len = stb_vorbis_get_frame_float(f, NULL, &output); - if (len > num_samples) len = num_samples; - if (len) - convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); - return len; -} - -static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) -{ - int i; - check_endianness(); - if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { - assert(buf_c == 2); - for (i=0; i < buf_c; ++i) - compute_stereo_samples(buffer, data_c, data, d_offset, len); - } else { - int limit = buf_c < data_c ? buf_c : data_c; - int j; - FASTDEF(float temp); - for (j=0; j < len; ++j) { - for (i=0; i < limit; ++i) { - int v = FAST_SCALED_FLOAT_TO_INT(data[i][d_offset+j],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - *buffer++ = v; - } - for ( ; i < buf_c; ++i) - *buffer++ = 0; - } - } -} - -int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) -{ - float **output; - int len; - if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); - len = stb_vorbis_get_frame_float(f, NULL, &output); - if (len) { - if (len*num_c > num_shorts) len = num_shorts / num_c; - convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); - } - return len; -} - -int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) -{ - float **outputs; - int len = num_shorts / channels; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < len) { - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - if (k) - convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); - buffer += k*channels; - n += k; - f->channel_buffer_start += k; - if (n == len) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} - -int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) -{ - float **outputs; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < len) { - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - if (k) - convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); - n += k; - f->channel_buffer_start += k; - if (n == len) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} - -#ifndef STB_VORBIS_NO_STDIO -int stb_vorbis_decode_filename(char *filename, int *channels, short **output) -{ - int data_len, offset, total, limit, error; - short *data; - stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); - if (v == NULL) return -1; - limit = v->channels * 4096; - *channels = v->channels; - offset = data_len = 0; - total = limit; - data = (short *) malloc(total * sizeof(*data)); - if (data == NULL) { - stb_vorbis_close(v); - return -2; - } - for (;;) { - int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); - if (n == 0) break; - data_len += n; - offset += n * v->channels; - if (offset + limit > total) { - short *data2; - total *= 2; - data2 = (short *) realloc(data, total * sizeof(*data)); - if (data2 == NULL) { - free(data); - stb_vorbis_close(v); - return -2; - } - data = data2; - } - } - *output = data; - return data_len; -} -#endif // NO_STDIO - -int stb_vorbis_decode_memory(uint8 *mem, int len, int *channels, short **output) -{ - int data_len, offset, total, limit, error; - short *data; - stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); - if (v == NULL) return -1; - limit = v->channels * 4096; - *channels = v->channels; - offset = data_len = 0; - total = limit; - data = (short *) malloc(total * sizeof(*data)); - if (data == NULL) { - stb_vorbis_close(v); - return -2; - } - for (;;) { - int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); - if (n == 0) break; - data_len += n; - offset += n * v->channels; - if (offset + limit > total) { - short *data2; - total *= 2; - data2 = (short *) realloc(data, total * sizeof(*data)); - if (data2 == NULL) { - free(data); - stb_vorbis_close(v); - return -2; - } - data = data2; - } - } - *output = data; - return data_len; -} -#endif - -int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) -{ - float **outputs; - int len = num_floats / channels; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < len) { - int i,j; - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - for (j=0; j < k; ++j) { - for (i=0; i < z; ++i) - *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; - for ( ; i < channels; ++i) - *buffer++ = 0; - } - n += k; - f->channel_buffer_start += k; - if (n == len) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} - -int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) -{ - float **outputs; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < num_samples) { - int i; - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= num_samples) k = num_samples - n; - if (k) { - for (i=0; i < z; ++i) - memcpy(buffer[i]+n, f->channel_buffers+f->channel_buffer_start, sizeof(float)*k); - for ( ; i < channels; ++i) - memset(buffer[i]+n, 0, sizeof(float) * k); - } - n += k; - f->channel_buffer_start += k; - if (n == num_samples) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} -#endif // STB_VORBIS_NO_PULLDATA_API - -#endif // STB_VORBIS_HEADER_ONLY + } + #ifndef STB_VORBIS_NO_STDIO + if (p->close_on_free) fclose(p->f); + #endif +} + +void stb_vorbis_close(stb_vorbis *p) +{ + if (p == NULL) return; + vorbis_deinit(p); + setup_free(p,p); +} + +static void vorbis_init(stb_vorbis *p, stb_vorbis_alloc *z) +{ + memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start + if (z) { + p->alloc = *z; + p->alloc.alloc_buffer_length_in_bytes = (p->alloc.alloc_buffer_length_in_bytes+3) & ~3; + p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; + } + p->eof = 0; + p->error = VORBIS__no_error; + p->stream = NULL; + p->codebooks = NULL; + p->page_crc_tests = -1; + #ifndef STB_VORBIS_NO_STDIO + p->close_on_free = FALSE; + p->f = NULL; + #endif +} + +int stb_vorbis_get_sample_offset(stb_vorbis *f) +{ + if (f->current_loc_valid) + return f->current_loc; + else + return -1; +} + +stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) +{ + stb_vorbis_info d; + d.channels = f->channels; + d.sample_rate = f->sample_rate; + d.setup_memory_required = f->setup_memory_required; + d.setup_temp_memory_required = f->setup_temp_memory_required; + d.temp_memory_required = f->temp_memory_required; + d.max_frame_size = f->blocksize_1 >> 1; + return d; +} + +int stb_vorbis_get_error(stb_vorbis *f) +{ + int e = f->error; + f->error = VORBIS__no_error; + return e; +} + +static stb_vorbis * vorbis_alloc(stb_vorbis *f) +{ + stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); + return p; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +void stb_vorbis_flush_pushdata(stb_vorbis *f) +{ + f->previous_length = 0; + f->page_crc_tests = 0; + f->discard_samples_deferred = 0; + f->current_loc_valid = FALSE; + f->first_decode = FALSE; + f->samples_output = 0; + f->channel_buffer_start = 0; + f->channel_buffer_end = 0; +} + +static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) +{ + int i,n; + for (i=0; i < f->page_crc_tests; ++i) + f->scan[i].bytes_done = 0; + + // if we have room for more scans, search for them first, because + // they may cause us to stop early if their header is incomplete + if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { + if (data_len < 4) return 0; + data_len -= 3; // need to look for 4-byte sequence, so don't miss + // one that straddles a boundary + for (i=0; i < data_len; ++i) { + if (data[i] == 0x4f) { + if (0==memcmp(data+i, ogg_page_header, 4)) { + int j,len; + uint32 crc; + // make sure we have the whole page header + if (i+26 >= data_len || i+27+data[i+26] >= data_len) { + // only read up to this page start, so hopefully we'll + // have the whole page header start next time + data_len = i; + break; + } + // ok, we have it all; compute the length of the page + len = 27 + data[i+26]; + for (j=0; j < data[i+26]; ++j) + len += data[i+27+j]; + // scan everything up to the embedded crc (which we must 0) + crc = 0; + for (j=0; j < 22; ++j) + crc = crc32_update(crc, data[i+j]); + // now process 4 0-bytes + for ( ; j < 26; ++j) + crc = crc32_update(crc, 0); + // len is the total number of bytes we need to scan + n = f->page_crc_tests++; + f->scan[n].bytes_left = len-j; + f->scan[n].crc_so_far = crc; + f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); + // if the last frame on a page is continued to the next, then + // we can't recover the sample_loc immediately + if (data[i+27+data[i+26]-1] == 255) + f->scan[n].sample_loc = ~0; + else + f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); + f->scan[n].bytes_done = i+j; + if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) + break; + // keep going if we still have room for more + } + } + } + } + + for (i=0; i < f->page_crc_tests;) { + uint32 crc; + int j; + int n = f->scan[i].bytes_done; + int m = f->scan[i].bytes_left; + if (m > data_len - n) m = data_len - n; + // m is the bytes to scan in the current chunk + crc = f->scan[i].crc_so_far; + for (j=0; j < m; ++j) + crc = crc32_update(crc, data[n+j]); + f->scan[i].bytes_left -= m; + f->scan[i].crc_so_far = crc; + if (f->scan[i].bytes_left == 0) { + // does it match? + if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { + // Houston, we have page + data_len = n+m; // consumption amount is wherever that scan ended + f->page_crc_tests = -1; // drop out of page scan mode + f->previous_length = 0; // decode-but-don't-output one frame + f->next_seg = -1; // start a new page + f->current_loc = f->scan[i].sample_loc; // set the current sample location + // to the amount we'd have decoded had we decoded this page + f->current_loc_valid = f->current_loc != ~0; + return data_len; + } + // delete entry + f->scan[i] = f->scan[--f->page_crc_tests]; + } else { + ++i; + } + } + + return data_len; +} + +// return value: number of bytes we used +int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, // the file we're decoding + uint8 *data, int data_len, // the memory available for decoding + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ) +{ + int i; + int len,right,left; + + if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (f->page_crc_tests >= 0) { + *samples = 0; + return vorbis_search_for_page_pushdata(f, data, data_len); + } + + f->stream = data; + f->stream_end = data + data_len; + f->error = VORBIS__no_error; + + // check that we have the entire packet in memory + if (!is_whole_packet_present(f, FALSE)) { + *samples = 0; + return 0; + } + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + // save the actual error we encountered + enum STBVorbisError error = f->error; + if (error == VORBIS_bad_packet_type) { + // flush and resynch + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return f->stream - data; + } + if (error == VORBIS_continued_packet_flag_invalid) { + if (f->previous_length == 0) { + // we may be resynching, in which case it's ok to hit one + // of these; just discard the packet + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return f->stream - data; + } + } + // if we get an error while parsing, what to do? + // well, it DEFINITELY won't work to continue from where we are! + stb_vorbis_flush_pushdata(f); + // restore the error that actually made us bail + f->error = error; + *samples = 0; + return 1; + } + + // success! + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + if (channels) *channels = f->channels; + *samples = len; + *output = f->outputs; + return f->stream - data; +} + +stb_vorbis *stb_vorbis_open_pushdata( + unsigned char *data, int data_len, // the memory available for decoding + int *data_used, // only defined if result is not NULL + int *error, stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.stream = data; + p.stream_end = data + data_len; + p.push_mode = TRUE; + if (!start_decoder(&p)) { + if (p.eof) + *error = VORBIS_need_more_data; + else + *error = p.error; + return NULL; + } + f = vorbis_alloc(&p); + if (f) { + *f = p; + *data_used = f->stream - data; + *error = 0; + return f; + } else { + vorbis_deinit(&p); + return NULL; + } +} +#endif // STB_VORBIS_NO_PUSHDATA_API + +unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + if (USE_MEMORY(f)) return f->stream - f->stream_start; + #ifndef STB_VORBIS_NO_STDIO + return ftell(f->f) - f->f_start; + #endif +} + +#ifndef STB_VORBIS_NO_PULLDATA_API +// +// DATA-PULLING API +// + +static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) +{ + for(;;) { + int n; + if (f->eof) return 0; + n = get8(f); + if (n == 0x4f) { // page header + unsigned int retry_loc = stb_vorbis_get_file_offset(f); + int i; + // check if we're off the end of a file_section stream + if (retry_loc - 25 > f->stream_len) + return 0; + // check the rest of the header + for (i=1; i < 4; ++i) + if (get8(f) != ogg_page_header[i]) + break; + if (f->eof) return 0; + if (i == 4) { + uint8 header[27]; + uint32 i, crc, goal, len; + for (i=0; i < 4; ++i) + header[i] = ogg_page_header[i]; + for (; i < 27; ++i) + header[i] = get8(f); + if (f->eof) return 0; + if (header[4] != 0) goto invalid; + goal = header[22] + (header[23] << 8) + (header[24]<<16) + (header[25]<<24); + for (i=22; i < 26; ++i) + header[i] = 0; + crc = 0; + for (i=0; i < 27; ++i) + crc = crc32_update(crc, header[i]); + len = 0; + for (i=0; i < header[26]; ++i) { + int s = get8(f); + crc = crc32_update(crc, s); + len += s; + } + if (len && f->eof) return 0; + for (i=0; i < len; ++i) + crc = crc32_update(crc, get8(f)); + // finished parsing probable page + if (crc == goal) { + // we could now check that it's either got the last + // page flag set, OR it's followed by the capture + // pattern, but I guess TECHNICALLY you could have + // a file with garbage between each ogg page and recover + // from it automatically? So even though that paranoia + // might decrease the chance of an invalid decode by + // another 2^32, not worth it since it would hose those + // invalid-but-useful files? + if (end) + *end = stb_vorbis_get_file_offset(f); + if (last) + if (header[5] & 0x04) + *last = 1; + else + *last = 0; + set_file_offset(f, retry_loc-1); + return 1; + } + } + invalid: + // not a valid page, so rewind and look for next one + set_file_offset(f, retry_loc); + } + } +} + +// seek is implemented with 'interpolation search'--this is like +// binary search, but we use the data values to estimate the likely +// location of the data item (plus a bit of a bias so when the +// estimation is wrong we don't waste overly much time) + +#define SAMPLE_unknown 0xffffffff + + +// ogg vorbis, in its insane infinite wisdom, only provides +// information about the sample at the END of the page. +// therefore we COULD have the data we need in the current +// page, and not know it. we could just use the end location +// as our only knowledge for bounds, seek back, and eventually +// the binary search finds it. or we can try to be smart and +// not waste time trying to locate more pages. we try to be +// smart, since this data is already in memory anyway, so +// doing needless I/O would be crazy! +static int vorbis_analyze_page(stb_vorbis *f, ProbedPage *z) +{ + uint8 header[27], lacing[255]; + uint8 packet_type[255]; + int num_packet, packet_start, previous =0; + int i,len; + uint32 samples; + + // record where the page starts + z->page_start = stb_vorbis_get_file_offset(f); + + // parse the header + getn(f, header, 27); + assert(header[0] == 'O' && header[1] == 'g' && header[2] == 'g' && header[3] == 'S'); + getn(f, lacing, header[26]); + + // determine the length of the payload + len = 0; + for (i=0; i < header[26]; ++i) + len += lacing[i]; + + // this implies where the page ends + z->page_end = z->page_start + 27 + header[26] + len; + + // read the last-decoded sample out of the data + z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 16); + + if (header[5] & 4) { + // if this is the last page, it's not possible to work + // backwards to figure out the first sample! whoops! fuck. + z->first_decoded_sample = SAMPLE_unknown; + set_file_offset(f, z->page_start); + return 1; + } + + // scan through the frames to determine the sample-count of each one... + // our goal is the sample # of the first fully-decoded sample on the + // page, which is the first decoded sample of the 2nd page + + num_packet=0; + + packet_start = ((header[5] & 1) == 0); + + for (i=0; i < header[26]; ++i) { + if (packet_start) { + uint8 n,b,m; + if (lacing[i] == 0) goto bail; // trying to read from zero-length packet + n = get8(f); + // if bottom bit is non-zero, we've got corruption + if (n & 1) goto bail; + n >>= 1; + b = ilog(f->mode_count-1); + m = n >> b; + n &= (1 << b)-1; + if (n >= f->mode_count) goto bail; + if (num_packet == 0 && f->mode_config[n].blockflag) + previous = (m & 1); + packet_type[num_packet++] = f->mode_config[n].blockflag; + skip(f, lacing[i]-1); + } else + skip(f, lacing[i]); + packet_start = (lacing[i] < 255); + } + + // now that we know the sizes of all the pages, we can start determining + // how much sample data there is. + + samples = 0; + + // for the last packet, we step by its whole length, because the definition + // is that we encoded the end sample loc of the 'last packet completed', + // where 'completed' refers to packets being split, and we are left to guess + // what 'end sample loc' means. we assume it means ignoring the fact that + // the last half of the data is useless without windowing against the next + // packet... (so it's not REALLY complete in that sense) + if (num_packet > 1) + samples += f->blocksize[packet_type[num_packet-1]]; + + for (i=num_packet-2; i >= 1; --i) { + // now, for this packet, how many samples do we have that + // do not overlap the following packet? + if (packet_type[i] == 1) + if (packet_type[i+1] == 1) + samples += f->blocksize_1 >> 1; + else + samples += ((f->blocksize_1 - f->blocksize_0) >> 2) + (f->blocksize_0 >> 1); + else + samples += f->blocksize_0 >> 1; + } + // now, at this point, we've rewound to the very beginning of the + // _second_ packet. if we entirely discard the first packet after + // a seek, this will be exactly the right sample number. HOWEVER! + // we can't as easily compute this number for the LAST page. The + // only way to get the sample offset of the LAST page is to use + // the end loc from the previous page. But what that returns us + // is _exactly_ the place where we get our first non-overlapped + // sample. (I think. Stupid spec for being ambiguous.) So for + // consistency it's better to do that here, too. However, that + // will then require us to NOT discard all of the first frame we + // decode, in some cases, which means an even weirder frame size + // and extra code. what a fucking pain. + + // we're going to discard the first packet if we + // start the seek here, so we don't care about it. (we could actually + // do better; if the first packet is long, and the previous packet + // is short, there's actually data in the first half of the first + // packet that doesn't need discarding... but not worth paying the + // effort of tracking that of that here and in the seeking logic) + // except crap, if we infer it from the _previous_ packet's end + // location, we DO need to use that definition... and we HAVE to + // infer the start loc of the LAST packet from the previous packet's + // end location. fuck you, ogg vorbis. + + z->first_decoded_sample = z->last_decoded_sample - samples; + + // restore file state to where we were + set_file_offset(f, z->page_start); + return 1; + + // restore file state to where we were + bail: + set_file_offset(f, z->page_start); + return 0; +} + +static int vorbis_seek_frame_from_page(stb_vorbis *f, uint32 page_start, uint32 first_sample, uint32 target_sample, int fine) +{ + int left_start, left_end, right_start, right_end, mode,i; + int frame=0; + uint32 frame_start; + int frames_to_skip, data_to_skip; + + // first_sample is the sample # of the first sample that doesn't + // overlap the previous page... note that this requires us to + // _partially_ discard the first packet! bleh. + set_file_offset(f, page_start); + + f->next_seg = -1; // force page resync + + frame_start = first_sample; + // frame start is where the previous packet's last decoded sample + // was, which corresponds to left_end... EXCEPT if the previous + // packet was long and this packet is short? Probably a bug here. + + + // now, we can start decoding frames... we'll only FAKE decode them, + // until we find the frame that contains our sample; then we'll rewind, + // and try again + for (;;) { + int start; + + if (!vorbis_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) + return error(f, VORBIS_seek_failed); + + if (frame == 0) + start = left_end; + else + start = left_start; + + // the window starts at left_start; the last valid sample we generate + // before the next frame's window start is right_start-1 + if (target_sample < frame_start + right_start-start) + break; + + flush_packet(f); + if (f->eof) + return error(f, VORBIS_seek_failed); + + frame_start += right_start - start; + + ++frame; + } + + // ok, at this point, the sample we want is contained in frame #'frame' + + // to decode frame #'frame' normally, we have to decode the + // previous frame first... but if it's the FIRST frame of the page + // we can't. if it's the first frame, it means it falls in the part + // of the first frame that doesn't overlap either of the other frames. + // so, if we have to handle that case for the first frame, we might + // as well handle it for all of them, so: + if (target_sample > frame_start + (left_end - left_start)) { + // so what we want to do is go ahead and just immediately decode + // this frame, but then make it so the next get_frame_float() uses + // this already-decoded data? or do we want to go ahead and rewind, + // and leave a flag saying to skip the first N data? let's do that + frames_to_skip = frame; // if this is frame #1, skip 1 frame (#0) + data_to_skip = left_end - left_start; + } else { + // otherwise, we want to skip frames 0, 1, 2, ... frame-2 + // (which means frame-2+1 total frames) then decode frame-1, + // then leave frame pending + frames_to_skip = frame - 1; + assert(frames_to_skip >= 0); + data_to_skip = -1; + } + + set_file_offset(f, page_start); + f->next_seg = - 1; // force page resync + + for (i=0; i < frames_to_skip; ++i) { + maybe_start_packet(f); + flush_packet(f); + } + + if (data_to_skip >= 0) { + int i,j,n = f->blocksize_0 >> 1; + f->discard_samples_deferred = data_to_skip; + for (i=0; i < f->channels; ++i) + for (j=0; j < n; ++j) + f->previous_window[i][j] = 0; + f->previous_length = n; + frame_start += data_to_skip; + } else { + f->previous_length = 0; + vorbis_pump_first_frame(f); + } + + // at this point, the NEXT decoded frame will generate the desired sample + if (fine) { + // so if we're doing sample accurate streaming, we want to go ahead and decode it! + if (target_sample != frame_start) { + int n; + stb_vorbis_get_frame_float(f, &n, NULL); + assert(target_sample > frame_start); + assert(f->channel_buffer_start + (int) (target_sample-frame_start) < f->channel_buffer_end); + f->channel_buffer_start += (target_sample - frame_start); + } + } + + return 0; +} + +static int vorbis_seek_base(stb_vorbis *f, unsigned int sample_number, int fine) +{ + ProbedPage p[2],q; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + // do we know the location of the last page? + if (f->p_last.page_start == 0) { + uint32 z = stb_vorbis_stream_length_in_samples(f); + if (z == 0) return error(f, VORBIS_cant_find_last_page); + } + + p[0] = f->p_first; + p[1] = f->p_last; + + if (sample_number >= f->p_last.last_decoded_sample) + sample_number = f->p_last.last_decoded_sample-1; + + if (sample_number < f->p_first.last_decoded_sample) { + vorbis_seek_frame_from_page(f, p[0].page_start, 0, sample_number, fine); + return 0; + } else { + int attempts=0; + while (p[0].page_end < p[1].page_start) { + uint32 probe; + uint32 start_offset, end_offset; + uint32 start_sample, end_sample; + + // copy these into local variables so we can tweak them + // if any are unknown + start_offset = p[0].page_end; + end_offset = p[1].after_previous_page_start; // an address known to seek to page p[1] + start_sample = p[0].last_decoded_sample; + end_sample = p[1].last_decoded_sample; + + // currently there is no such tweaking logic needed/possible? + if (start_sample == SAMPLE_unknown || end_sample == SAMPLE_unknown) + return error(f, VORBIS_seek_failed); + + // now we want to lerp between these for the target samples... + + // step 1: we need to bias towards the page start... + if (start_offset + 4000 < end_offset) + end_offset -= 4000; + + // now compute an interpolated search loc + probe = start_offset + (int) floor((float) (end_offset - start_offset) / (end_sample - start_sample) * (sample_number - start_sample)); + + // next we need to bias towards binary search... + // code is a little wonky to allow for full 32-bit unsigned values + if (attempts >= 4) { + uint32 probe2 = start_offset + ((end_offset - start_offset) >> 1); + if (attempts >= 8) + probe = probe2; + else if (probe < probe2) + probe = probe + ((probe2 - probe) >> 1); + else + probe = probe2 + ((probe - probe2) >> 1); + } + ++attempts; + + set_file_offset(f, probe); + if (!vorbis_find_page(f, NULL, NULL)) return error(f, VORBIS_seek_failed); + if (!vorbis_analyze_page(f, &q)) return error(f, VORBIS_seek_failed); + q.after_previous_page_start = probe; + + // it's possible we've just found the last page again + if (q.page_start == p[1].page_start) { + p[1] = q; + continue; + } + + if (sample_number < q.last_decoded_sample) + p[1] = q; + else + p[0] = q; + } + + if (p[0].last_decoded_sample <= sample_number && sample_number < p[1].last_decoded_sample) { + vorbis_seek_frame_from_page(f, p[1].page_start, p[0].last_decoded_sample, sample_number, fine); + return 0; + } + return error(f, VORBIS_seek_failed); + } +} + +int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) +{ + return vorbis_seek_base(f, sample_number, FALSE); +} + +int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) +{ + return vorbis_seek_base(f, sample_number, TRUE); +} + +void stb_vorbis_seek_start(stb_vorbis *f) +{ + if (IS_PUSH_MODE(f)) { error(f, VORBIS_invalid_api_mixing); return; } + set_file_offset(f, f->first_audio_page_offset); + f->previous_length = 0; + f->first_decode = TRUE; + f->next_seg = -1; + vorbis_pump_first_frame(f); +} + +unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) +{ + unsigned int restore_offset, previous_safe; + unsigned int end, last_page_loc; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + if (!f->total_samples) { + int last; + uint32 lo,hi; + char header[6]; + + // first, store the current decode position so we can restore it + restore_offset = stb_vorbis_get_file_offset(f); + + // now we want to seek back 64K from the end (the last page must + // be at most a little less than 64K, but let's allow a little slop) + if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) + previous_safe = f->stream_len - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + // previous_safe is now our candidate 'earliest known place that seeking + // to will lead to the final page' + + if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { + // if we can't find a page, we're hosed! + f->error = VORBIS_cant_find_last_page; + f->total_samples = 0xffffffff; + goto done; + } + + // check if there are more pages + last_page_loc = stb_vorbis_get_file_offset(f); + + // stop when the last_page flag is set, not when we reach eof; + // this allows us to stop short of a 'file_section' end without + // explicitly checking the length of the section + while (!last) { + set_file_offset(f, end); + if (!vorbis_find_page(f, &end, (int unsigned *)&last)) { + // the last page we found didn't have the 'last page' flag + // set. whoops! + break; + } + previous_safe = last_page_loc+1; + last_page_loc = stb_vorbis_get_file_offset(f); + } + + set_file_offset(f, last_page_loc); + + // parse the header + getn(f, (unsigned char *)header, 6); + // extract the absolute granule position + lo = get32(f); + hi = get32(f); + if (lo == 0xffffffff && hi == 0xffffffff) { + f->error = VORBIS_cant_find_last_page; + f->total_samples = SAMPLE_unknown; + goto done; + } + if (hi) + lo = 0xfffffffe; // saturate + f->total_samples = lo; + + f->p_last.page_start = last_page_loc; + f->p_last.page_end = end; + f->p_last.last_decoded_sample = lo; + f->p_last.first_decoded_sample = SAMPLE_unknown; + f->p_last.after_previous_page_start = previous_safe; + + done: + set_file_offset(f, restore_offset); + } + return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; +} + +float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) +{ + return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; +} + + + +int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) +{ + int len, right,left,i; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + f->channel_buffer_start = f->channel_buffer_end = 0; + return 0; + } + + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + f->channel_buffer_start = left; + f->channel_buffer_end = left+len; + + if (channels) *channels = f->channels; + if (output) *output = f->outputs; + return len; +} + +#ifndef STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc, unsigned int length) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.f = file; + p.f_start = ftell(file); + p.stream_len = length; + p.close_on_free = close_on_free; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, stb_vorbis_alloc *alloc) +{ + unsigned int len, start; + start = ftell(file); + fseek(file, 0, SEEK_END); + len = ftell(file) - start; + fseek(file, start, SEEK_SET); + return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); +} + +stb_vorbis * stb_vorbis_open_filename(char *filename, int *error, stb_vorbis_alloc *alloc) +{ + FILE *f = fopen(filename, "rb"); + if (f) + return stb_vorbis_open_file(f, TRUE, error, alloc); + if (error) *error = VORBIS_file_open_failure; + return NULL; +} +#endif // STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_memory(unsigned char *data, int len, int *error, stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + if (data == NULL) return NULL; + vorbis_init(&p, alloc); + p.stream = data; + p.stream_end = data + len; + p.stream_start = p.stream; + p.stream_len = len; + p.push_mode = FALSE; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#define PLAYBACK_MONO 1 +#define PLAYBACK_LEFT 2 +#define PLAYBACK_RIGHT 4 + +#define L (PLAYBACK_LEFT | PLAYBACK_MONO) +#define C (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) +#define R (PLAYBACK_RIGHT | PLAYBACK_MONO) + +static int8 channel_position[7][6] = +{ + { 0 }, + { C }, + { L, R }, + { L, C, R }, + { L, R, L, R }, + { L, C, R, L, R }, + { L, C, R, L, R, C }, +}; + + +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round + #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) + #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) + #define FAST_SCALED_FLOAT_TO_INT(x,s) ((temp = (x) + MAGIC(s)), (*(int *)&temp) - ADDEND(s)) + #define check_endianness() + typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; + #define FASTDEF(x) x +#else + #define FAST_SCALED_FLOAT_TO_INT(x,s) ((int) ((x) * (1 << (s)))) + #define check_endianness() + #define FASTDEF(x) +#endif + +static void copy_samples(short *dest, float *src, int len) +{ + int i; + FASTDEF(float temp); + check_endianness(); + for (i=0; i < len; ++i) { + int v = FAST_SCALED_FLOAT_TO_INT(src[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + dest[i] = v; + } +} + +static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE; + FASTDEF(float temp); + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE) { + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + if (channel_position[num_c][j] & mask) { + for (i=0; i < n; ++i) + buffer[i] += data[j][d_offset+o+i]; + } + } + for (i=0; i < n; ++i) { + int v = FAST_SCALED_FLOAT_TO_INT(buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o+i] = v; + } + } +} + +static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; +static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE >> 1; + FASTDEF(float temp); + // o is the offset in the source data + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE >> 1) { + // o2 is the offset in the output data + int o2 = o << 1; + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); + if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_LEFT) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_RIGHT) { + for (i=0; i < n; ++i) { + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } + } + for (i=0; i < (n<<1); ++i) { + int v = FAST_SCALED_FLOAT_TO_INT(buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o2+i] = v; + } + } +} + +static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) +{ + int i; + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; + for (i=0; i < buf_c; ++i) + compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + for (i=0; i < limit; ++i) + copy_samples(buffer[i]+b_offset, data[i], samples); + for ( ; i < buf_c; ++i) + memset(buffer[i]+b_offset, 0, sizeof(short) * samples); + } +} + +int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) +{ + float **output; + int len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len > num_samples) len = num_samples; + if (len) + convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); + return len; +} + +static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) +{ + int i; + check_endianness(); + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + assert(buf_c == 2); + for (i=0; i < buf_c; ++i) + compute_stereo_samples(buffer, data_c, data, d_offset, len); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + int j; + FASTDEF(float temp); + for (j=0; j < len; ++j) { + for (i=0; i < limit; ++i) { + int v = FAST_SCALED_FLOAT_TO_INT(data[i][d_offset+j],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + *buffer++ = v; + } + for ( ; i < buf_c; ++i) + *buffer++ = 0; + } + } +} + +int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) +{ + float **output; + int len; + if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); + len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len) { + if (len*num_c > num_shorts) len = num_shorts / num_c; + convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); + } + return len; +} + +int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) +{ + float **outputs; + int len = num_shorts / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); + buffer += k*channels; + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +#ifndef STB_VORBIS_NO_STDIO +int stb_vorbis_decode_filename(char *filename, int *channels, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + return data_len; +} +#endif // NO_STDIO + +int stb_vorbis_decode_memory(uint8 *mem, int len, int *channels, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + return data_len; +} +#endif + +int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) +{ + float **outputs; + int len = num_floats / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int i,j; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + for (j=0; j < k; ++j) { + for (i=0; i < z; ++i) + *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; + for ( ; i < channels; ++i) + *buffer++ = 0; + } + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < num_samples) { + int i; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= num_samples) k = num_samples - n; + if (k) { + for (i=0; i < z; ++i) + memcpy(buffer[i]+n, f->channel_buffers+f->channel_buffer_start, sizeof(float)*k); + for ( ; i < channels; ++i) + memset(buffer[i]+n, 0, sizeof(float) * k); + } + n += k; + f->channel_buffer_start += k; + if (n == num_samples) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} +#endif // STB_VORBIS_NO_PULLDATA_API + +#endif // STB_VORBIS_HEADER_ONLY From f644f6220d84133d287452bd1c5292e30b182c06 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Thu, 28 Jan 2010 18:36:13 +0000 Subject: [PATCH 03/13] Fixed compile error in Joystick.hpp on FreeBSD git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1378 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Window/Linux/Joystick.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SFML/Window/Linux/Joystick.hpp b/src/SFML/Window/Linux/Joystick.hpp index c03bf08e..3122264c 100644 --- a/src/SFML/Window/Linux/Joystick.hpp +++ b/src/SFML/Window/Linux/Joystick.hpp @@ -33,6 +33,7 @@ #include #elif defined(SFML_SYSTEM_FREEBSD) // #include ? + #define ABS_MAX 1 #endif From d3a53570d7945c4f1bec7301d925cda4aa169744 Mon Sep 17 00:00:00 2001 From: ceylo Date: Fri, 29 Jan 2010 00:17:21 +0000 Subject: [PATCH 04/13] Fixed small compilation error. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1380 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Window/Cocoa/Joystick.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SFML/Window/Cocoa/Joystick.cpp b/src/SFML/Window/Cocoa/Joystick.cpp index ff2a353a..f65ac736 100644 --- a/src/SFML/Window/Cocoa/Joystick.cpp +++ b/src/SFML/Window/Cocoa/Joystick.cpp @@ -49,7 +49,7 @@ void Joystick::Initialize(unsigned int Index) JoystickState Joystick::UpdateState() { // Fill a JoystickState instance with the current joystick state - JoystickState s = {0}; + JoystickState s; return s; } From 23f6b6f2afde70d684c75e452c0d14e6147907de Mon Sep 17 00:00:00 2001 From: ceylo Date: Fri, 29 Jan 2010 00:22:23 +0000 Subject: [PATCH 05/13] Initial import. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1381 4e206d99-4929-0410-ac5d-dfc041789085 --- .../project.pbxproj | 2471 +++++++++++++++++ 1 file changed, 2471 insertions(+) create mode 100644 build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj diff --git a/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj b/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj new file mode 100644 index 00000000..a3276463 --- /dev/null +++ b/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj @@ -0,0 +1,2471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXAggregateTarget section */ + A0F0BA820D92E4F500056981 /* All */ = { + isa = PBXAggregateTarget; + buildConfigurationList = A02679E40E5CDB03008D4C81 /* Build configuration list for PBXAggregateTarget "All" */; + buildPhases = ( + ); + dependencies = ( + A0B4CD3A0D96B11500DEEE0F /* PBXTargetDependency */, + A0F0BA8C0D92E52300056981 /* PBXTargetDependency */, + A0F0BA8A0D92E52300056981 /* PBXTargetDependency */, + A0F0BA860D92E52300056981 /* PBXTargetDependency */, + A07EA05B0DB657A9007C7747 /* PBXTargetDependency */, + A0F0BA880D92E52300056981 /* PBXTargetDependency */, + ); + name = All; + productName = All; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + A018A27B0EA21866005FFAC3 /* Http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A018A2790EA21866005FFAC3 /* Http.cpp */; }; + A018A27C0EA21866005FFAC3 /* Ftp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A018A27A0EA21866005FFAC3 /* Ftp.cpp */; }; + A01A3AED0E75181300D0BA9B /* AudioDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AD80E75181300D0BA9B /* AudioDevice.cpp */; }; + A01A3AEE0E75181300D0BA9B /* AudioDevice.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A01A3AD90E75181300D0BA9B /* AudioDevice.hpp */; }; + A01A3AEF0E75181300D0BA9B /* AudioResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3ADA0E75181300D0BA9B /* AudioResource.cpp */; }; + A01A3AF00E75181300D0BA9B /* Listener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3ADB0E75181300D0BA9B /* Listener.cpp */; }; + A01A3AF20E75181300D0BA9B /* Music.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3ADD0E75181300D0BA9B /* Music.cpp */; }; + A01A3AF30E75181300D0BA9B /* OpenAL.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A01A3ADE0E75181300D0BA9B /* OpenAL.hpp */; }; + A01A3AF40E75181300D0BA9B /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3ADF0E75181300D0BA9B /* Sound.cpp */; }; + A01A3AF50E75181300D0BA9B /* SoundBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE00E75181300D0BA9B /* SoundBuffer.cpp */; }; + A01A3AF60E75181300D0BA9B /* SoundBufferRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE10E75181300D0BA9B /* SoundBufferRecorder.cpp */; }; + A01A3AF70E75181300D0BA9B /* SoundFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE20E75181300D0BA9B /* SoundFile.cpp */; }; + A01A3AF80E75181300D0BA9B /* SoundFile.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A01A3AE30E75181300D0BA9B /* SoundFile.hpp */; }; + A01A3AF90E75181300D0BA9B /* SoundFileDefault.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE40E75181300D0BA9B /* SoundFileDefault.cpp */; }; + A01A3AFA0E75181300D0BA9B /* SoundFileDefault.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A01A3AE50E75181300D0BA9B /* SoundFileDefault.hpp */; }; + A01A3AFB0E75181300D0BA9B /* SoundFileOgg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE60E75181300D0BA9B /* SoundFileOgg.cpp */; }; + A01A3AFC0E75181300D0BA9B /* SoundFileOgg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A01A3AE70E75181300D0BA9B /* SoundFileOgg.hpp */; }; + A01A3AFD0E75181300D0BA9B /* SoundRecorder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE80E75181300D0BA9B /* SoundRecorder.cpp */; }; + A01A3AFE0E75181300D0BA9B /* SoundStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AE90E75181300D0BA9B /* SoundStream.cpp */; }; + A01A3AFF0E75181300D0BA9B /* stb_vorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = A01A3AEB0E75181300D0BA9B /* stb_vorbis.c */; }; + A01A3B000E75181300D0BA9B /* stb_vorbis.h in Headers */ = {isa = PBXBuildFile; fileRef = A01A3AEC0E75181300D0BA9B /* stb_vorbis.h */; }; + A01C69C90E3E63CE00ED3F04 /* Unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A01C69C80E3E63CE00ED3F04 /* Unicode.cpp */; }; + A04C59AF0EDDBA9C00935061 /* AppController.h in Headers */ = {isa = PBXBuildFile; fileRef = A04C59A50EDDBA9C00935061 /* AppController.h */; }; + A04C59B00EDDBA9C00935061 /* AppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A04C59A60EDDBA9C00935061 /* AppController.mm */; }; + A04C59B10EDDBA9C00935061 /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A04C59A70EDDBA9C00935061 /* Joystick.cpp */; }; + A04C59B20EDDBA9C00935061 /* Joystick.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A04C59A80EDDBA9C00935061 /* Joystick.hpp */; }; + A04C59B30EDDBA9C00935061 /* VideoModeSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A04C59A90EDDBA9C00935061 /* VideoModeSupport.cpp */; }; + A04C59B40EDDBA9C00935061 /* VideoModeSupport.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A04C59AA0EDDBA9C00935061 /* VideoModeSupport.hpp */; }; + A04C59B70EDDBA9C00935061 /* WindowImplCocoa.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A04C59AD0EDDBA9C00935061 /* WindowImplCocoa.hpp */; }; + A04C59B80EDDBA9C00935061 /* WindowImplCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = A04C59AE0EDDBA9C00935061 /* WindowImplCocoa.mm */; }; + A093E3D00D8BF918002236B4 /* dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A093E3CF0D8BF918002236B4 /* dummy.cpp */; }; + A09EEBF70D8C19BF00F6C625 /* Platform.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A09EEBED0D8C19BF00F6C625 /* Platform.hpp */; }; + A09EEBF80D8C19BF00F6C625 /* Randomizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBEE0D8C19BF00F6C625 /* Randomizer.cpp */; }; + A09EEBF90D8C19BF00F6C625 /* Mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF00D8C19BF00F6C625 /* Mutex.cpp */; }; + A09EEBFA0D8C19BF00F6C625 /* Platform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF10D8C19BF00F6C625 /* Platform.cpp */; }; + A09EEBFB0D8C19BF00F6C625 /* Platform.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A09EEBF20D8C19BF00F6C625 /* Platform.hpp */; }; + A09EEBFC0D8C19BF00F6C625 /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF30D8C19BF00F6C625 /* Thread.cpp */; }; + A09EEBFD0D8C19BF00F6C625 /* Clock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF40D8C19BF00F6C625 /* Clock.cpp */; }; + A09EEBFE0D8C19BF00F6C625 /* Lock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF50D8C19BF00F6C625 /* Lock.cpp */; }; + A09EEBFF0D8C19BF00F6C625 /* Sleep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A09EEBF60D8C19BF00F6C625 /* Sleep.cpp */; }; + A0CE9FE70F46F72500FD00CE /* GLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = A0CE9FE50F46F72500FD00CE /* GLKit.h */; }; + A0CE9FE80F46F72500FD00CE /* GLKit.mm in Sources */ = {isa = PBXBuildFile; fileRef = A0CE9FE60F46F72500FD00CE /* GLKit.mm */; }; + A0EEDE990F59D49C0023A7F7 /* Initializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0EEDE980F59D49C0023A7F7 /* Initializer.cpp */; }; + A0F1E68A0E75440800778F12 /* IPAddress.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6800E75440800778F12 /* IPAddress.cpp */; }; + A0F1E68C0E75440800778F12 /* Packet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6820E75440800778F12 /* Packet.cpp */; }; + A0F1E68D0E75440800778F12 /* SelectorBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6830E75440800778F12 /* SelectorBase.cpp */; }; + A0F1E68E0E75440800778F12 /* SocketTCP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6840E75440800778F12 /* SocketTCP.cpp */; }; + A0F1E68F0E75440800778F12 /* SocketUDP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6850E75440800778F12 /* SocketUDP.cpp */; }; + A0F1E6900E75440800778F12 /* SocketHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6870E75440800778F12 /* SocketHelper.cpp */; }; + A0F1E71F0E7545AA00778F12 /* Arial.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6990E7545AA00778F12 /* Arial.hpp */; }; + A0F1E7200E7545AA00778F12 /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E69A0E7545AA00778F12 /* Color.cpp */; }; + A0F1E7210E7545AA00778F12 /* Drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E69B0E7545AA00778F12 /* Drawable.cpp */; }; + A0F1E7220E7545AA00778F12 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E69C0E7545AA00778F12 /* Font.cpp */; }; + A0F1E7230E7545AA00778F12 /* FontLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E69D0E7545AA00778F12 /* FontLoader.cpp */; }; + A0F1E7240E7545AA00778F12 /* FontLoader.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E69E0E7545AA00778F12 /* FontLoader.hpp */; }; + A0F1E7250E7545AA00778F12 /* glew.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6A00E7545AA00778F12 /* glew.c */; }; + A0F1E7260E7545AA00778F12 /* glew.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6A10E7545AA00778F12 /* glew.h */; }; + A0F1E7290E7545AA00778F12 /* GraphicsContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6A40E7545AA00778F12 /* GraphicsContext.cpp */; }; + A0F1E72A0E7545AA00778F12 /* GraphicsContext.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6A50E7545AA00778F12 /* GraphicsContext.hpp */; }; + A0F1E72B0E7545AA00778F12 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6A60E7545AA00778F12 /* Image.cpp */; }; + A0F1E72C0E7545AA00778F12 /* ImageLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6A70E7545AA00778F12 /* ImageLoader.cpp */; }; + A0F1E72D0E7545AA00778F12 /* ImageLoader.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6A80E7545AA00778F12 /* ImageLoader.hpp */; }; + A0F1E72E0E7545AA00778F12 /* cderror.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6AA0E7545AA00778F12 /* cderror.h */; }; + A0F1E72F0E7545AA00778F12 /* jcapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6AB0E7545AA00778F12 /* jcapimin.c */; }; + A0F1E7300E7545AA00778F12 /* jcapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6AC0E7545AA00778F12 /* jcapistd.c */; }; + A0F1E7310E7545AA00778F12 /* jccoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6AD0E7545AA00778F12 /* jccoefct.c */; }; + A0F1E7320E7545AA00778F12 /* jccolor.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6AE0E7545AA00778F12 /* jccolor.c */; }; + A0F1E7330E7545AA00778F12 /* jcdctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6AF0E7545AA00778F12 /* jcdctmgr.c */; }; + A0F1E7340E7545AA00778F12 /* jchuff.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B00E7545AA00778F12 /* jchuff.c */; }; + A0F1E7350E7545AA00778F12 /* jchuff.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6B10E7545AA00778F12 /* jchuff.h */; }; + A0F1E7360E7545AA00778F12 /* jcinit.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B20E7545AA00778F12 /* jcinit.c */; }; + A0F1E7370E7545AA00778F12 /* jcmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B30E7545AA00778F12 /* jcmainct.c */; }; + A0F1E7380E7545AA00778F12 /* jcmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B40E7545AA00778F12 /* jcmarker.c */; }; + A0F1E7390E7545AA00778F12 /* jcmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B50E7545AA00778F12 /* jcmaster.c */; }; + A0F1E73A0E7545AA00778F12 /* jcomapi.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B60E7545AA00778F12 /* jcomapi.c */; }; + A0F1E73B0E7545AA00778F12 /* jconfig.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6B70E7545AA00778F12 /* jconfig.h */; }; + A0F1E73C0E7545AA00778F12 /* jcparam.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B80E7545AA00778F12 /* jcparam.c */; }; + A0F1E73D0E7545AA00778F12 /* jcphuff.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6B90E7545AA00778F12 /* jcphuff.c */; }; + A0F1E73E0E7545AA00778F12 /* jcprepct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BA0E7545AA00778F12 /* jcprepct.c */; }; + A0F1E73F0E7545AA00778F12 /* jcsample.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BB0E7545AA00778F12 /* jcsample.c */; }; + A0F1E7400E7545AA00778F12 /* jctrans.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BC0E7545AA00778F12 /* jctrans.c */; }; + A0F1E7410E7545AA00778F12 /* jdapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BD0E7545AA00778F12 /* jdapimin.c */; }; + A0F1E7420E7545AA00778F12 /* jdapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BE0E7545AA00778F12 /* jdapistd.c */; }; + A0F1E7430E7545AA00778F12 /* jdatadst.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6BF0E7545AA00778F12 /* jdatadst.c */; }; + A0F1E7440E7545AA00778F12 /* jdatasrc.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C00E7545AA00778F12 /* jdatasrc.c */; }; + A0F1E7450E7545AA00778F12 /* jdcoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C10E7545AA00778F12 /* jdcoefct.c */; }; + A0F1E7460E7545AA00778F12 /* jdcolor.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C20E7545AA00778F12 /* jdcolor.c */; }; + A0F1E7470E7545AA00778F12 /* jdct.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6C30E7545AA00778F12 /* jdct.h */; }; + A0F1E7480E7545AA00778F12 /* jddctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C40E7545AA00778F12 /* jddctmgr.c */; }; + A0F1E7490E7545AA00778F12 /* jdhuff.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C50E7545AA00778F12 /* jdhuff.c */; }; + A0F1E74A0E7545AA00778F12 /* jdhuff.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6C60E7545AA00778F12 /* jdhuff.h */; }; + A0F1E74B0E7545AA00778F12 /* jdinput.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C70E7545AA00778F12 /* jdinput.c */; }; + A0F1E74C0E7545AA00778F12 /* jdmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C80E7545AA00778F12 /* jdmainct.c */; }; + A0F1E74D0E7545AA00778F12 /* jdmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6C90E7545AA00778F12 /* jdmarker.c */; }; + A0F1E74E0E7545AA00778F12 /* jdmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CA0E7545AA00778F12 /* jdmaster.c */; }; + A0F1E74F0E7545AA00778F12 /* jdmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CB0E7545AA00778F12 /* jdmerge.c */; }; + A0F1E7500E7545AA00778F12 /* jdphuff.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CC0E7545AA00778F12 /* jdphuff.c */; }; + A0F1E7510E7545AA00778F12 /* jdpostct.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CD0E7545AA00778F12 /* jdpostct.c */; }; + A0F1E7520E7545AA00778F12 /* jdsample.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CE0E7545AA00778F12 /* jdsample.c */; }; + A0F1E7530E7545AA00778F12 /* jdtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6CF0E7545AA00778F12 /* jdtrans.c */; }; + A0F1E7540E7545AA00778F12 /* jerror.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D00E7545AA00778F12 /* jerror.c */; }; + A0F1E7550E7545AA00778F12 /* jerror.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6D10E7545AA00778F12 /* jerror.h */; }; + A0F1E7560E7545AA00778F12 /* jfdctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D20E7545AA00778F12 /* jfdctflt.c */; }; + A0F1E7570E7545AA00778F12 /* jfdctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D30E7545AA00778F12 /* jfdctfst.c */; }; + A0F1E7580E7545AA00778F12 /* jfdctint.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D40E7545AA00778F12 /* jfdctint.c */; }; + A0F1E7590E7545AA00778F12 /* jidctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D50E7545AA00778F12 /* jidctflt.c */; }; + A0F1E75A0E7545AA00778F12 /* jidctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D60E7545AA00778F12 /* jidctfst.c */; }; + A0F1E75B0E7545AA00778F12 /* jidctint.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D70E7545AA00778F12 /* jidctint.c */; }; + A0F1E75C0E7545AA00778F12 /* jidctred.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6D80E7545AA00778F12 /* jidctred.c */; }; + A0F1E75D0E7545AA00778F12 /* jinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6D90E7545AA00778F12 /* jinclude.h */; }; + A0F1E75E0E7545AA00778F12 /* jmemmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6DA0E7545AA00778F12 /* jmemmgr.c */; }; + A0F1E75F0E7545AA00778F12 /* jmemnobs.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6DB0E7545AA00778F12 /* jmemnobs.c */; }; + A0F1E7600E7545AA00778F12 /* jmemsys.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6DC0E7545AA00778F12 /* jmemsys.h */; }; + A0F1E7610E7545AA00778F12 /* jmorecfg.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6DD0E7545AA00778F12 /* jmorecfg.h */; }; + A0F1E7620E7545AA00778F12 /* jpegint.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6DE0E7545AA00778F12 /* jpegint.h */; }; + A0F1E7630E7545AA00778F12 /* jpeglib.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6DF0E7545AA00778F12 /* jpeglib.h */; }; + A0F1E7640E7545AA00778F12 /* jquant1.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E00E7545AA00778F12 /* jquant1.c */; }; + A0F1E7650E7545AA00778F12 /* jquant2.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E10E7545AA00778F12 /* jquant2.c */; }; + A0F1E7660E7545AA00778F12 /* jutils.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E20E7545AA00778F12 /* jutils.c */; }; + A0F1E7670E7545AA00778F12 /* jversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6E30E7545AA00778F12 /* jversion.h */; }; + A0F1E7680E7545AA00778F12 /* png.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E50E7545AA00778F12 /* png.c */; }; + A0F1E7690E7545AA00778F12 /* png.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6E60E7545AA00778F12 /* png.h */; }; + A0F1E76A0E7545AA00778F12 /* pngconf.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E6E70E7545AA00778F12 /* pngconf.h */; }; + A0F1E76B0E7545AA00778F12 /* pngerror.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E80E7545AA00778F12 /* pngerror.c */; }; + A0F1E76C0E7545AA00778F12 /* pnggccrd.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6E90E7545AA00778F12 /* pnggccrd.c */; }; + A0F1E76D0E7545AA00778F12 /* pngget.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6EA0E7545AA00778F12 /* pngget.c */; }; + A0F1E76E0E7545AA00778F12 /* pngmem.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6EB0E7545AA00778F12 /* pngmem.c */; }; + A0F1E76F0E7545AA00778F12 /* pngpread.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6EC0E7545AA00778F12 /* pngpread.c */; }; + A0F1E7700E7545AA00778F12 /* pngread.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6ED0E7545AA00778F12 /* pngread.c */; }; + A0F1E7710E7545AA00778F12 /* pngrio.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6EE0E7545AA00778F12 /* pngrio.c */; }; + A0F1E7720E7545AA00778F12 /* pngrtran.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6EF0E7545AA00778F12 /* pngrtran.c */; }; + A0F1E7730E7545AA00778F12 /* pngrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F00E7545AA00778F12 /* pngrutil.c */; }; + A0F1E7740E7545AA00778F12 /* pngset.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F10E7545AA00778F12 /* pngset.c */; }; + A0F1E7750E7545AA00778F12 /* pngtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F20E7545AA00778F12 /* pngtrans.c */; }; + A0F1E7760E7545AA00778F12 /* pngvcrd.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F30E7545AA00778F12 /* pngvcrd.c */; }; + A0F1E7770E7545AA00778F12 /* pngwio.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F40E7545AA00778F12 /* pngwio.c */; }; + A0F1E7780E7545AA00778F12 /* pngwrite.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F50E7545AA00778F12 /* pngwrite.c */; }; + A0F1E7790E7545AA00778F12 /* pngwtran.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F60E7545AA00778F12 /* pngwtran.c */; }; + A0F1E77A0E7545AA00778F12 /* pngwutil.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F70E7545AA00778F12 /* pngwutil.c */; }; + A0F1E77C0E7545AA00778F12 /* Matrix3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6F90E7545AA00778F12 /* Matrix3.cpp */; }; + A0F1E77D0E7545AA00778F12 /* PostFX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6FA0E7545AA00778F12 /* PostFX.cpp */; }; + A0F1E77E0E7545AA00778F12 /* RenderTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6FB0E7545AA00778F12 /* RenderTarget.cpp */; }; + A0F1E77F0E7545AA00778F12 /* RenderWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6FC0E7545AA00778F12 /* RenderWindow.cpp */; }; + A0F1E7800E7545AA00778F12 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6FD0E7545AA00778F12 /* Shape.cpp */; }; + A0F1E7810E7545AA00778F12 /* image_DXT.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E6FF0E7545AA00778F12 /* image_DXT.c */; }; + A0F1E7820E7545AA00778F12 /* image_DXT.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7000E7545AA00778F12 /* image_DXT.h */; }; + A0F1E7830E7545AA00778F12 /* SOIL.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7010E7545AA00778F12 /* SOIL.c */; }; + A0F1E7840E7545AA00778F12 /* SOIL.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7020E7545AA00778F12 /* SOIL.h */; }; + A0F1E7850E7545AA00778F12 /* stb_image_aug.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7030E7545AA00778F12 /* stb_image_aug.c */; }; + A0F1E7860E7545AA00778F12 /* stb_image_aug.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7040E7545AA00778F12 /* stb_image_aug.h */; }; + A0F1E7870E7545AA00778F12 /* stbi_DDS_aug.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7050E7545AA00778F12 /* stbi_DDS_aug.h */; }; + A0F1E7880E7545AA00778F12 /* stbi_DDS_aug_c.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7060E7545AA00778F12 /* stbi_DDS_aug_c.h */; }; + A0F1E7890E7545AA00778F12 /* Sprite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7070E7545AA00778F12 /* Sprite.cpp */; }; + A0F1E78A0E7545AA00778F12 /* String.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7080E7545AA00778F12 /* String.cpp */; }; + A0F1E78B0E7545AA00778F12 /* View.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7090E7545AA00778F12 /* View.cpp */; }; + A0F1E78C0E7545AA00778F12 /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E70B0E7545AA00778F12 /* adler32.c */; }; + A0F1E78D0E7545AA00778F12 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E70C0E7545AA00778F12 /* compress.c */; }; + A0F1E78E0E7545AA00778F12 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E70D0E7545AA00778F12 /* crc32.c */; }; + A0F1E78F0E7545AA00778F12 /* crc32.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E70E0E7545AA00778F12 /* crc32.h */; }; + A0F1E7900E7545AA00778F12 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E70F0E7545AA00778F12 /* deflate.c */; }; + A0F1E7910E7545AA00778F12 /* deflate.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7100E7545AA00778F12 /* deflate.h */; }; + A0F1E7920E7545AA00778F12 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7110E7545AA00778F12 /* inffast.c */; }; + A0F1E7930E7545AA00778F12 /* inffast.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7120E7545AA00778F12 /* inffast.h */; }; + A0F1E7940E7545AA00778F12 /* inffixed.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7130E7545AA00778F12 /* inffixed.h */; }; + A0F1E7950E7545AA00778F12 /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7140E7545AA00778F12 /* inflate.c */; }; + A0F1E7960E7545AA00778F12 /* inflate.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7150E7545AA00778F12 /* inflate.h */; }; + A0F1E7970E7545AA00778F12 /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7160E7545AA00778F12 /* inftrees.c */; }; + A0F1E7980E7545AA00778F12 /* inftrees.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7170E7545AA00778F12 /* inftrees.h */; }; + A0F1E7990E7545AA00778F12 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7180E7545AA00778F12 /* trees.c */; }; + A0F1E79A0E7545AA00778F12 /* trees.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7190E7545AA00778F12 /* trees.h */; }; + A0F1E79B0E7545AA00778F12 /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E71A0E7545AA00778F12 /* uncompr.c */; }; + A0F1E79C0E7545AA00778F12 /* zconf.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E71B0E7545AA00778F12 /* zconf.h */; }; + A0F1E79D0E7545AA00778F12 /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E71C0E7545AA00778F12 /* zlib.h */; }; + A0F1E79E0E7545AA00778F12 /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E71D0E7545AA00778F12 /* zutil.c */; }; + A0F1E79F0E7545AA00778F12 /* zutil.h in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E71E0E7545AA00778F12 /* zutil.h */; }; + A0F1E7E20E7545F800778F12 /* Context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7AC0E7545F800778F12 /* Context.cpp */; }; + A0F1E7E60E7545F800778F12 /* Input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7B10E7545F800778F12 /* Input.cpp */; }; + A0F1E7E70E7545F800778F12 /* Joystick.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7B20E7545F800778F12 /* Joystick.hpp */; }; + A0F1E8070E7545F800778F12 /* VideoMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7D60E7545F800778F12 /* VideoMode.cpp */; }; + A0F1E8080E7545F800778F12 /* VideoModeSupport.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7D70E7545F800778F12 /* VideoModeSupport.hpp */; }; + A0F1E80F0E7545F800778F12 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7DF0E7545F800778F12 /* Window.cpp */; }; + A0F1E8100E7545F800778F12 /* WindowImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A0F1E7E00E7545F800778F12 /* WindowImpl.cpp */; }; + A0F1E8110E7545F800778F12 /* WindowImpl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A0F1E7E10E7545F800778F12 /* WindowImpl.hpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXBuildRule section */ + A09EEA9F0D8C074D00F6C625 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.gcc; + fileType = sourcecode.cpp; + isEditable = 1; + outputFiles = ( + ); + script = /usr/local/bin/ppm; + }; +/* End PBXBuildRule section */ + +/* Begin PBXContainerItemProxy section */ + A012F57F0E0FF91B0022FB0F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3740D8BF86E002236B4; + remoteInfo = SFML; + }; + A012F5810E0FF9310022FB0F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3740D8BF86E002236B4; + remoteInfo = SFML; + }; + A017FF8A0E51E06400A4C078 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E37E0D8BF87A002236B4; + remoteInfo = "sfml-system"; + }; + A07EA05A0DB657A9007C7747 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A0C93EB30D9A9CA000B9E0C8; + remoteInfo = "sfml-window-cocoa"; + }; + A07EA05C0DB657C0007C7747 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A0C93EB30D9A9CA000B9E0C8; + remoteInfo = "sfml-window-cocoa"; + }; + A093E5490D8BFEB9002236B4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E37E0D8BF87A002236B4; + remoteInfo = "sfml-system"; + }; + A0B4CD390D96B11500DEEE0F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3740D8BF86E002236B4; + remoteInfo = SFML; + }; + A0F0BA850D92E52300056981 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3990D8BF89B002236B4; + remoteInfo = "sfml-audio"; + }; + A0F0BA870D92E52300056981 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3A20D8BF8A2002236B4; + remoteInfo = "sfml-graphics"; + }; + A0F0BA890D92E52300056981 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E3870D8BF885002236B4; + remoteInfo = "sfml-network"; + }; + A0F0BA8B0D92E52300056981 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A093E36A0D8BF860002236B4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A093E37E0D8BF87A002236B4; + remoteInfo = "sfml-system"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + A018A2790EA21866005FFAC3 /* Http.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Http.cpp; path = ../../src/SFML/Network/Http.cpp; sourceTree = SOURCE_ROOT; }; + A018A27A0EA21866005FFAC3 /* Ftp.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Ftp.cpp; path = ../../src/SFML/Network/Ftp.cpp; sourceTree = SOURCE_ROOT; }; + A018A27D0EA218C7005FFAC3 /* Http.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Http.hpp; path = ../../include/SFML/Network/Http.hpp; sourceTree = SOURCE_ROOT; }; + A018A27E0EA218C7005FFAC3 /* Ftp.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Ftp.hpp; path = ../../include/SFML/Network/Ftp.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A830E7517C800D0BA9B /* AudioResource.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = AudioResource.hpp; path = ../../include/SFML/Audio/AudioResource.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A840E7517C800D0BA9B /* Listener.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Listener.hpp; path = ../../include/SFML/Audio/Listener.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A850E7517C800D0BA9B /* Music.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Music.hpp; path = ../../include/SFML/Audio/Music.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A860E7517C800D0BA9B /* Sound.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Sound.hpp; path = ../../include/SFML/Audio/Sound.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A870E7517C800D0BA9B /* SoundBuffer.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundBuffer.hpp; path = ../../include/SFML/Audio/SoundBuffer.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A880E7517C800D0BA9B /* SoundBufferRecorder.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundBufferRecorder.hpp; path = ../../include/SFML/Audio/SoundBufferRecorder.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A890E7517C800D0BA9B /* SoundRecorder.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundRecorder.hpp; path = ../../include/SFML/Audio/SoundRecorder.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A8A0E7517C800D0BA9B /* SoundStream.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundStream.hpp; path = ../../include/SFML/Audio/SoundStream.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A8B0E7517C800D0BA9B /* Audio.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Audio.hpp; path = ../../include/SFML/Audio.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A8C0E7517C800D0BA9B /* Config.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Config.hpp; path = ../../include/SFML/Config.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A8E0E7517C800D0BA9B /* Color.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Color.hpp; path = ../../include/SFML/Graphics/Color.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A8F0E7517C800D0BA9B /* Drawable.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Drawable.hpp; path = ../../include/SFML/Graphics/Drawable.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A900E7517C800D0BA9B /* Font.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Font.hpp; path = ../../include/SFML/Graphics/Font.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A910E7517C800D0BA9B /* Glyph.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Glyph.hpp; path = ../../include/SFML/Graphics/Glyph.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A920E7517C800D0BA9B /* Image.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Image.hpp; path = ../../include/SFML/Graphics/Image.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A930E7517C800D0BA9B /* Matrix3.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Matrix3.hpp; path = ../../include/SFML/Graphics/Matrix3.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A940E7517C800D0BA9B /* Matrix3.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Matrix3.inl; path = ../../include/SFML/Graphics/Matrix3.inl; sourceTree = SOURCE_ROOT; }; + A01A3A950E7517C800D0BA9B /* PostFX.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = PostFX.hpp; path = ../../include/SFML/Graphics/PostFX.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A960E7517C800D0BA9B /* Rect.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Rect.hpp; path = ../../include/SFML/Graphics/Rect.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A970E7517C800D0BA9B /* Rect.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Rect.inl; path = ../../include/SFML/Graphics/Rect.inl; sourceTree = SOURCE_ROOT; }; + A01A3A980E7517C800D0BA9B /* RenderTarget.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = RenderTarget.hpp; path = ../../include/SFML/Graphics/RenderTarget.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A990E7517C800D0BA9B /* RenderWindow.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = RenderWindow.hpp; path = ../../include/SFML/Graphics/RenderWindow.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A9A0E7517C800D0BA9B /* Shape.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Shape.hpp; path = ../../include/SFML/Graphics/Shape.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A9B0E7517C800D0BA9B /* Sprite.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Sprite.hpp; path = ../../include/SFML/Graphics/Sprite.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A9C0E7517C800D0BA9B /* String.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = String.hpp; path = ../../include/SFML/Graphics/String.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A9D0E7517C800D0BA9B /* View.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = View.hpp; path = ../../include/SFML/Graphics/View.hpp; sourceTree = SOURCE_ROOT; }; + A01A3A9E0E7517C800D0BA9B /* Graphics.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Graphics.hpp; path = ../../include/SFML/Graphics.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA00E7517C800D0BA9B /* IPAddress.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = IPAddress.hpp; path = ../../include/SFML/Network/IPAddress.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA10E7517C800D0BA9B /* Packet.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Packet.hpp; path = ../../include/SFML/Network/Packet.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA20E7517C800D0BA9B /* Selector.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Selector.hpp; path = ../../include/SFML/Network/Selector.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA30E7517C800D0BA9B /* Selector.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Selector.inl; path = ../../include/SFML/Network/Selector.inl; sourceTree = SOURCE_ROOT; }; + A01A3AA40E7517C800D0BA9B /* SelectorBase.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SelectorBase.hpp; path = ../../include/SFML/Network/SelectorBase.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA50E7517C800D0BA9B /* SocketHelper.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SocketHelper.hpp; path = ../../include/SFML/Network/SocketHelper.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA60E7517C800D0BA9B /* Sockets.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Sockets.hpp; path = ../../include/SFML/Network/Sockets.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA70E7517C800D0BA9B /* SocketTCP.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SocketTCP.hpp; path = ../../include/SFML/Network/SocketTCP.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AA80E7517C800D0BA9B /* SocketUDP.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SocketUDP.hpp; path = ../../include/SFML/Network/SocketUDP.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AAA0E7517C800D0BA9B /* SocketHelper.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SocketHelper.hpp; path = ../../include/SFML/Network/Unix/SocketHelper.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AAC0E7517C800D0BA9B /* SocketHelper.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SocketHelper.hpp; path = ../../include/SFML/Network/Win32/SocketHelper.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AAD0E7517C800D0BA9B /* Network.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Network.hpp; path = ../../include/SFML/Network.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AAF0E7517C800D0BA9B /* Clock.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Clock.hpp; path = ../../include/SFML/System/Clock.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB00E7517C800D0BA9B /* Lock.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Lock.hpp; path = ../../include/SFML/System/Lock.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB10E7517C800D0BA9B /* Mutex.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Mutex.hpp; path = ../../include/SFML/System/Mutex.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB20E7517C800D0BA9B /* NonCopyable.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = NonCopyable.hpp; path = ../../include/SFML/System/NonCopyable.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB30E7517C800D0BA9B /* Randomizer.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Randomizer.hpp; path = ../../include/SFML/System/Randomizer.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB40E7517C800D0BA9B /* Resource.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Resource.hpp; path = ../../include/SFML/System/Resource.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB50E7517C800D0BA9B /* Resource.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Resource.inl; path = ../../include/SFML/System/Resource.inl; sourceTree = SOURCE_ROOT; }; + A01A3AB60E7517C800D0BA9B /* ResourcePtr.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = ResourcePtr.inl; path = ../../include/SFML/System/ResourcePtr.inl; sourceTree = SOURCE_ROOT; }; + A01A3AB70E7517C800D0BA9B /* Sleep.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Sleep.hpp; path = ../../include/SFML/System/Sleep.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB80E7517C800D0BA9B /* Thread.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Thread.hpp; path = ../../include/SFML/System/Thread.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AB90E7517C800D0BA9B /* Unicode.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Unicode.hpp; path = ../../include/SFML/System/Unicode.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ABA0E7517C800D0BA9B /* Unicode.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Unicode.inl; path = ../../include/SFML/System/Unicode.inl; sourceTree = SOURCE_ROOT; }; + A01A3ABC0E7517C800D0BA9B /* Mutex.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Mutex.hpp; path = ../../include/SFML/System/Unix/Mutex.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ABD0E7517C800D0BA9B /* Thread.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Thread.hpp; path = ../../include/SFML/System/Unix/Thread.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ABE0E7517C800D0BA9B /* Vector2.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Vector2.hpp; path = ../../include/SFML/System/Vector2.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ABF0E7517C800D0BA9B /* Vector2.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Vector2.inl; path = ../../include/SFML/System/Vector2.inl; sourceTree = SOURCE_ROOT; }; + A01A3AC00E7517C800D0BA9B /* Vector3.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Vector3.hpp; path = ../../include/SFML/System/Vector3.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AC10E7517C800D0BA9B /* Vector3.inl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Vector3.inl; path = ../../include/SFML/System/Vector3.inl; sourceTree = SOURCE_ROOT; }; + A01A3AC50E7517C800D0BA9B /* System.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = System.hpp; path = ../../include/SFML/System.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AC70E7517C800D0BA9B /* Context.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Context.hpp; path = ../../include/SFML/Window/Context.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AC80E7517C800D0BA9B /* Event.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Event.hpp; path = ../../include/SFML/Window/Event.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AC90E7517C800D0BA9B /* Input.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Input.hpp; path = ../../include/SFML/Window/Input.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACA0E7517C800D0BA9B /* OpenGL.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = OpenGL.hpp; path = ../../include/SFML/Window/OpenGL.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACB0E7517C800D0BA9B /* VideoMode.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = VideoMode.hpp; path = ../../include/SFML/Window/VideoMode.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACC0E7517C800D0BA9B /* Window.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Window.hpp; path = ../../include/SFML/Window/Window.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACD0E7517C800D0BA9B /* WindowHandle.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowHandle.hpp; path = ../../include/SFML/Window/WindowHandle.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACE0E7517C800D0BA9B /* WindowListener.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowListener.hpp; path = ../../include/SFML/Window/WindowListener.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ACF0E7517C800D0BA9B /* WindowSettings.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowSettings.hpp; path = ../../include/SFML/Window/WindowSettings.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AD00E7517C800D0BA9B /* WindowStyle.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowStyle.hpp; path = ../../include/SFML/Window/WindowStyle.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AD10E7517C800D0BA9B /* Window.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Window.hpp; path = ../../include/SFML/Window.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AD80E75181300D0BA9B /* AudioDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AudioDevice.cpp; path = ../../src/SFML/Audio/AudioDevice.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AD90E75181300D0BA9B /* AudioDevice.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = AudioDevice.hpp; path = ../../src/SFML/Audio/AudioDevice.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ADA0E75181300D0BA9B /* AudioResource.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AudioResource.cpp; path = ../../src/SFML/Audio/AudioResource.cpp; sourceTree = SOURCE_ROOT; }; + A01A3ADB0E75181300D0BA9B /* Listener.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Listener.cpp; path = ../../src/SFML/Audio/Listener.cpp; sourceTree = SOURCE_ROOT; }; + A01A3ADD0E75181300D0BA9B /* Music.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Music.cpp; path = ../../src/SFML/Audio/Music.cpp; sourceTree = SOURCE_ROOT; }; + A01A3ADE0E75181300D0BA9B /* OpenAL.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = OpenAL.hpp; path = ../../src/SFML/Audio/OpenAL.hpp; sourceTree = SOURCE_ROOT; }; + A01A3ADF0E75181300D0BA9B /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Sound.cpp; path = ../../src/SFML/Audio/Sound.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE00E75181300D0BA9B /* SoundBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundBuffer.cpp; path = ../../src/SFML/Audio/SoundBuffer.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE10E75181300D0BA9B /* SoundBufferRecorder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundBufferRecorder.cpp; path = ../../src/SFML/Audio/SoundBufferRecorder.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE20E75181300D0BA9B /* SoundFile.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundFile.cpp; path = ../../src/SFML/Audio/SoundFile.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE30E75181300D0BA9B /* SoundFile.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundFile.hpp; path = ../../src/SFML/Audio/SoundFile.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AE40E75181300D0BA9B /* SoundFileDefault.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundFileDefault.cpp; path = ../../src/SFML/Audio/SoundFileDefault.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE50E75181300D0BA9B /* SoundFileDefault.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundFileDefault.hpp; path = ../../src/SFML/Audio/SoundFileDefault.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AE60E75181300D0BA9B /* SoundFileOgg.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundFileOgg.cpp; path = ../../src/SFML/Audio/SoundFileOgg.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE70E75181300D0BA9B /* SoundFileOgg.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = SoundFileOgg.hpp; path = ../../src/SFML/Audio/SoundFileOgg.hpp; sourceTree = SOURCE_ROOT; }; + A01A3AE80E75181300D0BA9B /* SoundRecorder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundRecorder.cpp; path = ../../src/SFML/Audio/SoundRecorder.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AE90E75181300D0BA9B /* SoundStream.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SoundStream.cpp; path = ../../src/SFML/Audio/SoundStream.cpp; sourceTree = SOURCE_ROOT; }; + A01A3AEB0E75181300D0BA9B /* stb_vorbis.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stb_vorbis.c; path = ../../src/SFML/Audio/stb_vorbis/stb_vorbis.c; sourceTree = SOURCE_ROOT; }; + A01A3AEC0E75181300D0BA9B /* stb_vorbis.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stb_vorbis.h; path = ../../src/SFML/Audio/stb_vorbis/stb_vorbis.h; sourceTree = SOURCE_ROOT; }; + A01C69C80E3E63CE00ED3F04 /* Unicode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Unicode.cpp; path = ../../src/SFML/System/Unicode.cpp; sourceTree = SOURCE_ROOT; }; + A02C68B1102BA16300A77DF4 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = autogen.sh; sourceTree = ""; }; + A02C68B2102BA16300A77DF4 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = license.txt; sourceTree = ""; }; + A02C68B3102BA16300A77DF4 /* Lisez-moi.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Lisez-moi.rtf"; sourceTree = ""; }; + A02C68B4102BA16300A77DF4 /* Notes de version.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Notes de version.rtf"; sourceTree = ""; }; + A02C68B5102BA16300A77DF4 /* Read Me.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Read Me.rtf"; sourceTree = ""; }; + A02C68B6102BA16300A77DF4 /* Release Notes.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = "Release Notes.rtf"; sourceTree = ""; }; + A04C59A50EDDBA9C00935061 /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AppController.h; path = ../../src/SFML/Window/Cocoa/AppController.h; sourceTree = SOURCE_ROOT; }; + A04C59A60EDDBA9C00935061 /* AppController.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = AppController.mm; path = ../../src/SFML/Window/Cocoa/AppController.mm; sourceTree = SOURCE_ROOT; }; + A04C59A70EDDBA9C00935061 /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Joystick.cpp; path = ../../src/SFML/Window/Cocoa/Joystick.cpp; sourceTree = SOURCE_ROOT; }; + A04C59A80EDDBA9C00935061 /* Joystick.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Joystick.hpp; path = ../../src/SFML/Window/Cocoa/Joystick.hpp; sourceTree = SOURCE_ROOT; }; + A04C59A90EDDBA9C00935061 /* VideoModeSupport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = VideoModeSupport.cpp; path = ../../src/SFML/Window/Cocoa/VideoModeSupport.cpp; sourceTree = SOURCE_ROOT; }; + A04C59AA0EDDBA9C00935061 /* VideoModeSupport.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = VideoModeSupport.hpp; path = ../../src/SFML/Window/Cocoa/VideoModeSupport.hpp; sourceTree = SOURCE_ROOT; }; + A04C59AD0EDDBA9C00935061 /* WindowImplCocoa.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowImplCocoa.hpp; path = ../../src/SFML/Window/Cocoa/WindowImplCocoa.hpp; sourceTree = SOURCE_ROOT; }; + A04C59AE0EDDBA9C00935061 /* WindowImplCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = WindowImplCocoa.mm; path = ../../src/SFML/Window/Cocoa/WindowImplCocoa.mm; sourceTree = SOURCE_ROOT; }; + A093E3750D8BF86E002236B4 /* SFML.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SFML.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A093E3770D8BF86E002236B4 /* SFML-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SFML-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E37F0D8BF87A002236B4 /* sfml-system-d.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "sfml-system-d.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A093E3800D8BF87A002236B4 /* sfml-system-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sfml-system-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E3880D8BF885002236B4 /* sfml-network-d.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "sfml-network-d.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A093E3890D8BF885002236B4 /* sfml-network-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sfml-network-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E3920D8BF892002236B4 /* sfml-window-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sfml-window-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E39A0D8BF89B002236B4 /* sfml-audio-d.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "sfml-audio-d.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A093E39B0D8BF89B002236B4 /* sfml-audio-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sfml-audio-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E3A30D8BF8A2002236B4 /* sfml-graphics-d.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "sfml-graphics-d.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A093E3A40D8BF8A2002236B4 /* sfml-graphics-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "sfml-graphics-Info.plist"; sourceTree = SOURCE_ROOT; }; + A093E3CF0D8BF918002236B4 /* dummy.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = dummy.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBED0D8C19BF00F6C625 /* Platform.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Platform.hpp; path = ../../src/SFML/System/Platform.hpp; sourceTree = SOURCE_ROOT; }; + A09EEBEE0D8C19BF00F6C625 /* Randomizer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Randomizer.cpp; path = ../../src/SFML/System/Randomizer.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF00D8C19BF00F6C625 /* Mutex.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Mutex.cpp; path = ../../src/SFML/System/Unix/Mutex.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF10D8C19BF00F6C625 /* Platform.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Platform.cpp; path = ../../src/SFML/System/Unix/Platform.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF20D8C19BF00F6C625 /* Platform.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Platform.hpp; path = ../../src/SFML/System/Unix/Platform.hpp; sourceTree = SOURCE_ROOT; }; + A09EEBF30D8C19BF00F6C625 /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Thread.cpp; path = ../../src/SFML/System/Unix/Thread.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF40D8C19BF00F6C625 /* Clock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Clock.cpp; path = ../../src/SFML/System/Clock.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF50D8C19BF00F6C625 /* Lock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Lock.cpp; path = ../../src/SFML/System/Lock.cpp; sourceTree = SOURCE_ROOT; }; + A09EEBF60D8C19BF00F6C625 /* Sleep.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Sleep.cpp; path = ../../src/SFML/System/Sleep.cpp; sourceTree = SOURCE_ROOT; }; + A0C93EB40D9A9CA000B9E0C8 /* sfml-window-d.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "sfml-window-d.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A0CE9FE50F46F72500FD00CE /* GLKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLKit.h; sourceTree = ""; }; + A0CE9FE60F46F72500FD00CE /* GLKit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GLKit.mm; sourceTree = ""; }; + A0EEDE980F59D49C0023A7F7 /* Initializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Initializer.cpp; sourceTree = ""; }; + A0F1E6800E75440800778F12 /* IPAddress.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = IPAddress.cpp; path = ../../src/SFML/Network/IPAddress.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6820E75440800778F12 /* Packet.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Packet.cpp; path = ../../src/SFML/Network/Packet.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6830E75440800778F12 /* SelectorBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SelectorBase.cpp; path = ../../src/SFML/Network/SelectorBase.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6840E75440800778F12 /* SocketTCP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SocketTCP.cpp; path = ../../src/SFML/Network/SocketTCP.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6850E75440800778F12 /* SocketUDP.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SocketUDP.cpp; path = ../../src/SFML/Network/SocketUDP.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6870E75440800778F12 /* SocketHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SocketHelper.cpp; path = ../../src/SFML/Network/Unix/SocketHelper.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6990E7545AA00778F12 /* Arial.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Arial.hpp; path = ../../src/SFML/Graphics/Arial.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E69A0E7545AA00778F12 /* Color.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Color.cpp; path = ../../src/SFML/Graphics/Color.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E69B0E7545AA00778F12 /* Drawable.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Drawable.cpp; path = ../../src/SFML/Graphics/Drawable.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E69C0E7545AA00778F12 /* Font.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Font.cpp; path = ../../src/SFML/Graphics/Font.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E69D0E7545AA00778F12 /* FontLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = FontLoader.cpp; path = ../../src/SFML/Graphics/FontLoader.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E69E0E7545AA00778F12 /* FontLoader.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = FontLoader.hpp; path = ../../src/SFML/Graphics/FontLoader.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E6A00E7545AA00778F12 /* glew.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = glew.c; path = ../../src/SFML/Graphics/GLEW/glew.c; sourceTree = SOURCE_ROOT; }; + A0F1E6A10E7545AA00778F12 /* glew.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = glew.h; path = ../../src/SFML/Graphics/GLEW/glew.h; sourceTree = SOURCE_ROOT; }; + A0F1E6A40E7545AA00778F12 /* GraphicsContext.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = GraphicsContext.cpp; path = ../../src/SFML/Graphics/GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6A50E7545AA00778F12 /* GraphicsContext.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = GraphicsContext.hpp; path = ../../src/SFML/Graphics/GraphicsContext.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E6A60E7545AA00778F12 /* Image.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Image.cpp; path = ../../src/SFML/Graphics/Image.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6A70E7545AA00778F12 /* ImageLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ImageLoader.cpp; path = ../../src/SFML/Graphics/ImageLoader.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6A80E7545AA00778F12 /* ImageLoader.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = ImageLoader.hpp; path = ../../src/SFML/Graphics/ImageLoader.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E6AA0E7545AA00778F12 /* cderror.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cderror.h; path = ../../src/SFML/Graphics/libjpeg/cderror.h; sourceTree = SOURCE_ROOT; }; + A0F1E6AB0E7545AA00778F12 /* jcapimin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcapimin.c; path = ../../src/SFML/Graphics/libjpeg/jcapimin.c; sourceTree = SOURCE_ROOT; }; + A0F1E6AC0E7545AA00778F12 /* jcapistd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcapistd.c; path = ../../src/SFML/Graphics/libjpeg/jcapistd.c; sourceTree = SOURCE_ROOT; }; + A0F1E6AD0E7545AA00778F12 /* jccoefct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jccoefct.c; path = ../../src/SFML/Graphics/libjpeg/jccoefct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6AE0E7545AA00778F12 /* jccolor.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jccolor.c; path = ../../src/SFML/Graphics/libjpeg/jccolor.c; sourceTree = SOURCE_ROOT; }; + A0F1E6AF0E7545AA00778F12 /* jcdctmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcdctmgr.c; path = ../../src/SFML/Graphics/libjpeg/jcdctmgr.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B00E7545AA00778F12 /* jchuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jchuff.c; path = ../../src/SFML/Graphics/libjpeg/jchuff.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B10E7545AA00778F12 /* jchuff.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jchuff.h; path = ../../src/SFML/Graphics/libjpeg/jchuff.h; sourceTree = SOURCE_ROOT; }; + A0F1E6B20E7545AA00778F12 /* jcinit.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcinit.c; path = ../../src/SFML/Graphics/libjpeg/jcinit.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B30E7545AA00778F12 /* jcmainct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcmainct.c; path = ../../src/SFML/Graphics/libjpeg/jcmainct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B40E7545AA00778F12 /* jcmarker.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcmarker.c; path = ../../src/SFML/Graphics/libjpeg/jcmarker.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B50E7545AA00778F12 /* jcmaster.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcmaster.c; path = ../../src/SFML/Graphics/libjpeg/jcmaster.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B60E7545AA00778F12 /* jcomapi.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcomapi.c; path = ../../src/SFML/Graphics/libjpeg/jcomapi.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B70E7545AA00778F12 /* jconfig.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jconfig.h; path = ../../src/SFML/Graphics/libjpeg/jconfig.h; sourceTree = SOURCE_ROOT; }; + A0F1E6B80E7545AA00778F12 /* jcparam.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcparam.c; path = ../../src/SFML/Graphics/libjpeg/jcparam.c; sourceTree = SOURCE_ROOT; }; + A0F1E6B90E7545AA00778F12 /* jcphuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcphuff.c; path = ../../src/SFML/Graphics/libjpeg/jcphuff.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BA0E7545AA00778F12 /* jcprepct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcprepct.c; path = ../../src/SFML/Graphics/libjpeg/jcprepct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BB0E7545AA00778F12 /* jcsample.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jcsample.c; path = ../../src/SFML/Graphics/libjpeg/jcsample.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BC0E7545AA00778F12 /* jctrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jctrans.c; path = ../../src/SFML/Graphics/libjpeg/jctrans.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BD0E7545AA00778F12 /* jdapimin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdapimin.c; path = ../../src/SFML/Graphics/libjpeg/jdapimin.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BE0E7545AA00778F12 /* jdapistd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdapistd.c; path = ../../src/SFML/Graphics/libjpeg/jdapistd.c; sourceTree = SOURCE_ROOT; }; + A0F1E6BF0E7545AA00778F12 /* jdatadst.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdatadst.c; path = ../../src/SFML/Graphics/libjpeg/jdatadst.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C00E7545AA00778F12 /* jdatasrc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdatasrc.c; path = ../../src/SFML/Graphics/libjpeg/jdatasrc.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C10E7545AA00778F12 /* jdcoefct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdcoefct.c; path = ../../src/SFML/Graphics/libjpeg/jdcoefct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C20E7545AA00778F12 /* jdcolor.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdcolor.c; path = ../../src/SFML/Graphics/libjpeg/jdcolor.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C30E7545AA00778F12 /* jdct.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jdct.h; path = ../../src/SFML/Graphics/libjpeg/jdct.h; sourceTree = SOURCE_ROOT; }; + A0F1E6C40E7545AA00778F12 /* jddctmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jddctmgr.c; path = ../../src/SFML/Graphics/libjpeg/jddctmgr.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C50E7545AA00778F12 /* jdhuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdhuff.c; path = ../../src/SFML/Graphics/libjpeg/jdhuff.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C60E7545AA00778F12 /* jdhuff.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jdhuff.h; path = ../../src/SFML/Graphics/libjpeg/jdhuff.h; sourceTree = SOURCE_ROOT; }; + A0F1E6C70E7545AA00778F12 /* jdinput.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdinput.c; path = ../../src/SFML/Graphics/libjpeg/jdinput.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C80E7545AA00778F12 /* jdmainct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdmainct.c; path = ../../src/SFML/Graphics/libjpeg/jdmainct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6C90E7545AA00778F12 /* jdmarker.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdmarker.c; path = ../../src/SFML/Graphics/libjpeg/jdmarker.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CA0E7545AA00778F12 /* jdmaster.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdmaster.c; path = ../../src/SFML/Graphics/libjpeg/jdmaster.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CB0E7545AA00778F12 /* jdmerge.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdmerge.c; path = ../../src/SFML/Graphics/libjpeg/jdmerge.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CC0E7545AA00778F12 /* jdphuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdphuff.c; path = ../../src/SFML/Graphics/libjpeg/jdphuff.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CD0E7545AA00778F12 /* jdpostct.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdpostct.c; path = ../../src/SFML/Graphics/libjpeg/jdpostct.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CE0E7545AA00778F12 /* jdsample.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdsample.c; path = ../../src/SFML/Graphics/libjpeg/jdsample.c; sourceTree = SOURCE_ROOT; }; + A0F1E6CF0E7545AA00778F12 /* jdtrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jdtrans.c; path = ../../src/SFML/Graphics/libjpeg/jdtrans.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D00E7545AA00778F12 /* jerror.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jerror.c; path = ../../src/SFML/Graphics/libjpeg/jerror.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D10E7545AA00778F12 /* jerror.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jerror.h; path = ../../src/SFML/Graphics/libjpeg/jerror.h; sourceTree = SOURCE_ROOT; }; + A0F1E6D20E7545AA00778F12 /* jfdctflt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jfdctflt.c; path = ../../src/SFML/Graphics/libjpeg/jfdctflt.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D30E7545AA00778F12 /* jfdctfst.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jfdctfst.c; path = ../../src/SFML/Graphics/libjpeg/jfdctfst.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D40E7545AA00778F12 /* jfdctint.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jfdctint.c; path = ../../src/SFML/Graphics/libjpeg/jfdctint.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D50E7545AA00778F12 /* jidctflt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jidctflt.c; path = ../../src/SFML/Graphics/libjpeg/jidctflt.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D60E7545AA00778F12 /* jidctfst.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jidctfst.c; path = ../../src/SFML/Graphics/libjpeg/jidctfst.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D70E7545AA00778F12 /* jidctint.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jidctint.c; path = ../../src/SFML/Graphics/libjpeg/jidctint.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D80E7545AA00778F12 /* jidctred.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jidctred.c; path = ../../src/SFML/Graphics/libjpeg/jidctred.c; sourceTree = SOURCE_ROOT; }; + A0F1E6D90E7545AA00778F12 /* jinclude.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jinclude.h; path = ../../src/SFML/Graphics/libjpeg/jinclude.h; sourceTree = SOURCE_ROOT; }; + A0F1E6DA0E7545AA00778F12 /* jmemmgr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jmemmgr.c; path = ../../src/SFML/Graphics/libjpeg/jmemmgr.c; sourceTree = SOURCE_ROOT; }; + A0F1E6DB0E7545AA00778F12 /* jmemnobs.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jmemnobs.c; path = ../../src/SFML/Graphics/libjpeg/jmemnobs.c; sourceTree = SOURCE_ROOT; }; + A0F1E6DC0E7545AA00778F12 /* jmemsys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jmemsys.h; path = ../../src/SFML/Graphics/libjpeg/jmemsys.h; sourceTree = SOURCE_ROOT; }; + A0F1E6DD0E7545AA00778F12 /* jmorecfg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jmorecfg.h; path = ../../src/SFML/Graphics/libjpeg/jmorecfg.h; sourceTree = SOURCE_ROOT; }; + A0F1E6DE0E7545AA00778F12 /* jpegint.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jpegint.h; path = ../../src/SFML/Graphics/libjpeg/jpegint.h; sourceTree = SOURCE_ROOT; }; + A0F1E6DF0E7545AA00778F12 /* jpeglib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jpeglib.h; path = ../../src/SFML/Graphics/libjpeg/jpeglib.h; sourceTree = SOURCE_ROOT; }; + A0F1E6E00E7545AA00778F12 /* jquant1.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jquant1.c; path = ../../src/SFML/Graphics/libjpeg/jquant1.c; sourceTree = SOURCE_ROOT; }; + A0F1E6E10E7545AA00778F12 /* jquant2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jquant2.c; path = ../../src/SFML/Graphics/libjpeg/jquant2.c; sourceTree = SOURCE_ROOT; }; + A0F1E6E20E7545AA00778F12 /* jutils.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = ../../src/SFML/Graphics/libjpeg/jutils.c; sourceTree = SOURCE_ROOT; }; + A0F1E6E30E7545AA00778F12 /* jversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jversion.h; path = ../../src/SFML/Graphics/libjpeg/jversion.h; sourceTree = SOURCE_ROOT; }; + A0F1E6E50E7545AA00778F12 /* png.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = png.c; path = ../../src/SFML/Graphics/libpng/png.c; sourceTree = SOURCE_ROOT; }; + A0F1E6E60E7545AA00778F12 /* png.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = png.h; path = ../../src/SFML/Graphics/libpng/png.h; sourceTree = SOURCE_ROOT; }; + A0F1E6E70E7545AA00778F12 /* pngconf.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = ../../src/SFML/Graphics/libpng/pngconf.h; sourceTree = SOURCE_ROOT; }; + A0F1E6E80E7545AA00778F12 /* pngerror.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngerror.c; path = ../../src/SFML/Graphics/libpng/pngerror.c; sourceTree = SOURCE_ROOT; }; + A0F1E6E90E7545AA00778F12 /* pnggccrd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pnggccrd.c; path = ../../src/SFML/Graphics/libpng/pnggccrd.c; sourceTree = SOURCE_ROOT; }; + A0F1E6EA0E7545AA00778F12 /* pngget.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngget.c; path = ../../src/SFML/Graphics/libpng/pngget.c; sourceTree = SOURCE_ROOT; }; + A0F1E6EB0E7545AA00778F12 /* pngmem.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngmem.c; path = ../../src/SFML/Graphics/libpng/pngmem.c; sourceTree = SOURCE_ROOT; }; + A0F1E6EC0E7545AA00778F12 /* pngpread.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngpread.c; path = ../../src/SFML/Graphics/libpng/pngpread.c; sourceTree = SOURCE_ROOT; }; + A0F1E6ED0E7545AA00778F12 /* pngread.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngread.c; path = ../../src/SFML/Graphics/libpng/pngread.c; sourceTree = SOURCE_ROOT; }; + A0F1E6EE0E7545AA00778F12 /* pngrio.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngrio.c; path = ../../src/SFML/Graphics/libpng/pngrio.c; sourceTree = SOURCE_ROOT; }; + A0F1E6EF0E7545AA00778F12 /* pngrtran.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngrtran.c; path = ../../src/SFML/Graphics/libpng/pngrtran.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F00E7545AA00778F12 /* pngrutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngrutil.c; path = ../../src/SFML/Graphics/libpng/pngrutil.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F10E7545AA00778F12 /* pngset.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngset.c; path = ../../src/SFML/Graphics/libpng/pngset.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F20E7545AA00778F12 /* pngtrans.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = ../../src/SFML/Graphics/libpng/pngtrans.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F30E7545AA00778F12 /* pngvcrd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngvcrd.c; path = ../../src/SFML/Graphics/libpng/pngvcrd.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F40E7545AA00778F12 /* pngwio.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngwio.c; path = ../../src/SFML/Graphics/libpng/pngwio.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F50E7545AA00778F12 /* pngwrite.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngwrite.c; path = ../../src/SFML/Graphics/libpng/pngwrite.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F60E7545AA00778F12 /* pngwtran.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngwtran.c; path = ../../src/SFML/Graphics/libpng/pngwtran.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F70E7545AA00778F12 /* pngwutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = pngwutil.c; path = ../../src/SFML/Graphics/libpng/pngwutil.c; sourceTree = SOURCE_ROOT; }; + A0F1E6F90E7545AA00778F12 /* Matrix3.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Matrix3.cpp; path = ../../src/SFML/Graphics/Matrix3.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6FA0E7545AA00778F12 /* PostFX.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PostFX.cpp; path = ../../src/SFML/Graphics/PostFX.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6FB0E7545AA00778F12 /* RenderTarget.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = RenderTarget.cpp; path = ../../src/SFML/Graphics/RenderTarget.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6FC0E7545AA00778F12 /* RenderWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = RenderWindow.cpp; path = ../../src/SFML/Graphics/RenderWindow.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6FD0E7545AA00778F12 /* Shape.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Shape.cpp; path = ../../src/SFML/Graphics/Shape.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E6FF0E7545AA00778F12 /* image_DXT.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = image_DXT.c; path = ../../src/SFML/Graphics/SOIL/image_DXT.c; sourceTree = SOURCE_ROOT; }; + A0F1E7000E7545AA00778F12 /* image_DXT.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = image_DXT.h; path = ../../src/SFML/Graphics/SOIL/image_DXT.h; sourceTree = SOURCE_ROOT; }; + A0F1E7010E7545AA00778F12 /* SOIL.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = SOIL.c; path = ../../src/SFML/Graphics/SOIL/SOIL.c; sourceTree = SOURCE_ROOT; }; + A0F1E7020E7545AA00778F12 /* SOIL.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SOIL.h; path = ../../src/SFML/Graphics/SOIL/SOIL.h; sourceTree = SOURCE_ROOT; }; + A0F1E7030E7545AA00778F12 /* stb_image_aug.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = stb_image_aug.c; path = ../../src/SFML/Graphics/SOIL/stb_image_aug.c; sourceTree = SOURCE_ROOT; }; + A0F1E7040E7545AA00778F12 /* stb_image_aug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stb_image_aug.h; path = ../../src/SFML/Graphics/SOIL/stb_image_aug.h; sourceTree = SOURCE_ROOT; }; + A0F1E7050E7545AA00778F12 /* stbi_DDS_aug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stbi_DDS_aug.h; path = ../../src/SFML/Graphics/SOIL/stbi_DDS_aug.h; sourceTree = SOURCE_ROOT; }; + A0F1E7060E7545AA00778F12 /* stbi_DDS_aug_c.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stbi_DDS_aug_c.h; path = ../../src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h; sourceTree = SOURCE_ROOT; }; + A0F1E7070E7545AA00778F12 /* Sprite.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Sprite.cpp; path = ../../src/SFML/Graphics/Sprite.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7080E7545AA00778F12 /* String.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = String.cpp; path = ../../src/SFML/Graphics/String.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7090E7545AA00778F12 /* View.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = View.cpp; path = ../../src/SFML/Graphics/View.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E70B0E7545AA00778F12 /* adler32.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = ../../src/SFML/Graphics/zlib/adler32.c; sourceTree = SOURCE_ROOT; }; + A0F1E70C0E7545AA00778F12 /* compress.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = compress.c; path = ../../src/SFML/Graphics/zlib/compress.c; sourceTree = SOURCE_ROOT; }; + A0F1E70D0E7545AA00778F12 /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../src/SFML/Graphics/zlib/crc32.c; sourceTree = SOURCE_ROOT; }; + A0F1E70E0E7545AA00778F12 /* crc32.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = crc32.h; path = ../../src/SFML/Graphics/zlib/crc32.h; sourceTree = SOURCE_ROOT; }; + A0F1E70F0E7545AA00778F12 /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = ../../src/SFML/Graphics/zlib/deflate.c; sourceTree = SOURCE_ROOT; }; + A0F1E7100E7545AA00778F12 /* deflate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = deflate.h; path = ../../src/SFML/Graphics/zlib/deflate.h; sourceTree = SOURCE_ROOT; }; + A0F1E7110E7545AA00778F12 /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = inffast.c; path = ../../src/SFML/Graphics/zlib/inffast.c; sourceTree = SOURCE_ROOT; }; + A0F1E7120E7545AA00778F12 /* inffast.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = inffast.h; path = ../../src/SFML/Graphics/zlib/inffast.h; sourceTree = SOURCE_ROOT; }; + A0F1E7130E7545AA00778F12 /* inffixed.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = inffixed.h; path = ../../src/SFML/Graphics/zlib/inffixed.h; sourceTree = SOURCE_ROOT; }; + A0F1E7140E7545AA00778F12 /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = inflate.c; path = ../../src/SFML/Graphics/zlib/inflate.c; sourceTree = SOURCE_ROOT; }; + A0F1E7150E7545AA00778F12 /* inflate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = inflate.h; path = ../../src/SFML/Graphics/zlib/inflate.h; sourceTree = SOURCE_ROOT; }; + A0F1E7160E7545AA00778F12 /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = inftrees.c; path = ../../src/SFML/Graphics/zlib/inftrees.c; sourceTree = SOURCE_ROOT; }; + A0F1E7170E7545AA00778F12 /* inftrees.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = inftrees.h; path = ../../src/SFML/Graphics/zlib/inftrees.h; sourceTree = SOURCE_ROOT; }; + A0F1E7180E7545AA00778F12 /* trees.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = trees.c; path = ../../src/SFML/Graphics/zlib/trees.c; sourceTree = SOURCE_ROOT; }; + A0F1E7190E7545AA00778F12 /* trees.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = trees.h; path = ../../src/SFML/Graphics/zlib/trees.h; sourceTree = SOURCE_ROOT; }; + A0F1E71A0E7545AA00778F12 /* uncompr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = uncompr.c; path = ../../src/SFML/Graphics/zlib/uncompr.c; sourceTree = SOURCE_ROOT; }; + A0F1E71B0E7545AA00778F12 /* zconf.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = zconf.h; path = ../../src/SFML/Graphics/zlib/zconf.h; sourceTree = SOURCE_ROOT; }; + A0F1E71C0E7545AA00778F12 /* zlib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = ../../src/SFML/Graphics/zlib/zlib.h; sourceTree = SOURCE_ROOT; }; + A0F1E71D0E7545AA00778F12 /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = zutil.c; path = ../../src/SFML/Graphics/zlib/zutil.c; sourceTree = SOURCE_ROOT; }; + A0F1E71E0E7545AA00778F12 /* zutil.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = zutil.h; path = ../../src/SFML/Graphics/zlib/zutil.h; sourceTree = SOURCE_ROOT; }; + A0F1E7AC0E7545F800778F12 /* Context.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Context.cpp; path = ../../src/SFML/Window/Context.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7B10E7545F800778F12 /* Input.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Input.cpp; path = ../../src/SFML/Window/Input.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7B20E7545F800778F12 /* Joystick.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = Joystick.hpp; path = ../../src/SFML/Window/Joystick.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E7D60E7545F800778F12 /* VideoMode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = VideoMode.cpp; path = ../../src/SFML/Window/VideoMode.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7D70E7545F800778F12 /* VideoModeSupport.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = VideoModeSupport.hpp; path = ../../src/SFML/Window/VideoModeSupport.hpp; sourceTree = SOURCE_ROOT; }; + A0F1E7DF0E7545F800778F12 /* Window.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Window.cpp; path = ../../src/SFML/Window/Window.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7E00E7545F800778F12 /* WindowImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = WindowImpl.cpp; path = ../../src/SFML/Window/WindowImpl.cpp; sourceTree = SOURCE_ROOT; }; + A0F1E7E10E7545F800778F12 /* WindowImpl.hpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.h; name = WindowImpl.hpp; path = ../../src/SFML/Window/WindowImpl.hpp; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A093E3730D8BF86E002236B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E37D0D8BF87A002236B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3860D8BF885002236B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3980D8BF89B002236B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3A10D8BF8A2002236B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0C93EB20D9A9CA000B9E0C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A01A3A810E7517C800D0BA9B /* Headers */ = { + isa = PBXGroup; + children = ( + A01A3A820E7517C800D0BA9B /* Audio */, + A01A3A8B0E7517C800D0BA9B /* Audio.hpp */, + A01A3A8C0E7517C800D0BA9B /* Config.hpp */, + A01A3A8D0E7517C800D0BA9B /* Graphics */, + A01A3A9E0E7517C800D0BA9B /* Graphics.hpp */, + A01A3A9F0E7517C800D0BA9B /* Network */, + A01A3AAD0E7517C800D0BA9B /* Network.hpp */, + A01A3AAE0E7517C800D0BA9B /* System */, + A01A3AC50E7517C800D0BA9B /* System.hpp */, + A01A3AC60E7517C800D0BA9B /* Window */, + A01A3AD10E7517C800D0BA9B /* Window.hpp */, + ); + name = Headers; + path = ../../include/SFML; + sourceTree = SOURCE_ROOT; + }; + A01A3A820E7517C800D0BA9B /* Audio */ = { + isa = PBXGroup; + children = ( + A01A3A830E7517C800D0BA9B /* AudioResource.hpp */, + A01A3A840E7517C800D0BA9B /* Listener.hpp */, + A01A3A850E7517C800D0BA9B /* Music.hpp */, + A01A3A860E7517C800D0BA9B /* Sound.hpp */, + A01A3A870E7517C800D0BA9B /* SoundBuffer.hpp */, + A01A3A880E7517C800D0BA9B /* SoundBufferRecorder.hpp */, + A01A3A890E7517C800D0BA9B /* SoundRecorder.hpp */, + A01A3A8A0E7517C800D0BA9B /* SoundStream.hpp */, + ); + name = Audio; + path = ../../include/SFML/Audio; + sourceTree = SOURCE_ROOT; + }; + A01A3A8D0E7517C800D0BA9B /* Graphics */ = { + isa = PBXGroup; + children = ( + A01A3A8E0E7517C800D0BA9B /* Color.hpp */, + A01A3A8F0E7517C800D0BA9B /* Drawable.hpp */, + A01A3A900E7517C800D0BA9B /* Font.hpp */, + A01A3A910E7517C800D0BA9B /* Glyph.hpp */, + A01A3A920E7517C800D0BA9B /* Image.hpp */, + A01A3A930E7517C800D0BA9B /* Matrix3.hpp */, + A01A3A940E7517C800D0BA9B /* Matrix3.inl */, + A01A3A950E7517C800D0BA9B /* PostFX.hpp */, + A01A3A960E7517C800D0BA9B /* Rect.hpp */, + A01A3A970E7517C800D0BA9B /* Rect.inl */, + A01A3A980E7517C800D0BA9B /* RenderTarget.hpp */, + A01A3A990E7517C800D0BA9B /* RenderWindow.hpp */, + A01A3A9A0E7517C800D0BA9B /* Shape.hpp */, + A01A3A9B0E7517C800D0BA9B /* Sprite.hpp */, + A01A3A9C0E7517C800D0BA9B /* String.hpp */, + A01A3A9D0E7517C800D0BA9B /* View.hpp */, + ); + name = Graphics; + path = ../../include/SFML/Graphics; + sourceTree = SOURCE_ROOT; + }; + A01A3A9F0E7517C800D0BA9B /* Network */ = { + isa = PBXGroup; + children = ( + A018A27D0EA218C7005FFAC3 /* Http.hpp */, + A018A27E0EA218C7005FFAC3 /* Ftp.hpp */, + A01A3AA00E7517C800D0BA9B /* IPAddress.hpp */, + A01A3AA10E7517C800D0BA9B /* Packet.hpp */, + A01A3AA20E7517C800D0BA9B /* Selector.hpp */, + A01A3AA30E7517C800D0BA9B /* Selector.inl */, + A01A3AA40E7517C800D0BA9B /* SelectorBase.hpp */, + A01A3AA50E7517C800D0BA9B /* SocketHelper.hpp */, + A01A3AA60E7517C800D0BA9B /* Sockets.hpp */, + A01A3AA70E7517C800D0BA9B /* SocketTCP.hpp */, + A01A3AA80E7517C800D0BA9B /* SocketUDP.hpp */, + A01A3AA90E7517C800D0BA9B /* Unix */, + A01A3AAB0E7517C800D0BA9B /* Win32 */, + ); + name = Network; + path = ../../include/SFML/Network; + sourceTree = SOURCE_ROOT; + }; + A01A3AA90E7517C800D0BA9B /* Unix */ = { + isa = PBXGroup; + children = ( + A01A3AAA0E7517C800D0BA9B /* SocketHelper.hpp */, + ); + name = Unix; + path = ../../include/SFML/Network/Unix; + sourceTree = SOURCE_ROOT; + }; + A01A3AAB0E7517C800D0BA9B /* Win32 */ = { + isa = PBXGroup; + children = ( + A01A3AAC0E7517C800D0BA9B /* SocketHelper.hpp */, + ); + name = Win32; + path = ../../include/SFML/Network/Win32; + sourceTree = SOURCE_ROOT; + }; + A01A3AAE0E7517C800D0BA9B /* System */ = { + isa = PBXGroup; + children = ( + A01A3AAF0E7517C800D0BA9B /* Clock.hpp */, + A01A3AB00E7517C800D0BA9B /* Lock.hpp */, + A01A3AB10E7517C800D0BA9B /* Mutex.hpp */, + A01A3AB20E7517C800D0BA9B /* NonCopyable.hpp */, + A01A3AB30E7517C800D0BA9B /* Randomizer.hpp */, + A01A3AB40E7517C800D0BA9B /* Resource.hpp */, + A01A3AB50E7517C800D0BA9B /* Resource.inl */, + A01A3AB60E7517C800D0BA9B /* ResourcePtr.inl */, + A01A3AB70E7517C800D0BA9B /* Sleep.hpp */, + A01A3AB80E7517C800D0BA9B /* Thread.hpp */, + A01A3AB90E7517C800D0BA9B /* Unicode.hpp */, + A01A3ABA0E7517C800D0BA9B /* Unicode.inl */, + A01A3ABB0E7517C800D0BA9B /* Unix */, + A01A3ABE0E7517C800D0BA9B /* Vector2.hpp */, + A01A3ABF0E7517C800D0BA9B /* Vector2.inl */, + A01A3AC00E7517C800D0BA9B /* Vector3.hpp */, + A01A3AC10E7517C800D0BA9B /* Vector3.inl */, + ); + name = System; + path = ../../include/SFML/System; + sourceTree = SOURCE_ROOT; + }; + A01A3ABB0E7517C800D0BA9B /* Unix */ = { + isa = PBXGroup; + children = ( + A01A3ABC0E7517C800D0BA9B /* Mutex.hpp */, + A01A3ABD0E7517C800D0BA9B /* Thread.hpp */, + ); + name = Unix; + path = ../../include/SFML/System/Unix; + sourceTree = SOURCE_ROOT; + }; + A01A3AC60E7517C800D0BA9B /* Window */ = { + isa = PBXGroup; + children = ( + A01A3AC70E7517C800D0BA9B /* Context.hpp */, + A01A3AC80E7517C800D0BA9B /* Event.hpp */, + A01A3AC90E7517C800D0BA9B /* Input.hpp */, + A01A3ACA0E7517C800D0BA9B /* OpenGL.hpp */, + A01A3ACB0E7517C800D0BA9B /* VideoMode.hpp */, + A01A3ACC0E7517C800D0BA9B /* Window.hpp */, + A01A3ACD0E7517C800D0BA9B /* WindowHandle.hpp */, + A01A3ACE0E7517C800D0BA9B /* WindowListener.hpp */, + A01A3ACF0E7517C800D0BA9B /* WindowSettings.hpp */, + A01A3AD00E7517C800D0BA9B /* WindowStyle.hpp */, + ); + name = Window; + path = ../../include/SFML/Window; + sourceTree = SOURCE_ROOT; + }; + A01A3AD70E75181300D0BA9B /* Sources */ = { + isa = PBXGroup; + children = ( + A01A3AD80E75181300D0BA9B /* AudioDevice.cpp */, + A01A3AD90E75181300D0BA9B /* AudioDevice.hpp */, + A01A3ADA0E75181300D0BA9B /* AudioResource.cpp */, + A01A3ADB0E75181300D0BA9B /* Listener.cpp */, + A01A3ADD0E75181300D0BA9B /* Music.cpp */, + A01A3ADE0E75181300D0BA9B /* OpenAL.hpp */, + A01A3ADF0E75181300D0BA9B /* Sound.cpp */, + A01A3AE00E75181300D0BA9B /* SoundBuffer.cpp */, + A01A3AE10E75181300D0BA9B /* SoundBufferRecorder.cpp */, + A01A3AE20E75181300D0BA9B /* SoundFile.cpp */, + A01A3AE30E75181300D0BA9B /* SoundFile.hpp */, + A01A3AE40E75181300D0BA9B /* SoundFileDefault.cpp */, + A01A3AE50E75181300D0BA9B /* SoundFileDefault.hpp */, + A01A3AE60E75181300D0BA9B /* SoundFileOgg.cpp */, + A01A3AE70E75181300D0BA9B /* SoundFileOgg.hpp */, + A01A3AE80E75181300D0BA9B /* SoundRecorder.cpp */, + A01A3AE90E75181300D0BA9B /* SoundStream.cpp */, + A01A3AEA0E75181300D0BA9B /* stb_vorbis */, + ); + name = Sources; + path = ../../src/SFML/Audio; + sourceTree = SOURCE_ROOT; + }; + A01A3AEA0E75181300D0BA9B /* stb_vorbis */ = { + isa = PBXGroup; + children = ( + A01A3AEB0E75181300D0BA9B /* stb_vorbis.c */, + A01A3AEC0E75181300D0BA9B /* stb_vorbis.h */, + ); + name = stb_vorbis; + path = ../../src/SFML/Audio/stb_vorbis; + sourceTree = SOURCE_ROOT; + }; + A02C68B0102BA16300A77DF4 /* dist */ = { + isa = PBXGroup; + children = ( + A02C68B1102BA16300A77DF4 /* autogen.sh */, + A02C68B2102BA16300A77DF4 /* license.txt */, + A02C68B3102BA16300A77DF4 /* Lisez-moi.rtf */, + A02C68B4102BA16300A77DF4 /* Notes de version.rtf */, + A02C68B5102BA16300A77DF4 /* Read Me.rtf */, + A02C68B6102BA16300A77DF4 /* Release Notes.rtf */, + ); + path = dist; + sourceTree = ""; + }; + A04C59A40EDDBA9C00935061 /* Cocoa */ = { + isa = PBXGroup; + children = ( + A04C59A50EDDBA9C00935061 /* AppController.h */, + A04C59A60EDDBA9C00935061 /* AppController.mm */, + A04C59A80EDDBA9C00935061 /* Joystick.hpp */, + A04C59A70EDDBA9C00935061 /* Joystick.cpp */, + A04C59AA0EDDBA9C00935061 /* VideoModeSupport.hpp */, + A04C59A90EDDBA9C00935061 /* VideoModeSupport.cpp */, + A04C59AD0EDDBA9C00935061 /* WindowImplCocoa.hpp */, + A04C59AE0EDDBA9C00935061 /* WindowImplCocoa.mm */, + A0CE9FE50F46F72500FD00CE /* GLKit.h */, + A0CE9FE60F46F72500FD00CE /* GLKit.mm */, + ); + name = Cocoa; + path = ../../src/SFML/Window/Cocoa; + sourceTree = SOURCE_ROOT; + }; + A093E3660D8BF860002236B4 = { + isa = PBXGroup; + children = ( + A02C68B0102BA16300A77DF4 /* dist */, + A093E3AD0D8BF8AD002236B4 /* SFML */, + A093E3B90D8BF8C2002236B4 /* sfml-audio */, + A093E3BC0D8BF8C7002236B4 /* sfml-graphics */, + A093E3B30D8BF8B5002236B4 /* sfml-network */, + A093E3B00D8BF8B0002236B4 /* sfml-system */, + A093E3B60D8BF8BB002236B4 /* sfml-window */, + A093E3760D8BF86E002236B4 /* Products */, + ); + sourceTree = ""; + }; + A093E3760D8BF86E002236B4 /* Products */ = { + isa = PBXGroup; + children = ( + A093E3750D8BF86E002236B4 /* SFML.framework */, + A093E37F0D8BF87A002236B4 /* sfml-system-d.framework */, + A093E3880D8BF885002236B4 /* sfml-network-d.framework */, + A093E39A0D8BF89B002236B4 /* sfml-audio-d.framework */, + A093E3A30D8BF8A2002236B4 /* sfml-graphics-d.framework */, + A0C93EB40D9A9CA000B9E0C8 /* sfml-window-d.framework */, + ); + name = Products; + sourceTree = ""; + }; + A093E3AD0D8BF8AD002236B4 /* SFML */ = { + isa = PBXGroup; + children = ( + A01A3A810E7517C800D0BA9B /* Headers */, + A093E3CF0D8BF918002236B4 /* dummy.cpp */, + A093E3770D8BF86E002236B4 /* SFML-Info.plist */, + ); + name = SFML; + sourceTree = SOURCE_ROOT; + }; + A093E3B00D8BF8B0002236B4 /* sfml-system */ = { + isa = PBXGroup; + children = ( + A09EEBE40D8C19B000F6C625 /* Sources */, + A093E3800D8BF87A002236B4 /* sfml-system-Info.plist */, + ); + name = "sfml-system"; + sourceTree = SOURCE_ROOT; + }; + A093E3B30D8BF8B5002236B4 /* sfml-network */ = { + isa = PBXGroup; + children = ( + A0F1E67F0E75440800778F12 /* Sources */, + A093E3890D8BF885002236B4 /* sfml-network-Info.plist */, + ); + name = "sfml-network"; + sourceTree = SOURCE_ROOT; + }; + A093E3B60D8BF8BB002236B4 /* sfml-window */ = { + isa = PBXGroup; + children = ( + A0F1E7AB0E7545F800778F12 /* Sources */, + A093E3920D8BF892002236B4 /* sfml-window-Info.plist */, + ); + name = "sfml-window"; + sourceTree = SOURCE_ROOT; + }; + A093E3B90D8BF8C2002236B4 /* sfml-audio */ = { + isa = PBXGroup; + children = ( + A01A3AD70E75181300D0BA9B /* Sources */, + A093E39B0D8BF89B002236B4 /* sfml-audio-Info.plist */, + ); + name = "sfml-audio"; + sourceTree = SOURCE_ROOT; + }; + A093E3BC0D8BF8C7002236B4 /* sfml-graphics */ = { + isa = PBXGroup; + children = ( + A0F1E6980E7545AA00778F12 /* Sources */, + A093E3A40D8BF8A2002236B4 /* sfml-graphics-Info.plist */, + ); + name = "sfml-graphics"; + sourceTree = SOURCE_ROOT; + }; + A09EEBE40D8C19B000F6C625 /* Sources */ = { + isa = PBXGroup; + children = ( + A09EEBED0D8C19BF00F6C625 /* Platform.hpp */, + A09EEBEE0D8C19BF00F6C625 /* Randomizer.cpp */, + A01C69C80E3E63CE00ED3F04 /* Unicode.cpp */, + A09EEBEF0D8C19BF00F6C625 /* Unix */, + A09EEBF40D8C19BF00F6C625 /* Clock.cpp */, + A09EEBF50D8C19BF00F6C625 /* Lock.cpp */, + A09EEBF60D8C19BF00F6C625 /* Sleep.cpp */, + ); + name = Sources; + sourceTree = SOURCE_ROOT; + }; + A09EEBEF0D8C19BF00F6C625 /* Unix */ = { + isa = PBXGroup; + children = ( + A0EEDE980F59D49C0023A7F7 /* Initializer.cpp */, + A09EEBF00D8C19BF00F6C625 /* Mutex.cpp */, + A09EEBF10D8C19BF00F6C625 /* Platform.cpp */, + A09EEBF20D8C19BF00F6C625 /* Platform.hpp */, + A09EEBF30D8C19BF00F6C625 /* Thread.cpp */, + ); + name = Unix; + path = ../../src/SFML/System/Unix; + sourceTree = SOURCE_ROOT; + }; + A0F1E67F0E75440800778F12 /* Sources */ = { + isa = PBXGroup; + children = ( + A0F1E6800E75440800778F12 /* IPAddress.cpp */, + A0F1E6820E75440800778F12 /* Packet.cpp */, + A0F1E6830E75440800778F12 /* SelectorBase.cpp */, + A0F1E6840E75440800778F12 /* SocketTCP.cpp */, + A0F1E6850E75440800778F12 /* SocketUDP.cpp */, + A018A2790EA21866005FFAC3 /* Http.cpp */, + A018A27A0EA21866005FFAC3 /* Ftp.cpp */, + A0F1E6860E75440800778F12 /* Unix */, + ); + name = Sources; + path = ../../src/SFML/Network; + sourceTree = SOURCE_ROOT; + }; + A0F1E6860E75440800778F12 /* Unix */ = { + isa = PBXGroup; + children = ( + A0F1E6870E75440800778F12 /* SocketHelper.cpp */, + ); + name = Unix; + path = ../../src/SFML/Network/Unix; + sourceTree = SOURCE_ROOT; + }; + A0F1E6980E7545AA00778F12 /* Sources */ = { + isa = PBXGroup; + children = ( + A0F1E6990E7545AA00778F12 /* Arial.hpp */, + A0F1E69A0E7545AA00778F12 /* Color.cpp */, + A0F1E69B0E7545AA00778F12 /* Drawable.cpp */, + A0F1E69C0E7545AA00778F12 /* Font.cpp */, + A0F1E69D0E7545AA00778F12 /* FontLoader.cpp */, + A0F1E69E0E7545AA00778F12 /* FontLoader.hpp */, + A0F1E69F0E7545AA00778F12 /* GLEW */, + A0F1E6A40E7545AA00778F12 /* GraphicsContext.cpp */, + A0F1E6A50E7545AA00778F12 /* GraphicsContext.hpp */, + A0F1E6A60E7545AA00778F12 /* Image.cpp */, + A0F1E6A70E7545AA00778F12 /* ImageLoader.cpp */, + A0F1E6A80E7545AA00778F12 /* ImageLoader.hpp */, + A0F1E6A90E7545AA00778F12 /* libjpeg */, + A0F1E6E40E7545AA00778F12 /* libpng */, + A0F1E6F90E7545AA00778F12 /* Matrix3.cpp */, + A0F1E6FA0E7545AA00778F12 /* PostFX.cpp */, + A0F1E6FB0E7545AA00778F12 /* RenderTarget.cpp */, + A0F1E6FC0E7545AA00778F12 /* RenderWindow.cpp */, + A0F1E6FD0E7545AA00778F12 /* Shape.cpp */, + A0F1E6FE0E7545AA00778F12 /* SOIL */, + A0F1E7070E7545AA00778F12 /* Sprite.cpp */, + A0F1E7080E7545AA00778F12 /* String.cpp */, + A0F1E7090E7545AA00778F12 /* View.cpp */, + A0F1E70A0E7545AA00778F12 /* zlib */, + ); + name = Sources; + path = ../../src/SFML/Graphics; + sourceTree = SOURCE_ROOT; + }; + A0F1E69F0E7545AA00778F12 /* GLEW */ = { + isa = PBXGroup; + children = ( + A0F1E6A00E7545AA00778F12 /* glew.c */, + A0F1E6A10E7545AA00778F12 /* glew.h */, + ); + name = GLEW; + path = ../../src/SFML/Graphics/GLEW; + sourceTree = SOURCE_ROOT; + }; + A0F1E6A90E7545AA00778F12 /* libjpeg */ = { + isa = PBXGroup; + children = ( + A0F1E6AA0E7545AA00778F12 /* cderror.h */, + A0F1E6AB0E7545AA00778F12 /* jcapimin.c */, + A0F1E6AC0E7545AA00778F12 /* jcapistd.c */, + A0F1E6AD0E7545AA00778F12 /* jccoefct.c */, + A0F1E6AE0E7545AA00778F12 /* jccolor.c */, + A0F1E6AF0E7545AA00778F12 /* jcdctmgr.c */, + A0F1E6B00E7545AA00778F12 /* jchuff.c */, + A0F1E6B10E7545AA00778F12 /* jchuff.h */, + A0F1E6B20E7545AA00778F12 /* jcinit.c */, + A0F1E6B30E7545AA00778F12 /* jcmainct.c */, + A0F1E6B40E7545AA00778F12 /* jcmarker.c */, + A0F1E6B50E7545AA00778F12 /* jcmaster.c */, + A0F1E6B60E7545AA00778F12 /* jcomapi.c */, + A0F1E6B70E7545AA00778F12 /* jconfig.h */, + A0F1E6B80E7545AA00778F12 /* jcparam.c */, + A0F1E6B90E7545AA00778F12 /* jcphuff.c */, + A0F1E6BA0E7545AA00778F12 /* jcprepct.c */, + A0F1E6BB0E7545AA00778F12 /* jcsample.c */, + A0F1E6BC0E7545AA00778F12 /* jctrans.c */, + A0F1E6BD0E7545AA00778F12 /* jdapimin.c */, + A0F1E6BE0E7545AA00778F12 /* jdapistd.c */, + A0F1E6BF0E7545AA00778F12 /* jdatadst.c */, + A0F1E6C00E7545AA00778F12 /* jdatasrc.c */, + A0F1E6C10E7545AA00778F12 /* jdcoefct.c */, + A0F1E6C20E7545AA00778F12 /* jdcolor.c */, + A0F1E6C30E7545AA00778F12 /* jdct.h */, + A0F1E6C40E7545AA00778F12 /* jddctmgr.c */, + A0F1E6C50E7545AA00778F12 /* jdhuff.c */, + A0F1E6C60E7545AA00778F12 /* jdhuff.h */, + A0F1E6C70E7545AA00778F12 /* jdinput.c */, + A0F1E6C80E7545AA00778F12 /* jdmainct.c */, + A0F1E6C90E7545AA00778F12 /* jdmarker.c */, + A0F1E6CA0E7545AA00778F12 /* jdmaster.c */, + A0F1E6CB0E7545AA00778F12 /* jdmerge.c */, + A0F1E6CC0E7545AA00778F12 /* jdphuff.c */, + A0F1E6CD0E7545AA00778F12 /* jdpostct.c */, + A0F1E6CE0E7545AA00778F12 /* jdsample.c */, + A0F1E6CF0E7545AA00778F12 /* jdtrans.c */, + A0F1E6D00E7545AA00778F12 /* jerror.c */, + A0F1E6D10E7545AA00778F12 /* jerror.h */, + A0F1E6D20E7545AA00778F12 /* jfdctflt.c */, + A0F1E6D30E7545AA00778F12 /* jfdctfst.c */, + A0F1E6D40E7545AA00778F12 /* jfdctint.c */, + A0F1E6D50E7545AA00778F12 /* jidctflt.c */, + A0F1E6D60E7545AA00778F12 /* jidctfst.c */, + A0F1E6D70E7545AA00778F12 /* jidctint.c */, + A0F1E6D80E7545AA00778F12 /* jidctred.c */, + A0F1E6D90E7545AA00778F12 /* jinclude.h */, + A0F1E6DA0E7545AA00778F12 /* jmemmgr.c */, + A0F1E6DB0E7545AA00778F12 /* jmemnobs.c */, + A0F1E6DC0E7545AA00778F12 /* jmemsys.h */, + A0F1E6DD0E7545AA00778F12 /* jmorecfg.h */, + A0F1E6DE0E7545AA00778F12 /* jpegint.h */, + A0F1E6DF0E7545AA00778F12 /* jpeglib.h */, + A0F1E6E00E7545AA00778F12 /* jquant1.c */, + A0F1E6E10E7545AA00778F12 /* jquant2.c */, + A0F1E6E20E7545AA00778F12 /* jutils.c */, + A0F1E6E30E7545AA00778F12 /* jversion.h */, + ); + name = libjpeg; + path = ../../src/SFML/Graphics/libjpeg; + sourceTree = SOURCE_ROOT; + }; + A0F1E6E40E7545AA00778F12 /* libpng */ = { + isa = PBXGroup; + children = ( + A0F1E6E50E7545AA00778F12 /* png.c */, + A0F1E6E60E7545AA00778F12 /* png.h */, + A0F1E6E70E7545AA00778F12 /* pngconf.h */, + A0F1E6E80E7545AA00778F12 /* pngerror.c */, + A0F1E6E90E7545AA00778F12 /* pnggccrd.c */, + A0F1E6EA0E7545AA00778F12 /* pngget.c */, + A0F1E6EB0E7545AA00778F12 /* pngmem.c */, + A0F1E6EC0E7545AA00778F12 /* pngpread.c */, + A0F1E6ED0E7545AA00778F12 /* pngread.c */, + A0F1E6EE0E7545AA00778F12 /* pngrio.c */, + A0F1E6EF0E7545AA00778F12 /* pngrtran.c */, + A0F1E6F00E7545AA00778F12 /* pngrutil.c */, + A0F1E6F10E7545AA00778F12 /* pngset.c */, + A0F1E6F20E7545AA00778F12 /* pngtrans.c */, + A0F1E6F30E7545AA00778F12 /* pngvcrd.c */, + A0F1E6F40E7545AA00778F12 /* pngwio.c */, + A0F1E6F50E7545AA00778F12 /* pngwrite.c */, + A0F1E6F60E7545AA00778F12 /* pngwtran.c */, + A0F1E6F70E7545AA00778F12 /* pngwutil.c */, + ); + name = libpng; + path = ../../src/SFML/Graphics/libpng; + sourceTree = SOURCE_ROOT; + }; + A0F1E6FE0E7545AA00778F12 /* SOIL */ = { + isa = PBXGroup; + children = ( + A0F1E6FF0E7545AA00778F12 /* image_DXT.c */, + A0F1E7000E7545AA00778F12 /* image_DXT.h */, + A0F1E7010E7545AA00778F12 /* SOIL.c */, + A0F1E7020E7545AA00778F12 /* SOIL.h */, + A0F1E7030E7545AA00778F12 /* stb_image_aug.c */, + A0F1E7040E7545AA00778F12 /* stb_image_aug.h */, + A0F1E7050E7545AA00778F12 /* stbi_DDS_aug.h */, + A0F1E7060E7545AA00778F12 /* stbi_DDS_aug_c.h */, + ); + name = SOIL; + path = ../../src/SFML/Graphics/SOIL; + sourceTree = SOURCE_ROOT; + }; + A0F1E70A0E7545AA00778F12 /* zlib */ = { + isa = PBXGroup; + children = ( + A0F1E70B0E7545AA00778F12 /* adler32.c */, + A0F1E70C0E7545AA00778F12 /* compress.c */, + A0F1E70D0E7545AA00778F12 /* crc32.c */, + A0F1E70E0E7545AA00778F12 /* crc32.h */, + A0F1E70F0E7545AA00778F12 /* deflate.c */, + A0F1E7100E7545AA00778F12 /* deflate.h */, + A0F1E7110E7545AA00778F12 /* inffast.c */, + A0F1E7120E7545AA00778F12 /* inffast.h */, + A0F1E7130E7545AA00778F12 /* inffixed.h */, + A0F1E7140E7545AA00778F12 /* inflate.c */, + A0F1E7150E7545AA00778F12 /* inflate.h */, + A0F1E7160E7545AA00778F12 /* inftrees.c */, + A0F1E7170E7545AA00778F12 /* inftrees.h */, + A0F1E7180E7545AA00778F12 /* trees.c */, + A0F1E7190E7545AA00778F12 /* trees.h */, + A0F1E71A0E7545AA00778F12 /* uncompr.c */, + A0F1E71B0E7545AA00778F12 /* zconf.h */, + A0F1E71C0E7545AA00778F12 /* zlib.h */, + A0F1E71D0E7545AA00778F12 /* zutil.c */, + A0F1E71E0E7545AA00778F12 /* zutil.h */, + ); + name = zlib; + path = ../../src/SFML/Graphics/zlib; + sourceTree = SOURCE_ROOT; + }; + A0F1E7AB0E7545F800778F12 /* Sources */ = { + isa = PBXGroup; + children = ( + A04C59A40EDDBA9C00935061 /* Cocoa */, + A0F1E7AC0E7545F800778F12 /* Context.cpp */, + A0F1E7B10E7545F800778F12 /* Input.cpp */, + A0F1E7B20E7545F800778F12 /* Joystick.hpp */, + A0F1E7D60E7545F800778F12 /* VideoMode.cpp */, + A0F1E7D70E7545F800778F12 /* VideoModeSupport.hpp */, + A0F1E7DF0E7545F800778F12 /* Window.cpp */, + A0F1E7E00E7545F800778F12 /* WindowImpl.cpp */, + A0F1E7E10E7545F800778F12 /* WindowImpl.hpp */, + ); + name = Sources; + path = ../../src/SFML/Window; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + A093E3700D8BF86E002236B4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E37A0D8BF87A002236B4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A09EEBF70D8C19BF00F6C625 /* Platform.hpp in Headers */, + A09EEBFB0D8C19BF00F6C625 /* Platform.hpp in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3830D8BF885002236B4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3950D8BF89B002236B4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A01A3AEE0E75181300D0BA9B /* AudioDevice.hpp in Headers */, + A01A3AF30E75181300D0BA9B /* OpenAL.hpp in Headers */, + A01A3AF80E75181300D0BA9B /* SoundFile.hpp in Headers */, + A01A3AFA0E75181300D0BA9B /* SoundFileDefault.hpp in Headers */, + A01A3AFC0E75181300D0BA9B /* SoundFileOgg.hpp in Headers */, + A01A3B000E75181300D0BA9B /* stb_vorbis.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E39E0D8BF8A2002236B4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A0F1E71F0E7545AA00778F12 /* Arial.hpp in Headers */, + A0F1E7240E7545AA00778F12 /* FontLoader.hpp in Headers */, + A0F1E7260E7545AA00778F12 /* glew.h in Headers */, + A0F1E72A0E7545AA00778F12 /* GraphicsContext.hpp in Headers */, + A0F1E72D0E7545AA00778F12 /* ImageLoader.hpp in Headers */, + A0F1E72E0E7545AA00778F12 /* cderror.h in Headers */, + A0F1E7350E7545AA00778F12 /* jchuff.h in Headers */, + A0F1E73B0E7545AA00778F12 /* jconfig.h in Headers */, + A0F1E7470E7545AA00778F12 /* jdct.h in Headers */, + A0F1E74A0E7545AA00778F12 /* jdhuff.h in Headers */, + A0F1E7550E7545AA00778F12 /* jerror.h in Headers */, + A0F1E75D0E7545AA00778F12 /* jinclude.h in Headers */, + A0F1E7600E7545AA00778F12 /* jmemsys.h in Headers */, + A0F1E7610E7545AA00778F12 /* jmorecfg.h in Headers */, + A0F1E7620E7545AA00778F12 /* jpegint.h in Headers */, + A0F1E7630E7545AA00778F12 /* jpeglib.h in Headers */, + A0F1E7670E7545AA00778F12 /* jversion.h in Headers */, + A0F1E7690E7545AA00778F12 /* png.h in Headers */, + A0F1E76A0E7545AA00778F12 /* pngconf.h in Headers */, + A0F1E7820E7545AA00778F12 /* image_DXT.h in Headers */, + A0F1E7840E7545AA00778F12 /* SOIL.h in Headers */, + A0F1E7860E7545AA00778F12 /* stb_image_aug.h in Headers */, + A0F1E7870E7545AA00778F12 /* stbi_DDS_aug.h in Headers */, + A0F1E7880E7545AA00778F12 /* stbi_DDS_aug_c.h in Headers */, + A0F1E78F0E7545AA00778F12 /* crc32.h in Headers */, + A0F1E7910E7545AA00778F12 /* deflate.h in Headers */, + A0F1E7930E7545AA00778F12 /* inffast.h in Headers */, + A0F1E7940E7545AA00778F12 /* inffixed.h in Headers */, + A0F1E7960E7545AA00778F12 /* inflate.h in Headers */, + A0F1E7980E7545AA00778F12 /* inftrees.h in Headers */, + A0F1E79A0E7545AA00778F12 /* trees.h in Headers */, + A0F1E79C0E7545AA00778F12 /* zconf.h in Headers */, + A0F1E79D0E7545AA00778F12 /* zlib.h in Headers */, + A0F1E79F0E7545AA00778F12 /* zutil.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0C93EAF0D9A9CA000B9E0C8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A0F1E7E70E7545F800778F12 /* Joystick.hpp in Headers */, + A0F1E8080E7545F800778F12 /* VideoModeSupport.hpp in Headers */, + A0F1E8110E7545F800778F12 /* WindowImpl.hpp in Headers */, + A04C59AF0EDDBA9C00935061 /* AppController.h in Headers */, + A04C59B20EDDBA9C00935061 /* Joystick.hpp in Headers */, + A04C59B40EDDBA9C00935061 /* VideoModeSupport.hpp in Headers */, + A04C59B70EDDBA9C00935061 /* WindowImplCocoa.hpp in Headers */, + A0CE9FE70F46F72500FD00CE /* GLKit.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + A093E3740D8BF86E002236B4 /* SFML */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679DE0E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "SFML" */; + buildPhases = ( + A093E3700D8BF86E002236B4 /* Headers */, + A093E3710D8BF86E002236B4 /* Resources */, + A093E3720D8BF86E002236B4 /* Sources */, + A093E3730D8BF86E002236B4 /* Frameworks */, + A0BA42130DDF0E3F00039094 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SFML; + productName = SFML; + productReference = A093E3750D8BF86E002236B4 /* SFML.framework */; + productType = "com.apple.product-type.framework"; + }; + A093E37E0D8BF87A002236B4 /* sfml-system */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679DF0E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-system" */; + buildPhases = ( + A093E37A0D8BF87A002236B4 /* Headers */, + A093E37B0D8BF87A002236B4 /* Resources */, + A093E37C0D8BF87A002236B4 /* Sources */, + A093E37D0D8BF87A002236B4 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A012F5800E0FF91B0022FB0F /* PBXTargetDependency */, + ); + name = "sfml-system"; + productName = "sfml-system"; + productReference = A093E37F0D8BF87A002236B4 /* sfml-system-d.framework */; + productType = "com.apple.product-type.framework"; + }; + A093E3870D8BF885002236B4 /* sfml-network */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679E00E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-network" */; + buildPhases = ( + A093E3830D8BF885002236B4 /* Headers */, + A093E3840D8BF885002236B4 /* Resources */, + A093E3850D8BF885002236B4 /* Sources */, + A093E3860D8BF885002236B4 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A012F5820E0FF9310022FB0F /* PBXTargetDependency */, + ); + name = "sfml-network"; + productName = "sfml-network"; + productReference = A093E3880D8BF885002236B4 /* sfml-network-d.framework */; + productType = "com.apple.product-type.framework"; + }; + A093E3990D8BF89B002236B4 /* sfml-audio */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679E10E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-audio" */; + buildPhases = ( + A093E3950D8BF89B002236B4 /* Headers */, + A093E3960D8BF89B002236B4 /* Resources */, + A093E3970D8BF89B002236B4 /* Sources */, + A093E3980D8BF89B002236B4 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A093E54A0D8BFEB9002236B4 /* PBXTargetDependency */, + ); + name = "sfml-audio"; + productName = "sfml-audio"; + productReference = A093E39A0D8BF89B002236B4 /* sfml-audio-d.framework */; + productType = "com.apple.product-type.framework"; + }; + A093E3A20D8BF8A2002236B4 /* sfml-graphics */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679E30E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-graphics" */; + buildPhases = ( + A093E39E0D8BF8A2002236B4 /* Headers */, + A093E39F0D8BF8A2002236B4 /* Resources */, + A093E3A00D8BF8A2002236B4 /* Sources */, + A093E3A10D8BF8A2002236B4 /* Frameworks */, + ); + buildRules = ( + A09EEA9F0D8C074D00F6C625 /* PBXBuildRule */, + ); + dependencies = ( + A07EA05D0DB657C0007C7747 /* PBXTargetDependency */, + ); + name = "sfml-graphics"; + productName = "sfml-graphics"; + productReference = A093E3A30D8BF8A2002236B4 /* sfml-graphics-d.framework */; + productType = "com.apple.product-type.framework"; + }; + A0C93EB30D9A9CA000B9E0C8 /* sfml-window */ = { + isa = PBXNativeTarget; + buildConfigurationList = A02679E20E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-window" */; + buildPhases = ( + A0C93EAF0D9A9CA000B9E0C8 /* Headers */, + A0C93EB00D9A9CA000B9E0C8 /* Resources */, + A0C93EB10D9A9CA000B9E0C8 /* Sources */, + A0C93EB20D9A9CA000B9E0C8 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A017FF8B0E51E06400A4C078 /* PBXTargetDependency */, + ); + name = "sfml-window"; + productName = "sfml-window"; + productReference = A0C93EB40D9A9CA000B9E0C8 /* sfml-window-d.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A093E36A0D8BF860002236B4 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = A02679DD0E5CDB03008D4C81 /* Build configuration list for PBXProject "SFML with Intel 64 bits" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 0; + mainGroup = A093E3660D8BF860002236B4; + productRefGroup = A093E3760D8BF86E002236B4 /* Products */; + projectDirPath = ""; + projectRoot = ../..; + targets = ( + A0F0BA820D92E4F500056981 /* All */, + A093E3740D8BF86E002236B4 /* SFML */, + A093E3990D8BF89B002236B4 /* sfml-audio */, + A093E3A20D8BF8A2002236B4 /* sfml-graphics */, + A093E3870D8BF885002236B4 /* sfml-network */, + A093E37E0D8BF87A002236B4 /* sfml-system */, + A0C93EB30D9A9CA000B9E0C8 /* sfml-window */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A093E3710D8BF86E002236B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E37B0D8BF87A002236B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3840D8BF885002236B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3960D8BF89B002236B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E39F0D8BF8A2002236B4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0C93EB00D9A9CA000B9E0C8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + A0BA42130DDF0E3F00039094 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export HEADER_PATH=$BUILT_PRODUCTS_DIR/$PUBLIC_HEADERS_FOLDER_PATH\n\nrm -rf $HEADER_PATH\nmkdir -p $HEADER_PATH\nln -s Versions/Current/Headers $HEADER_PATH/../../../Headers\ncp -r $SRCROOT/../../include/SFML/ $HEADER_PATH\nrm -rf `find $HEADER_PATH -name \".svn\"`\nrm -f $HEADER_PATH/Headers"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A093E3720D8BF86E002236B4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A093E3D00D8BF918002236B4 /* dummy.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E37C0D8BF87A002236B4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A09EEBF80D8C19BF00F6C625 /* Randomizer.cpp in Sources */, + A09EEBF90D8C19BF00F6C625 /* Mutex.cpp in Sources */, + A09EEBFA0D8C19BF00F6C625 /* Platform.cpp in Sources */, + A09EEBFC0D8C19BF00F6C625 /* Thread.cpp in Sources */, + A09EEBFD0D8C19BF00F6C625 /* Clock.cpp in Sources */, + A09EEBFE0D8C19BF00F6C625 /* Lock.cpp in Sources */, + A09EEBFF0D8C19BF00F6C625 /* Sleep.cpp in Sources */, + A01C69C90E3E63CE00ED3F04 /* Unicode.cpp in Sources */, + A0EEDE990F59D49C0023A7F7 /* Initializer.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3850D8BF885002236B4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A0F1E68A0E75440800778F12 /* IPAddress.cpp in Sources */, + A0F1E68C0E75440800778F12 /* Packet.cpp in Sources */, + A0F1E68D0E75440800778F12 /* SelectorBase.cpp in Sources */, + A0F1E68E0E75440800778F12 /* SocketTCP.cpp in Sources */, + A0F1E68F0E75440800778F12 /* SocketUDP.cpp in Sources */, + A0F1E6900E75440800778F12 /* SocketHelper.cpp in Sources */, + A018A27B0EA21866005FFAC3 /* Http.cpp in Sources */, + A018A27C0EA21866005FFAC3 /* Ftp.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3970D8BF89B002236B4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A01A3AED0E75181300D0BA9B /* AudioDevice.cpp in Sources */, + A01A3AEF0E75181300D0BA9B /* AudioResource.cpp in Sources */, + A01A3AF00E75181300D0BA9B /* Listener.cpp in Sources */, + A01A3AF20E75181300D0BA9B /* Music.cpp in Sources */, + A01A3AF40E75181300D0BA9B /* Sound.cpp in Sources */, + A01A3AF50E75181300D0BA9B /* SoundBuffer.cpp in Sources */, + A01A3AF60E75181300D0BA9B /* SoundBufferRecorder.cpp in Sources */, + A01A3AF70E75181300D0BA9B /* SoundFile.cpp in Sources */, + A01A3AF90E75181300D0BA9B /* SoundFileDefault.cpp in Sources */, + A01A3AFB0E75181300D0BA9B /* SoundFileOgg.cpp in Sources */, + A01A3AFD0E75181300D0BA9B /* SoundRecorder.cpp in Sources */, + A01A3AFE0E75181300D0BA9B /* SoundStream.cpp in Sources */, + A01A3AFF0E75181300D0BA9B /* stb_vorbis.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A093E3A00D8BF8A2002236B4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A0F1E7200E7545AA00778F12 /* Color.cpp in Sources */, + A0F1E7210E7545AA00778F12 /* Drawable.cpp in Sources */, + A0F1E7220E7545AA00778F12 /* Font.cpp in Sources */, + A0F1E7230E7545AA00778F12 /* FontLoader.cpp in Sources */, + A0F1E7250E7545AA00778F12 /* glew.c in Sources */, + A0F1E7290E7545AA00778F12 /* GraphicsContext.cpp in Sources */, + A0F1E72B0E7545AA00778F12 /* Image.cpp in Sources */, + A0F1E72C0E7545AA00778F12 /* ImageLoader.cpp in Sources */, + A0F1E72F0E7545AA00778F12 /* jcapimin.c in Sources */, + A0F1E7300E7545AA00778F12 /* jcapistd.c in Sources */, + A0F1E7310E7545AA00778F12 /* jccoefct.c in Sources */, + A0F1E7320E7545AA00778F12 /* jccolor.c in Sources */, + A0F1E7330E7545AA00778F12 /* jcdctmgr.c in Sources */, + A0F1E7340E7545AA00778F12 /* jchuff.c in Sources */, + A0F1E7360E7545AA00778F12 /* jcinit.c in Sources */, + A0F1E7370E7545AA00778F12 /* jcmainct.c in Sources */, + A0F1E7380E7545AA00778F12 /* jcmarker.c in Sources */, + A0F1E7390E7545AA00778F12 /* jcmaster.c in Sources */, + A0F1E73A0E7545AA00778F12 /* jcomapi.c in Sources */, + A0F1E73C0E7545AA00778F12 /* jcparam.c in Sources */, + A0F1E73D0E7545AA00778F12 /* jcphuff.c in Sources */, + A0F1E73E0E7545AA00778F12 /* jcprepct.c in Sources */, + A0F1E73F0E7545AA00778F12 /* jcsample.c in Sources */, + A0F1E7400E7545AA00778F12 /* jctrans.c in Sources */, + A0F1E7410E7545AA00778F12 /* jdapimin.c in Sources */, + A0F1E7420E7545AA00778F12 /* jdapistd.c in Sources */, + A0F1E7430E7545AA00778F12 /* jdatadst.c in Sources */, + A0F1E7440E7545AA00778F12 /* jdatasrc.c in Sources */, + A0F1E7450E7545AA00778F12 /* jdcoefct.c in Sources */, + A0F1E7460E7545AA00778F12 /* jdcolor.c in Sources */, + A0F1E7480E7545AA00778F12 /* jddctmgr.c in Sources */, + A0F1E7490E7545AA00778F12 /* jdhuff.c in Sources */, + A0F1E74B0E7545AA00778F12 /* jdinput.c in Sources */, + A0F1E74C0E7545AA00778F12 /* jdmainct.c in Sources */, + A0F1E74D0E7545AA00778F12 /* jdmarker.c in Sources */, + A0F1E74E0E7545AA00778F12 /* jdmaster.c in Sources */, + A0F1E74F0E7545AA00778F12 /* jdmerge.c in Sources */, + A0F1E7500E7545AA00778F12 /* jdphuff.c in Sources */, + A0F1E7510E7545AA00778F12 /* jdpostct.c in Sources */, + A0F1E7520E7545AA00778F12 /* jdsample.c in Sources */, + A0F1E7530E7545AA00778F12 /* jdtrans.c in Sources */, + A0F1E7540E7545AA00778F12 /* jerror.c in Sources */, + A0F1E7560E7545AA00778F12 /* jfdctflt.c in Sources */, + A0F1E7570E7545AA00778F12 /* jfdctfst.c in Sources */, + A0F1E7580E7545AA00778F12 /* jfdctint.c in Sources */, + A0F1E7590E7545AA00778F12 /* jidctflt.c in Sources */, + A0F1E75A0E7545AA00778F12 /* jidctfst.c in Sources */, + A0F1E75B0E7545AA00778F12 /* jidctint.c in Sources */, + A0F1E75C0E7545AA00778F12 /* jidctred.c in Sources */, + A0F1E75E0E7545AA00778F12 /* jmemmgr.c in Sources */, + A0F1E75F0E7545AA00778F12 /* jmemnobs.c in Sources */, + A0F1E7640E7545AA00778F12 /* jquant1.c in Sources */, + A0F1E7650E7545AA00778F12 /* jquant2.c in Sources */, + A0F1E7660E7545AA00778F12 /* jutils.c in Sources */, + A0F1E7680E7545AA00778F12 /* png.c in Sources */, + A0F1E76B0E7545AA00778F12 /* pngerror.c in Sources */, + A0F1E76C0E7545AA00778F12 /* pnggccrd.c in Sources */, + A0F1E76D0E7545AA00778F12 /* pngget.c in Sources */, + A0F1E76E0E7545AA00778F12 /* pngmem.c in Sources */, + A0F1E76F0E7545AA00778F12 /* pngpread.c in Sources */, + A0F1E7700E7545AA00778F12 /* pngread.c in Sources */, + A0F1E7710E7545AA00778F12 /* pngrio.c in Sources */, + A0F1E7720E7545AA00778F12 /* pngrtran.c in Sources */, + A0F1E7730E7545AA00778F12 /* pngrutil.c in Sources */, + A0F1E7740E7545AA00778F12 /* pngset.c in Sources */, + A0F1E7750E7545AA00778F12 /* pngtrans.c in Sources */, + A0F1E7760E7545AA00778F12 /* pngvcrd.c in Sources */, + A0F1E7770E7545AA00778F12 /* pngwio.c in Sources */, + A0F1E7780E7545AA00778F12 /* pngwrite.c in Sources */, + A0F1E7790E7545AA00778F12 /* pngwtran.c in Sources */, + A0F1E77A0E7545AA00778F12 /* pngwutil.c in Sources */, + A0F1E77C0E7545AA00778F12 /* Matrix3.cpp in Sources */, + A0F1E77D0E7545AA00778F12 /* PostFX.cpp in Sources */, + A0F1E77E0E7545AA00778F12 /* RenderTarget.cpp in Sources */, + A0F1E77F0E7545AA00778F12 /* RenderWindow.cpp in Sources */, + A0F1E7800E7545AA00778F12 /* Shape.cpp in Sources */, + A0F1E7810E7545AA00778F12 /* image_DXT.c in Sources */, + A0F1E7830E7545AA00778F12 /* SOIL.c in Sources */, + A0F1E7850E7545AA00778F12 /* stb_image_aug.c in Sources */, + A0F1E7890E7545AA00778F12 /* Sprite.cpp in Sources */, + A0F1E78A0E7545AA00778F12 /* String.cpp in Sources */, + A0F1E78B0E7545AA00778F12 /* View.cpp in Sources */, + A0F1E78C0E7545AA00778F12 /* adler32.c in Sources */, + A0F1E78D0E7545AA00778F12 /* compress.c in Sources */, + A0F1E78E0E7545AA00778F12 /* crc32.c in Sources */, + A0F1E7900E7545AA00778F12 /* deflate.c in Sources */, + A0F1E7920E7545AA00778F12 /* inffast.c in Sources */, + A0F1E7950E7545AA00778F12 /* inflate.c in Sources */, + A0F1E7970E7545AA00778F12 /* inftrees.c in Sources */, + A0F1E7990E7545AA00778F12 /* trees.c in Sources */, + A0F1E79B0E7545AA00778F12 /* uncompr.c in Sources */, + A0F1E79E0E7545AA00778F12 /* zutil.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0C93EB10D9A9CA000B9E0C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A0F1E7E20E7545F800778F12 /* Context.cpp in Sources */, + A0F1E7E60E7545F800778F12 /* Input.cpp in Sources */, + A0F1E8070E7545F800778F12 /* VideoMode.cpp in Sources */, + A0F1E80F0E7545F800778F12 /* Window.cpp in Sources */, + A0F1E8100E7545F800778F12 /* WindowImpl.cpp in Sources */, + A04C59B00EDDBA9C00935061 /* AppController.mm in Sources */, + A04C59B10EDDBA9C00935061 /* Joystick.cpp in Sources */, + A04C59B30EDDBA9C00935061 /* VideoModeSupport.cpp in Sources */, + A04C59B80EDDBA9C00935061 /* WindowImplCocoa.mm in Sources */, + A0CE9FE80F46F72500FD00CE /* GLKit.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + A012F5800E0FF91B0022FB0F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3740D8BF86E002236B4 /* SFML */; + targetProxy = A012F57F0E0FF91B0022FB0F /* PBXContainerItemProxy */; + }; + A012F5820E0FF9310022FB0F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3740D8BF86E002236B4 /* SFML */; + targetProxy = A012F5810E0FF9310022FB0F /* PBXContainerItemProxy */; + }; + A017FF8B0E51E06400A4C078 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E37E0D8BF87A002236B4 /* sfml-system */; + targetProxy = A017FF8A0E51E06400A4C078 /* PBXContainerItemProxy */; + }; + A07EA05B0DB657A9007C7747 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A0C93EB30D9A9CA000B9E0C8 /* sfml-window */; + targetProxy = A07EA05A0DB657A9007C7747 /* PBXContainerItemProxy */; + }; + A07EA05D0DB657C0007C7747 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A0C93EB30D9A9CA000B9E0C8 /* sfml-window */; + targetProxy = A07EA05C0DB657C0007C7747 /* PBXContainerItemProxy */; + }; + A093E54A0D8BFEB9002236B4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E37E0D8BF87A002236B4 /* sfml-system */; + targetProxy = A093E5490D8BFEB9002236B4 /* PBXContainerItemProxy */; + }; + A0B4CD3A0D96B11500DEEE0F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3740D8BF86E002236B4 /* SFML */; + targetProxy = A0B4CD390D96B11500DEEE0F /* PBXContainerItemProxy */; + }; + A0F0BA860D92E52300056981 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3990D8BF89B002236B4 /* sfml-audio */; + targetProxy = A0F0BA850D92E52300056981 /* PBXContainerItemProxy */; + }; + A0F0BA880D92E52300056981 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3A20D8BF8A2002236B4 /* sfml-graphics */; + targetProxy = A0F0BA870D92E52300056981 /* PBXContainerItemProxy */; + }; + A0F0BA8A0D92E52300056981 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E3870D8BF885002236B4 /* sfml-network */; + targetProxy = A0F0BA890D92E52300056981 /* PBXContainerItemProxy */; + }; + A0F0BA8C0D92E52300056981 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A093E37E0D8BF87A002236B4 /* sfml-system */; + targetProxy = A0F0BA8B0D92E52300056981 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + A02679C20E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ); + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../../extlibs/bin/x86_64"; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = 4.0; + GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO; + GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = NO; + GCC_WARN_CHECK_SWITCH_STATEMENTS = NO; + GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO; + GCC_WARN_MISSING_PARENTHESES = NO; + GCC_WARN_SHADOW = NO; + GCC_WARN_SIGN_COMPARE = NO; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/../../src", + "${SRCROOT}/../../include", + "$(SRCROOT)/../../extlibs/headers", + ); + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OBJROOT = build; + OTHER_CFLAGS = ""; + SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = ../../lib; + }; + name = Debug; + }; + A02679C30E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ); + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../../extlibs/bin/x86_64"; + GCC_OPTIMIZATION_LEVEL = 2; + GCC_VERSION = 4.0; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = NO; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = NO; + GCC_WARN_MISSING_PARENTHESES = NO; + GCC_WARN_SHADOW = NO; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNUSED_VARIABLE = NO; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/../../src", + "${SRCROOT}/../../include", + "$(SRCROOT)/../../extlibs/headers", + ); + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OBJROOT = build; + OTHER_CFLAGS = ""; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DNDEBUG", + ); + SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; + SYMROOT = ../../lib; + }; + name = Release; + }; + A02679C50E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = All; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679C60E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = All; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679C80E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "SFML-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = SFML; + SECTORDER_FLAGS = ""; + SYMROOT = ../../lib; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679C90E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "SFML-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = SFML; + SECTORDER_FLAGS = ""; + SYMROOT = ../../lib; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679CB0E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-audio-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenAL, + "-framework", + sndfile, + "-framework", + "sfml-system-d", + ); + PRODUCT_NAME = "sfml-audio-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679CC0E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-audio-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "-framework", + OpenAL, + "-framework", + sndfile, + "-framework", + "sfml-system", + ); + PRODUCT_NAME = "sfml-audio"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679CE0E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-graphics-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-lfreetype", + "-framework", + "sfml-system-d", + "-framework", + "sfml-window-d", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-graphics-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679CF0E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-graphics-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-lfreetype", + "-framework", + "sfml-system", + "-framework", + "sfml-window", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-graphics"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679D10E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-network-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-network-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679D20E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-network-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-network"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679D40E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-system-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + CoreFoundation, + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-system-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679D50E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-system-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + CoreFoundation, + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-system"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A02679D70E5CDB03008D4C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 2; + INFOPLIST_FILE = "sfml-window-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_CPLUSPLUSFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-framework", + ApplicationServices, + "-framework", + Cocoa, + "-framework", + "sfml-system-d", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-window-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Debug; + }; + A02679D80E5CDB03008D4C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 2; + INFOPLIST_FILE = "sfml-window-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_CPLUSPLUSFLAGS = "-DNDEBUG"; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-framework", + ApplicationServices, + "-framework", + Cocoa, + "-framework", + "sfml-system", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-window"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + A0C9DDC80E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)"; + ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64; + CONFIGURATION_BUILD_DIR = ../../lib; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../../extlibs/bin/x86_64"; + GCC_DEBUGGING_SYMBOLS = full; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = 4.0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/../../src", + "${SRCROOT}/../../include", + "$(SRCROOT)/../../extlibs/headers", + ); + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OBJROOT = build; + OTHER_CFLAGS = "-g3"; + SDKROOT = ""; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = ../../lib; + }; + name = Development; + }; + A0C9DDC90E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = All; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCA0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "SFML-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = SFML; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCB0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-audio-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenAL, + "-framework", + sndfile, + "-framework", + "sfml-system-d", + ); + PRODUCT_NAME = "sfml-audio-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCC0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-graphics-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-lfreetype", + "-framework", + "sfml-system-d", + "-framework", + "sfml-window-d", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-graphics-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCD0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = "sfml-network-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-network-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCE0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + GCC_VERSION = 4.2; + INFOPLIST_FILE = "sfml-system-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + CoreFoundation, + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-system-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; + A0C9DDCF0E8BE5D10084CFD8 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 2; + INFOPLIST_FILE = "sfml-window-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_CFLAGS = ""; + OTHER_CPLUSPLUSFLAGS = ""; + OTHER_LDFLAGS = ( + "-framework", + OpenGL, + "-framework", + ApplicationServices, + "-framework", + Cocoa, + "-framework", + "sfml-system-d", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = "sfml-window-d"; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Development; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A02679DD0E5CDB03008D4C81 /* Build configuration list for PBXProject "SFML with Intel 64 bits" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679C30E5CDB03008D4C81 /* Release */, + A02679C20E5CDB03008D4C81 /* Debug */, + A0C9DDC80E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679DE0E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "SFML" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679C90E5CDB03008D4C81 /* Release */, + A02679C80E5CDB03008D4C81 /* Debug */, + A0C9DDCA0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679DF0E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-system" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679D50E5CDB03008D4C81 /* Release */, + A02679D40E5CDB03008D4C81 /* Debug */, + A0C9DDCE0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679E00E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-network" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679D20E5CDB03008D4C81 /* Release */, + A02679D10E5CDB03008D4C81 /* Debug */, + A0C9DDCD0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679E10E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-audio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679CC0E5CDB03008D4C81 /* Release */, + A02679CB0E5CDB03008D4C81 /* Debug */, + A0C9DDCB0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679E20E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-window" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679D80E5CDB03008D4C81 /* Release */, + A02679D70E5CDB03008D4C81 /* Debug */, + A0C9DDCF0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679E30E5CDB03008D4C81 /* Build configuration list for PBXNativeTarget "sfml-graphics" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679CF0E5CDB03008D4C81 /* Release */, + A02679CE0E5CDB03008D4C81 /* Debug */, + A0C9DDCC0E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A02679E40E5CDB03008D4C81 /* Build configuration list for PBXAggregateTarget "All" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A02679C60E5CDB03008D4C81 /* Release */, + A02679C50E5CDB03008D4C81 /* Debug */, + A0C9DDC90E8BE5D10084CFD8 /* Development */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A093E36A0D8BF860002236B4 /* Project object */; +} From 7cd315c38b58bbbf707c4479a2e03af94f4d3560 Mon Sep 17 00:00:00 2001 From: ceylo Date: Fri, 29 Jan 2010 07:35:10 +0000 Subject: [PATCH 06/13] Added missing ppc architecture. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1383 4e206d99-4929-0410-ac5d-dfc041789085 --- build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj b/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj index a3276463..bf414e04 100644 --- a/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj +++ b/build/xcode/SFML with Intel 64 bits.xcodeproj/project.pbxproj @@ -1711,6 +1711,7 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = ( + ppc, i386, x86_64, ); @@ -1748,6 +1749,7 @@ isa = XCBuildConfiguration; buildSettings = { ARCHS = ( + ppc, i386, x86_64, ); From f96a3864bcfa1e4ba8ba91ada832cfb0ee8d2f35 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Sat, 30 Jan 2010 11:37:53 +0000 Subject: [PATCH 07/13] Fixed wrong project name :D git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1386 4e206d99-4929-0410-ac5d-dfc041789085 --- include/SFML/Graphics/Matrix3.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/SFML/Graphics/Matrix3.inl b/include/SFML/Graphics/Matrix3.inl index 73c78b70..44994157 100644 --- a/include/SFML/Graphics/Matrix3.inl +++ b/include/SFML/Graphics/Matrix3.inl @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////// // -// SFGE - Simple and Fast Game Engine +// SFGE - Simple and Fast Multimedia Library // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. From ec2fe136f9285d97151537c24256e65a6124fb43 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Tue, 2 Feb 2010 07:49:27 +0000 Subject: [PATCH 08/13] Fixed sound streams sometimes being stuck after looping once git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1387 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Audio/SoundStream.cpp | 33 +++++++++++++++++++-------------- src/SFML/Network/SocketTCP.cpp | 26 +++++++++++++------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/SFML/Audio/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index bd776edf..9530d785 100644 --- a/src/SFML/Audio/SoundStream.cpp +++ b/src/SFML/Audio/SoundStream.cpp @@ -253,14 +253,7 @@ void SoundStream::Run() if (!RequestStop) { if (FillAndPushBuffer(BufferNum)) - { - // User requested to stop: check if we must loop or really stop - if (!myLoop || !OnStart()) - { - // Not looping or restart failed: request stop - RequestStop = true; - } - } + RequestStop = true; } } @@ -293,11 +286,26 @@ bool SoundStream::FillAndPushBuffer(unsigned int BufferNum) Chunk Data = {NULL, 0}; if (!OnGetData(Data)) { + // Mark the buffer as the last one (so that we know when to reset the playing position) myEndBuffers[BufferNum] = true; - RequestStop = true; + + // Check if the stream must loop or stop + if (myLoop && OnStart()) + { + // If we succeeded to restart and we previously had no data, try to fill the buffer once again + if (!Data.Samples || (Data.NbSamples == 0)) + { + return FillAndPushBuffer(BufferNum); + } + } + else + { + // Not looping or restart failed: request stop + RequestStop = true; + } } - // Create and fill the buffer, and push it to the queue + // Fill the buffer if some data was returned if (Data.Samples && Data.NbSamples) { unsigned int Buffer = myBuffers[BufferNum]; @@ -324,10 +332,7 @@ bool SoundStream::FillQueue() for (int i = 0; (i < BuffersCount) && !RequestStop; ++i) { if (FillAndPushBuffer(i)) - { - if (!myLoop || !OnStart()) - RequestStop = true; - } + RequestStop = true; } return RequestStop; diff --git a/src/SFML/Network/SocketTCP.cpp b/src/SFML/Network/SocketTCP.cpp index 6de4b081..61a01bc2 100644 --- a/src/SFML/Network/SocketTCP.cpp +++ b/src/SFML/Network/SocketTCP.cpp @@ -133,20 +133,20 @@ Socket::Status SocketTCP::Connect(unsigned short Port, const IPAddress& HostAddr // Wait for something to write on our socket (which means that the connection request has returned) if (select(static_cast(mySocket + 1), NULL, &Selector, NULL, &Time) > 0) - { - // At this point the connection may have been either accepted or refused. - // To know whether it's a success or a failure, we try to retrieve the name of the connected peer + { + // At this point the connection may have been either accepted or refused. + // To know whether it's a success or a failure, we try to retrieve the name of the connected peer SocketHelper::LengthType Size = sizeof(SockAddr); - if (getpeername(mySocket, reinterpret_cast(&SockAddr), &Size) != -1) - { - // Connection accepted - Status = Socket::Done; - } - else - { - // Connection failed - Status = SocketHelper::GetErrorStatus(); - } + if (getpeername(mySocket, reinterpret_cast(&SockAddr), &Size) != -1) + { + // Connection accepted + Status = Socket::Done; + } + else + { + // Connection failed + Status = SocketHelper::GetErrorStatus(); + } } else { From e79415209fe833b32bce0cacc14577d6554b72d0 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Thu, 4 Feb 2010 10:51:22 +0000 Subject: [PATCH 09/13] Made audio capture work in Mac OS X 10.5 / 10.6 git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1391 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Audio/SoundRecorder.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SFML/Audio/SoundRecorder.cpp b/src/SFML/Audio/SoundRecorder.cpp index ac787b2a..c12a49d5 100644 --- a/src/SFML/Audio/SoundRecorder.cpp +++ b/src/SFML/Audio/SoundRecorder.cpp @@ -137,7 +137,8 @@ bool SoundRecorder::CanCapture() { ALCdevice* Device = priv::AudioDevice::GetInstance().GetDevice(); - return alcIsExtensionPresent(Device, "ALC_EXT_CAPTURE") != AL_FALSE; + return (alcIsExtensionPresent(Device, "ALC_EXT_CAPTURE") != AL_FALSE) || + (alcIsExtensionPresent(Device, "ALC_EXT_capture") != AL_FALSE); // "bug" in Mac OS X 10.5 and 10.6 } From d4a5384da10633e853cf88c1460958267d5a2b2e Mon Sep 17 00:00:00 2001 From: ceylo Date: Fri, 5 Feb 2010 19:26:20 +0000 Subject: [PATCH 10/13] Added "hack" to allow window import with Qt. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1393 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Window/Cocoa/WindowImplCocoa.mm | 41 ++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/SFML/Window/Cocoa/WindowImplCocoa.mm b/src/SFML/Window/Cocoa/WindowImplCocoa.mm index 4f6afddf..b3f426b3 100644 --- a/src/SFML/Window/Cocoa/WindowImplCocoa.mm +++ b/src/SFML/Window/Cocoa/WindowImplCocoa.mm @@ -90,16 +90,35 @@ myWheelStatus(0.0f) { if (Handle) { - if (![(NSWindow *)Handle isKindOfClass:[NSWindow class]]) - std::cerr << "Cannot import this Window Handle because it is not a object" - << "(or one of its subclasses). You gave a <" - << [[(NSWindow *)Handle className] UTF8String] - << "> object." << std::endl; + NSWindow *cocoaWindow = nil; + + if ([(id)Handle isKindOfClass:[NSWindow class]]) + { + cocoaWindow = (NSWindow *)Handle; + NSLog(@"detected window object"); + } + else if ([(id)Handle isKindOfClass:[NSView class]]) + { + cocoaWindow = [(NSView *)Handle window]; + NSLog(@"detected view object"); + } else + { + std::cerr + << "Cannot import this Window Handle because it is neither" + << "a nor object" + << "(or any of its subclasses). You gave a <" + << [[(id)Handle className] UTF8String] + << "> object." + << std::endl; + + } + + if (cocoaWindow) { // We create the window according to the given handle - myWrapper = [[WindowWrapper alloc] initWithWindow:(NSWindow *)Handle + myWrapper = [[WindowWrapper alloc] initWithWindow:cocoaWindow settings:params delegate:this]; @@ -115,6 +134,16 @@ myWheelStatus(0.0f) std::cerr << "Failed to make the public window" << std::endl; } } + else + { + std::cerr + << "Could not get a valid NSWindow object from the given handle" + << " (%p <" + << [[(id)Handle className] UTF8String] + << ">" + << std::endl; + } + } } From 37c9dd8ac420b3d99a84bc0e2b640707df6901f2 Mon Sep 17 00:00:00 2001 From: ceylo Date: Fri, 5 Feb 2010 19:31:43 +0000 Subject: [PATCH 11/13] Oops. Dropped debug message. git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1394 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Window/Cocoa/WindowImplCocoa.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SFML/Window/Cocoa/WindowImplCocoa.mm b/src/SFML/Window/Cocoa/WindowImplCocoa.mm index b3f426b3..b1fe2204 100644 --- a/src/SFML/Window/Cocoa/WindowImplCocoa.mm +++ b/src/SFML/Window/Cocoa/WindowImplCocoa.mm @@ -92,15 +92,15 @@ myWheelStatus(0.0f) { NSWindow *cocoaWindow = nil; + // Classical window import if ([(id)Handle isKindOfClass:[NSWindow class]]) { cocoaWindow = (NSWindow *)Handle; - NSLog(@"detected window object"); } + // Qt "window" import else if ([(id)Handle isKindOfClass:[NSView class]]) { cocoaWindow = [(NSView *)Handle window]; - NSLog(@"detected view object"); } else { From 7878edc82458efd8122ecc925fb6aa0e96d9f450 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Sun, 7 Feb 2010 21:22:10 +0000 Subject: [PATCH 12/13] Minor code refactoring git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1395 4e206d99-4929-0410-ac5d-dfc041789085 --- dotnet/extlibs/csfml-audio.dll | Bin 102400 -> 92672 bytes dotnet/extlibs/csfml-graphics.dll | Bin 1163264 -> 1150464 bytes dotnet/extlibs/csfml-window.dll | Bin 40960 -> 44032 bytes src/SFML/Window/Win32/WindowImplWin32.cpp | 14 +++++--------- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/dotnet/extlibs/csfml-audio.dll b/dotnet/extlibs/csfml-audio.dll index cc3a3ca69db7aa99e603ee46934440d31630f893..14becea15f3674f37f717dd21ff9f094a276b81b 100644 GIT binary patch delta 46797 zcmbTf33wD$);Hc;LIVxeNQX4gKm!d1I$|IZ6Dw*0Nhd%ESx5pB5`9GmBZDa2fYPLc zoj{743TU~Ej_WthtIjy;42rl6W-|fVL9|a z%em*Cd$xP-sY=!J(N!NuZB5l_v=84hW7*-|f4cGUm-j8{{@?lCq9sq@x%T3MB?`Zm zEqR33?_Dw!*T1jWzT{zEK5I!0zveD^l3%kT<>it7rTkiO_npfK_QPYXx8-GOG&$NR z%~KCn%+W;toz&>Y4%GJ7Xa;LFng!v)Oat!CxVPgG=cTX zZ0+b_4Rf`c>jr5w*{NF1T57jat9e8B@YtcIDy?SaK#eACoK|CdcmP5+cF$9ZH?MAPAMI7t?wS2*1Y5eD#^<)EG~KB8b=`P$ zccs=excld+mhgbgm5|rwB6@1tTxsD;23^$uoDNfBKlKmcpE?JaE4L3BIiZ;SSgigI zMdvacMyiD=YD(<_{>1=i;ot_~w^+R`+*2tVGIkE&GM6cg z-^2*SXrN~bJWEt`y*H?;Wa#*(EcqkX?HyoJqs zF=cfZ*t&<3`5k>2aPQsXXq}-&R7Qn?1_>Ev6~@0@j@Jgs~6Spx7``@ymrb0YY*oyktWdUKmgc}C6e1=QsciRc9$#7>;QP)s@jyP zu^GD9Ztw6HzV60I$Yi09_{x!Od5ATT+A9zObOesJ`a{F=R`4R z0Cb=h^D@;OcHf9Onrn8uuV)!M?LJnSP@>5axmkZC>bz3kxcOtlsuTG^`Qb zdss0tKG@&$>jk0pz#?EtjBU|tfqYxPI{F1MNjJ2*Y#R0OSKyxmpo_()QCp!|!DHRR zdgIr4#A=k6MR*HpCn5s=Q|7`V4u6Hcs6ro#c@&5zHUPV&k}GZ6v0B%R#1IjIRzSGY zO@u6e2t?qFQCsR5s(u63s;abUgz7Ghl@L+g{WO}I2G7vs498GUe-tzu6x)bVzGEOl zN~yylR7*g;!x*9SR_3yVz^kB^l~XH*D2NqypnYN}v4QPN8R8z8=5I9kyY$}wbm&-D zmG_o3jeCGpmfD(uyN*%dI9vWQgI%L32*qp-_m4aDJs@a{Q>(m=p&E~G2u&p6GM`8k z$Td_;*mySZ!HLn;KS2^9ZPx^&9tDx}gEoiyJctYR!Dm=w1S_D~B|XttJql33y+X6B zKU7>^D5ehMa!PjM#@}KoFI!A%z8MO@P|U{sNDGlCx#FeV1og>ez}TgJIUQoQTXH3d zjmldiU(iK=sVuNLb+uNd#^#8YybfbcgYvp<36;c*x_KZLmMir#6fYh%N%w|TsU0;r zDy@3A=YsOisIkc}Vxg+mf30cDyaXa^Jf^nHQ&=HQ`$PC)!`KW1%SbR!XaM)LW?s_z zyVBe#@)CzeF^_(}KRRKCA;5lT^yvO`+7s~rR#r}qPKck=v5#dMnVHQtRA?&<`dy)z zm3DAqc$^(?j?rME9%H+RKHE~q?A1+pew@a)^i-{T*zcA&+wm)DdwEc$9Pk_XfIkQ5YdEo-}=^0Hb>v^SOF(5`a^& zx{zS@i=Y%9((ACO|G7_B6fEl(X4lKCgfj5pKYhjd~R~&~vGIzGZs!$qyX~W;n9ZCs^vRv+G{ubFlNeg3wWPLF0tH zWdnNJrUnMhhh;_&2t{Dfa>y1$i#I@r;2E@!3(j}g^Y9Y~`~Wu|G>pp!qHzVw3}Hmy z80$kn;K6dKg$=jKfQMTHZtVn-T7s%C6XtxH$py=FU_Gp4-)Uy>X;MY+G=W22-ZFa+ z&ZXh`CHY&Dcqz@y*FCkdJp zGWuJI!}*Gm6%R9+QT@t}6^-`Ml9s{y==leu(fMnm(QCy&p91yL&=y?>@6Tc#_vd z79Ma@gK0(w5}O+*y> z{Ynzh9+CjACrQZXlEC>qo(lnq2;?uq;BR2rFm5WR?f)bQ-4y0i%*f+{(07XS9eI3; z5djHLkq|D;k8nI8yo}E+ECvO9$$O_2W_Ug=-l|6mXzn?Vcv6d8yDjcrTiewlq2$Cl zqO4_NzCrQCIio5p>RX>EQIi(=3O8dQHS_VJl7I`BhOY&DdeCdT@vaLtj~?V+UD)X{eX` zL^&@uvUDp;Gr()nQL$$v^JoZRaiwWhG@5HV^nk&8oFb%I|FXr>0-r%LO4&v!&$Os} z7n0Akn4ln;9J0wl=0&~9Mn<(;89=wFUFZ93?uHz_YD>aqWxzNJ>Jmr_{Ml%3nqiW= z0R+>tyKndI^#LjX`YSUu?o#F|b-ET59_lJ$*Acx-JUT3J?g9qElLoTNQfK7?R$S^V zUT`RM=pwIlEnvABY)DBSXc#&u%`~vwQfKah@1bm0?^&0EL&C40Is2cAtA=Re09KNnw62y$`i+8 z769!RUd2zrvNyq$dFt*?KFjVY5y6Z!q4Y39CZG(???yR{u1THQgYJx9%*aGdfbO_% zbo)opz3)sY^oEw8ce50(P{4`9m7_^he3QQa^)y@yz>ujD(`8Vnw1+~$Gl>nD2dycH z2hp+S$+M%HwGzdhyk98q_ahKb=4qYWtq=Ul!v3);Kb8a>5w=IQB*@&gm@N9phuBKtlzZc1dH2`M9 zn1#iO$7nb+X3-ra5`T7QZXnOpw>nDw`KwTAeguT~|2WkHS zXHsnJ6T!l6Ov*t#0h=lq9s@-!)HK2oC8oZ#v~^ghu^}k&oOi%08L4e6uDcR{tdIj5>kjH08Y$$7HxyjDlq(c`x-3#VQ>elLe5vOsc zCmrhQh5|lXa5W!+jj(gaW}n?m*kOJqm;sjSh~WGwb2&g{EBEA=5uSOlCa}wetkma7 z%P&+XT??k_^0zp!J#&Dcp@p$i3AuAwS+cV%i4`Y1i<1uh3{BXLU~UrYhX6-mK05$q z){m4LJAj^cTKLf6^0GIyi-=8oc$Db+0%-y^h*Uw|vN(sf(zCA zP*{|wwv9vGF4boqi>q35+LIMlROo97qgb%)eQ3kHWq-hLz8ZjV14BaRcEVq6>n$L? zyqF_Lddx*K2-Bi($g7}DbuM{jC62rzxGy|g$q;317q-MG2Zwzmh zdKljd!G+Ae_ZtWsfiTfKE*zq?sx5YobsS+GPdG!O;=r#Obv6c)v*Lg{5x>=!;c!H- zZ$sz?4IYFi8_Y^W$2j0wfVl%eMjlO5rw$6ENe_{z7#Na`;@Sdx=Z zRCI>I3oEoESoH*di@m4-OML^ea*o4Vu1rfE4TlQzI`bRzG8M7*;u6psp&AWQm}QnS z4fABk>oeM*BM4)x67AnCg{<6)4gWc}LF{x#v`Y$Pz@1!k&XW+aUyu;dW$jTuz<|v% z`P9MiBd{PA)e{9Fb~`K`+t~Du!~XRSjhyLNJ+(tJaxQ zMDrW=$rM@W64tIxqTZb_P#}SYVAA^4oD-`5gDVMCEvcscETC@TH$)}%QQTH&_4kJ*ikN3Org6L*A#}elZl<96)56v^DuH zaWtLKVMKp16ErpT&Zb9Q)2=6`S7qlfJBS4>Q0IR;^j9i7{aYpHR_mY$RKT3puvnR% zJkD3L>}9UzJHPo=pX1@8K58CRMZc>s=}~OB0nc6YD+=dBfmspyZO0^Ra6w-h9j37n zG&Z(DT6mzIh#VjyQ`qz;dxXlD_zj5aP_@t+eW;wEZY5?ZF*{34eQY0yjNrb36ZtSF zGAN0G=`3WQx~~f|G7MzaMTl$}Gn2g-#H}JHasINn2}InFz9vGB z>^7#0h#(lCPe;Xf>oA`WURA^ zo|l2<+2Tj;+1U5su2>oZI_HQ7-2>RPLS~glNC}JNbn;A=aG+*L@e(OP!n2%i1I%S* z1QdgzgpaiZg%nI(844vq6sP>mHPSNHR^CI^mEC5J&z<$}yYFgNuD^DyV!qa{0(3;R9NvRjZJ;Rrz^VtZV~=9%j2$Ccp^036XRI@SS5w84g@>wLm7_h({^gAkQ)T8_ZZMmHf{24 zW})UX*cEdT*BZj^p!`Q-;N)^t{fnxi#V*fXO5=5w@CMMuLlqu3GbS%IdyMdE0mXd> z%jVA(X0E->oX7UHrkOSBE;4{FlH% ztuAzUf;vR=Fv-ve#L>)*0X(s-X+AUI$*!=~212%G4%9@))G!_vfbKJJ6~MFT-f?LF z8a5g5Ys)F(377Pa2AVhmR0jBkH4Uo`*;1wrD?`#<%8E1~9G-F{b40uPH2#+Pd>A=!Tv59+$)WEJ|H=E7@Lb?!lGDHB<6#EDkT=*ri;WJ|YsSK#T z4L%z-2)Ew9aG6_iO-{Wxa%Aryaa%y*7RQh5e`o@Yp^R9TmE29YV|j(9Ag?%2z4#r5 zS5f>PcIX;yxlQc!n5AU~lt^)Go>jWr*f9?0cFQ#GLDCeIiV2=;q_~d3(h4J4tr$WIJuTT^E$4&UoEZ7nDbxiCU|&%Xz(zLU-UROl%1g$^dtgdOOl@{lPLm}E5PQ}WwVl!)UHXiDF2g2ra?h^N` zic-Jd9}4N4#V)}Q3BrNzq4sxq?IH2gRRl$+zaVxY6xvmxDN%oa01KUKLR2)v;czwr zBap+Oku6r3Er)wZUVdI-m>}SjB)_i(JM!x^vWYCEqvrJLAy_s$8ud~QG)0+>uyPMY zCkM8USJxxLWp?g5bV1)9j!q@K$GukBvQ9SKQ%<3mVuV%9Akack9)k>}LG-7K@{4?Z z#=+dN<^@F1;pa#!&2s8U+0-weO8QYrxP|^x-sY#DLLqG>ttbcEO>pjmE%=oeLAgee zD2!Qs{N3&-jIU1^2CQjk>&(t|CeXrqC?w^Yq+ByXLhjppB1U)Y3x)Da)B#wMaG*#w ztd(3AbOWVR*7fj95xd7E-b38l9piFdJ`|D-x5}wT_n^F@Je&*=SNi-dW~tIl{*(Ea zhcdlqS=cd?;J}B3Dqw4@IMX7f{da9Gx_QR1p<79(u~NA6B2uX47F4dG%q%fQuNYnoBZRiFv} zhN}JtD*~`!2@A_KiTYJjX%>aWbc|>(0FZAl{NI4EVUVD5t}p;x(*s=Dk`Swl{z`c{ zVUlm%mly}moWI3dQdmTLM=o=2@?^o|VY%x)&7~9z2tWxJvC|N-6&7dvq03Mu)*1v@ zmO{!3A>6FFub3Txm=*4Un6-(j;D3e0Y+ppoe9lASQOMb8$XUCnLeA6*O_BNuT6fEt z{g-lP!xHz%8CDp0+DV4;N+`1TN1T8_VlXGG^P@u-+yW)hTDHM`#2RSSN6v+Opp`XWeSJIDWLQC)3ppe2rn~H6{5q`ui(r77Jo?(*jGhJO`mVNh`uP(Cq8!d1s zj4Xi-0T8~i>B(+@37|L@hW&LQn4;-C3~W@@xA=OJ0qag<~toCl)Kn=NuD4!-&1> zcF@{K!Up#0UIeX;u~V=@4DSR+uQpAg<`uu7eA~(GF;B3*~}Xq3mqxs|ddkYhW+TH1Gmw^B70s zHy&qph=+!u_wGQ$?q!h8gmNrqi4-8RfIH1TwhkMNt3yEI5AGYVow_cp+{G2W!JoON zHgd2u7|g8R_5)A=82Dl4jvWa890k$X9&!`f&tQsu$c0-_N{xd%dM+c9EZVq@m;{I5 zk#kbH?}1^s19PQ0U8y`+?@na7Y0lhKZ2T+JoRz6K8tjeOm!*=N>kwP7(3TX+x!I}! zp)X(56UQf1hyrY3T2ZllUqY|%gCr2}#Q);_d;&X+c_E~Zd0plH(I{_Fpks{=U-$85)XU@%k&FQpAI95WFEdt=KT{J*q@EI%4Jd<_x`w#OSFvq<0Qoi61D|a_X;xKgv@LcyU5K`1I*J5 z3yB50-|TNPvomC>U}Od@W%{L3w7*p+`KEP@6!-T`v|nK{ak7n!^uHi-{$?G3J3KFu zGA8I)itsjt(%`t~CK-EIrWL1{?OCsDy7``^$6d8#>U$Kd+@+pH6m;1FgnROahGO1_ zqe6#P#_9%S@@#HwR=$}%#dq*GR65Ri!qH;0`rvEuv5rCCK?$@)F9#^(FscXN;EIpu zZ%5+TSQm>_Zj#E)Qn^Jci>ob*zuFU`d@+Cx17R*(*vU+)3WEY~;0%}_X|TVn{WTy%OQJkJ=T_a@`;<@TT&Jtur$pz(&HU5zztiG821mhHg}SPEs4E@r z9_HO0|Ko?0a;{nJPbM#%Ln~FrDfi_J9~-Y#|MfSG<`?If`LqEvKX_U!vrBiZDz2IS}bk+XbSHhAzcgcyusC}tPv50}MRX2N7~d;=SUbUzR}2v-=1zWUm%`10O7g)l3=K+uYn;<Lsd<1JMFp1WuY3ym$*m?z%^MxdQwCR6P3BKyJhP^M;RzZ6X4korpvq zN}oD|gdhWQr_}N$<%fAT-G<%Dpgc#>qTN^V12pqh(gU;K@hhpw=g5J>#0rzT`mY=} z$v_90CPEJ5Z_K-Sfo9|{&y9QfO+vru-{|M=4?%qxI)KiD{zQ|7C>cU&y~mnJJyu5M zFV`*liz4OQbrVM_f6c$Pbl6|QIDpS!;Aj;^0BWIpog|nCb@pJYhp@ZXS7fUyykSri zCYQ3HZDid@0MX+bs0tdIby5WwC{%M!nNq-Xu93=n1)M7tauk==q} zUPM5+cN_-78JXH^tL+Z7(XL zN>Y$xUK&T*M=2|*(LFR$`KDxE)Ku0#KW&@1;Ar#{xdXM)iluy^_W5lq$`@;ilKLXMg z0cnkZbVNYfp9g3uH?7T;LCmTyF%UJ80Fs1^Xpi%1omo1Gjt3IoRu=u&rkKBM|J9IB zY*)_zS5B0aMQCN;Ii+{{m3NNR&H97#$2-NrZPD)oOjyTHzD@c1PEmN~VH%Xu%}h8F zTc}J~GFCXw%cvd7-dL!VElJXScAxU-k_po=ecChSEaZHFjbEzYXEom+g%nl9?Xr*r z3KgIp-^zi8Y1FY~WX#4le}(X>H_{P!aFCQ8!|#;=aqN`~3ptg}W@KHM~Dj z0+VUHD@M0{n-W0d|6YK`6O>U)uhA{OOPRWK!i2sv`b$X|DZFEW?4KT2@9xKxbxTV| z%9b~3&Q%VHsAb7go38&<-0wXHCA01H(z~>SXKc8rfoKSIiQvuVZ7Y}EsI^HZ$1#J0 zPTxO|N|+4&b+W_UU8XeOT{Y&5$6(Uy91t*~Vq!zh?#h8xsn*c_QE6hM_a|jZMSj_+ zcX004ooe?1N#Bw0X3P>lk-U#uDu0mIYQ^^*FQQbC1sZ?5Wei0VHe3u*S@miB)*P;k zi6HLxK5Er?qGs0|_MNRcEL5LTM&9$%4e4SNJalvA*mvw`?%c&Akw?DDPS>A6O=-2w zcbYxzcpi0G-GkNrsD$nrI|Q!ju8{EdLDp2*_@%jIV3RUo`SgBOsj&luO;0PoTkf4c zE;8~`X+E+^Dvg^>vH#?g_(uQX&Ge?*{ol+Gj|g@7Alu?{dYgp)DT9AMxBr~PP)emi zsNbn9`F(OsmRM=w|Xx>S_Lu(eJ=+`r7Cp47iomAZWn+(Esov=N{+2*-c*giumY=1zD`;q=D zy47(gK;3;hXRBub?)Adp-6;j^J!hMj^u?X+g6T? zDrAA0-O6Vx|G5-AV1W4p6DAV0<5Ah*+2c`Z_yrq-BT*S>3j8OqJ9y>uUGy6)edv<+ ztK$Ls51PE2P;jQZ)ElvxYYgeL6VKIzD%ZU;9@KH}D(cWHm+$*8i%Z|2ZxGKfl`>Xc z@haH!5jLytPcZ-olk)Zbla&x7FxrM!Xi`l_2v(8yo_t)}K!WrotV>el{gVzalUd@)Qyo_k_{lb9Q~ zYWQYty0XDN*1=qMI>p$56VVbbXBfpIy5jEdCsnSTw!34@W@DQ2iF-o-LDX#+b&K*$ z?0tHqZJ090W7ftgr5jXej_OV320i2p3V#l}$>;#VTkub_0dz*{ide!h| zEZ2^6q3ejm(?Mb>*WQu1c^87CU-&CmYIcw=lw59{JG$KE%DFY;Z+VH1Z&Zp2s88dT zydhP=japAn8<&9_R6n)hwD{G6E?hgtCv3kU?OcwA^0O;B^9a>&L=bvU1{%U9M1(XY zd4=lHO)>HQL4^F5L!M~l$eZ26*+v49U6ra2t-2ub7Sd~5(XMLeefZV5 zZ)JRt#NANzp~_hHY50Iq7_dEFpQhg@HbLWu*3Qu`ROUP|K`Heb754+RSbld(*-AzC z;N;P707`foNNb6^e_(`e;LU4^H$V7jjB?L|HeJ7qiu9l@rX4%!)Zcl&R8P`Pp(n^% z)en_-ADlGpJz(C)J@)ThOZa)_`**r=6Y|^>nToX0i)VCuSBY5{2Y$b0-L3eoT9>B0 zzi#rxEA=a>`NmrOVy#CLPJ^fIj$j1_FKZ^W%--SGALR_s#{@VDglpSajc)X>mxH*D zL;c;#5^s5b+V~Jh&r$Yz9YYe><5h&r0iLXV`Wtnz z;oIQ)$=Y_sP+2~s;K&coL(=0kl(dujL!;BnS1^ea*?JhGepMGj?qLyw$L8ASjDMDz zrPwyOU*rGT5Ip0(U$)fH zjPM4Qyy{Zp8J$Z>tXh&eR^LeKj+NK~26MWp6y6$8kDgOLfB3VRor7pj$IpGh>)By3vG;dT;GTE4c8bF|kh zLpLqZJ$x42Cn_&*D$)M!k=mOkjG;AxtxP=ZzhJ=1nT5Ll!>32eN+aJF=Ds^>?O3T1 z{*W%bRE1b7vw>OO2^#)F=whjUQEB|&Dowv#Nvm~6>)8OJQXY;4YlVQW2okTKrqB2U zMX=BM!%m{Ohj(^JeGrdPmF>~NhQl#F2$Sxc%Xx))0v8VYzG|UrQ zfuP-s7kd_mRY^1M5;GbWHFFp2dPYY_CBYKRc>E2EPfW7{Cs&OpU%% z9}v%bkMx28Bfe8Nzdz!<1}U=>&f+ln=4%%syNi7+-E|7VSkt?(X9FbDLuvXwVw?9I zTa34r;d4#vh*lny9m&&Ial@G<{_Oq4zdoQ7Y95BA^#80Cs%vorb$qOHFq>Q3b|d2IeF*jK$cU`q#wu)iL781|Pp!gZ)lRZs8qXl?mshEWkv9$! zRKUQ74V!jn#IW`C8OD=Ed!;@@d$)3?eunl1W$Km@TAz}$W$eUyz~ZknE$$TL4R~Pr zM%KhpW^+%m{tS~a4OF&lNy(W2-`L-R>}{d?KbT&Jpl@Qk{9kC1**%wL6Uscx7N2Ev zFJ+1AzZU9NlO@bNX%GRq?gAXJ_TkuUq~NLEtW#pQj`Gd;-zWb%u;G*cZ`@$E(b7h; za$!ntBjY4Xl-?x89YL5qUqTEFxtA3DG3lG0 zJip$=mpj1v&?rsJ{F*qR?%uv+`VZ|4GP~0JT}COhOQ?H|68`2MlyaBLceUV*iG8!U zxh=B`2=GNqY)HxMRv7lp-ZQ{b{HqKYyQHC9H*d z?hej9Db58YUqneSihew?#YV85bB{Fl1 z)Vy0cSx@#5G!F!2nJ4|3pQA;XIv`}2u=?h1%5I{9Ur;upH+PuqT8(;cIk2g7m~mg| z!`|?HhaI=F;h!{(Jf4#vCsFd9ra&$WsqfxHQ^CF)>dXWk=sZ@Vc0?wvI**m<%4Iqd4S=d$fX(4N{vsx-%u260Q`_H z*cfc`rbEM8=CSti9l`2XZ2-i+59Cza#&;lxQ@{U2v;GsYEmDJW>xm}s5ljHD3{y52 zg>|iB+xlVha*g(QKzO|u3;|&g#COB|SfWof&G0wgs5{Y!H=D&z$!3#90CHBL?jBH@ zJAsQfv=GgDec~OOG;CnDD>puVy?t#3m=y-0xIkS;%+O-NJm4)RcYB+)j~AQMWp|yC z?Q`z(w;LMUb?Hjy<2TG3O$BmJohiKK2x`-UCs8kc7%bg%$=iwOjupdDnu7nL!8-@X zdHVpy!uIrlk>_tR%7)r-e`VzpQ)XG&LFZ99=TUPQTBAX14nrdox1ojb?wtl_2ugbc zkPV=ksqu4H$p9S z2oWhz_uUD7b5|FeYi3WgRM-SI_be;w((lH9`=!N~WbeCOtX2HceM7{z3F_f?1+qK+ zKj4k>E`PHzFz3>V_F%awII}B|-4&d936+>mIg*sIzt21?=WINy6g?ZG?NaV}c8`+$ z+_*W&P20hw3*pY(q@M&H!f73J?TNS;$d z9la*aK5-UxNksvu7C0tFfo*?!?n7;VVBl}U=Siv*_Y3x$2ZCJU+)Khkf6$;qD2P{I zGdlynGq9plVeGHP!755=$+8UoX0yM|3b zw*Kt-U^Y9_c+rqAWd_J(7M(0$MVI8P5W+we@QqmJ=WH%!bSV$H4Vho(XQRA;ms8>S zK!us@X}l1XhvB5Tr}D!c^C^+7s1sVV!c5?p4}DeM_eQG1au#(WfsxmqqNE9GMWC&` zx)T$t!0}!R$su#?|^6s@}^0^KQrKOxQv7gut0-Q|12unGCN5-vALb;?8uRe z+<#*q`3_x>FpIgJNARP<9EJD34gU3?YbuLT-q@g*GWSA7pAYyOal4B(AL)|kg?O*e z&wnOm9+Zk&Kp?zXoq3QI?PYU!5zaW}&pZjd$&F-1E!v`!P`Ccyf3Ed}Eo&!CK!cR& zgHa{TglscH`J%W>ka=Jv9}!Eb2p9!AqTrYnsq*X)`}s(SeH6yF=$2d}FXGwEGVHM~e`56cUJve{2u(=KAgXq9^HGW}`=I+ITeo+g%0~4CtfXuA9 zo%w{r$zt^o$9OMc{QFMh96!Dgam@EI*n?UrC; zpgFj(6VZc~;KH-K|L))dGvt1OMGOcJ6>w28u}m|o^Jf4j3E0g&D`#vzDSPWX#U|mQ z0eq%L=OMYwD7)+7Bbc3YyX5&#+-a1GjB<|F21!k`vLa)kKNM;(E!F?MIWX%Igp?$- z6@!5Y!L($w4$QIzPX^QNf$UVEusc|&;<4NoELMZJS%T@-Kz2efEh#X|g4%Qoo|L+m zMh;Df+KLON#Rq1YsN94n<=vOECx~#<{PYeG%lw$lHA(64)ZUDEYOLsEsgRx($IA`c z-O4vF+qH@k{mM;!Hf6J3Sul8pobilNwkeU={_C$ij$N4RFE`AaDSj5nc?Ns1XRrt3 z`$8|?PeOVIHbV5;h<&E`hh)U`aT4GV>SjW7!B)kIpDbE`FWc|@2%BtgF29Kw)q{U= z`7FVV$22pf_f#Z~v)JF_=ruZFcZl-7J4+Hn($2H+xTT$)_)V!? zDb$d!!g%Bq!LNx(6DFtkDHQUPlA>a@;1F4RZ1)6yQd(7+0IyVArELAHb?Q9zAH0Vr z3P&*=>Al;R*T};Z+qz@eD|%wspZ|5tL}@3*#1LNdY$X(`OF(zpE@HR1V?0KtsAJ_y zW$ddlM(Lj+2$1@Sa?7hzO}8Hmg(|egOjU~yD(hbT^B_!Z!zpinOrY9PtxW#gD4*>h zKEsydz-!4VE<*_j8iywbZJvet>oKTYe-^q9&q*kc@95vXS*Pu(1+GDoTwPrUE=7yf zHlPB~^qy264prt4z|l#DuK!a1`>sc+MyP%t5bthC#nS0Fk`!0?v`j5VIM|_HMk;WG zYW0u>VS7yynz7WHjJx=Od^{V@+K^e4Mq6%D&%o8HzWrV(l#Tg*fZj{-j!K*Q=Sa!l zI6U)GX{N4fJ#;o)N{++EzoRq%@&?5lrlVNczFdb>pPb24h3%!2$3~PQrc19eCQv7O zSwFjGw@|$o55jiuWaXaMQgxnvJjS@^wIROw^BiEygqp+N$!wlc*lrqfM4eR61DSm9 z_P{v*M}2~*)V4z?QQzS>8UQ_k9jx-j;-vw$DGpmviSAkK0!w6cz6@}58PlAIXJwD>{fK_*ZW8b z4g2mRz3L|9=3?uys)tLtgRZT=dNY(utV$tmIkYiclaJ#o1aN9|pMno>2FFYjr9w^Ntn| zRSp2M)}@l+fsPdCK>{kz9{|p@tnHZevew-%?NFC;}B?*g1)8) z(a)Ae8EHErTFx%i{U<^Q>>D>wX{D1|Z>@UYK!a;M{rm?oPU?&_kym@a?I2WA+q9TC z$)p9_nj}4b;tgq{i+B#lre`Q~3Nr7*Cx0mFS0GnAwxUCxT<3TcvYM}6p9_wEdmuax zoHX9f*5OMAa*39;cl3*B0x)|&|NC{M1Hit*_5s}wo@?85q~! zW)P2h|AegyeV_uTy&0laew6bJC0NEGlRC$-fHEB~1?Uq~g~lv@i&?zL5v5rM%PCrWT=8wQX`fb}-ZtX;q#mVH=OFg;!hp5=+b+pPrp6z1&W^0eenQ6EZeTCv zyKS?lPCC~T^{7xAK8Y|J;hYidi56P8eqgD%0;GO6v!ftN5)!O4$r%M1R~WoIcnUz}_1K_3 z3WCe8CHSyR;WZ)wPcFchi!wFp6ud+QI-2|+8YoTR%kViVkLN^~s#_0T(|y`CPu<G32| z3LA;#rDv0I-@1{X0DCCsNB4=A07x`(fG zyogTvgVK;TUWZ{c?aRP@&c+BpN&7zms~^DeA*24Ra^Kt5_@@EN*%TfZ0}wjWO;;fh zi3j1L{Pk^{?x%k%yWhTE_u^UQ;@cAj@>l-NNXw{RtxVn_4!a4QE&E9x!D{xzbNIC$H;{t@uT%tzYnL^F`%-PMW@$UZtiR?Y!>%;^#0u;aZTLn!DWlvvfQNg;D+Ip z5=T2Bgvxy=VEBYX?g(+$s^e_5I4X@2PF}C7G-y1p;BBEH{tr4aRgHV_Iaid{^LR%z zUETG<_DOQtNIA(VcCPtz;_jN$l_SH#x!E$XFRuH%X8=EpZvVOBKB0~Rf8rLJ9*`RY z>^g-_cc3hcQuY0~?LK5cDuw+1s04*(M*3ps)0lwXi=!I6rRpvgwr34u^`tuQZlH*K z;<1!cqoMM8<+JzW`ppzehZww{Dqrl3O^0mZdw~YXj|mpVY)un4S^)_#O+wv$7|_3y zTP30Tc>we8q|h*w?<7&JjOyw!p>n6 zUD!<=3t^Z8YL1hN-9_24P9~{VIS9sST zM!jDVKd@_q+e$x3*7`=tkG%@s;BTF_k++~p_cvKY`Dqk_to(}218IJ6s9BJwqY+|k z>j#9rZ9meB{NL*n&%xcon_oixFw}!B9Xs%u6b*LSP_{47ddm;!t9+N|2{m5<*_5oy z?puZJ^DZNGA>iEOfti_iMcDp1Zb#u3W@Xe2^ugm`+|I zfYcVeRn;WO&(IUbglQc-Le5AWNrmJk!cd+@dil>fdFDv3Z4UXzXd_tlN9Y1U^6B&) zI7qX4+hG8x|L74Ah(YwA-wy|P_(+^sf3N=#IS+?nc+nvCGHY)&-6!lGv4)Y)YS)%&T|UGnQ^XVpD8^9ufbIHL_Id z*uU`>HO}D9Ro+1J(+6njIFsTLYiLMjpEY(^6Pp{qG$vYVh?H6471&MmMhiPjabA&9 zq405l0*kU*B>OP1RYPKsswhZ;X@-|X<-mV6T zC=nz!Wz9;@HQ10n(zn<{-|k3|rm`%1*&^qMi}{HDi+0bfl($JOdeX7UTjN$2_w9si zolrNljJ_3shCPuqjYAvQ4X#8zsmLErxfb|A1-6(|N(_}F^yl>FP1Y6jkKOqfA zc;6tF7`&az*B{2~VCu}Rw@!GBHJ0%5@bssi z46{etCSLauB|Zr?w2AbG@U}lGST=}s0yK&>oG;bWL7Cq+PP<=O)0Pn(c6^i%+Op&D zjjjtL@BasQ(=jdaG@Q4MZ$h3}U~8Y=BPgM5>aLr|Z>u@&#!E&kJ@?~%;M}mq_+`6? zcO{SB0ZLi8izQxkkHQ+8)q>Zsn1pThJ<4~xiY(b`=ikDN(TqgOa6m-K-F<_v&XGiP z8MS;YW`VcpXhSqgUOQ5(j9U|5F_PXrvK6Rr-H0jU9H`RXF`6>QDzxyOZ51Q&-CZn# zzYDvc2sr@((&v~0FgCo$OJFARH<*$O)O&lOj0!`^_W=$*hyP0`90WApVfxm#|AG!t z1hdyBFN8i_Zb;A{rOQ-07rKli>JBh8z9g|eidQ1~!DpnAZASfP`hQ_dkAwU9&XMq3 zsX{6=AbjB%rT>&_em@d&7rq_A@1#QW=J}4{=b8*|Q`<}v>67-uSZA2&^9Q-hkr*1^ zlz1Au1bpRPsHYSiiUu`d8LPbU2nSWqC${LD<5s+K+A-{+t&|uxX(DC3vYjvE7x7Rv z_Bre`cKt(p_{)PGS3VjCb>1Yl3GyjL*fYvb0*<6Y`#ex{sJ;v22R-jEijcY^N6Fh` z88L;E97Cg#pl^eROzb^YDqg8Pv}f{kj5Ewn+CHi+L7ES}%DY;iLJeiVFzJN%}D&Y%-dmwaHy72;y013mH_ zSRJpDEwXa@z_s=?8pw1#gjw8QX#f*gu}^rF`W_>vr$tFRI9B_lQhe|}?PO)wL7Oiv zpe1eE7A&o{d(R+xE7WCTG5H)^WZ=8!@umawxD7Eic`Kg>!Vi2NyCELWG|t-a1)oPF zpGPC&c`gcqocFdOVHxP!@nfkXhZ89@cJWomj_^Egwh48QV{Pa?=?yJ3+rGiv-y3W_d-<8ETZ*T$bk# zHEdN9j@*pM_=+PFQ+tWmV)LG9C*K@Sg;2A(2S&kf!k~S%a_~s1_B!RhBO@n;F@ve+ z>i~4lWP(DpYC>HA!7{wcj`cWQIbT`)@yJB;b^mW`@RPSydHv&wx_+0HPd}b?&D}VV z_m%lCNBb7iA`A6Lm1~aPEXr6_sr z16`2A3UbG5{WKy>4erGY?)V-QXPu?x69R2i=|D9vw zuhBeBVJ1(MJaaUnULUH@Kdp2gi;0#p-6@M#Dg!^CGW4z|k)W-0+jfitu_EO;pWA%J zPw}2cycyL#8DEsc;A!fHM|t4@-ne}ziq%`tpAZQbX{hMuKTvQHXSm49@I)%U8$x=( zTsdF|h^=W4;8E41tCXqfZPY}ir_ozg2h#6X^z+&ul(U~t_DOG5qoe;qKVj4TXeQ6T z$nTfp9y`V@Ww^4R)Kc_#S=&8mF2S4h3?V2~=g>n=(Qs-XAy}qm?jDPoiOku}EEtCUTxudW=E`cORxO0u~Y< z=DT?_NK`|?2Tmn$vZnoRbYgv478K^is5g(NE~b=cc<=!y148{%%Hk8Fd}lE|z)GDV z)Jz=^9_@=r(M+Lcbfjp1q^MY^85k*g4@JOjb3pw&?u6}o8c!PajVO_#)#rNZ9t+>q zW;kx;lq5&f==%N&BSY4l`|+Y z#AR@{sTtpbf_X*i4_HsUQ-KCzF2(B{!WIXBK;@Y8^cV59=Woa2$xELNHO-_jZX+4` zs>)b+w+}1-{MQ(tzZN4D8$fNKqCP>*bMconOza5c>RYNTGq$>7@mF|o@Rdb6w_`~- zg8UpW5@^1;Km#~HV1@y2^;SGyX+S{;+uB;gm<~g$VN8g>ZMLWVE(kTnE>d!_;ln4P z43PkuVR-6*)lsP-w{}Llc)9ZiMPgFjU7K2-nR* z`Fp&aALw3(a<-9PXX7sk994hl?K9-+y1_>|K-NWcKi5xbKRJ5B1E8%RSr8cEv3}i< zFt;4ML4f!jzLuj--=xHUVKvzZ?nXKbM8bdG7css$GA9J5%uTGGqkw!P_9=*2j>h34 zR&1v%B$UmevRnfv_N};&ywtDa57~q&3`OdDe~d6vOsY=U^b?$8e3fA1U^wa(_9FEe z)Ut!>Fz`{Z%!HDgR2D8W@FFvTcmO3=8n8;WE{nRH!?Raa#%OC@!#oze)}M07fA0EtH(#Ey?+I9h6J<#+~3!EUigjo|={h#d&k<*0`nyABI$_5O=s3N`JZ z51Ph;rICw^zjVWwfk;WAM>b4&{U8!iaOqjkZ8fx>JSo)?3y27sS~d9K3}1L8+2F6o zG$4{^=R$J0a;kE*Udh8ZZ@pji zf=dLrDqm%c&NH#9a+t<#=X)rEa}CRdzq#R(Y}$|(98TTNw7P~-oXfTWCYE$ynpjf{ zGGRh+iRtq~_;N&aQQ|pu1(fxb24OqYiBbF+(h;gK7pV(S%7sg)Sqmjbn+6r_)ifU} zxO&|RXm=l`1ADZ?#9}eAlxL_^s-XjXEGQJ`32=@47&*NZxuW1G)CmpH1?vJ=06GGH zoJ+eDK>%S>JQ#f`En6{e*gpvhBGA@~DF2>N5&FlgO@Hulyb{mV_N#7K?Tj1>5zD;{ zfVCMn;<%oafY^-SSwPqx>k|L%JxR<3Z}gZ@_X;qPvkE{4dxgG8U4>5IQ(X~yj#cl% z6J!wgQ=vjflQk(ok+6LiAfhx~lxs5pK#;3pJvQguIF)aYk9{yU;y?6^<64em(VC74heClTgJ{LY6iTAFguDq)9a(S^S%KN z=8Y;RDCOS{k3qJePUHn(S$zpiKZWgYZ`^>LDUAeUQRs%T=gOKJ9x4u5Q*3YySa&M{(OUFfnYC;xMv*J&w^VsA@kRrTnPI`1IX{AhD*MJX_ii-hGZ| z1ieM7fMn|T7z%{0jaKgr-{BAY>C_Usk1oQ!L7hYQM8aq_4Y%)sn{eV+>*}XY#UorM z1B?*>HS-TKxPo*Zg1Eb zW;Pw|jA5Ymsb&oBZ>CS>DI32}hm>RtF>vXwC({AlWYys(4u^PLDo_RE(S#ELZamaK zKf=YQ>MHS}BRO^5dJ-SHm1^izE-XHXMR7B*mAyrUdN*`Cq^1mDK=m5m|JUBv_(fIa z|KBr=Fe=IsBAOi6ewd#;)qR2*zd9AHotoFNB zZp*HgY+8${sb!m$nPnNf>*h?dN@|8?&i8%p3@})~*Y6+r&g=D_d(P+cIiK_NIS=>T zd(UYN+wxnq&ALQ2+9Z-^gccY&tyZgF1}C7>&VH)Ti<-nVZ?*=V{%j52!x7Qm@lR)m z{kj5#ZQhLXp!NL2Q%J6|%MyP9TR-LEG3>*Li}%)f-S49$TuF|l?oS|u;lEZr1T6RK zAXDmFl)6w|n-E68qzMci686Re=!0p#6R41IB;dSf`+R~mM#e?Y~cHx9BUs@GqGYNj&v&<_||>NobC za*>w9cMVDtaeI8%+7S2GaD~0$3adF5RXZoliX}KY$kF4(!rnMzeVTTIVf8_ZccBLF zrdYA7#T#{g6T$bjTa=nstYbWE*k>JeP#T8>^Iq%GZCmJy^~SaJufK+?ayLgSDUYTA z&3X1c_sRyZi@H%U?!~@@DQ$Z;+%?CdYiE0NEu+G=JcQu6mQ`3tOQ(sVsiSd+)z8KM zoSJuot#8qo*1v$)nUA~kpG0818+j8m%9ZME&(prNNyUvGx5?rCZrzPVYp z`#r3^Y@1!(L;UDlnBf6XX>&o!URDGW5RuxtLB0N+x-HcRj#U`kFaHLU}zEl@qg!zu=xq z=lXO`g4N^{v<(*HX$;-r6GsctMId-%u~Hte%)b2)%|-<6k3K{O5SX3;6jgT;$AGBn z-lKiTlohwp15T}<8b3Kq)2U z=jfDokd3L>hSz$#Qd4&YWud*&zkaRv1RMydysqW`5>-XZ0;}behDFg0bzk9G!5?sI zqgd@PWe<05y|Smg?Msx`c0u=lb*Q|yOFs;w?;zpM5_>WPz6u$#O%YHj-`Cf4&h=L8 zqL0M4p!n%?mLp+1w$jSjRgM3T?%+1o|4I_3ARDuAJjrX+nE4CztDjiBNL4?NuG`hL zYGyXhxz4&+sEMKz{23gZS5F!H=KF>hLU3sf2B&i}R?n1QbCs#eQXaW#3OCryE`0 zFC%X^e)heKR5mWVwM_N)vBu_GF)H)B`_J7{6Y_E6g&!u6_ZwB6X{v~$jmtYHlDfuC zomJDuxwUwC&ax^iYzvJt%^R7AM{B5>mG$xW@X!Rcd=!g6OPAn9>a@m5w^LQ*Vx#MJ ztZL2C#+PqTZ2ZUV)zinhFJNc4|BsF|=vbWQ9`jY>F($r`BitDHQUt6?o6$X zgMWI^m5bi+w0As zDJI$%?-n6Lw<`MZt#PZ4)=XgBE3m4QSE9j*4OX~LsAD#Tz&!)*3}uTKnzob_I+BN0 z47Bt)yq0J;irxYATC*XP)D5_a7pLp`Vt?Ij13I8QY|B|hpHnv=3KtwcQD?x%j4ph5 z73w(D2|nHmY4x0fm0M4g56N?*ZF?i*paP5DOT6dM^e$fsIguC&0cOul$QP(k$mM+t zM!U1ITyRCq(_;^!yjc95=tKEb&^-&Rj10(yKzTk$c`;Nf8h`F+@LU<&3{;r+W>_|a zR%j4aWGo`JNNN;H`G`Dvaa(Anp=5x!LYwBT(0C&$*{kH)LmzOX48pc(;KAhr(f!;nJJ<-RFXPtBy z#KIu$(P4!ZecVgIL!Hs@rIv=ePh(ujSgCAL{Q4b|LR58LdA^FAP*wGjBZA1-aj9sK z8F_uxOsh9?1S|m?`{Ao$?Wv;$5qalnHZp_cj38o*zO6=foNk=H4V7N^QWz}O{tH6$ zI;j*1k`D$ELDervz7a&mg*^f345}ka0QWcYcr_Uxyrw|o&Qi+`H5um0K>fAVC$>52 z6E8VvdJSlvw7wngaR`f#@Vph5yyuki_Exlc&td#hYM?6tSkcB|8eh7TFm4@%;>$=7 zJ?k4K0d?+$NF;q1;D_@WNh?84YiZ(%_HFuy4@j-9cgw<*bF5X~GxYt#d!^rDb1W*h zmx|FpD)x&~U85*AlcKTJEzq{bB66mZT_b zI9B%#9_!N|-WH%gp90uhl89IB56+BOk`{LG;b8t_Y?`XUL;lL)bsIwKl0vPwOZ(QP zYl1$v{#e=%ufOAqsZtzQ1B>(P^QrUcE4Y_uMycm*>DRrXCWbt8Oncg3FkE6Mf861! zPwdEf5k-ivVQHOGS012sPe#EhV}JQld~S<}%?!@iQ#cNVLl^X|b#XCA+@pUuQ`1KL z^?`2({RjMH_=o$t#CDtAt{4STJ18_;09`SbH2r{#NnNYtbra~@P9?Zn8# zRPM<8cfoX{B<6I-io%_3QgW@2HB^Xb#Fo0#pg-sy-z zcgTG3)KT{{@|_SOuEu0r?U{(TiMnb5e)l8rW37``H|5tH(RvO<`b4_?n|u4+3GmY( z3Li%Vs$(1o=AJfK-lHKV*RhD+!FT%om@(lFdneY2PtpyhHSRbpO-9lf|ePfhZDe42UBvVOe^ z(_^~NKPSMylm-Y1Aas@X13ks%SvIg+Vb>eRT6_l4hLTEiYp*LN@87B`t-#?{Uzc9m3zx7w%Qpwt;n z<=(N~5%`Z@2Jw>#z0}4iYL8u&n+K4{xmz)u2U^jx`}`Ao``wqrdiOEDKEr)ROFN7i zvNVurCa-}^piWbdKd`B~KO86*4{$Av74>AgSI6Pb9N-H- zdVm}jMh0`sdg7sG;hu=F{{Hai9Txh^qjFjpnd*8BS={zWsIpU~-(c7D?pZx^?(+xq zyn$`28VN{qH?{Y+1Fd@}C|!2YA2kvMxvn-|BV!^x*0c>V&|52|+-T})?|pNCuOPep z$9ntSn+M3twS-fp43z7&WQyyiKbhU~et%%8)1FiWJ)lr~l`7@m?cJNx?W}rr_f)1O zK*q1%)!pBR1~6%k?oYsJ^qqkTpb7Sbpuq>4&1b6K{)6}V<@@}PxOx+43C8$4X(fUa z=vo6K_@jR?1da0Dmk~a|UYM|_yT>2*A@BlHT+=>+Ho%l`dn$HdUf%?CgQ#9MO17c1 zAd$4M7!@*v8pU@W+Et8{n+Bne|E6zOWd~YM$6zYh;OT8WIquD%bXm{9JbxV7(26+$ z?MixD`c-5opac26qR{SB7|?;piQ#01DvFUS!^vFDO7A^bp7y9bC!9cp!PrevIf?aO#>ld_nSSnXd<=*I)qv16eaTM(u zkAy+JrGttzLWDA}h~3O+%8W69S*b8DdH$g=FV!5;c!DT1oia1Jl_Mok;qr7cejUl4 z|K7gmZP`J^cz*;Jz-+;%Yg*438nAwW+LMGXyyX%l4fG4;cBMk?snbzqZqJg*exvV-z2xqZ2>gVofcWnnI$sh@SXZeAyU()~P?w8UB=_Lg6)yP)b8$iEpv zB9aQJNGcWCai0j)c#@|@gh7P$jKo2Cy_D-{$XXh5F+$2$hmbL@AWAz-Y2$p_sFFNI zNr$IoVz;u_Z*?i_sGHZ0l)i_$Xz8Q@zr7q-opp(reXjZb9&Tm=Gxl359wS2h5X3QQ z^!@g~shUMx&n+O#6F>=&3d8|pfneZzGGQ(Pt-vc3GYPX3cmg;Ld;>rSa~N0pdu}#i zmIKX+ged?z;J%tbnBM`bfMLKF@q}ps9s|tr#KjDQ;~tc}20R2r0kh^1W(S~2BFtvs z3qX%YOVgp0{$86$n0DY2@CEQOa1v-hBA);@0wq8$FbfC;I_DGSU%(ll75FRg(tHhXX|-Y|xQx%S!#a{xF7oCPicHvx4VVYI*~U^-v}76Ms76|fz60eAyA z3A6zWDq|2Z0k8oMAP3k5eNO;|zzQG%&;ikQvWU^b!2nmW?PD9=`tiQso4C`y-XC}9 z_x+xItYAJR(RW8y0DGqpX75OO`B*Y+SkzRa?TBQw4Z|3%7N}Gctr|4#U>Tb|?9#Wf zaBCUuL(shw?h?3hxT`iHz&#c6U37*yIZG}aM@9@=x4L9TnX_C>wMCZ~7e^Ns7p-B| zLz0~$|9Tur8`chY+jPW?YX`j|cE=P(TRla-H;%lZVWtsnbuy!sr^b*m@~If|`@u~h zWi4j39Vv{KMS0M~#w|LyaXfj9OgI2$+fqi!{Ykh>9z>3SIG|xUu0ZSZgQF%Afeee7 z4&gP>1ZMOKFmoZ~M1VC1OJm7wGAsuItp$v>EzhR`YwX(Se5yhIcoNy(?*RC$7pc7` z=T0UQLQcY8#1Of0GI@NSb_UVnG;AfE%mQQ!Xhv4DIAk@#M{mHj8E6AeQo6qq8gOj} z4uFPAST%*rnxe(jU>quL@sflkKk9~_J3jk|dHbg?oRzvs*N>V(g0LdTS-GMtcU__U z`4l3hbeX^keB&6S>unLgL<`MAL82a@OZj2>j&Z=B1stOmAm>jdqf-J!s9XZnZ@y1G z3so=qRnfFz1(Z1e{~167+07`M!$2O~$@1q=o7g4Z6@8!z8V&s=Lu~|VmAa`~n!*_P z^*|F;Ib>-XCYBNM%4uYHWT9WOOL{&0o8@{)^kPwVTrL*oA&^IdWFccQ0Xndd%jn^cMSUjWs#JuW zGJ}jBnG+yJlV1*hk4Qa4h6bjFmP0c{LZRufd>rh-=L0m*gt_7Gm?7VpK}M1D@=%rx z?@Kk%GzH0HSQ1WRRh#GAwfwn7v%GAn)B|{>o`n{Ay6E9K`c>xElff^{AfyI{xh|@yFQMuaP zKu?M7K~PdIAK^&2^kslFRj?i!x@a^q+CJJL(*fiAdHZ-kM@EnDYQa<-%eRdF7e$vs z)Id#`wn{2WvxsFFq&0<(c!U=y%=IEi3R!4ZTv3U$C*;Mo!6sWFjqGf&hiN0j^qPbT+!D9Ts2 z1yS<1@T;n$${L?b`zBlR2R%O@o< z@;^<;=LnFfkN&z!ZmN&P`dJo#D4L`!g*DO<5K0N^4^8WBry`;%877}Ik;wxnn<}Pp z-c?wAoBRriESXUYt$t-E1L8@QXPU|A0c~B92wdwUeIGzNppYW9!+p>DhU40mhc<;3 z#rj#+09J&BXrCGrA-5WcCd%O#crZX9sYjsi5YTBB9u45H@8PTEPBV!bC}8$OrGjxC zrj|!p$l%~h!9+VCL>4SqJS+&2m(%NHjr^E}3=2NgmuNriOL@bBS7Ms@Xn*-lxP$UA zZTZYX3}ZUN8Kn{I6M8oS2j+V;qLcD8fehD|V8%kL#SO8pb^-xKL~ZqzN`pV;v;v|* zqgn3|NZ+skda|Fc6iEjdG>%Tc0F9t3P#}7QPhb+RUFE$mKp@)T7fAPCv;2b8JlX;T zwGDm-P1^{uyIR!Q$pLff>zJhP7=s&{09rXF=;ffbii#~GIK%YAjSv%!dk?9Hwh{Ll z$)J@7(B|R3brzAxCHeR) zGKM6`muC?>sgx(ilXy}luZ@Rqr2J|;Swx1&KT@9{TN8+tyd*!8K(65)4?JtgtaRL{ zG5h7863M)NGiRl-TpS3mAB4Y=klpfAbI4LMSiU@mWRSneGn2?djfI__Q&`A6Aj?UZ ztjv}VCXr_lW6E3-IcZ8zCN}kOX0L`oKUHRaQRV8w{G7~^)upS~Im?};nMK9EtSVt9QyJXl zGK`_m!)3*#P%VoX)jOyE?br ziDZ4K&dsK^&M;rN)Vaka<$W14$*ubtKbSlvA!$w6hBLJS6iW=bHSY9?F6xY4MBw zMNmMcvx{?_nI*^;vd3&yW%|;dnT^D)?c(QT7F8hXERvby43J+?%BX1}<(DJuI;KyL zJJZQTlFZfX%GP8$tMZZG{_y1#RFsux=H}#A;-zsWGc&%VBt5&Ne0F{zje5R(Z61k? zjA!grnPRYUaTzny)0ZFGFIj$xSsJZ#GFYX3>_{IK!F>}cvXwAk_I|U zC)7i51>)dlfNHpz!I&Te&43o4cwoJkX$8&z(eO6`4!GlREx|PlXn>ogJh+=9v5eOY zPa8aECY*OND_Ze1Ovc!~t1AHBbULFq?GXWwQ=k&rpEY3bX+X{2jPzacvj~ zH*f}M0$PD)zyYuWU2udV&;Ue$YZh<@V1a7t2E7Alg}VgMB2YBIfYt_oG_H6u%VYs@ zKm)*l-x`j{fMz5x4p%ME3O73lbX?m22DE4w2xs7_hNl6@g5N0TcmSfZqYH0mp%hz;!^igfK&a$v`}?3~;TZf520~YrtXP z6wn5A03oSZSp}v7^MDmVKJWza5^xM~1L~!O84ZZQgTSwVr+{YQJ>VO_3ye%7j1foy z^3qWM)o}a{H~^diE&?}!2bQ6@fZ0Gc@EGt6upjskxD0rKvFT6<%ms3R^}sVgGw>d8 z6$s8i&Vg9K3@idx0}p3leYh5mXMn!~?*iw6Z-J2Igoy;k0v2FC@E}kM)Bw)`&A>l^ zw&e#0JII}WZ)6dTM%I*&1XY?!URXlX`<9oYLz;{JTwYy5Cc5~swgLU3@e|9O*%hVv z<&XOPpeW;BS-CUEQJP%3> zx*~sOHtl7kvAL@Y%ba6v;tap;MYLxL4BZ_;x5zIf;xu zj*YH#mX;w|(pbxMcDjyZb-L;1gQFiNUy(j^E`DC_Q%%OZ%D5WtWiCjk)$P}{>hk$2 zemlRD{~!J^{|CF@i4tMrfQtM%cAXhV)+tzn|kU|ei`-1ryc_eO(hm1(2t zMbj6i8>T9At@&AVj-|r#nZ;unC&UYLg*`&Jb*A-k>rpEnb%++xF3uMn;%c!}+%7hV zyIkTQ#hYS~WR#XmjnYBssB}pRw!LQi)D~>KSb+W%~S*M83ajUC-#H15H1 zA?!HT!p>#4u&=Wpu{YRoj^`X)HP^(w!kyt5U9>JySE8%cHR)c`?bYqm{Y&T74dh4h zJinNKn17t##oywW>TC6`&-5Mo+xj5}(U4?t8TJ|u8$LD6Gd^f+G`1Me7;hN8#v!I; zQ<xYq^KHN4O1KJ-3I` z=mzPcbfa`LbaA=@-B#T*x#Ru&l24Eqgd4ME0m<5**=@u<;a+F{yddd~EM>93}DO*c({?!{=xy@V@zlHxhe}fOwAJ=>IeGLx7i-yt0>Bc$64~#3!+s)aQuPjT1e+xHY z52e-@tOuYdQjGMvbV~X`>T8>7d(Jk%9${Z%ueKkj_3dDoLUhm3>_nDF zjoVoVyPVBt^VlMMi6OJUXJ2Oj3>$ctb+gylk=!I$K{i*&{e?Tkz0ZBjUEun{7AERU zI-4#*=hU6ho!7Z_BY7Qf=HvOfyepMo&O7@X86kRZ^I2ki187l%ed9}q)|2=G`@v$IcpS5 zai-a5Q7cR(rbDJ9E|c4&Gbfo>S#m4|mJ&;~Wv9g;2tpi+=cLdn+!NH+epan@oAqVu zXVx3mx5YNGSbAJ~QhHVToAeLq-%_}3qRnEXR%u51f1`U&*H5q2kAN8l8^#&jhO359 zL|JY68yf3>Ei(k0@T%Yuc3J01P8;5_XR0xSLcq!FYqndqNW0#iV*fQQi3Z;SX{N41 z|DN%pnQ2n`9%iVtMyi!wmQG5$pAivLP~ z(Rj-kY8s33{MK^AViY7{k&rG-v0k*^wa!P^8!mBDwe)w%bxRsyv)ks{ifzBQwb+i^ zKD2pkH*7)nzVfc-aaXxM zy8gPUI!-rBw_I1MtJ3X2Z}+zDl#tG<%1Y^80$+*y%Zd`3F zG*%fm80(F{F}ijee`h>kJY+m(9BZmEJ*9M#ZqbS?625e87ym@Z_F@Pnzxz%Vm@pB&OFefx6HO=ShiUXTdr9M zA{j3jV72i=hVUr*ikHzxv_Nt_la0ZZQ4rS zbZHTJj2J7LMNv$~z?&+ji&w3PjXibm9$bc zdgWMYs-%~aC5MzJRY~im&C+wyKJ+cE(lP0*bY5~x?NW!-DQRudwiuh|Hn*+acGDJW9|7xP(b~**5rce^Jdd2AtD!d77rZDL(Z%qd!QCv~TFXLaqm4xL7R zYa1EuYSACox9U&oztmsSx9dCgQJ5=DH6$BS4Oxb2L#<(_;eesl&<4{CHAWam7-NjA z(E(%3GUge}jXRCc8DBE)!<^&1@sd$((wbOPf+@#TXsR;pHXSgXHMN;S%~Q>0bGkXp zTxi~5-feC%A2VMvx0^f7QI_a67{HS)sg^9X_*(R#CoN|zXD#h8Rjt4Z$$~>D6iS3D zVTZ6&*ef&($Ar_u8R4w(rEm$>#8@@fP-}#Bgf+&>S{>FE*7erS)&^^{wZ(eOddb>u Sy=i4&!c)bAP1{Mk`hNjT4uCTN delta 45352 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 diff --git a/dotnet/extlibs/csfml-graphics.dll b/dotnet/extlibs/csfml-graphics.dll index f46bee592a09d8c20d75fb42764a42dcbebf372c..fffec299e82177c7886e2c6e1f1bec8bab5e2a5f 100644 GIT binary patch delta 303166 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 H*OLDL*G0{S delta 301438 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 yFmpyTlL#b+WFd(miP^Ix zcoBn}V3xxowWxTd7An1$THA74u43!OgkS=Si1-5{R#Qvui2)5tAy(?X-)GL*WD`*D zZSNoN=Y8+y^UOJC=9y=ndFGjCW}caIl6&`7E|}vu9^mtF+{D; za{DH}e)E1!&g(Z9R@XQUjZF=!nkrTsDl6*i8$`njhoQ+;Z>Xs^WZYF?Slv+Nm^Wq0 zB%?}t;11sT%jjBzACf-P8=k}SrgJk4zh>77hMnv>&G2)Ecdy|fuJy)v!@se3-tbd) zjbQ1U&gs*s=Qo~#i#t{yS-l-P_0Ty=m} z_N-&~L5jR6hUCV6#}VS;wV4_Y$@n1?`4 zqsSVkDr0#?wQwARUuYz z+`*ZMXjLM)CR_u4X()Q0g2rto8an}0`9}c(zch~PoY&-Rsze;CE9%Vfwgn*JHjU^t zIqDjK*oJ1{Isuaaj{^dJX&kpO;PL-%{|O1$rSo#hEROSpN*&B z8sCX-JmWr%_w^rDegl(@9H-vXrPfz{t=rB+G zT!qckINf#tJ@3Z#w}6A{GsT_4{W(Ao?nz(;5SID0pN#@rZ)n^@oX+z!RoL@1)mDCS z*|+o6Q8LsKp)&ME-=|VfAFE#9<6Dut@9`EEZe!s(7H(%@D+_n9u#JT~S=hnC-7MTp z;nRB%mMv9uqE|Bq{Eh0zMYOjDb?6PHcyXd#?kpj8d2}~Yz+R0N@xIxH4N83(DvJuI zC}bBjlxx$NT&nWn;$CaiHStoquGJl7`n!l-5{-ggcFgrxa#R$IX=xhu0E^BQ zA?5KF8}HIdiv>%z;1c#jiqt2~og^3kZv_8l75_RFe;UI#pJ?k0+jel%L6$M_NhOe1 zU@xxL!a&Hgz|t-~?xguT3U7>re9;h=A($X7Ck?N;*7sHbf@Nq;knb&UtF=jQL?7G# zi)Wv`_0qtbf0JJA8kiaUYF@Ej{!B}?)RmVlE%jG3&#sVfzbHmZQ&@3tM!&0M{sfs1 zcF8k?54xtwl|G+OMPU52Uv!0-JIhMD1B+6y5$PAlQTJJ0(MS=+9<;!Bl=IcsW6QCe zm*!H5s_&gZ9xUezq`o!!@sW_jJ7{YiWcf0Q5{5fUF2Fz!YtZhKhL(!F#U}#E z+-VVw5J%W!oy*B=gX_FqB<%K1@p`48=)N{tNezVO{tACpIsMIK5Q$e77D`>R5|-)@u6D@^u= zQmSeSS^X%TY>efgIGgyiOEJZXCRm9U-m;c=2~vw-Su2PW+?`s>LD!$lY0eV(E0C5M zBa5UuV+2_uy*JDEWc0x|hZ99(1j$JMK#o_NCKWy+Sl)t~G)FX9rD>LTnsrTaDAkyl z$A>*}u6Irh zeJy?3enR@(^@U|1%=;V~v;ADymfg5|`3HkLgFC%Bt2qyp#v3VZmG0!FYtgs$oS-RD!3GO+oNf(#EF0h1XF{r3r$cZ-{^Yl@e2QjF!@=CG!@l8v|cTgf0@ zhlEBRO5ur+N_kHSFO>>t0?#xLT5YWW6^M}ROleMnOrkVhO0b*+ncE~gjXp|a&qDNi zUMdrcq$tlkshaoH^HR0osTVvtPYb9D%fSv~=AYmNqXdKiVF?AKpL)_yoj2o}Aj>Po z)Hn~^?X5C$q@C-w2-31Gmn~m;wOg96Z@NKBlu9pHz5?4iX)U_JaM%-FZAZjlx2z#_ z>lWa7_4!`?4nev0pn?t$Ra?8Ua|uZn@5BOjq?+<=t~yR9fs-j4|Pp)_z< z-c8DhL~VYtEl>UlOVE}3l~LheX%B7m>!Y3Uy{^HT!S6}kPuimoN<(jc-F~rneY}@n z<6YOzp_oXi_(Gm^*Dw>5`!g*@n_{8B{i((dc@=qVf*g*q3{q;p_~3EBq?8WeK3hVz zpo&zWPI^7iBs7jp52)DUH;41Qe44lDLcTZ7Z7+}?Wh8Z$52Rz>^;&1KH|sLy+ftNN zqO}Y*XEa4fwqe#u5}T$-w#ycqz_iPw;*+z)HsYTbOWUd7TaYdRqGzmx@B!* zjfiGy{p# zk%-w`v6?smV~^$UO)tTO^?K?spl2AxF!zHnSdx!OqxkolYms}JWCBO`D7n?%=*pw? zx0(x(u5|jv#PLX{cO^+DrCLFXmG0(2JPKX*R_d~~tji(+#tik)c}%bdU<9o}V+B}f za$D+*jbR&~Aj|2x;Dsj!9Kkx2Qh9YKZ@P3H?pB~YSO?X}xC)46JF&c+v3wI_j#b#M z7!X&6RC8I%yC9VgLz-YJPMYWWfmF|XYIq4oq()#2O$Tdno-!C+!F^8a{#2U?c1S*9 z53PZrWX!de zqVgu-=%q4VI*ywN7&KfWrRzO6k*pAXx8Nxwo2bXA2FpmpnrMuKklbBb2+7kV4A@A^ z&M|orYpx2^$TA?_DlHeJB2ID<8#&T-p5+|b+vUvOE{DAZA30=m^GKYGU+Ndjj3rlP zxkO=k;3Mj~B?2?zK(3OOb1>w~nIQ*N7;=jf!Ounfbl&XGc;T+Y%3yLz*f#al8J z^%eD&PsLJi7IKOCwH#Ky_M*Xb=>w^U?6Z`88QsP5B?f{Uq^Xk5@+z`Vla}z7Y-A_1 z%uA;R`z#-b(-jh73W);w^GjqB^zI%lCdmS1dou8p#p5z8WeG(vOSrvEHk_uvC4%>^3!}D8 zUB1+EcDdn8u=JVsic$_mqM!$#8f&@y_Ddl9g+&OlNHYTeq$Yq#L)aE_@u4Ed_KRU# zI_aK?^()B<% z;-a7@x;%S+fm})}t3M3VLNm%{FD{a^DdL-$J*0CF8^Rtb1P)0zj7a4b7s$V5V}+Jv z;65aD18Mz-V{5Aj(*31o{k14NirP6J8J{Jg9-=`96)upYnb{tpgY`C)CD6y#o5e#u zoMnC_7D{EVNxdO-Ls6s|=FUXe+{ZfoS|Tl`%pn7Xz%V0r{Ihq%ao7z%Hu(p5PMicR za^vZI{i8E|r9H8h&nAj9Q3W`ruzc`rl|jL?_bft5W6zgtdf$mMzY}Z>y-3gtbdG^! z>x=!!$GLQ45Dg;*kBK&pL@Uf79Frb}^bya3g2K}EN`1gFTxR*c<9juz794f(8({r? zUfOsDJhXSNSqR19PXitZJr!~fRvLY>cgta^SnUR-gX2DrrXXN`nJ=OPN|HVTg z_fO61i!{pdh<6|22ZR1_s@QvgGDvU8pJ$S<=Y8ejuXteXST52aXyeISiU_(F%8=Lh zk+QJ#rbmu82C4wH;5{3NKcyx5HW0;86s0|<^Z|{rvU#c>Q>p(brt*yHy4RzLXQ+jb zGEyd`X?^|7$)upNki>%}iDwBfcfq}iTy{Adx`Z2VR-{d~;=c8O+J=aPYD|PVUuZxD zk1NmN^i1W@Gu>-zIe!|%CD*Zv%btz&tO#CyDFagc6d4s!`pGNgrb`P2xT}r_FimTx zZ|pO>sHa$lTocTl&(JLlQ`E(7A*{^}6@<^>`@6Q&a(Bu$gtqEVC_tWUnLuqTNQZsl zTM_O4)1|=@GE4GLKlS-Av&odgDbp^>lV9C}JT`g4*gQZNYPmew@EPoi4s&+{`ViJ! zMzlRhQ-p{0=8N5-n5Dm_sny7D%fLM>|B^14XG_yOk5fm*w8^`XZeXa<1C5xt+Y0i@ zoY0he%v?M{ab?JpCQ}6>Y|=6LHrSRjT3sEC@O#X@QC5n52{bR@Dn;RHhQgIrnx-;C z-V=o*fjG(sGx97}u0Z9!0Nbcqgt7g7u4-r^eErfCCi`%bV_vn+4Qa|Rhm4Uu*$((K z)?dY+A)Tk)f!@$M*cvA|l%bFh3wi)csPPtaf8 zsQ#ioE?!wbGzYo11T$O)q!OO>ya&!4&w8zAJsxl~+8(d|Wo-TKPE+d_dDXfdpf>vE zx*1TnV?7(GT{NBp)G+dsY8A%0(3F92r2kEJuaDqdljR$z+u&AQCuKzxC|>7cX}vzU z*D}l;%u6DIm*_2DHj%SAOK0hA4vHR@>{^Nc9j3)OSjhO->Db=E>^e>BN!Nl@duRDl zah5wvuaTDM6PM_kC-i2q4K{L8WktCBk9*n9Pi&`ZQ)&EhCronPN=vFAlIpo;(t_)U zq<=2GqLLe!N^YPij8Zg+y1RsdF7)1`7~ljL2Pq>c3I=wfH=Fm(Zb29KD=6CU>i*Fx z^ha_P{xAARk75@%U}$5vkXWGq(u>Z<<;(f0WO(>7{!9LU;=io$7lryoT}?kRr7xDg z^u%LA4wp$r45R}M6%+}DuY-iJx?IQy_qbaG^6;{za)n80b09`G8i|B66|!}&ixtRf zX~VX4cHGWOz2yOhOPMu{*7}?HQS2v-CJDe7UI*eB+yrT=FT9Zo3JqvRvaOi@`pQ&p zsXa-KS1~_Fi=?wC(sqRi+-LPtCWh)_^J$M`$g}*c*QTNM(k86hG;K#*mn4?}UkWW) zn0z8E-RlKQ?|MGES2|_)=Jv}!#bDO@z!|PL^D^=5()MParJ38Z z>w5|lMOrB*CaO5!7hVN4OK(^kxhT|9fs%&S!sb_YgeUj1lzUd1jxk@lgAc}jS~W6& zPdYd=BHM{lZoewr%>F>>X2M?he1Wpfy%1nKmP&tK-t8XL48#CyE9%q6*xOVXgZji! zeTrl$SI!Hlk82{;WuOEZka6%etY~2??!Y9fmJdd?iM{auylK}bgp2GaY%Lj1vW~se6{9AtSjB0X%Zv%d-?t1WJ$=AeHPZ4 z;E?CFN6mx43oMH(b6Z(@<@oOXaAowxKfhhmNuDZMG(s|`L#8`3&5#CKxZYmD&5{SrAi zuQe28nNM6lHTqz17p7xf!$DrYouz6M$TKd6+wyI+!L$Keq$i>1MvOp%p-KeoW28lH zo-ZxpyS@(c>i?5vjGH7*%(vy|`Az~AIU=K97emdR($`=7qW#>OyP5y<^}!`l0q>o| zijrPIvEmfs1cj;j7SR+BdsI=;=YxlcI1%W67ry`-F!W{1 zNyHB)F}Z^VdB}B|MS`b*r^RWYO~Cjg@44vnjcgp}skxNxX4)S{lcP^2W(my`Fa^99 z-40FzG`BW*y?^*w!n>_6Vi8xXlV>15++nbu9*js?yu|MZN7&B8vfv!*u`A4eJ+!mZw zD{KW0H(Ao*8XMJtTk`JS|C8ti#^(s&9vb}RJW&MD2qBzLVJaRx-M7 zLT@4rR~Yk8A66g5zm~(v1FSTb-*tnkukch0uBo6T9mjl>ksgEy8N+)JJ#I&xjW!Df zyJW)dfMjZ2kAi|}+qjAMVB>W$?UR(bCVSF(?3FI0V|JK_Sf;rqc{KhA>@NCmmGNH+ zvP+Eu_8=OCZ=i=Y4*U7=m&`=lI#Qd+)N&-%Li5XNcj)nKrI#DtNvQFzdiCuhk;ir+l zEHeBrH_=lT!N80qj#2`#On z*x{L9)2N57BXnD3Po)m-d7IrP-$B+!M)dDVKALg?4n&=&nsxFh=`L*A34^m**BPrh zaSBcYVAIp&y2cYVI2Gps=&4aa2dKtw7~guoj`L>n(qF^cKLIIaK257*%Ovb#<_nbW zx~`*C*KxOw&Ch$%bsTP*_ou|usB0D<)^-CaW-%!Zl)aER&M;P$L4M0U2}{dICTO;UI;P@R zZGU8maG%X4y(y9g#M0``iUQ#1QX85SEp0?Q7D7g&3LuaI#8DfQ0zHlly6j5zMqTMEVzDFaqaeND|nx8y=jD>NHwjlhz8Z zds%OE@@VH~UdrSXOGq{?{NUuon;@7J2nM@|*!v8|POZ)rPUxV~GdQtWj>Og$`l~0H z(lJX&yi;&BF@ypF(^`ITL_QE~M#nCY45AJEi@tSsh3%4swhJPF#QjNt#F>A-x_Wx$rY#io^p!XCxWF-1X* z0<7+zFmrns+X;HOl5}D+vqdOF=lVgBy;eh};m0KU!|J?tF$Qmpv^Y7QCTNz^Y)jze zUtrrA_0(gV#*)c7>716f$exGEWn})~f1x7SOQtiMY_Av@IW?m?tkPOt-Rs4fG^`zY zDGK%e+CSaKmW$Ey2UjTw!R3WB4@m6sC*pv^99N2B((*A~3!^r}1P!Jri&y7dm{?Ja zK$Pi_QDnKtgpK`dWo4`9+I?cEWt}m~Pt&r@I7hr0QZUH6VV|#{n5M}@{88%N;0Enu z7^E3*q$dHbfKwoBjjWEiI6sRdJ*(4sGAURh9g{DD5^GmFHbDylhy;d&tuP=wBhF5- z-CP_l8l(dVaFk;UrnsPp5)3pGeVaxV8{scf`NIg2#c~6@rWfi;JCFuHPME%kB&)p9GrcH9n_&1}pc zQH?tADuS^_X`gX7F!S<>+XW|3XiwROLzH=RGQjBVMHCayOU6UE#X+FNW`2#jp2A|w zQZD$P?8Oj26Tlntk1%zHIE{Jcb45kOMWLUI_Rg@je+4CFeB5T-OjO&9+vu{{xD^+8 zNGPlPlQ+TE?Ls1^+pu5$QgGBIv3!(+X5P{~!hz)rafV+3b|E(wHWTQC#TTvtI*RPl zf<1`&4f$<2uNiypS2RV~uVnH8XYKcntYfI+-4L0w4KBTV<#{&CF-Q|9dDFc7L!u%2 z&0?HqO7vJK(V@F_lX#3BxZuqWt>u{OV`U-@dN79Ax{$7N3|yr~UZP^SMh`~!TF#3% zM!zYoz2L^Nn`2jyzVg5;@e4A7!b0@ z6}BJE@*fm$1T8vmJ1#FfXglD~NcDkxiaaP@eEA4^g!_=XZJtNCBS&I%7~uJ8IutB^; zup@(K*)fm^^hFd%r$J#UBbJWN-x+^_b)l>}wyLJOELZ9>%97$gPrJfJM0P1tkGU7y z?Z!5b;K@A$yU>25nEdHQvM2Mbi#MMh49DJ3pk}H^6(7*G`@-68MJH@O0=!PbyUK~) z-xU=Vg-0K^oP@_U2L0t*k+DT}D$G3v(`2dpP1&FIEhn)N6nyGC^ExNP)coQ&`t+&b z4{NysrGGEsdopQ^*X4Uq;UaxLj)P}vZF#ESU%r(|+~CbUlUGc(>ThIlmk9n$BRTSH zvX7>^@Kqj)_;y}~>6k&DoHbjqq?vlJcBxn2;nhCqvE$9B4xGrN1##{Lbqau07M${! z!Jm&Ia{ZHmVogZObb_9o|*y;4M0n zf32gOuYsww?-f_L=WNkX94PpA^j>$daV!U1^c9~U|)1^9wg?; z)X5H_QKToe&D7=F3gk9qCtAT@;Y`v5Mk@leMz)sJ3Lnj5hm&!5{yaRwJOiUAlS3j@N`y1C{`2(W9n^77 zUeRQSoiSv6sOw|LW7NLjC|RwhSk_`z0sW$br0WI$2wVV}1k@UQ*$V6!T_R{M@jG<+ zrGCt#zHloB;!CG)=)81FnGZ&ii{bzcHk|8jY2$Oa!rfB{ENtJnsVWNN?=n|kPB*6<4SHqqM>nDV zN@XuX$K3rP*lY?HiBrYXO6eUNUIGJ31Q<=6Z`=jnqF!mNb-?Wnp%~(l+_2C?9Kt%` zSA$s;hZjI8PGap0zT+qtdtkXXcH)BejZhSlcxYi56i+|@^nu>zoZpJ1>Ya%7y&Lv& zXP2z2CMQwYW8L(8xNATM{V;bX(0pc2LdXxmnu~8c?ZSN&-7m%=+sv|#8!2IbC`PA_ zDHOl7Tfr40fUEbX2aQQ5JaHnnqeECm70I7pZGYa~Ih_11arAH<4071>t&w@qVPpHY zyU}PZ(w003vXoMO)SKh36RUc!kbw*i-l<{ zjA3Cc3(YKyW8r)jE?{9i3lmtF$igHRT3BdhVKNI-SeVMf@3GLx!r3gmg@xZ|VH690 zz`|Qu7|p^tES$^2c`Uq*g(enOpb5J7-_Jq^3!7LdvT!X6T`a6&A$`T6dw(Mf?_;5p zg;gwE$--4EtY%>?3-4uN9Sc{pu$hG|EUaYV8Wyf#VLb~?ER10xd{8JCn{f!^Scr`Z z+%I5ZJPWZah#2fua@{!5i#>zi<#M`Cz&^l2fC&(^gwyT8^;du%z)`>nz$w5Aq}2ne z0V3c7#GL`;Ltje(Wq>L`Euayw2CxqB5TFC_Jo04WngsY7_Xhzy?k53sfPOqr$2Af# z3lIg!0ep=3vw+V5hXKQYV}SPnX-J<3hy%Qh=a&G5;OTC_J%Ic1+zQwT*bI0SupRI; zU^n1dz+S*b;C=!a0$c_Nh?@$~1Fi=c0Ji|<0Ac|NfD}Lm;0}NdUw@KeBgzz#qg;Bmkf@Xcu|Dk_2i!F&ip`h`+3L6|scvUbYUFnZ8UtGMP`efabl z5!YRR14ZB$dE-qp4L8sFo^kdq-;esitH6)U@MBQ$}H1?PVP6X;b6(Bi>(W_gNELVX=vm`LyM= zu(sd9qQHn-lR2{X4}VNyTO&exG2r2k!E{*L%Lv__U%Q8=hCRFq_!t!0irJu0hYMzX zyWv5iqqrt4_0*XlCa{sR^^XDZSf}F*N%#)p3)6#WnrmS0iNRk>{vNDo$z6e0CoxeV zuM)&hW}K5R_6JZ==9!d6=a1y~0@D;<7^Q)KPCgKjwh|4Op$Th$4GGHR31Te)D}J^^ zIEdCg91`|0?QIs*fJb%1TXmROMiNVKvw^gMC(@N5jdhYz3cCt5Ya3TqadhraJ0SobC@{42e0=UwJ zs$BV*my7!wKu;HuDgou6+omI2<0s~qEW@%xysW#`-ES5YcW?i9}Ov4CUp?I>}C zu>x5L;7b?QwisdtZ(8E*#z4%3r~eBKxssSei`tN;WRN>;h8UF-^JoJV8MX$_l#0OXUF0?{LpBOGNNoa zOO~&I4WQ=J&;e6{P5%CLWdx-cs-X#{F+*qx?68#v(4=lLrvQCH0E)J?1Z_+G0A^Cd*348%E+rYWvIvw5Wqrp#4SP^P>s0O+94ax!mv>r&pcOq7KbWv-Vz)sJ`h8` zjTW>xqpPgcm5D%Y2pUZU5f5ARs!MCoQq+lM#Y&C~wbc%RAdL115B~Pu4ogr#yLS)M z`W`u70y)eax;+nfBEmJUYKDzewRf<=5>T~rkR>{BAK?AYea5}GPh_v>>cck9#zVD$ zY>Jx%Z%4^}c&m3m*)*L0%7D0Y0EK`mc&g1uEZyWlK_j3+b@|>lBV$Zr>{PcR7i@nE zY;+E}gi7*lXpMU`24>c(b;`9dShAgujAkP5!=6|FVm*k*pe9TT+by$JK=Zg`tjiR_?>o&1~8h^>g& z4=Hf)S5j@ERq&8(X7$RG9_d61s~4)1LpyFInDvd}18#EH+%Ye1l~B?0lCfo=TjRtR zjTv0q>995u8!E7IH?HQ>?MMEL-p2{s_!u4sCwP_fh0?Yid+@9Xm&U!k+NgY{@ljE1 zvkhxjU$}q@ggu{Qyd~^;49;QCW6LnOiy~&>s|R)=pJL2POdRdNwHaSRb#WNw^>;}s z5tdgTm?CXfN|MofdK}ZlW`(Y)6;4)t`{}Uu?Zm`3<8#QiX)2DnVZa5L01<#lz#M=P z5Cw<>Bmk_K(8K}^n-&V2>^$ynhWH{df4NN&t1XW@uR*B_+yQtn&PGv~_aykjwWt=} zV}Mz8%@`xyVf0_y0KG_0{7FxA;tuWAiVNgZkiQbDL`p+++l-ImZd6KbM#>lV{AMH7 z$-B+iic7vH6sOe`DHouR=~&6Gsfs@3RqsK8gWprqksQUWisxbGbu{^rL?B7*g|mFQ z@Qo35Bkd|%9?%69pCzo)ROu0-kOzu$Kv9~3Q!Q|Qz2Q6VUN3NKCRhI$y!paSNE<_7 z#5%I?0WG~^GiSqD8j@(8;Sn*-={V{0(VJwn9P&I(TIYG15Ij%sW8r>;JsZh}Yn0hT z;*GQ(LXYc2oNEFGy2r3{&I|$@Xq3%iv}69!!6r@} zY;G$kP)8Pg^I!@ME;eks7ZhN7pr9I=I;yK-gz|v&94b6GcMLjPYmGx+rK0Z#dVzF2 z-@_c2ioH!_^%NJzd_^%e4WpPi$~o|m=gU^IDy)g+&Dg4zn~{dCV3CjTvg^4~&}YNaCL zgLHJrNZPT3_`rY*N~UOZ?r6vvX%Tt!rJF244n-|+kOfwdZAbCShIWK}>^F#~WdZ~M zX&;k+NhcuKs3RrQ*k-4B&Pipgs-`&rEnH7}*iyM1=E^kso}Bwo0)`LN_n|B5yW#9% zGAGJQatU(8JJ2`0DaZ8f0Mj?N-{3jG>U$udzRDtkOH5`8_mc4x=rDydV$Fix2O8^& zYK3CFn>Lq6KcYQ{;pmr)GVp3A)pBos=6j3cHXDZ#gINM4;B;M^@honlrv9p2Vd?zRqo|6-R$q!|zr4(cv;1&P82SZR(6;VyRZ{s)2U8VGLvqXvd+ z1`d>LW5t+{(C1=IXcIkJ)(D8Ay^|<%^~b5Mbxf3yJ|`LzC$t%v#|XvOfkwf3K=}c! z(s{6MqG2+7Oy{{Dou`mGPg|#0k1Ab2mE0{6Iw@PBjxEF9(mX|RZD6{YhuoKeLlYRa@8txP)-+LhyEt+X zAH8Bu0#H`zVOP!8ZvU!Ym{S53;Q*E5U5k|5tM&z@DX-egpLB< zz{$%%8ypm39EyXn%^-t|;}$0ASoC2Kig=M`QS3JIMW8CT2KNykzGT&+*^gDPFS^HD zAIvlebnxl`?Vj^ecXUse9Fz#<3Uf=yh(*UFiVS|ka=1y|k!-)XsaVrd^mhy-I19;A zUmue?1FS`K=o1)1VWvcK&aESne=pbAj|>1m%{&!1te2t^(hGqO;m~p=yDW z)T?}eL!B7*W@#aVkqs-h9j?W6e~?BL_I4ZIkQ3A0fA_5kkw5*l&xccB@-1i;yw`>K zt!2=&ggNst6ugdaN?s$uCAaDNj+yuzs=HT%GclhBzk)u(7N^*Dgz1Kc(kbxdqi7OT zTq~WonNJt=l5>h1%bV|H^3M<{-h(|}t!0Pt6tarn!(0((52fj_ecC*X9t_9zK3mHW zaavDJt=@(^P|u+5dmJS}GuOev30q3@TV)(ugO`Q{10DnO21*zEqu=#@(5L3k4QG#{ zFk0uljceac%5=q(1-a-vSvZt{<1~?;EQ2S@=*hyD=jIf9vP_<=I8RmrV-stwus~Mn znATG2=M%61(6aSR1ZL`NYc&p6UpR@5u;vpMj4ZzSp>IFp|LO-~s!-i(uU^xB0)vBq zWWk@<7qSgn9o^O5`TmiAMN>5&rxjUWb&% zs}eu;8WCnh2TqM8_a!n#f?OGWpd>PY8lBc_`A4W3h#J++FhXs!u>MI~xCa2!~u>TKz^cL3?_7#_nz<_D&{sTJ$ z;-^j5{lpIrEwqKC?ZU)p`b2iEPQU}EznC*TW5TUFnLjv0d9L|Z4lmJuAM0#0ds@a>LFC1T1LPcp_&Xu}^A_yT0thkdqkew56s-~;_ z1u6^@VwevfT`Q&lTUSW%g-`_t9tTm&D`D+haFvpc$gk97asc~9wHiA+;WNlMhs#Br z1iq&c1A`^L`6O{E`7-iiQE{sMbg3BUn@=s^J6Vc%90X|sM!p~{Z$INLUpdcXg~g!) zrM_?;7uHm)(eQ0B&s?gGQV%p92887p$!j5(&8W&TR0UT0b9@yJiJr_ecuzj}vSKXystGb*dv#r80Xn;MO-nRDSY+sJ|82AnuSt~?>Od1C@R>sh%!Hm zbYu#?St&?V$_MgnfBAzqNSSAG_I#ozw;vyge3f(&-wSrgZpRtU?YK-|B%pbsOj`p| z<{3F0Wq0?6P-PMA>&7xc(6~b6IK-n_*?S)t_Oj?%tKavo`%olP zsj=dFUw#*ZbT^7wioB)WBrv%IVpKL(O0&ChM0Ug3C~*6X?Wa(uDLE8|XH$4%28Hv} zC``5@T)8>Cnq8(WW0xBf*d-*6U1pouW$qkYc03Yt4=z$B_e>$X^3Rmu>dh3MsiNoh zeu%C&WalpG@EUFxB|cM#r{0ikgcEtLvo|D%rQ$o{WDY&;r;ugWS$6wAZgHp_GJIw` zkgyxMh4hH#;wD5^?}yU+!Xt3&P9_A-B><6M0@VN$5tjeGFobJKa8GzSibdfm$ud=m~+IGTU2+>n@iw-}7WCQ`aJ zxNAcK{WBETkom~U4J{FqHDTMjq%Qw}fyoHo8?y!<4tpV8UtkY=;l5Dw349LKn;}H3 zxd}t6UdqPj5V1%t5rX?HUo~mn2Q}`_D9gJ|ADi*zf~9EbY7^-ny#hc=^*dbQ4|YOc zrKm!$r3i|NmeP#)O8TYa?tYD`JA(%5qMXE;k0e9c@yT~$5nWVGH+Rad zAlvPmJq+>rW?x|85DSr_Q+nvN?qsq(oNE#(oiE&m6qqlzLaDBB;*gAQKB&-oQs=?= z=LJOfW4K|>9g}(4{EE%vkbSOUDf6;gvL|!cn>keV4CU*Va);Ct#HHn^I?fR1k$&p} zq576O8eMimA}ttM+=n7a;c@(%72v9GX=T2mLw@xh|bk|as^+Je()Tc z1cm_yQGyBRmoob|Bvd+A_luKzGv8-o%zVF_wfbl~$?t(2cHwHZ)r~}bBcpx>-xb9N zp~8Nhsng(PEiybPZSoIr#8@e6s5kQrjlzCQBH&(rL?K0^hijV8rT4jXiYb%Rph?}Z zerHf|-|T)CzR$w9S$Ldihl@k4tMO-@g&+bv*80JI%UpHB$0;%t>mIl1>+U%kyM%|_m!~P z(mR&eJjGjrBdIv2Hw(r70B~dtr~5nL2Hcwfw4WaoqzMkj4fZO>>kp<(?2RC7d9atf z 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 diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 1b92ee7b..f59f4021 100644 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -478,20 +478,16 @@ void WindowImplWin32::SwitchToFullscreen(const VideoMode& Mode) return; } - // Change window style (no border, no titlebar, ...) - SetWindowLong(myHandle, GWL_STYLE, WS_POPUP); - SetWindowLong(myHandle, GWL_EXSTYLE, WS_EX_APPWINDOW); - - // And resize it so that it fits the entire screen + // Resize the window so that it fits the entire screen SetWindowPos(myHandle, HWND_TOP, 0, 0, Mode.Width, Mode.Height, SWP_FRAMECHANGED); ShowWindow(myHandle, SW_SHOW); + // Make the window flags compatible with fullscreen mode + SetWindowLong(myHandle, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); + SetWindowLong(myHandle, GWL_EXSTYLE, WS_EX_APPWINDOW); + // Set "this" as the current fullscreen window ourFullscreenWindow = this; - - // SetPixelFormat can fail (really ?) if window style doesn't contain these flags - long Style = GetWindowLong(myHandle, GWL_STYLE); - SetWindowLong(myHandle, GWL_STYLE, Style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); } From f0e231eabf5de172cdf30c7405c4ccc79489e3d5 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Wed, 10 Feb 2010 11:01:38 +0000 Subject: [PATCH 13/13] Fixed wrong sf::Event::Resized notification when switching from fullscreen to windowed mode git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/trunk@1396 4e206d99-4929-0410-ac5d-dfc041789085 --- src/SFML/Window/Window.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SFML/Window/Window.cpp b/src/SFML/Window/Window.cpp index cfaae84c..7ea1963b 100644 --- a/src/SFML/Window/Window.cpp +++ b/src/SFML/Window/Window.cpp @@ -445,6 +445,10 @@ void Window::Initialize(priv::WindowImpl* Window) myWindow = Window; myWindow->Initialize(); + // Clear the event queue + while (!myEvents.empty()) + myEvents.pop(); + // Listen to events from the new window myWindow->AddListener(this); myWindow->AddListener(&myInput);